docorbit 0.1.0 → 0.1.2
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/README.md +29 -15
- package/bin/docorbit.js +2 -2
- package/dist/apps/cli/src/commands/add.d.ts +7 -0
- package/dist/apps/cli/src/commands/add.js +35 -0
- package/dist/apps/cli/src/commands/api.d.ts +2 -0
- package/dist/apps/cli/src/commands/api.js +35 -0
- package/dist/apps/cli/src/commands/context.d.ts +10 -0
- package/dist/apps/cli/src/commands/context.js +36 -0
- package/dist/apps/cli/src/commands/dashboard.d.ts +8 -0
- package/dist/apps/cli/src/commands/dashboard.js +43 -0
- package/dist/apps/cli/src/commands/diff.d.ts +2 -0
- package/dist/apps/cli/src/commands/diff.js +29 -0
- package/dist/apps/cli/src/commands/evaluate.d.ts +11 -0
- package/dist/apps/cli/src/commands/evaluate.js +101 -0
- package/dist/apps/cli/src/commands/examples.d.ts +2 -0
- package/dist/apps/cli/src/commands/examples.js +36 -0
- package/dist/apps/cli/src/commands/export.d.ts +11 -0
- package/dist/apps/cli/src/commands/export.js +72 -0
- package/dist/apps/cli/src/commands/impact.d.ts +2 -0
- package/dist/apps/cli/src/commands/impact.js +30 -0
- package/dist/apps/cli/src/commands/init.d.ts +5 -0
- package/dist/apps/cli/src/commands/init.js +52 -0
- package/dist/apps/cli/src/commands/inspect.d.ts +5 -0
- package/dist/apps/cli/src/commands/inspect.js +24 -0
- package/dist/apps/cli/src/commands/mcp.d.ts +8 -0
- package/dist/apps/cli/src/commands/mcp.js +49 -0
- package/dist/apps/cli/src/commands/pitfalls.d.ts +2 -0
- package/dist/apps/cli/src/commands/pitfalls.js +35 -0
- package/dist/apps/cli/src/commands/recipes.d.ts +2 -0
- package/dist/apps/cli/src/commands/recipes.js +33 -0
- package/dist/apps/cli/src/commands/search.d.ts +11 -0
- package/dist/apps/cli/src/commands/search.js +36 -0
- package/dist/apps/cli/src/commands/update.d.ts +6 -0
- package/dist/apps/cli/src/commands/update.js +53 -0
- package/dist/apps/cli/src/commands/verify.d.ts +2 -0
- package/dist/apps/cli/src/commands/verify.js +44 -0
- package/dist/apps/cli/src/formatters/colors.d.ts +21 -0
- package/dist/apps/cli/src/formatters/colors.js +22 -0
- package/dist/apps/cli/src/formatters/inspection.d.ts +3 -0
- package/dist/apps/cli/src/formatters/inspection.js +88 -0
- package/dist/apps/cli/src/formatters/knowledge.d.ts +5 -0
- package/dist/apps/cli/src/formatters/knowledge.js +229 -0
- package/dist/apps/cli/src/formatters/retrieval.d.ts +3 -0
- package/dist/apps/cli/src/formatters/retrieval.js +61 -0
- package/{apps/cli/src/formatters/terminal.ts → dist/apps/cli/src/formatters/terminal.d.ts} +0 -1
- package/dist/apps/cli/src/formatters/terminal.js +5 -0
- package/dist/apps/cli/src/formatters/verification.d.ts +4 -0
- package/dist/apps/cli/src/formatters/verification.js +102 -0
- package/dist/apps/cli/src/index.d.ts +1 -0
- package/dist/apps/cli/src/index.js +376 -0
- package/dist/packages/core/src/dashboard/server.d.ts +33 -0
- package/dist/packages/core/src/dashboard/server.js +267 -0
- package/dist/packages/core/src/dashboard/ui.d.ts +5 -0
- package/{packages/core/src/dashboard/ui.ts → dist/packages/core/src/dashboard/ui.js} +2 -2
- package/dist/packages/core/src/implementation-service.d.ts +73 -0
- package/dist/packages/core/src/implementation-service.js +325 -0
- package/{packages/core/src/index.ts → dist/packages/core/src/index.d.ts} +0 -1
- package/dist/packages/core/src/index.js +6 -0
- package/dist/packages/core/src/inspector.d.ts +22 -0
- package/dist/packages/core/src/inspector.js +38 -0
- package/dist/packages/core/src/pipeline.d.ts +45 -0
- package/dist/packages/core/src/pipeline.js +246 -0
- package/dist/packages/crawler/src/config.d.ts +2 -0
- package/dist/packages/crawler/src/config.js +10 -0
- package/dist/packages/crawler/src/fetcher.d.ts +31 -0
- package/dist/packages/crawler/src/fetcher.js +139 -0
- package/dist/packages/crawler/src/index.js +2 -0
- package/dist/packages/discovery/src/index.d.ts +11 -0
- package/dist/packages/discovery/src/index.js +29 -0
- package/dist/packages/discovery/src/provider.d.ts +12 -0
- package/dist/packages/discovery/src/provider.js +30 -0
- package/dist/packages/discovery/src/providers/generic.d.ts +7 -0
- package/dist/packages/discovery/src/providers/generic.js +94 -0
- package/dist/packages/discovery/src/providers/github.d.ts +7 -0
- package/dist/packages/discovery/src/providers/github.js +52 -0
- package/dist/packages/discovery/src/providers/llms-txt.d.ts +7 -0
- package/dist/packages/discovery/src/providers/llms-txt.js +60 -0
- package/dist/packages/discovery/src/providers/markdown.d.ts +7 -0
- package/dist/packages/discovery/src/providers/markdown.js +38 -0
- package/dist/packages/discovery/src/providers/openapi.d.ts +7 -0
- package/dist/packages/discovery/src/providers/openapi.js +77 -0
- package/dist/packages/discovery/src/providers/sitemap.d.ts +7 -0
- package/dist/packages/discovery/src/providers/sitemap.js +53 -0
- package/dist/packages/discovery/src/providers/skill.d.ts +7 -0
- package/dist/packages/discovery/src/providers/skill.js +46 -0
- package/dist/packages/discovery/src/ranker.d.ts +6 -0
- package/dist/packages/discovery/src/ranker.js +107 -0
- package/dist/packages/evaluation/src/dataset.d.ts +2 -0
- package/dist/packages/evaluation/src/dataset.js +944 -0
- package/dist/packages/evaluation/src/index.js +8 -0
- package/dist/packages/evaluation/src/runner.d.ts +7 -0
- package/dist/packages/evaluation/src/runner.js +196 -0
- package/dist/packages/evaluation/src/strategies/context7-runner.d.ts +24 -0
- package/dist/packages/evaluation/src/strategies/context7-runner.js +229 -0
- package/dist/packages/evaluation/src/strategies/docorbit-runner.d.ts +5 -0
- package/dist/packages/evaluation/src/strategies/docorbit-runner.js +210 -0
- package/dist/packages/evaluation/src/strategies/firecrawl-runner.d.ts +24 -0
- package/dist/packages/evaluation/src/strategies/firecrawl-runner.js +151 -0
- package/dist/packages/evaluation/src/strategies/web-search-runner.d.ts +32 -0
- package/dist/packages/evaluation/src/strategies/web-search-runner.js +161 -0
- package/dist/packages/evaluation/src/types.d.ts +15 -0
- package/dist/packages/evaluation/src/types.js +1 -0
- package/dist/packages/evaluation/src/version-matcher.d.ts +11 -0
- package/dist/packages/evaluation/src/version-matcher.js +61 -0
- package/dist/packages/export/src/agents-md.d.ts +19 -0
- package/dist/packages/export/src/agents-md.js +170 -0
- package/dist/packages/export/src/claude-md.d.ts +17 -0
- package/dist/packages/export/src/claude-md.js +118 -0
- package/dist/packages/export/src/docs-map.d.ts +14 -0
- package/dist/packages/export/src/docs-map.js +118 -0
- package/dist/packages/export/src/index.js +6 -0
- package/dist/packages/export/src/llms-txt.d.ts +15 -0
- package/dist/packages/export/src/llms-txt.js +73 -0
- package/dist/packages/export/src/service.d.ts +23 -0
- package/dist/packages/export/src/service.js +210 -0
- package/dist/packages/export/src/skill-md.d.ts +14 -0
- package/dist/packages/export/src/skill-md.js +107 -0
- package/{packages/mcp/src/index.ts → dist/packages/mcp/src/index.d.ts} +2 -35
- package/dist/packages/mcp/src/index.js +6 -0
- package/dist/packages/mcp/src/resources/index.d.ts +12 -0
- package/dist/packages/mcp/src/resources/index.js +165 -0
- package/dist/packages/mcp/src/server.d.ts +30 -0
- package/dist/packages/mcp/src/server.js +243 -0
- package/dist/packages/mcp/src/tools/analyze-impact.d.ts +6 -0
- package/dist/packages/mcp/src/tools/analyze-impact.js +64 -0
- package/dist/packages/mcp/src/tools/check-api.d.ts +6 -0
- package/dist/packages/mcp/src/tools/check-api.js +74 -0
- package/dist/packages/mcp/src/tools/diff-docs.d.ts +6 -0
- package/dist/packages/mcp/src/tools/diff-docs.js +58 -0
- package/dist/packages/mcp/src/tools/export-context.d.ts +6 -0
- package/dist/packages/mcp/src/tools/export-context.js +61 -0
- package/dist/packages/mcp/src/tools/find-api.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-api.js +91 -0
- package/dist/packages/mcp/src/tools/find-example.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-example.js +92 -0
- package/dist/packages/mcp/src/tools/find-pitfall.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-pitfall.js +85 -0
- package/dist/packages/mcp/src/tools/find-recipe.d.ts +6 -0
- package/dist/packages/mcp/src/tools/find-recipe.js +89 -0
- package/dist/packages/mcp/src/tools/get-doc.d.ts +6 -0
- package/dist/packages/mcp/src/tools/get-doc.js +118 -0
- package/dist/packages/mcp/src/tools/get-docs-map.d.ts +6 -0
- package/dist/packages/mcp/src/tools/get-docs-map.js +54 -0
- package/dist/packages/mcp/src/tools/get-version.d.ts +6 -0
- package/dist/packages/mcp/src/tools/get-version.js +104 -0
- package/dist/packages/mcp/src/tools/implementation-context.d.ts +6 -0
- package/dist/packages/mcp/src/tools/implementation-context.js +102 -0
- package/dist/packages/mcp/src/tools/index.d.ts +19 -0
- package/dist/packages/mcp/src/tools/index.js +41 -0
- package/dist/packages/mcp/src/tools/ingest-doc.d.ts +6 -0
- package/dist/packages/mcp/src/tools/ingest-doc.js +264 -0
- package/dist/packages/mcp/src/tools/list-sources.d.ts +6 -0
- package/dist/packages/mcp/src/tools/list-sources.js +76 -0
- package/dist/packages/mcp/src/tools/search-docs.d.ts +6 -0
- package/dist/packages/mcp/src/tools/search-docs.js +113 -0
- package/dist/packages/mcp/src/tools/types.d.ts +22 -0
- package/dist/packages/mcp/src/tools/types.js +1 -0
- package/dist/packages/mcp/src/transports/http.d.ts +31 -0
- package/dist/packages/mcp/src/transports/http.js +215 -0
- package/dist/packages/mcp/src/transports/stdio.d.ts +22 -0
- package/dist/packages/mcp/src/transports/stdio.js +86 -0
- package/{packages/mcp/src/transports/types.ts → dist/packages/mcp/src/transports/types.d.ts} +2 -3
- package/dist/packages/mcp/src/transports/types.js +1 -0
- package/dist/packages/mcp/src/types.d.ts +89 -0
- package/dist/packages/mcp/src/types.js +7 -0
- package/dist/packages/normalizer/src/example-indexer.d.ts +5 -0
- package/dist/packages/normalizer/src/example-indexer.js +200 -0
- package/dist/packages/normalizer/src/html.d.ts +13 -0
- package/dist/packages/normalizer/src/html.js +221 -0
- package/{packages/normalizer/src/index.ts → dist/packages/normalizer/src/index.d.ts} +0 -1
- package/dist/packages/normalizer/src/index.js +7 -0
- package/dist/packages/normalizer/src/llms.d.ts +3 -0
- package/dist/packages/normalizer/src/llms.js +71 -0
- package/dist/packages/normalizer/src/openapi/endpoint-parser.d.ts +11 -0
- package/dist/packages/normalizer/src/openapi/endpoint-parser.js +357 -0
- package/dist/packages/normalizer/src/openapi/schema-resolver.d.ts +10 -0
- package/dist/packages/normalizer/src/openapi/schema-resolver.js +82 -0
- package/dist/packages/normalizer/src/openapi.js +2 -0
- package/dist/packages/normalizer/src/page.d.ts +13 -0
- package/dist/packages/normalizer/src/page.js +150 -0
- package/dist/packages/normalizer/src/pitfall-extractor.d.ts +6 -0
- package/dist/packages/normalizer/src/pitfall-extractor.js +153 -0
- package/dist/packages/normalizer/src/slicer.d.ts +30 -0
- package/dist/packages/normalizer/src/slicer.js +360 -0
- package/dist/packages/retrieval/src/engine.d.ts +17 -0
- package/dist/packages/retrieval/src/engine.js +93 -0
- package/{packages/retrieval/src/index.ts → dist/packages/retrieval/src/index.d.ts} +0 -1
- package/dist/packages/retrieval/src/index.js +6 -0
- package/dist/packages/retrieval/src/intent.d.ts +6 -0
- package/dist/packages/retrieval/src/intent.js +39 -0
- package/dist/packages/retrieval/src/packer.d.ts +2 -0
- package/dist/packages/retrieval/src/packer.js +108 -0
- package/dist/packages/retrieval/src/recipe-engine.d.ts +18 -0
- package/dist/packages/retrieval/src/recipe-engine.js +265 -0
- package/dist/packages/retrieval/src/scorer.d.ts +13 -0
- package/dist/packages/retrieval/src/scorer.js +110 -0
- package/dist/packages/retrieval/src/weights.d.ts +3 -0
- package/dist/packages/retrieval/src/weights.js +28 -0
- package/dist/packages/security/src/annotations.d.ts +10 -0
- package/dist/packages/security/src/annotations.js +100 -0
- package/dist/packages/security/src/index.js +2 -0
- package/dist/packages/security/src/ssrf.d.ts +17 -0
- package/dist/packages/security/src/ssrf.js +132 -0
- package/dist/packages/shared/src/errors.d.ts +22 -0
- package/dist/packages/shared/src/errors.js +44 -0
- package/dist/packages/shared/src/hashing.d.ts +3 -0
- package/dist/packages/shared/src/hashing.js +21 -0
- package/dist/packages/shared/src/index.js +3 -0
- package/dist/packages/shared/src/types.d.ts +715 -0
- package/dist/packages/shared/src/types.js +1 -0
- package/dist/packages/storage/src/db.d.ts +11 -0
- package/dist/packages/storage/src/db.js +128 -0
- package/dist/packages/storage/src/index.js +10 -0
- package/dist/packages/storage/src/interfaces.d.ts +83 -0
- package/dist/packages/storage/src/interfaces.js +1 -0
- package/dist/packages/storage/src/repositories/api-repository.d.ts +16 -0
- package/dist/packages/storage/src/repositories/api-repository.js +169 -0
- package/dist/packages/storage/src/repositories/chunk-repository.d.ts +32 -0
- package/dist/packages/storage/src/repositories/chunk-repository.js +250 -0
- package/dist/packages/storage/src/repositories/example-repository.d.ts +16 -0
- package/dist/packages/storage/src/repositories/example-repository.js +158 -0
- package/dist/packages/storage/src/repositories/page-repository.d.ts +16 -0
- package/dist/packages/storage/src/repositories/page-repository.js +161 -0
- package/dist/packages/storage/src/repositories/pitfall-repository.d.ts +15 -0
- package/dist/packages/storage/src/repositories/pitfall-repository.js +144 -0
- package/dist/packages/storage/src/repositories/source-repository.d.ts +33 -0
- package/dist/packages/storage/src/repositories/source-repository.js +153 -0
- package/dist/packages/storage/src/repository.d.ts +92 -0
- package/dist/packages/storage/src/repository.js +157 -0
- package/dist/packages/storage/src/schema.d.ts +2 -0
- package/{packages/storage/src/schema.ts → dist/packages/storage/src/schema.js} +0 -3
- package/dist/packages/storage/src/search-tokens.d.ts +6 -0
- package/dist/packages/storage/src/search-tokens.js +26 -0
- package/dist/packages/verification/src/diff-engine.d.ts +18 -0
- package/dist/packages/verification/src/diff-engine.js +218 -0
- package/dist/packages/verification/src/extractor.d.ts +29 -0
- package/dist/packages/verification/src/extractor.js +302 -0
- package/dist/packages/verification/src/impact-scanner.d.ts +9 -0
- package/dist/packages/verification/src/impact-scanner.js +181 -0
- package/dist/packages/verification/src/index.js +5 -0
- package/dist/packages/verification/src/services.d.ts +55 -0
- package/dist/packages/verification/src/services.js +189 -0
- package/dist/packages/verification/src/verifier.d.ts +15 -0
- package/dist/packages/verification/src/verifier.js +315 -0
- package/dist/packages/workspace/src/detector.d.ts +7 -0
- package/dist/packages/workspace/src/detector.js +117 -0
- package/dist/packages/workspace/src/ecosystems/cargo.d.ts +10 -0
- package/dist/packages/workspace/src/ecosystems/cargo.js +69 -0
- package/dist/packages/workspace/src/ecosystems/composer.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/composer.js +40 -0
- package/dist/packages/workspace/src/ecosystems/go.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/go.js +49 -0
- package/{packages/workspace/src/ecosystems/index.ts → dist/packages/workspace/src/ecosystems/index.d.ts} +2 -24
- package/dist/packages/workspace/src/ecosystems/index.js +21 -0
- package/dist/packages/workspace/src/ecosystems/maven.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/maven.js +28 -0
- package/dist/packages/workspace/src/ecosystems/npm.d.ts +10 -0
- package/dist/packages/workspace/src/ecosystems/npm.js +73 -0
- package/dist/packages/workspace/src/ecosystems/pub.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/pub.js +34 -0
- package/dist/packages/workspace/src/ecosystems/pypi.d.ts +9 -0
- package/dist/packages/workspace/src/ecosystems/pypi.js +94 -0
- package/dist/packages/workspace/src/ecosystems/rubygems.d.ts +7 -0
- package/dist/packages/workspace/src/ecosystems/rubygems.js +25 -0
- package/dist/packages/workspace/src/ecosystems/types.d.ts +9 -0
- package/dist/packages/workspace/src/ecosystems/types.js +1 -0
- package/dist/packages/workspace/src/index.js +5 -0
- package/dist/packages/workspace/src/lockfile.d.ts +21 -0
- package/dist/packages/workspace/src/lockfile.js +153 -0
- package/dist/packages/workspace/src/resolver.d.ts +39 -0
- package/dist/packages/workspace/src/resolver.js +164 -0
- package/dist/packages/workspace/src/semver.d.ts +33 -0
- package/dist/packages/workspace/src/semver.js +235 -0
- package/package.json +13 -9
- package/apps/cli/bin/docorbit.js +0 -8
- package/apps/cli/src/commands/add.ts +0 -44
- package/apps/cli/src/commands/api.ts +0 -38
- package/apps/cli/src/commands/context.ts +0 -47
- package/apps/cli/src/commands/dashboard.ts +0 -55
- package/apps/cli/src/commands/diff.ts +0 -30
- package/apps/cli/src/commands/evaluate.ts +0 -133
- package/apps/cli/src/commands/examples.ts +0 -39
- package/apps/cli/src/commands/export.ts +0 -89
- package/apps/cli/src/commands/impact.ts +0 -31
- package/apps/cli/src/commands/init.ts +0 -69
- package/apps/cli/src/commands/inspect.ts +0 -30
- package/apps/cli/src/commands/mcp.ts +0 -72
- package/apps/cli/src/commands/pitfalls.ts +0 -38
- package/apps/cli/src/commands/recipes.ts +0 -35
- package/apps/cli/src/commands/search.ts +0 -48
- package/apps/cli/src/commands/update.ts +0 -73
- package/apps/cli/src/commands/verify.ts +0 -48
- package/apps/cli/src/formatters/colors.ts +0 -23
- package/apps/cli/src/formatters/inspection.ts +0 -102
- package/apps/cli/src/formatters/knowledge.ts +0 -272
- package/apps/cli/src/formatters/retrieval.ts +0 -74
- package/apps/cli/src/formatters/verification.ts +0 -126
- package/apps/cli/src/index.ts +0 -409
- package/packages/core/src/dashboard/server.ts +0 -314
- package/packages/core/src/implementation-service.ts +0 -451
- package/packages/core/src/inspector.ts +0 -71
- package/packages/core/src/pipeline.ts +0 -331
- package/packages/crawler/src/config.ts +0 -12
- package/packages/crawler/src/fetcher.ts +0 -185
- package/packages/discovery/src/index.ts +0 -31
- package/packages/discovery/src/provider.ts +0 -47
- package/packages/discovery/src/providers/generic.ts +0 -98
- package/packages/discovery/src/providers/github.ts +0 -61
- package/packages/discovery/src/providers/llms-txt.ts +0 -73
- package/packages/discovery/src/providers/markdown.ts +0 -48
- package/packages/discovery/src/providers/openapi.ts +0 -91
- package/packages/discovery/src/providers/sitemap.ts +0 -62
- package/packages/discovery/src/providers/skill.ts +0 -54
- package/packages/discovery/src/ranker.ts +0 -123
- package/packages/evaluation/src/dataset.ts +0 -963
- package/packages/evaluation/src/runner.ts +0 -241
- package/packages/evaluation/src/strategies/context7-runner.ts +0 -269
- package/packages/evaluation/src/strategies/docorbit-runner.ts +0 -228
- package/packages/evaluation/src/strategies/firecrawl-runner.ts +0 -172
- package/packages/evaluation/src/strategies/web-search-runner.ts +0 -194
- package/packages/evaluation/src/types.ts +0 -34
- package/packages/evaluation/src/version-matcher.ts +0 -73
- package/packages/export/src/agents-md.ts +0 -200
- package/packages/export/src/claude-md.ts +0 -141
- package/packages/export/src/docs-map.ts +0 -150
- package/packages/export/src/llms-txt.ts +0 -96
- package/packages/export/src/service.ts +0 -250
- package/packages/export/src/skill-md.ts +0 -128
- package/packages/mcp/src/resources/index.ts +0 -189
- package/packages/mcp/src/server.ts +0 -278
- package/packages/mcp/src/tools/analyze-impact.ts +0 -74
- package/packages/mcp/src/tools/check-api.ts +0 -86
- package/packages/mcp/src/tools/diff-docs.ts +0 -68
- package/packages/mcp/src/tools/export-context.ts +0 -73
- package/packages/mcp/src/tools/find-api.ts +0 -99
- package/packages/mcp/src/tools/find-example.ts +0 -100
- package/packages/mcp/src/tools/find-pitfall.ts +0 -94
- package/packages/mcp/src/tools/find-recipe.ts +0 -98
- package/packages/mcp/src/tools/get-doc.ts +0 -130
- package/packages/mcp/src/tools/get-docs-map.ts +0 -64
- package/packages/mcp/src/tools/get-version.ts +0 -118
- package/packages/mcp/src/tools/implementation-context.ts +0 -88
- package/packages/mcp/src/tools/index.ts +0 -59
- package/packages/mcp/src/tools/list-sources.ts +0 -85
- package/packages/mcp/src/tools/search-docs.ts +0 -123
- package/packages/mcp/src/tools/types.ts +0 -28
- package/packages/mcp/src/transports/http.ts +0 -256
- package/packages/mcp/src/transports/stdio.ts +0 -105
- package/packages/mcp/src/types.ts +0 -102
- package/packages/normalizer/src/example-indexer.ts +0 -240
- package/packages/normalizer/src/html.ts +0 -253
- package/packages/normalizer/src/llms.ts +0 -83
- package/packages/normalizer/src/openapi/endpoint-parser.ts +0 -406
- package/packages/normalizer/src/openapi/schema-resolver.ts +0 -111
- package/packages/normalizer/src/page.ts +0 -184
- package/packages/normalizer/src/pitfall-extractor.ts +0 -190
- package/packages/normalizer/src/slicer.ts +0 -455
- package/packages/retrieval/src/engine.ts +0 -120
- package/packages/retrieval/src/intent.ts +0 -43
- package/packages/retrieval/src/packer.ts +0 -145
- package/packages/retrieval/src/recipe-engine.ts +0 -313
- package/packages/retrieval/src/scorer.ts +0 -139
- package/packages/retrieval/src/weights.ts +0 -31
- package/packages/security/src/annotations.ts +0 -112
- package/packages/security/src/ssrf.ts +0 -153
- package/packages/shared/src/errors.ts +0 -53
- package/packages/shared/src/hashing.ts +0 -23
- package/packages/shared/src/types.ts +0 -881
- package/packages/storage/src/db.ts +0 -72
- package/packages/storage/src/interfaces.ts +0 -115
- package/packages/storage/src/repositories/api-repository.ts +0 -219
- package/packages/storage/src/repositories/chunk-repository.ts +0 -316
- package/packages/storage/src/repositories/example-repository.ts +0 -206
- package/packages/storage/src/repositories/page-repository.ts +0 -205
- package/packages/storage/src/repositories/pitfall-repository.ts +0 -188
- package/packages/storage/src/repositories/source-repository.ts +0 -205
- package/packages/storage/src/repository.ts +0 -256
- package/packages/storage/src/search-tokens.ts +0 -28
- package/packages/verification/src/diff-engine.ts +0 -258
- package/packages/verification/src/extractor.ts +0 -339
- package/packages/verification/src/impact-scanner.ts +0 -203
- package/packages/verification/src/services.ts +0 -238
- package/packages/verification/src/verifier.ts +0 -375
- package/packages/workspace/src/detector.ts +0 -143
- package/packages/workspace/src/ecosystems/cargo.ts +0 -84
- package/packages/workspace/src/ecosystems/composer.ts +0 -42
- package/packages/workspace/src/ecosystems/go.ts +0 -54
- package/packages/workspace/src/ecosystems/maven.ts +0 -34
- package/packages/workspace/src/ecosystems/npm.ts +0 -83
- package/packages/workspace/src/ecosystems/pub.ts +0 -40
- package/packages/workspace/src/ecosystems/pypi.ts +0 -100
- package/packages/workspace/src/ecosystems/rubygems.ts +0 -30
- package/packages/workspace/src/ecosystems/types.ts +0 -18
- package/packages/workspace/src/lockfile.ts +0 -194
- package/packages/workspace/src/resolver.ts +0 -234
- package/packages/workspace/src/semver.ts +0 -259
- /package/{packages/crawler/src/index.ts → dist/packages/crawler/src/index.d.ts} +0 -0
- /package/{packages/evaluation/src/index.ts → dist/packages/evaluation/src/index.d.ts} +0 -0
- /package/{packages/export/src/index.ts → dist/packages/export/src/index.d.ts} +0 -0
- /package/{packages/normalizer/src/openapi.ts → dist/packages/normalizer/src/openapi.d.ts} +0 -0
- /package/{packages/security/src/index.ts → dist/packages/security/src/index.d.ts} +0 -0
- /package/{packages/shared/src/index.ts → dist/packages/shared/src/index.d.ts} +0 -0
- /package/{packages/storage/src/index.ts → dist/packages/storage/src/index.d.ts} +0 -0
- /package/{packages/verification/src/index.ts → dist/packages/verification/src/index.d.ts} +0 -0
- /package/{packages/workspace/src/index.ts → dist/packages/workspace/src/index.d.ts} +0 -0
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
SearchResult,
|
|
3
|
-
SearchOptions,
|
|
4
|
-
ContextPackage,
|
|
5
|
-
ContextOptions,
|
|
6
|
-
ScoringWeights,
|
|
7
|
-
SourceAuthority,
|
|
8
|
-
} from '../../shared/src/index.ts';
|
|
9
|
-
import { DocOrbitRepository } from '../../storage/src/index.ts';
|
|
10
|
-
import { resolveScoringWeights } from './weights.ts';
|
|
11
|
-
import { detectQueryIntent } from './intent.ts';
|
|
12
|
-
import { scoreChunkCandidate } from './scorer.ts';
|
|
13
|
-
import { packContext } from './packer.ts';
|
|
14
|
-
import { resolveProjectContext } from '../../workspace/src/index.ts';
|
|
15
|
-
|
|
16
|
-
export class RetrievalEngine {
|
|
17
|
-
private repository: DocOrbitRepository;
|
|
18
|
-
private defaultWeights: ScoringWeights;
|
|
19
|
-
|
|
20
|
-
constructor(repository: DocOrbitRepository, defaultWeights?: Partial<ScoringWeights>) {
|
|
21
|
-
this.repository = repository;
|
|
22
|
-
this.defaultWeights = resolveScoringWeights(defaultWeights);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Deterministic hybrid search combining FTS5 lexical matching, exact phrases,
|
|
27
|
-
* title/breadcrumb boosts, shallow symbol matches, intent weighting, and authority.
|
|
28
|
-
*/
|
|
29
|
-
async search(query: string, options: SearchOptions = {}): Promise<SearchResult[]> {
|
|
30
|
-
const intent = options.intent || detectQueryIntent(query);
|
|
31
|
-
const weights = resolveScoringWeights(options.weights || this.defaultWeights);
|
|
32
|
-
const limit = options.limit || 10;
|
|
33
|
-
|
|
34
|
-
let targetDocVersion = options.docVersion;
|
|
35
|
-
|
|
36
|
-
if (options.projectDir) {
|
|
37
|
-
const projContext = resolveProjectContext(options.projectDir, query, this.repository);
|
|
38
|
-
if (projContext.matchedDependency && !targetDocVersion) {
|
|
39
|
-
targetDocVersion = projContext.matchedDependency.targetDocVersion;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Fetch candidate pool from FTS5 with extra headroom for re-ranking
|
|
44
|
-
const candidates = this.repository.searchChunksFts(query, {
|
|
45
|
-
limit: Math.max(limit * 3, 30),
|
|
46
|
-
snapshotId: options.snapshotId,
|
|
47
|
-
chunkType: options.chunkType,
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
if (candidates.length === 0) {
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const scoredResults: SearchResult[] = [];
|
|
55
|
-
|
|
56
|
-
// Cache source authority per page
|
|
57
|
-
const pageAuthorityCache = new Map<string, SourceAuthority>();
|
|
58
|
-
|
|
59
|
-
for (const item of candidates) {
|
|
60
|
-
let authority: SourceAuthority = 'official';
|
|
61
|
-
const pageId = item.chunk.pageId;
|
|
62
|
-
|
|
63
|
-
if (!pageAuthorityCache.has(pageId)) {
|
|
64
|
-
const page = this.repository.getPage(pageId);
|
|
65
|
-
if (page?.sourceId) {
|
|
66
|
-
const src = this.repository.getSource(page.sourceId);
|
|
67
|
-
if (src?.authority) {
|
|
68
|
-
authority = src.authority;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
pageAuthorityCache.set(pageId, authority);
|
|
72
|
-
} else {
|
|
73
|
-
authority = pageAuthorityCache.get(pageId)!;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const scored = scoreChunkCandidate({
|
|
77
|
-
chunk: item.chunk,
|
|
78
|
-
ftsRank: item.ftsRank,
|
|
79
|
-
symbols: item.symbols,
|
|
80
|
-
codeSnippets: item.codeSnippets,
|
|
81
|
-
query,
|
|
82
|
-
intent,
|
|
83
|
-
authority,
|
|
84
|
-
targetDocVersion,
|
|
85
|
-
weights,
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
if (options.minScore !== undefined && scored.score < options.minScore) {
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
scoredResults.push(scored);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Sort by score descending
|
|
96
|
-
scoredResults.sort((a, b) => b.score - a.score);
|
|
97
|
-
|
|
98
|
-
return scoredResults.slice(0, limit);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Assembles a context package tailored for AI coding agents, optimizing for
|
|
103
|
-
* relevance + coverage - redundancy within a strict token budget.
|
|
104
|
-
*/
|
|
105
|
-
async buildContext(task: string, options: ContextOptions = {}): Promise<ContextPackage> {
|
|
106
|
-
const intent = options.intent || detectQueryIntent(task);
|
|
107
|
-
|
|
108
|
-
// Retrieve broad candidate set
|
|
109
|
-
const candidates = await this.search(task, {
|
|
110
|
-
limit: (options.maxChunks || 15) * 2,
|
|
111
|
-
snapshotId: options.snapshotId,
|
|
112
|
-
docVersion: options.docVersion,
|
|
113
|
-
projectDir: options.projectDir,
|
|
114
|
-
weights: options.weights,
|
|
115
|
-
intent,
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
return packContext(task, candidates, intent, options);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { QueryIntent } from '../../shared/src/index.ts';
|
|
2
|
-
|
|
3
|
-
const INTENT_PATTERNS: Array<{ intent: QueryIntent; regex: RegExp }> = [
|
|
4
|
-
{
|
|
5
|
-
intent: 'troubleshooting',
|
|
6
|
-
regex: /\b(error|failed|failure|exception|crash|fix|debug|issue|cannot|unable|why does|broken|invalid|429|401|403|404|500)\b/i,
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
intent: 'examples',
|
|
10
|
-
regex: /\b(example|examples|sample|samples|snippet|snippets|tutorial|how to|quickstart)\b/i,
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
intent: 'configuration',
|
|
14
|
-
regex: /\b(config|configuration|settings|setup|env|\.env|environment|options|flags?|port|credentials|apikey|api_key)\b/i,
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
intent: 'api',
|
|
18
|
-
regex: /\b(api|endpoint|endpoints|parameters?|request|response|headers?|payload|schema|rest|graphql|status code)\b/i,
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
intent: 'implementation',
|
|
22
|
-
regex: /\b(implement|implementation|build|create|integrate|integration|workflow|handler|webhook|callback|oauth|pipeline)\b/i,
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
intent: 'conceptual',
|
|
26
|
-
regex: /\b(architecture|overview|what is|concept|concepts|design|lifecycle|philosophy|background|understand)\b/i,
|
|
27
|
-
},
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Deterministically detects query intent from task or query text.
|
|
33
|
-
* Falls back to 'conceptual' when no specific pattern matches.
|
|
34
|
-
*/
|
|
35
|
-
export function detectQueryIntent(query: string): QueryIntent {
|
|
36
|
-
const normalized = query.toLowerCase();
|
|
37
|
-
for (const { intent, regex } of INTENT_PATTERNS) {
|
|
38
|
-
if (regex.test(normalized)) {
|
|
39
|
-
return intent;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return 'conceptual';
|
|
43
|
-
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
SearchResult,
|
|
3
|
-
DocumentChunk,
|
|
4
|
-
ContextPackage,
|
|
5
|
-
ContextOptions,
|
|
6
|
-
QueryIntent,
|
|
7
|
-
} from '../../shared/src/index.ts';
|
|
8
|
-
|
|
9
|
-
export function packContext(
|
|
10
|
-
task: string,
|
|
11
|
-
candidates: SearchResult[],
|
|
12
|
-
detectedIntent: QueryIntent,
|
|
13
|
-
options: ContextOptions = {}
|
|
14
|
-
): ContextPackage {
|
|
15
|
-
const tokenBudget = options.tokenBudget || 3000;
|
|
16
|
-
const maxChunks = options.maxChunks || 15;
|
|
17
|
-
const redundancyPenalty = options.redundancyPenalty ?? 0.35;
|
|
18
|
-
|
|
19
|
-
const selectedChunks: DocumentChunk[] = [];
|
|
20
|
-
const selectedChunkIds = new Set<string>();
|
|
21
|
-
const selectedSectionCounts = new Map<string, number>();
|
|
22
|
-
const selectedPages = new Set<string>();
|
|
23
|
-
const sourcesSet = new Set<string>();
|
|
24
|
-
const warnings: string[] = [];
|
|
25
|
-
|
|
26
|
-
let totalEstimatedTokens = 0;
|
|
27
|
-
const remainingCandidates = [...candidates];
|
|
28
|
-
|
|
29
|
-
while (remainingCandidates.length > 0 && selectedChunks.length < maxChunks) {
|
|
30
|
-
let bestIdx = -1;
|
|
31
|
-
let bestUtility = -Infinity;
|
|
32
|
-
|
|
33
|
-
for (let i = 0; i < remainingCandidates.length; i++) {
|
|
34
|
-
const candidate = remainingCandidates[i];
|
|
35
|
-
const chunk = candidate.chunk;
|
|
36
|
-
|
|
37
|
-
// Check if it strictly fits within the remaining token budget
|
|
38
|
-
if (totalEstimatedTokens + chunk.tokenEstimate > tokenBudget) {
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const sectionKey = `${chunk.pageId}:${chunk.sectionPath.join(' > ')}`;
|
|
44
|
-
const sectionOverlap = selectedSectionCounts.get(sectionKey) || 0;
|
|
45
|
-
|
|
46
|
-
// Penalize multiple chunks from the exact same section to encourage diversity/coverage
|
|
47
|
-
const redundancyFactor = Math.pow(1 - redundancyPenalty, sectionOverlap);
|
|
48
|
-
|
|
49
|
-
// Reward discovering new pages / sections (coverage bonus)
|
|
50
|
-
const coverageMultiplier = selectedPages.has(chunk.pageId) ? 1.0 : 1.25;
|
|
51
|
-
|
|
52
|
-
const utility = candidate.score * redundancyFactor * coverageMultiplier;
|
|
53
|
-
|
|
54
|
-
if (utility > bestUtility) {
|
|
55
|
-
bestUtility = utility;
|
|
56
|
-
bestIdx = i;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (bestIdx === -1) {
|
|
61
|
-
// No remaining candidate fits within the remaining token budget
|
|
62
|
-
break;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const chosen = remainingCandidates.splice(bestIdx, 1)[0];
|
|
66
|
-
const chunk = chosen.chunk;
|
|
67
|
-
|
|
68
|
-
selectedChunks.push(chunk);
|
|
69
|
-
selectedChunkIds.add(chunk.id);
|
|
70
|
-
|
|
71
|
-
const sectionKey = `${chunk.pageId}:${chunk.sectionPath.join(' > ')}`;
|
|
72
|
-
selectedSectionCounts.set(sectionKey, (selectedSectionCounts.get(sectionKey) || 0) + 1);
|
|
73
|
-
selectedPages.add(chunk.pageId);
|
|
74
|
-
|
|
75
|
-
if (chunk.provenance?.targetUrl) {
|
|
76
|
-
sourcesSet.add(chunk.provenance.targetUrl);
|
|
77
|
-
} else if (chunk.provenance?.sourceUrl) {
|
|
78
|
-
sourcesSet.add(chunk.provenance.sourceUrl);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
totalEstimatedTokens += chunk.tokenEstimate;
|
|
82
|
-
|
|
83
|
-
// If chunk is a warning, register it in top-level warnings
|
|
84
|
-
if (chunk.chunkType === 'warning') {
|
|
85
|
-
warnings.push(`[${chunk.sectionPath.join(' > ')}]: ${chunk.content.slice(0, 150)}...`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Group chunks by page in order of page first appearance in selectedChunks (most relevant page first)
|
|
90
|
-
const pageOrder = new Map<string, number>();
|
|
91
|
-
for (let i = 0; i < selectedChunks.length; i++) {
|
|
92
|
-
const pId = selectedChunks[i].pageId;
|
|
93
|
-
if (!pageOrder.has(pId)) {
|
|
94
|
-
pageOrder.set(pId, pageOrder.size);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const sortedChunks = [...selectedChunks].sort((a, b) => {
|
|
99
|
-
const pOrderA = pageOrder.get(a.pageId) ?? 0;
|
|
100
|
-
const pOrderB = pageOrder.get(b.pageId) ?? 0;
|
|
101
|
-
if (pOrderA !== pOrderB) return pOrderA - pOrderB;
|
|
102
|
-
return a.ordinal - b.ordinal;
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
// Build agent-facing Markdown package
|
|
106
|
-
const lines: string[] = [];
|
|
107
|
-
lines.push(`# Context Package: ${task}`);
|
|
108
|
-
lines.push(`- **Detected Intent**: \`${detectedIntent}\``);
|
|
109
|
-
lines.push(`- **Estimated Tokens**: ~${totalEstimatedTokens} / ${tokenBudget} tokens (heuristic estimate)`);
|
|
110
|
-
lines.push(`- **Sources Included**: ${sourcesSet.size > 0 ? Array.from(sourcesSet).map(s => `[${s}](${s})`).join(', ') : 'Local documentation'}`);
|
|
111
|
-
|
|
112
|
-
if (warnings.length > 0) {
|
|
113
|
-
lines.push('\n> [!WARNING]');
|
|
114
|
-
lines.push('> **Relevant Advisories & Caveats**:');
|
|
115
|
-
for (const w of warnings) {
|
|
116
|
-
lines.push(`> - ${w}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
lines.push('\n---\n');
|
|
121
|
-
|
|
122
|
-
for (const chunk of sortedChunks) {
|
|
123
|
-
const breadcrumb = chunk.sectionPath.length > 0 ? chunk.sectionPath.join(' > ') : (chunk.title || 'General');
|
|
124
|
-
lines.push(`### ${breadcrumb}`);
|
|
125
|
-
lines.push(`*Type: \`${chunk.chunkType}\` | Est. Tokens: ~${chunk.tokenEstimate}*`);
|
|
126
|
-
lines.push('\n' + chunk.content.trim() + '\n');
|
|
127
|
-
if (chunk.provenance?.sourceUrl) {
|
|
128
|
-
lines.push(`*Source: ${chunk.provenance.sourceUrl}*\n`);
|
|
129
|
-
}
|
|
130
|
-
lines.push('---\n');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const markdown = lines.join('\n');
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
task,
|
|
137
|
-
detectedIntent,
|
|
138
|
-
totalEstimatedTokens,
|
|
139
|
-
tokenBudget,
|
|
140
|
-
chunks: sortedChunks,
|
|
141
|
-
markdown,
|
|
142
|
-
sources: Array.from(sourcesSet),
|
|
143
|
-
warnings,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import type {
|
|
3
|
-
Recipe,
|
|
4
|
-
RecipeStep,
|
|
5
|
-
RecipeValidationStep,
|
|
6
|
-
EvidenceLevel,
|
|
7
|
-
ApiEndpoint,
|
|
8
|
-
IndexedExample,
|
|
9
|
-
Pitfall,
|
|
10
|
-
} from '../../shared/src/index.ts';
|
|
11
|
-
import { DocOrbitRepository } from '../../storage/src/index.ts';
|
|
12
|
-
import { RetrievalEngine } from './engine.ts';
|
|
13
|
-
import { resolveProjectContext } from '../../workspace/src/index.ts';
|
|
14
|
-
|
|
15
|
-
export interface RecipeOptions {
|
|
16
|
-
docVersion?: string;
|
|
17
|
-
projectDir?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class RecipeEngine {
|
|
21
|
-
private repository: DocOrbitRepository;
|
|
22
|
-
private retrievalEngine: RetrievalEngine;
|
|
23
|
-
|
|
24
|
-
constructor(repository: DocOrbitRepository, retrievalEngine?: RetrievalEngine) {
|
|
25
|
-
this.repository = repository;
|
|
26
|
-
this.retrievalEngine = retrievalEngine || new RetrievalEngine(repository);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Deterministically compiles an implementation recipe grounded strictly in indexed evidence.
|
|
31
|
-
* Distinguishes documented facts, inferred relationships, and missing information.
|
|
32
|
-
* Never invents APIs, steps, prerequisites, or validation steps.
|
|
33
|
-
*/
|
|
34
|
-
async assembleRecipe(goal: string, options: RecipeOptions = {}): Promise<Recipe> {
|
|
35
|
-
const cleanGoal = goal.trim();
|
|
36
|
-
let effectiveDocVersion = options.docVersion;
|
|
37
|
-
|
|
38
|
-
// Resolve project and version context if projectDir is provided
|
|
39
|
-
if (options.projectDir) {
|
|
40
|
-
const projContext = resolveProjectContext(options.projectDir, cleanGoal, this.repository);
|
|
41
|
-
if (projContext.matchedDependency && !effectiveDocVersion) {
|
|
42
|
-
effectiveDocVersion = projContext.matchedDependency.targetDocVersion;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// 1. Query candidate API endpoints, examples, pitfalls, and search chunks
|
|
47
|
-
const endpoints = this.repository.searchApiEndpoints(cleanGoal, {
|
|
48
|
-
docVersion: effectiveDocVersion,
|
|
49
|
-
limit: 10,
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
const examples = this.repository.searchIndexedExamples(cleanGoal, {
|
|
53
|
-
docVersion: effectiveDocVersion,
|
|
54
|
-
limit: 10,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const pitfalls = this.repository.searchPitfalls(cleanGoal, {
|
|
58
|
-
docVersion: effectiveDocVersion,
|
|
59
|
-
limit: 10,
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const searchResults = await this.retrievalEngine.search(cleanGoal, {
|
|
63
|
-
docVersion: effectiveDocVersion,
|
|
64
|
-
limit: 10,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// 2. Collect unique source URLs
|
|
68
|
-
const sourcesSet = new Set<string>();
|
|
69
|
-
for (const ep of endpoints) {
|
|
70
|
-
if (ep.provenance?.sourceUrl) sourcesSet.add(ep.provenance.sourceUrl);
|
|
71
|
-
}
|
|
72
|
-
for (const ex of examples) {
|
|
73
|
-
if (ex.sourceUrl) sourcesSet.add(ex.sourceUrl);
|
|
74
|
-
}
|
|
75
|
-
for (const pf of pitfalls) {
|
|
76
|
-
if (pf.provenance?.sourceUrl) sourcesSet.add(pf.provenance.sourceUrl);
|
|
77
|
-
}
|
|
78
|
-
for (const sr of searchResults) {
|
|
79
|
-
if (sr.chunk.provenance?.sourceUrl) sourcesSet.add(sr.chunk.provenance.sourceUrl);
|
|
80
|
-
}
|
|
81
|
-
const sources = Array.from(sourcesSet);
|
|
82
|
-
|
|
83
|
-
// 3. Assemble Prerequisites strictly from documented requirements
|
|
84
|
-
const prerequisites: Array<{ text: string; evidenceLevel: EvidenceLevel; sourceUrl?: string }> = [];
|
|
85
|
-
|
|
86
|
-
// Check required_config or permission pitfalls
|
|
87
|
-
for (const pf of pitfalls) {
|
|
88
|
-
if (pf.kind === 'required_config' || pf.kind === 'permission') {
|
|
89
|
-
prerequisites.push({
|
|
90
|
-
text: `${pf.title}: ${pf.content}`,
|
|
91
|
-
evidenceLevel: 'documented_fact',
|
|
92
|
-
sourceUrl: pf.provenance?.sourceUrl,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Check chunks with prerequisite/setup headings (only relevant chunks with score >= 5.0)
|
|
98
|
-
for (const sr of searchResults.filter(s => s.score >= 5.0)) {
|
|
99
|
-
const headingText = (sr.chunk.title || sr.chunk.sectionPath.join(' ')).toLowerCase();
|
|
100
|
-
if (headingText.includes('prerequisite') || headingText.includes('before you begin') || headingText.includes('requirements')) {
|
|
101
|
-
const textSnippet = sr.chunk.content.split('\n')[0].trim();
|
|
102
|
-
if (textSnippet && !prerequisites.some(p => p.text === textSnippet)) {
|
|
103
|
-
prerequisites.push({
|
|
104
|
-
text: textSnippet,
|
|
105
|
-
evidenceLevel: 'documented_fact',
|
|
106
|
-
sourceUrl: sr.chunk.provenance?.sourceUrl,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// 4. Assemble Ordered Steps
|
|
113
|
-
const orderedSteps: RecipeStep[] = [];
|
|
114
|
-
const usedApis = new Set<string>();
|
|
115
|
-
const usedExamples = new Set<string>();
|
|
116
|
-
const usedPitfalls = new Set<string>();
|
|
117
|
-
let stepNumber = 1;
|
|
118
|
-
|
|
119
|
-
// A. Setup / Client Initialization Step (if documented in examples)
|
|
120
|
-
const initExample = examples.find(ex =>
|
|
121
|
-
/(?:new\s+\w+|initialize|config(?:ure)?|createClient|express\(\)|FastAPI\()/i.test(ex.code)
|
|
122
|
-
);
|
|
123
|
-
if (initExample) {
|
|
124
|
-
orderedSteps.push({
|
|
125
|
-
step: stepNumber++,
|
|
126
|
-
title: `Initialize Client / Service (${initExample.framework || initExample.language})`,
|
|
127
|
-
description: `Configure and initialize client instance as documented in ${initExample.task}`,
|
|
128
|
-
evidenceLevel: 'documented_fact',
|
|
129
|
-
exampleCode: initExample.code,
|
|
130
|
-
sourceUrl: initExample.sourceUrl,
|
|
131
|
-
sourceChunkIds: initExample.chunkId ? [initExample.chunkId] : undefined,
|
|
132
|
-
});
|
|
133
|
-
usedExamples.add(initExample.id);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// B. Primary API Actions (Documented Fact)
|
|
137
|
-
for (const ep of endpoints) {
|
|
138
|
-
const apiStr = `${ep.method.toUpperCase()} ${ep.path}`;
|
|
139
|
-
if (usedApis.has(apiStr)) continue;
|
|
140
|
-
usedApis.add(apiStr);
|
|
141
|
-
|
|
142
|
-
// Find matching code example for this API
|
|
143
|
-
const matchingEx = examples.find(ex =>
|
|
144
|
-
!usedExamples.has(ex.id) &&
|
|
145
|
-
(ex.relatedApi === apiStr || ex.code.includes(ep.path) || (ep.operationId && ex.code.includes(ep.operationId)))
|
|
146
|
-
);
|
|
147
|
-
if (matchingEx) usedExamples.add(matchingEx.id);
|
|
148
|
-
|
|
149
|
-
// Find matching pitfalls for this API
|
|
150
|
-
const matchingPfs = pitfalls.filter(pf =>
|
|
151
|
-
pf.relatedApi === apiStr ||
|
|
152
|
-
(ep.deprecated && pf.kind === 'deprecated') ||
|
|
153
|
-
(pf.kind === 'rate_limit') ||
|
|
154
|
-
(pf.kind === 'breaking_change')
|
|
155
|
-
);
|
|
156
|
-
const stepPitfalls: string[] = [];
|
|
157
|
-
for (const p of matchingPfs) {
|
|
158
|
-
const pfStr = `[${p.kind}] ${p.title}: ${p.content}`;
|
|
159
|
-
stepPitfalls.push(pfStr);
|
|
160
|
-
usedPitfalls.add(pfStr);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// If the endpoint is deprecated, explicitly highlight it in step title/description
|
|
164
|
-
const depWarning = ep.deprecated ? ' [DEPRECATED]' : '';
|
|
165
|
-
|
|
166
|
-
orderedSteps.push({
|
|
167
|
-
step: stepNumber++,
|
|
168
|
-
title: `${apiStr}${depWarning}${ep.summary ? ` - ${ep.summary}` : ''}`,
|
|
169
|
-
description: ep.description || ep.summary || `Execute documented ${apiStr} request with parameters: ${ep.parameters.map(p => `${p.name}${p.required ? ' (required)' : ''}`).join(', ')}`,
|
|
170
|
-
evidenceLevel: 'documented_fact',
|
|
171
|
-
apiEndpoint: apiStr,
|
|
172
|
-
exampleCode: matchingEx?.code,
|
|
173
|
-
pitfalls: stepPitfalls.length > 0 ? stepPitfalls : undefined,
|
|
174
|
-
sourceUrl: ep.provenance?.sourceUrl || matchingEx?.sourceUrl,
|
|
175
|
-
sourceChunkIds: matchingEx?.chunkId ? [matchingEx.chunkId] : undefined,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// C. Remaining Code Examples as implementation steps
|
|
180
|
-
for (const ex of examples) {
|
|
181
|
-
if (usedExamples.has(ex.id)) continue;
|
|
182
|
-
usedExamples.add(ex.id);
|
|
183
|
-
|
|
184
|
-
const matchingPfs = pitfalls.filter(pf =>
|
|
185
|
-
(ex.relatedApi && pf.relatedApi === ex.relatedApi) ||
|
|
186
|
-
(ex.relatedSymbol && pf.relatedSymbol === ex.relatedSymbol)
|
|
187
|
-
);
|
|
188
|
-
const stepPitfalls = matchingPfs.map(p => `[${p.kind}] ${p.title}: ${p.content}`);
|
|
189
|
-
stepPitfalls.forEach(p => usedPitfalls.add(p));
|
|
190
|
-
|
|
191
|
-
orderedSteps.push({
|
|
192
|
-
step: stepNumber++,
|
|
193
|
-
title: ex.task,
|
|
194
|
-
description: `Implement documented code example for ${ex.task} (${ex.language}${ex.framework ? ` / ${ex.framework}` : ''})`,
|
|
195
|
-
evidenceLevel: 'documented_fact',
|
|
196
|
-
apiEndpoint: ex.relatedApi,
|
|
197
|
-
exampleCode: ex.code,
|
|
198
|
-
pitfalls: stepPitfalls.length > 0 ? stepPitfalls : undefined,
|
|
199
|
-
sourceUrl: ex.sourceUrl,
|
|
200
|
-
sourceChunkIds: ex.chunkId ? [ex.chunkId] : undefined,
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
if (ex.relatedApi) usedApis.add(ex.relatedApi);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// D. If neither endpoints nor examples existed, check procedural chunks with strong relevance
|
|
207
|
-
if (orderedSteps.length === 0) {
|
|
208
|
-
for (const sr of searchResults.filter(s => s.score >= 5.0).slice(0, 3)) {
|
|
209
|
-
orderedSteps.push({
|
|
210
|
-
step: stepNumber++,
|
|
211
|
-
title: sr.chunk.title || sr.chunk.sectionPath.join(' > ') || 'Documented Procedure',
|
|
212
|
-
description: sr.chunk.content.substring(0, 300),
|
|
213
|
-
evidenceLevel: 'inferred_relationship',
|
|
214
|
-
sourceUrl: sr.chunk.provenance?.sourceUrl,
|
|
215
|
-
sourceChunkIds: [sr.chunk.id],
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// E. If documentation contains no relevant implementation steps, mark missing_information
|
|
221
|
-
if (orderedSteps.length === 0) {
|
|
222
|
-
orderedSteps.push({
|
|
223
|
-
step: stepNumber++,
|
|
224
|
-
title: 'Missing Implementation Knowledge',
|
|
225
|
-
description: `The indexed documentation does not contain documented API endpoints, code examples, or procedures for: "${cleanGoal}".`,
|
|
226
|
-
evidenceLevel: 'missing_information',
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// 5. Assemble Evidence-Based Validation Steps
|
|
231
|
-
const validationSteps: RecipeValidationStep[] = [];
|
|
232
|
-
let valStepNumber = 1;
|
|
233
|
-
|
|
234
|
-
// Validation from API response schemas
|
|
235
|
-
for (const ep of endpoints) {
|
|
236
|
-
const okResponse = ep.responseSchema?.['200'] || ep.responseSchema?.['201'];
|
|
237
|
-
if (okResponse && okResponse.schema) {
|
|
238
|
-
const props = okResponse.schema.properties ? Object.keys(okResponse.schema.properties) : [];
|
|
239
|
-
const propsDesc = props.length > 0 ? ` Expected properties: [${props.slice(0, 6).join(', ')}]` : '';
|
|
240
|
-
const exampleStr = okResponse.example ? JSON.stringify(okResponse.example, null, 2) : undefined;
|
|
241
|
-
|
|
242
|
-
validationSteps.push({
|
|
243
|
-
step: valStepNumber++,
|
|
244
|
-
description: `Verify ${ep.method.toUpperCase()} ${ep.path} returns HTTP ${okResponse.statusCode}.${propsDesc}`,
|
|
245
|
-
evidenceLevel: 'documented_fact',
|
|
246
|
-
expectedResponse: exampleStr || (props.length > 0 ? JSON.stringify(props) : undefined),
|
|
247
|
-
sourceUrl: ep.provenance?.sourceUrl,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Validation from code examples containing verification/assertion patterns
|
|
253
|
-
for (const ex of examples) {
|
|
254
|
-
if (/(?:constructEvent|verifySignature|assert|expect|validate|signature)/i.test(ex.code)) {
|
|
255
|
-
validationSteps.push({
|
|
256
|
-
step: valStepNumber++,
|
|
257
|
-
description: `Validate event/data integrity using documented pattern from ${ex.task}`,
|
|
258
|
-
evidenceLevel: 'documented_fact',
|
|
259
|
-
testPattern: ex.code,
|
|
260
|
-
sourceUrl: ex.sourceUrl,
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// If no validation steps can be derived from evidence, do NOT invent any!
|
|
266
|
-
if (validationSteps.length === 0) {
|
|
267
|
-
validationSteps.push({
|
|
268
|
-
step: 1,
|
|
269
|
-
description: 'No response schemas, test instructions, or verification assertions are documented for this task.',
|
|
270
|
-
evidenceLevel: 'missing_information',
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Collect all pitfalls
|
|
275
|
-
for (const pf of pitfalls) {
|
|
276
|
-
const pfStr = `[${pf.kind}] ${pf.title}: ${pf.content}`;
|
|
277
|
-
usedPitfalls.add(pfStr);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Calculate confidence score strictly based on evidence
|
|
281
|
-
let confidence = 0.0;
|
|
282
|
-
const factSteps = orderedSteps.filter(s => s.evidenceLevel === 'documented_fact').length;
|
|
283
|
-
const totalSteps = orderedSteps.length;
|
|
284
|
-
|
|
285
|
-
if (totalSteps > 0 && factSteps > 0) {
|
|
286
|
-
confidence += 0.4 * (factSteps / totalSteps);
|
|
287
|
-
if (endpoints.length > 0) confidence += 0.3;
|
|
288
|
-
if (examples.length > 0) confidence += 0.2;
|
|
289
|
-
if (validationSteps.some(v => v.evidenceLevel === 'documented_fact')) confidence += 0.1;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
confidence = Math.min(1.0, Math.round(confidence * 100) / 100);
|
|
293
|
-
|
|
294
|
-
const recipeId = createHash('sha256')
|
|
295
|
-
.update(`${cleanGoal}:${effectiveDocVersion || 'default'}:${orderedSteps.length}`)
|
|
296
|
-
.digest('hex')
|
|
297
|
-
.substring(0, 16);
|
|
298
|
-
|
|
299
|
-
return {
|
|
300
|
-
id: recipeId,
|
|
301
|
-
goal: cleanGoal,
|
|
302
|
-
prerequisites,
|
|
303
|
-
orderedSteps,
|
|
304
|
-
requiredApis: Array.from(usedApis),
|
|
305
|
-
examples: Array.from(usedExamples),
|
|
306
|
-
pitfalls: Array.from(usedPitfalls),
|
|
307
|
-
validationSteps,
|
|
308
|
-
sources,
|
|
309
|
-
docVersion: effectiveDocVersion,
|
|
310
|
-
confidence,
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
}
|