octocode-cli 1.2.5 → 1.2.7
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/LICENSE +21 -63
- package/README.md +86 -109
- package/out/octocode-cli.js +7027 -7014
- package/package.json +8 -6
- package/skills/README.md +97 -120
- package/skills/octocode-code-engineer/.claude/settings.local.json +18 -0
- package/skills/octocode-code-engineer/.octocode/rfc/RFC-code-engineer-weakness-fixes.md +255 -0
- package/skills/octocode-code-engineer/.plan/VALIDATED_PLAN.md +223 -0
- package/skills/octocode-code-engineer/README.md +178 -0
- package/skills/octocode-code-engineer/SKILL.md +418 -0
- package/skills/octocode-code-engineer/coverage/architecture.ts.html +7828 -0
- package/skills/octocode-code-engineer/coverage/ast-helpers.ts.html +211 -0
- package/skills/octocode-code-engineer/coverage/ast-search.ts.html +1795 -0
- package/skills/octocode-code-engineer/coverage/base.css +224 -0
- package/skills/octocode-code-engineer/coverage/block-navigation.js +87 -0
- package/skills/octocode-code-engineer/coverage/cache.ts.html +376 -0
- package/skills/octocode-code-engineer/coverage/cli.ts.html +982 -0
- package/skills/octocode-code-engineer/coverage/clover.xml +3217 -0
- package/skills/octocode-code-engineer/coverage/collect-effects.ts.html +664 -0
- package/skills/octocode-code-engineer/coverage/collect-input-sources.ts.html +577 -0
- package/skills/octocode-code-engineer/coverage/collect-performance.ts.html +331 -0
- package/skills/octocode-code-engineer/coverage/collect-prototype-pollution.ts.html +421 -0
- package/skills/octocode-code-engineer/coverage/collect-security.ts.html +604 -0
- package/skills/octocode-code-engineer/coverage/collect-test-profile.ts.html +589 -0
- package/skills/octocode-code-engineer/coverage/coverage-final.json +30 -0
- package/skills/octocode-code-engineer/coverage/dependencies.ts.html +997 -0
- package/skills/octocode-code-engineer/coverage/dependency-summary.ts.html +688 -0
- package/skills/octocode-code-engineer/coverage/discovery.ts.html +322 -0
- package/skills/octocode-code-engineer/coverage/favicon.png +0 -0
- package/skills/octocode-code-engineer/coverage/graph-analytics.ts.html +1510 -0
- package/skills/octocode-code-engineer/coverage/index.html +536 -0
- package/skills/octocode-code-engineer/coverage/index.ts.html +826 -0
- package/skills/octocode-code-engineer/coverage/metrics.ts.html +553 -0
- package/skills/octocode-code-engineer/coverage/pipeline.ts.html +2044 -0
- package/skills/octocode-code-engineer/coverage/prettify.css +1 -0
- package/skills/octocode-code-engineer/coverage/prettify.js +2 -0
- package/skills/octocode-code-engineer/coverage/report-analysis.ts.html +1570 -0
- package/skills/octocode-code-engineer/coverage/report-writer.ts.html +1102 -0
- package/skills/octocode-code-engineer/coverage/security-detectors.ts.html +1747 -0
- package/skills/octocode-code-engineer/coverage/semantic-detectors.ts.html +2152 -0
- package/skills/octocode-code-engineer/coverage/semantic.ts.html +1897 -0
- package/skills/octocode-code-engineer/coverage/sort-arrow-sprite.png +0 -0
- package/skills/octocode-code-engineer/coverage/sorter.js +210 -0
- package/skills/octocode-code-engineer/coverage/summary-md.ts.html +1222 -0
- package/skills/octocode-code-engineer/coverage/test-quality-detectors.ts.html +1039 -0
- package/skills/octocode-code-engineer/coverage/tree-sitter-analyzer.ts.html +955 -0
- package/skills/octocode-code-engineer/coverage/ts-analyzer.ts.html +1213 -0
- package/skills/octocode-code-engineer/coverage/types.ts.html +2473 -0
- package/skills/octocode-code-engineer/coverage/utils.ts.html +820 -0
- package/skills/octocode-code-engineer/eslint.config.mjs +54 -0
- package/skills/octocode-code-engineer/minify-scripts.mjs +32 -0
- package/skills/octocode-code-engineer/package.json +54 -0
- package/skills/octocode-code-engineer/references/agent-ast-reading-rfc.md +95 -0
- package/skills/octocode-code-engineer/references/architecture-techniques.md +121 -0
- package/skills/octocode-code-engineer/references/ast-search.md +210 -0
- package/skills/octocode-code-engineer/references/ast-tree-search.md +151 -0
- package/skills/octocode-code-engineer/references/cli-reference.md +167 -0
- package/skills/octocode-code-engineer/references/concepts.md +107 -0
- package/skills/octocode-code-engineer/references/finding-categories.md +128 -0
- package/skills/octocode-code-engineer/references/improvement-roadmap.md +304 -0
- package/skills/octocode-code-engineer/references/output-files.md +144 -0
- package/skills/octocode-code-engineer/references/playbooks.md +204 -0
- package/skills/octocode-code-engineer/references/present-results.md +136 -0
- package/skills/octocode-code-engineer/references/tool-workflows.md +566 -0
- package/skills/octocode-code-engineer/references/validate-investigate.md +225 -0
- package/skills/octocode-code-engineer/scripts/analysis/dependencies.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/dependency-summary.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/discovery.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/graph-analytics.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/semantic.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/helpers.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/metrics.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/search.js +2 -0
- package/skills/octocode-code-engineer/scripts/ast/tree-search.js +2 -0
- package/skills/octocode-code-engineer/scripts/ast/tree-sitter.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/ts-analyzer.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/chains.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/effects.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/input-sources.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/performance.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/prototype-pollution.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/security.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/test-profile.js +1 -0
- package/skills/octocode-code-engineer/scripts/common/is-direct-run.js +1 -0
- package/skills/octocode-code-engineer/scripts/common/utils.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/code-quality.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/cohesion.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/coupling.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/cycle.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/dead-code.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/import-style.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/security.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/semantic.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/shared.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/test-quality.js +1 -0
- package/skills/octocode-code-engineer/scripts/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/cache.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/cli.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/main.js +2 -0
- package/skills/octocode-code-engineer/scripts/reporting/analysis.js +1 -0
- package/skills/octocode-code-engineer/scripts/reporting/summary-md.js +1 -0
- package/skills/octocode-code-engineer/scripts/reporting/writer.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/constants.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/interfaces.js +1 -0
- package/skills/octocode-code-engineer/src/analysis/dependencies.test.ts +545 -0
- package/skills/octocode-code-engineer/src/analysis/dependencies.ts +406 -0
- package/skills/octocode-code-engineer/src/analysis/dependency-summary.test.ts +566 -0
- package/skills/octocode-code-engineer/src/analysis/dependency-summary.ts +257 -0
- package/skills/octocode-code-engineer/src/analysis/discovery.test.ts +420 -0
- package/skills/octocode-code-engineer/src/analysis/discovery.ts +87 -0
- package/skills/octocode-code-engineer/src/analysis/graph-analytics.test.ts +449 -0
- package/skills/octocode-code-engineer/src/analysis/graph-analytics.ts +534 -0
- package/skills/octocode-code-engineer/src/analysis/semantic.test.ts +1533 -0
- package/skills/octocode-code-engineer/src/analysis/semantic.ts +830 -0
- package/skills/octocode-code-engineer/src/ast/helpers.test.ts +185 -0
- package/skills/octocode-code-engineer/src/ast/helpers.ts +62 -0
- package/skills/octocode-code-engineer/src/ast/metrics.test.ts +304 -0
- package/skills/octocode-code-engineer/src/ast/metrics.ts +204 -0
- package/skills/octocode-code-engineer/src/ast/search.test.ts +647 -0
- package/skills/octocode-code-engineer/src/ast/search.ts +648 -0
- package/skills/octocode-code-engineer/src/ast/tree-search.test.ts +199 -0
- package/skills/octocode-code-engineer/src/ast/tree-search.ts +392 -0
- package/skills/octocode-code-engineer/src/ast/tree-sitter.test.ts +407 -0
- package/skills/octocode-code-engineer/src/ast/tree-sitter.ts +402 -0
- package/skills/octocode-code-engineer/src/ast/ts-analyzer.test.ts +1864 -0
- package/skills/octocode-code-engineer/src/ast/ts-analyzer.ts +509 -0
- package/skills/octocode-code-engineer/src/collectors/chains.ts +74 -0
- package/skills/octocode-code-engineer/src/collectors/effects.test.ts +490 -0
- package/skills/octocode-code-engineer/src/collectors/effects.ts +332 -0
- package/skills/octocode-code-engineer/src/collectors/input-sources.test.ts +144 -0
- package/skills/octocode-code-engineer/src/collectors/input-sources.ts +196 -0
- package/skills/octocode-code-engineer/src/collectors/performance.test.ts +82 -0
- package/skills/octocode-code-engineer/src/collectors/performance.ts +141 -0
- package/skills/octocode-code-engineer/src/collectors/prototype-pollution.test.ts +55 -0
- package/skills/octocode-code-engineer/src/collectors/prototype-pollution.ts +162 -0
- package/skills/octocode-code-engineer/src/collectors/security.test.ts +124 -0
- package/skills/octocode-code-engineer/src/collectors/security.ts +309 -0
- package/skills/octocode-code-engineer/src/collectors/test-profile.test.ts +97 -0
- package/skills/octocode-code-engineer/src/collectors/test-profile.ts +269 -0
- package/skills/octocode-code-engineer/src/common/is-direct-run.test.ts +32 -0
- package/skills/octocode-code-engineer/src/common/is-direct-run.ts +13 -0
- package/skills/octocode-code-engineer/src/common/utils.test.ts +463 -0
- package/skills/octocode-code-engineer/src/common/utils.ts +304 -0
- package/skills/octocode-code-engineer/src/detectors/code-quality.ts +966 -0
- package/skills/octocode-code-engineer/src/detectors/cohesion.ts +539 -0
- package/skills/octocode-code-engineer/src/detectors/coupling.ts +323 -0
- package/skills/octocode-code-engineer/src/detectors/cycle.ts +349 -0
- package/skills/octocode-code-engineer/src/detectors/dead-code.ts +320 -0
- package/skills/octocode-code-engineer/src/detectors/import-style.ts +376 -0
- package/skills/octocode-code-engineer/src/detectors/index.test.ts +3061 -0
- package/skills/octocode-code-engineer/src/detectors/index.ts +88 -0
- package/skills/octocode-code-engineer/src/detectors/security.test.ts +882 -0
- package/skills/octocode-code-engineer/src/detectors/security.ts +821 -0
- package/skills/octocode-code-engineer/src/detectors/semantic.ts +758 -0
- package/skills/octocode-code-engineer/src/detectors/shared.ts +49 -0
- package/skills/octocode-code-engineer/src/detectors/test-quality.test.ts +388 -0
- package/skills/octocode-code-engineer/src/detectors/test-quality.ts +367 -0
- package/skills/octocode-code-engineer/src/index.test.ts +4425 -0
- package/skills/octocode-code-engineer/src/index.ts +403 -0
- package/skills/octocode-code-engineer/src/pipeline/cache.test.ts +199 -0
- package/skills/octocode-code-engineer/src/pipeline/cache.ts +130 -0
- package/skills/octocode-code-engineer/src/pipeline/cli.test.ts +493 -0
- package/skills/octocode-code-engineer/src/pipeline/cli.ts +344 -0
- package/skills/octocode-code-engineer/src/pipeline/main.test.ts +174 -0
- package/skills/octocode-code-engineer/src/pipeline/main.ts +1074 -0
- package/skills/octocode-code-engineer/src/pipeline.test.ts +84 -0
- package/skills/octocode-code-engineer/src/reporting/analysis.test.ts +782 -0
- package/skills/octocode-code-engineer/src/reporting/analysis.ts +688 -0
- package/skills/octocode-code-engineer/src/reporting/output-contract.test.ts +463 -0
- package/skills/octocode-code-engineer/src/reporting/summary-md.test.ts +421 -0
- package/skills/octocode-code-engineer/src/reporting/summary-md.ts +714 -0
- package/skills/octocode-code-engineer/src/reporting/writer.ts +430 -0
- package/skills/octocode-code-engineer/src/sanity.test.ts +47 -0
- package/skills/octocode-code-engineer/src/types/constants.ts +248 -0
- package/skills/octocode-code-engineer/src/types/index.ts +80 -0
- package/skills/octocode-code-engineer/src/types/interfaces.ts +682 -0
- package/skills/octocode-code-engineer/tsconfig.json +17 -0
- package/skills/octocode-code-engineer/vitest.config.ts +8 -0
- package/skills/octocode-documentation-writer/README.md +113 -0
- package/skills/octocode-documentation-writer/SKILL.md +886 -0
- package/skills/octocode-documentation-writer/references/agent-discovery-analysis.md +453 -0
- package/skills/octocode-documentation-writer/references/agent-documentation-writer.md +255 -0
- package/skills/octocode-documentation-writer/references/agent-engineer-questions.md +247 -0
- package/skills/octocode-documentation-writer/references/agent-orchestrator.md +370 -0
- package/skills/octocode-documentation-writer/references/agent-qa-validator.md +227 -0
- package/skills/octocode-documentation-writer/references/agent-researcher.md +250 -0
- package/skills/octocode-documentation-writer/schemas/analysis-schema.json +886 -0
- package/skills/octocode-documentation-writer/schemas/discovery-tasks.json +96 -0
- package/skills/octocode-documentation-writer/schemas/documentation-structure.json +373 -0
- package/skills/octocode-documentation-writer/schemas/partial-discovery-schema.json +102 -0
- package/skills/octocode-documentation-writer/schemas/partial-research-schema.json +98 -0
- package/skills/octocode-documentation-writer/schemas/qa-results-schema.json +113 -0
- package/skills/octocode-documentation-writer/schemas/questions-schema.json +228 -0
- package/skills/octocode-documentation-writer/schemas/research-schema.json +104 -0
- package/skills/octocode-documentation-writer/schemas/state-schema.json +222 -0
- package/skills/octocode-documentation-writer/schemas/work-assignments-schema.json +74 -0
- package/skills/octocode-plan/SKILL.md +122 -116
- package/skills/octocode-prompt-optimizer/SKILL.md +617 -0
- package/skills/octocode-pull-request-reviewer/README.md +249 -0
- package/skills/octocode-pull-request-reviewer/SKILL.md +479 -0
- package/skills/octocode-pull-request-reviewer/references/dependency-check.md +74 -0
- package/skills/octocode-pull-request-reviewer/references/domain-reviewers.md +24 -0
- package/skills/octocode-pull-request-reviewer/references/execution-lifecycle.md +441 -0
- package/skills/octocode-pull-request-reviewer/references/flow-analysis-protocol.md +64 -0
- package/skills/octocode-pull-request-reviewer/references/output-template.md +174 -0
- package/skills/octocode-pull-request-reviewer/references/parallel-agent-protocol.md +182 -0
- package/skills/octocode-pull-request-reviewer/references/review-guidelines.md +26 -0
- package/skills/octocode-pull-request-reviewer/references/verification-checklist.md +40 -0
- package/skills/octocode-research/.claude/settings.local.json +46 -0
- package/skills/octocode-research/.octocode/plan/code-review-fixes/plan.md +312 -0
- package/skills/octocode-research/.octocode/plan/code-review-fixes/research.md +212 -0
- package/skills/octocode-research/.octocode/plans/NODE_SERVER_START_PLAN.md +755 -0
- package/skills/octocode-research/.octocode/research/code-review/research.md +371 -0
- package/skills/octocode-research/.octocode/review/IMPROVEMENTS.md +391 -0
- package/skills/octocode-research/.octocode/review/REVIEW_PLAN.md +289 -0
- package/skills/octocode-research/.octocode/review/REVIEW_REPORT.md +356 -0
- package/skills/octocode-research/AGENTS.md +349 -0
- package/skills/octocode-research/README.md +494 -0
- package/skills/octocode-research/SKILL.md +652 -274
- package/skills/octocode-research/docs/API_REFERENCE.md +562 -0
- package/skills/octocode-research/docs/ARCHITECTURE.md +554 -0
- package/skills/octocode-research/docs/FLOWS.md +577 -0
- package/skills/octocode-research/docs/OVERVIEW.md +564 -0
- package/skills/octocode-research/docs/SERVER_FLOWS.md +631 -0
- package/skills/octocode-research/ecosystem.config.cjs +88 -0
- package/skills/octocode-research/eslint.config.mjs +27 -0
- package/skills/octocode-research/package.json +84 -0
- package/skills/octocode-research/references/GUARDRAILS.md +40 -0
- package/skills/octocode-research/references/PARALLEL_AGENT_PROTOCOL.md +178 -0
- package/skills/octocode-research/references/roast-prompt.md +149 -0
- package/skills/octocode-research/scripts/server-init.d.ts +2 -0
- package/skills/octocode-research/scripts/server-init.js +2 -0
- package/skills/octocode-research/scripts/server.d.ts +8 -0
- package/skills/octocode-research/scripts/server.js +445 -0
- package/skills/octocode-research/src/__tests__/integration/circuitBreaker.test.ts +205 -0
- package/skills/octocode-research/src/__tests__/integration/routes.test.ts +374 -0
- package/skills/octocode-research/src/__tests__/unit/circuitBreaker.test.ts +245 -0
- package/skills/octocode-research/src/__tests__/unit/errorHandler.test.ts +183 -0
- package/skills/octocode-research/src/__tests__/unit/httpPreprocess.test.ts +157 -0
- package/skills/octocode-research/src/__tests__/unit/logger.test.ts +143 -0
- package/skills/octocode-research/src/__tests__/unit/queryParser.test.ts +130 -0
- package/skills/octocode-research/src/__tests__/unit/responseBuilder.test.ts +469 -0
- package/skills/octocode-research/src/__tests__/unit/retry.test.ts +205 -0
- package/skills/octocode-research/src/index.ts +186 -0
- package/skills/octocode-research/src/mcpCache.ts +49 -0
- package/skills/octocode-research/src/middleware/errorHandler.ts +65 -0
- package/skills/octocode-research/src/middleware/logger.ts +61 -0
- package/skills/octocode-research/src/middleware/queryParser.ts +115 -0
- package/skills/octocode-research/src/middleware/readiness.ts +17 -0
- package/skills/octocode-research/src/routes/github.ts +197 -0
- package/skills/octocode-research/src/routes/local.ts +175 -0
- package/skills/octocode-research/src/routes/lsp.ts +177 -0
- package/skills/octocode-research/src/routes/package.ts +127 -0
- package/skills/octocode-research/src/routes/prompts.ts +138 -0
- package/skills/octocode-research/src/routes/tools.ts +677 -0
- package/skills/octocode-research/src/server-init.ts +363 -0
- package/skills/octocode-research/src/server.ts +285 -0
- package/skills/octocode-research/src/types/errorGuards.ts +151 -0
- package/skills/octocode-research/src/types/express.d.ts +76 -0
- package/skills/octocode-research/src/types/guards.ts +98 -0
- package/skills/octocode-research/src/types/mcp.ts +119 -0
- package/skills/octocode-research/src/types/responses.ts +199 -0
- package/skills/octocode-research/src/types/toolTypes.ts +33 -0
- package/skills/octocode-research/src/utils/asyncTimeout.ts +116 -0
- package/skills/octocode-research/src/utils/circuitBreaker.ts +492 -0
- package/skills/octocode-research/src/utils/colors.ts +53 -0
- package/skills/octocode-research/src/utils/errorQueue.ts +71 -0
- package/skills/octocode-research/src/utils/logEmoji.ts +103 -0
- package/skills/octocode-research/src/utils/logger.ts +413 -0
- package/skills/octocode-research/src/utils/resilience.ts +169 -0
- package/skills/octocode-research/src/utils/responseBuilder.ts +495 -0
- package/skills/octocode-research/src/utils/responseFactory.ts +100 -0
- package/skills/octocode-research/src/utils/responseParser.ts +272 -0
- package/skills/octocode-research/src/utils/retry.ts +280 -0
- package/skills/octocode-research/src/utils/routeFactory.ts +117 -0
- package/skills/octocode-research/src/utils/url.ts +20 -0
- package/skills/octocode-research/src/validation/httpPreprocess.ts +155 -0
- package/skills/octocode-research/src/validation/index.ts +2 -0
- package/skills/octocode-research/src/validation/schemas.ts +578 -0
- package/skills/octocode-research/src/validation/toolCallSchema.ts +132 -0
- package/skills/octocode-research/tsconfig.json +21 -0
- package/skills/octocode-research/tsdown.config.ts +42 -0
- package/skills/octocode-research/vitest.config.ts +20 -0
- package/skills/octocode-researcher/SKILL.md +461 -0
- package/skills/octocode-researcher/references/fallbacks.md +120 -0
- package/skills/{octocode-local-search → octocode-researcher}/references/tool-reference.md +132 -49
- package/skills/{octocode-local-search → octocode-researcher}/references/workflow-patterns.md +204 -4
- package/skills/octocode-rfc-generator/SKILL.md +223 -0
- package/skills/octocode-rfc-generator/references/rfc-template.md +193 -0
- package/skills/octocode-roast/SKILL.md +63 -21
- package/skills/octocode-implement/SKILL.md +0 -293
- package/skills/octocode-implement/references/execution-phases.md +0 -317
- package/skills/octocode-implement/references/tool-reference.md +0 -403
- package/skills/octocode-implement/references/workflow-patterns.md +0 -385
- package/skills/octocode-local-search/SKILL.md +0 -449
- package/skills/octocode-pr-review/SKILL.md +0 -391
- package/skills/octocode-pr-review/references/domain-reviewers.md +0 -105
- package/skills/octocode-pr-review/references/execution-lifecycle.md +0 -116
- package/skills/octocode-pr-review/references/research-flows.md +0 -75
- package/skills/octocode-research/references/tool-reference.md +0 -304
- package/skills/octocode-research/references/workflow-patterns.md +0 -325
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route handler factory for reducing boilerplate in route files.
|
|
3
|
+
*
|
|
4
|
+
* Abstracts the common pattern:
|
|
5
|
+
* 1. Parse and validate query params
|
|
6
|
+
* 2. Execute tool with resilience wrapper
|
|
7
|
+
* 3. Parse tool response
|
|
8
|
+
* 4. Transform data to response format
|
|
9
|
+
* 5. Send response with appropriate status
|
|
10
|
+
*
|
|
11
|
+
* @module utils/routeFactory
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Request, Response, NextFunction, RequestHandler } from 'express';
|
|
15
|
+
import type { z } from 'zod/v4';
|
|
16
|
+
import { parseAndValidate } from '../middleware/queryParser.js';
|
|
17
|
+
import { parseToolResponse, type ParsedResponse } from './responseParser.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Resilience wrapper type - matches the signature of withLocalResilience, withGitHubResilience, etc.
|
|
21
|
+
*/
|
|
22
|
+
type ResilienceWrapper = <T>(
|
|
23
|
+
fn: () => Promise<T>,
|
|
24
|
+
toolName: string
|
|
25
|
+
) => Promise<T>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Transformer function type - converts parsed tool response to final response
|
|
29
|
+
*/
|
|
30
|
+
type ResponseTransformer<TQuery, TResponse> = (
|
|
31
|
+
parsed: ParsedResponse,
|
|
32
|
+
queries: TQuery[]
|
|
33
|
+
) => TResponse;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* MCP tool function type for the route factory.
|
|
37
|
+
*
|
|
38
|
+
* Uses `any` for the params intentionally: HTTP schemas produce slightly different
|
|
39
|
+
* types than MCP tool functions expect (optional vs required fields, auto-generated id).
|
|
40
|
+
* Type safety is enforced by Zod schema validation at runtime, not by static types
|
|
41
|
+
* at this HTTP→MCP boundary.
|
|
42
|
+
*/
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
+
type McpToolFn = (params: any) => Promise<any>;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Route configuration options.
|
|
48
|
+
* TQuery flows from schema validation through to response transformation.
|
|
49
|
+
* The toolFn boundary uses McpToolFn because the schema's runtime transforms
|
|
50
|
+
* (defaults, id generation) produce MCP-compatible data that TypeScript can't verify.
|
|
51
|
+
*/
|
|
52
|
+
export interface RouteConfig<TQuery, TResponse> {
|
|
53
|
+
/** Zod schema for query validation - accepts schemas with transforms */
|
|
54
|
+
schema: z.ZodType<TQuery>;
|
|
55
|
+
|
|
56
|
+
/** The MCP tool function to execute */
|
|
57
|
+
toolFn: McpToolFn;
|
|
58
|
+
|
|
59
|
+
/** Tool name for logging/resilience */
|
|
60
|
+
toolName: string;
|
|
61
|
+
|
|
62
|
+
/** Resilience wrapper (withLocalResilience, withGitHubResilience, etc.) */
|
|
63
|
+
resilience: ResilienceWrapper;
|
|
64
|
+
|
|
65
|
+
/** Transform parsed response to final format */
|
|
66
|
+
transform: ResponseTransformer<TQuery, TResponse>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Create a route handler with standard error handling, validation, and resilience.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* localRoutes.get('/search', createRouteHandler({
|
|
75
|
+
* schema: localSearchSchema,
|
|
76
|
+
* toolFn: localSearchCode,
|
|
77
|
+
* toolName: 'localSearchCode',
|
|
78
|
+
* resilience: withLocalResilience,
|
|
79
|
+
* transform: (parsed, queries) => {
|
|
80
|
+
* // Custom transformation logic
|
|
81
|
+
* return ResearchResponse.searchResults({ ... });
|
|
82
|
+
* },
|
|
83
|
+
* }));
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export function createRouteHandler<TQuery, TResponse>(
|
|
87
|
+
config: RouteConfig<TQuery, TResponse>
|
|
88
|
+
): RequestHandler {
|
|
89
|
+
const { schema, toolFn, toolName, resilience, transform } = config;
|
|
90
|
+
|
|
91
|
+
return async (req: Request, res: Response, next: NextFunction): Promise<void> => {
|
|
92
|
+
try {
|
|
93
|
+
// 1. Parse and validate query params
|
|
94
|
+
const queries = parseAndValidate(
|
|
95
|
+
req.query as Record<string, unknown>,
|
|
96
|
+
schema as z.ZodType<TQuery>
|
|
97
|
+
) as TQuery[];
|
|
98
|
+
|
|
99
|
+
// 2. Execute tool with resilience wrapper
|
|
100
|
+
const rawResult = await resilience(
|
|
101
|
+
() => toolFn({ queries }),
|
|
102
|
+
toolName
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// 3. Parse tool response
|
|
106
|
+
const parsed = parseToolResponse(rawResult as { content: Array<{ type: string; text: string }> });
|
|
107
|
+
|
|
108
|
+
// 4. Transform to final response format
|
|
109
|
+
const response = transform(parsed, queries);
|
|
110
|
+
|
|
111
|
+
// 5. Send response with appropriate status
|
|
112
|
+
res.status(parsed.isError ? 500 : 200).json(response);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
next(error);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function extractToolName(path: string): string {
|
|
2
|
+
// Handle /tools/call/:toolName format
|
|
3
|
+
const toolCallMatch = path.match(/^\/tools\/call\/(\w+)$/);
|
|
4
|
+
if (toolCallMatch) {
|
|
5
|
+
return toolCallMatch[1];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Fallback: extract from path segments
|
|
9
|
+
const parts = path.split('/').filter(Boolean);
|
|
10
|
+
if (parts.length >= 2) {
|
|
11
|
+
// e.g., /tools/list -> toolsList (camelCase)
|
|
12
|
+
// or just return the second part if it looks like a tool name
|
|
13
|
+
// But typically we want the tool name if it's in the URL
|
|
14
|
+
if (parts[0] === 'tools' && parts[1] === 'call' && parts[2]) {
|
|
15
|
+
return parts[2];
|
|
16
|
+
}
|
|
17
|
+
return parts[0] + parts[1].charAt(0).toUpperCase() + parts[1].slice(1);
|
|
18
|
+
}
|
|
19
|
+
return parts.join('/') || 'unknown';
|
|
20
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Query String Preprocessing Utilities
|
|
3
|
+
*
|
|
4
|
+
* HTTP query strings are always strings. These utilities convert them
|
|
5
|
+
* to proper types before Zod schema validation.
|
|
6
|
+
*
|
|
7
|
+
* @module validation/httpPreprocess
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { z } from 'zod/v4';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import os from 'os';
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Preprocessors - Convert HTTP query strings to proper types
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Preprocess string to number (for query params)
|
|
20
|
+
*/
|
|
21
|
+
export const toNumber = (val: unknown): unknown => {
|
|
22
|
+
if (typeof val === 'number') return val;
|
|
23
|
+
if (typeof val === 'string' && /^\d+$/.test(val)) return parseInt(val, 10);
|
|
24
|
+
return val;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Preprocess string to boolean
|
|
29
|
+
*/
|
|
30
|
+
export const toBoolean = (val: unknown): unknown => {
|
|
31
|
+
if (typeof val === 'boolean') return val;
|
|
32
|
+
if (val === 'true') return true;
|
|
33
|
+
if (val === 'false') return false;
|
|
34
|
+
return val;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Preprocess comma-separated string to array
|
|
39
|
+
*/
|
|
40
|
+
export const toArray = (val: unknown): unknown => {
|
|
41
|
+
if (Array.isArray(val)) return val;
|
|
42
|
+
if (typeof val === 'string') {
|
|
43
|
+
if (val.trim() === '') return [];
|
|
44
|
+
return val.split(',').map((s) => s.trim()).filter(Boolean);
|
|
45
|
+
}
|
|
46
|
+
return val;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// =============================================================================
|
|
50
|
+
// Reusable Schema Parts for HTTP
|
|
51
|
+
// =============================================================================
|
|
52
|
+
|
|
53
|
+
/** Numeric string that gets converted to number */
|
|
54
|
+
export const numericString = z.preprocess(toNumber, z.number().optional());
|
|
55
|
+
|
|
56
|
+
/** Required numeric string */
|
|
57
|
+
export const requiredNumber = z.preprocess(toNumber, z.number());
|
|
58
|
+
|
|
59
|
+
/** Boolean string that gets converted to boolean */
|
|
60
|
+
export const booleanString = z.preprocess(toBoolean, z.boolean().optional());
|
|
61
|
+
|
|
62
|
+
/** Comma-separated string that gets converted to array */
|
|
63
|
+
export const stringArray = z.preprocess(toArray, z.array(z.string()));
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* URL-encoded traversal patterns to detect
|
|
67
|
+
*/
|
|
68
|
+
const URL_ENCODED_TRAVERSAL = [
|
|
69
|
+
'%2e%2e', // ..
|
|
70
|
+
'%2e%2e%2f', // ../
|
|
71
|
+
'%2e%2e%5c', // ..\
|
|
72
|
+
'%252e', // double-encoded .
|
|
73
|
+
'%2f', // /
|
|
74
|
+
'%5c', // \
|
|
75
|
+
] as const;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Safe path that blocks traversal attacks.
|
|
79
|
+
*
|
|
80
|
+
* Validates:
|
|
81
|
+
* - No directory traversal (..)
|
|
82
|
+
* - No null bytes
|
|
83
|
+
* - No Windows backslashes on non-Windows systems
|
|
84
|
+
* - No URL-encoded traversal patterns
|
|
85
|
+
*/
|
|
86
|
+
export const safePath = z.string().refine(
|
|
87
|
+
(p) => {
|
|
88
|
+
// Check for null bytes
|
|
89
|
+
if (p.includes('\0')) return false;
|
|
90
|
+
|
|
91
|
+
// Normalize and check for traversal
|
|
92
|
+
const normalized = path.normalize(p);
|
|
93
|
+
if (normalized.includes('..')) return false;
|
|
94
|
+
|
|
95
|
+
// Reject Windows backslashes on non-Windows (can bypass checks)
|
|
96
|
+
if (os.platform() !== 'win32' && p.includes('\\')) return false;
|
|
97
|
+
|
|
98
|
+
// Check for URL-encoded traversal patterns (case-insensitive)
|
|
99
|
+
const lowerPath = p.toLowerCase();
|
|
100
|
+
if (URL_ENCODED_TRAVERSAL.some((pattern) => lowerPath.includes(pattern))) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return true;
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
message:
|
|
108
|
+
'Path contains invalid characters or traversal patterns ' +
|
|
109
|
+
'(null bytes, .., \\, URL-encoded sequences)',
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// Default Research Context
|
|
115
|
+
// =============================================================================
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Default research context values for HTTP requests
|
|
119
|
+
*/
|
|
120
|
+
const RESEARCH_DEFAULTS = {
|
|
121
|
+
mainResearchGoal: 'HTTP API request',
|
|
122
|
+
researchGoal: 'Execute tool via HTTP',
|
|
123
|
+
reasoning: 'HTTP API call',
|
|
124
|
+
} as const;
|
|
125
|
+
|
|
126
|
+
let httpQueryCounter = 0;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Apply research defaults and auto-generate `id`, ensuring structural compatibility
|
|
130
|
+
* with MCP tool query types (which require `id`, `mainResearchGoal`, `researchGoal`, `reasoning`).
|
|
131
|
+
*/
|
|
132
|
+
export function withResearchDefaults<T extends Record<string, unknown>>(
|
|
133
|
+
data: T
|
|
134
|
+
): Omit<T, 'id' | 'mainResearchGoal' | 'researchGoal' | 'reasoning'> & {
|
|
135
|
+
id: string;
|
|
136
|
+
mainResearchGoal: string;
|
|
137
|
+
researchGoal: string;
|
|
138
|
+
reasoning: string;
|
|
139
|
+
} {
|
|
140
|
+
return {
|
|
141
|
+
...data,
|
|
142
|
+
id: (data.id as string | undefined) ?? `http-${++httpQueryCounter}`,
|
|
143
|
+
mainResearchGoal:
|
|
144
|
+
(data.mainResearchGoal as string | undefined) ??
|
|
145
|
+
RESEARCH_DEFAULTS.mainResearchGoal,
|
|
146
|
+
researchGoal:
|
|
147
|
+
(data.researchGoal as string | undefined) ??
|
|
148
|
+
RESEARCH_DEFAULTS.researchGoal,
|
|
149
|
+
reasoning:
|
|
150
|
+
(data.reasoning as string | undefined) ?? RESEARCH_DEFAULTS.reasoning,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** @deprecated Use withResearchDefaults() instead */
|
|
155
|
+
export const researchDefaults = RESEARCH_DEFAULTS;
|