pipecat-ai-context-hub 0.2.0__tar.gz
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.
- pipecat_ai_context_hub-0.2.0/.claude/settings.json +1 -0
- pipecat_ai_context_hub-0.2.0/.env.example +87 -0
- pipecat_ai_context_hub-0.2.0/.github/ISSUE_TEMPLATE/bug-report.yml +42 -0
- pipecat_ai_context_hub-0.2.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- pipecat_ai_context_hub-0.2.0/.github/ISSUE_TEMPLATE/retrieval-quality.yml +140 -0
- pipecat_ai_context_hub-0.2.0/.github/workflows/ci.yml +181 -0
- pipecat_ai_context_hub-0.2.0/.github/workflows/release.yml +169 -0
- pipecat_ai_context_hub-0.2.0/.github/workflows/security-audit.yml +86 -0
- pipecat_ai_context_hub-0.2.0/.github/workflows/smoke-drift.yml +89 -0
- pipecat_ai_context_hub-0.2.0/.gitignore +26 -0
- pipecat_ai_context_hub-0.2.0/AGENTS.md +395 -0
- pipecat_ai_context_hub-0.2.0/CHANGELOG.md +1203 -0
- pipecat_ai_context_hub-0.2.0/CLAUDE.md +214 -0
- pipecat_ai_context_hub-0.2.0/LICENSE +24 -0
- pipecat_ai_context_hub-0.2.0/PKG-INFO +360 -0
- pipecat_ai_context_hub-0.2.0/SECURITY.md +29 -0
- pipecat_ai_context_hub-0.2.0/config/clients/claude-code.json +9 -0
- pipecat_ai_context_hub-0.2.0/config/clients/cursor.json +9 -0
- pipecat_ai_context_hub-0.2.0/config/clients/vscode.json +10 -0
- pipecat_ai_context_hub-0.2.0/config/clients/zed.json +10 -0
- pipecat_ai_context_hub-0.2.0/dashboard/public/index.html +385 -0
- pipecat_ai_context_hub-0.2.0/dashboard/public/latent-space.html +831 -0
- pipecat_ai_context_hub-0.2.0/dashboard/scripts/compute_clusters.py +179 -0
- pipecat_ai_context_hub-0.2.0/dashboard/scripts/extract_dashboard.py +156 -0
- pipecat_ai_context_hub-0.2.0/dashboard/scripts/extract_embeddings.py +124 -0
- pipecat_ai_context_hub-0.2.0/dashboard/video-frames/narration-script.md +41 -0
- pipecat_ai_context_hub-0.2.0/docs/CONTRIBUTING.md +248 -0
- pipecat_ai_context_hub-0.2.0/docs/README.md +334 -0
- pipecat_ai_context_hub-0.2.0/docs/decisions/docs-source.md +45 -0
- pipecat_ai_context_hub-0.2.0/docs/decisions/vector-backend.md +41 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260218-design-pipecat-context-hub.md +1816 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260324-bug-chroma-index-recovery.md +78 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260325-chore-mcp-server-audit-hardening.md +182 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260330-feature-tree-sitter-ts-phase2.md +377 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260331-feature-version-aware-indexing.md +677 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260420-bug-windows-refresh-resilience.md +252 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260420-feature-reranker-model-selection.md +190 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260421-bug-serve-orphan-watchdog.md +167 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260422-feature-examples-topic-layout.md +322 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260529-chore-chromadb-1x-python-314.md +445 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260530-fix-serve-uv-run-grandparent-watchdog.md +82 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260612-chore-release-0-2-0.md +102 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260612-feature-cli-query-subcommands.md +263 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/20260612-feature-deprecations-json-consumer.md +81 -0
- pipecat_ai_context_hub-0.2.0/docs/dev_plans/README.md +34 -0
- pipecat_ai_context_hub-0.2.0/docs/security/threat-model.md +226 -0
- pipecat_ai_context_hub-0.2.0/docs/setup/README.md +46 -0
- pipecat_ai_context_hub-0.2.0/docs/setup/claude-code.md +102 -0
- pipecat_ai_context_hub-0.2.0/docs/setup/cursor.md +69 -0
- pipecat_ai_context_hub-0.2.0/docs/setup/vscode.md +88 -0
- pipecat_ai_context_hub-0.2.0/docs/setup/zed.md +68 -0
- pipecat_ai_context_hub-0.2.0/docs/sshot-dashboard-index.jpg +0 -0
- pipecat_ai_context_hub-0.2.0/docs/sshot-dashboard-latent-space.png +0 -0
- pipecat_ai_context_hub-0.2.0/justfile +110 -0
- pipecat_ai_context_hub-0.2.0/pyproject.toml +99 -0
- pipecat_ai_context_hub-0.2.0/scripts/check_pipecat_drift.py +343 -0
- pipecat_ai_context_hub-0.2.0/scripts/smoke_check_deprecation.py +138 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/__init__.py +3 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/__main__.py +6 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/cli.py +985 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/cli_query.py +560 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/py.typed +0 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/__init__.py +1 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/main.py +312 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/__init__.py +1 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/check_deprecation.py +42 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_code_snippet.py +18 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_doc.py +18 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_example.py +18 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/get_hub_status.py +49 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/search_api.py +18 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/search_docs.py +18 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/tools/search_examples.py +18 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/server/transport.py +619 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/embedding.py +96 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/__init__.py +8 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/errors.py +61 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/fts.py +546 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/store.py +180 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/index/vector.py +595 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/ast_extractor.py +606 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/daily_type_map.py +77 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/deprecation_map.py +890 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/docs_crawler.py +412 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/github_ingest.py +1281 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/rst_type_parser.py +341 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/source_ingest.py +857 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/taxonomy.py +742 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/ingest/ts_tree_sitter_parser.py +701 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/cross_encoder.py +184 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/decompose.py +50 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/evidence.py +293 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/hybrid.py +818 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/services/retrieval/rerank.py +471 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/config.py +509 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/interfaces.py +91 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/model_loading.py +36 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/paths.py +74 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/reranker.py +49 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/staleness.py +121 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/tracking.py +51 -0
- pipecat_ai_context_hub-0.2.0/src/pipecat_context_hub/shared/types.py +711 -0
- pipecat_ai_context_hub-0.2.0/tests/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/tests/_ingest_helpers.py +48 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/baselines/v0.0.20.json +17 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/conftest.py +129 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/engine_parity_check.py +163 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_chromadb_parity.py +296 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_chromadb_perf.py +351 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_latency.py +301 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_retrieval_quality.py +560 -0
- pipecat_ai_context_hub-0.2.0/tests/benchmarks/test_runtime_stability.py +314 -0
- pipecat_ai_context_hub-0.2.0/tests/conftest.py +131 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/FIXTURE_PINS.json +16 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/README.md +4 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/gemini-tools/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/gemini-tools/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/weather/README.md +4 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/function-calling/weather/bot.py +13 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/getting-started/hello.py +11 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/getting-started/quickstart.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/mcp/remote-mcp/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/mcp/remote-mcp/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/realtime/openai-realtime/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/realtime/openai-realtime/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/daily/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/daily/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/websocket/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/transports/websocket/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/voice/cartesia-tts/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/examples/voice/cartesia-tts/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/pyproject.toml +4 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat/src/pipecat/__init__.py +1 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/README.md +4 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/pyproject.toml +4 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/simple-chatbot/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/simple-chatbot/bot.py +13 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/storytelling/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/storytelling/main.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/voice-bot/README.md +3 -0
- pipecat_ai_context_hub-0.2.0/tests/fixtures/smoke/pipecat-examples/voice-bot/bot.py +9 -0
- pipecat_ai_context_hub-0.2.0/tests/integration/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/tests/integration/conftest.py +52 -0
- pipecat_ai_context_hub-0.2.0/tests/integration/test_end_to_end.py +943 -0
- pipecat_ai_context_hub-0.2.0/tests/integration/test_no_telemetry_egress.sh +301 -0
- pipecat_ai_context_hub-0.2.0/tests/integration/test_serve_lifetime.py +530 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/README.md +90 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/__init__.py +5 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/conftest.py +35 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/invariants.py +136 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/refresh_fixtures.py +222 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/test_new_repo_layouts.py +72 -0
- pipecat_ai_context_hub-0.2.0/tests/smoke/test_pipecat_layout.py +73 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/__init__.py +0 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_ast_extractor.py +1225 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_audit_sync.py +43 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_cli.py +950 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_cli_query.py +459 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_config.py +423 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_deprecation_map.py +354 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_docs_crawler.py +554 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_format_detection.py +171 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_github_ingest.py +1366 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_github_ingest_taxonomy.py +96 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_hub_status.py +233 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_index_store.py +1232 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_mcp_tools.py +425 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_metadata_types.py +140 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_model_loading.py +32 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_release_notes_deprecation.py +753 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_retrieval.py +1517 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_rst_type_parser.py +324 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_server.py +450 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_shared_types.py +449 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_smoke_scaffold.py +306 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_source_ingest.py +826 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_staleness.py +159 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_taxonomy.py +1350 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_transport.py +542 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_ts_source_parser.py +573 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_version_extraction.py +327 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_version_pinned_indexing.py +322 -0
- pipecat_ai_context_hub-0.2.0/tests/unit/test_version_scoring.py +286 -0
- pipecat_ai_context_hub-0.2.0/uv.lock +3787 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "attribution": { "commit": "", "pr": "" } }
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Extra GitHub repos to ingest (comma-separated org/repo slugs).
|
|
2
|
+
# These are appended to the default repos:
|
|
3
|
+
# pipecat-ai/pipecat, pipecat-ai/pipecat-examples, pipecat-ai/pipecat-flows,
|
|
4
|
+
# daily-co/daily-python, pipecat-ai/pipecat-client-web,
|
|
5
|
+
# pipecat-ai/pipecat-client-web-transports,
|
|
6
|
+
# pipecat-ai/pipecat-client-react-native-transports,
|
|
7
|
+
# pipecat-ai/voice-ui-kit, pipecat-ai/pipecat-prebuilt
|
|
8
|
+
# PIPECAT_HUB_EXTRA_REPOS="your-org/repo-1,your-org/repo-2"
|
|
9
|
+
#
|
|
10
|
+
# NOTE: only Python (.py/.pyi), TypeScript (.ts/.tsx), and RST (docs/**.rst)
|
|
11
|
+
# are parsed. Swift/Kotlin/C++ client SDKs (pipecat-client-ios,
|
|
12
|
+
# pipecat-client-android, pipecat-client-cxx, pipecat-esp32) clone but yield
|
|
13
|
+
# ZERO source/API chunks (only a few README/config fallback chunks) until a
|
|
14
|
+
# grammar for those languages exists — they won't surface in search_api.
|
|
15
|
+
# Entries below that duplicate a default are deduped automatically — harmless
|
|
16
|
+
# to leave in.
|
|
17
|
+
|
|
18
|
+
# --------------------------------------------------------------------------
|
|
19
|
+
# Recommended extras — copy/uncomment what you need
|
|
20
|
+
# --------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
# Client SDKs & transports (web, mobile, native)
|
|
23
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-client-web,pipecat-ai/pipecat-client-web-transports,pipecat-ai/pipecat-client-react-native-transports,pipecat-ai/pipecat-websocket-transport,pipecat-ai/pipecat-client-ios,pipecat-ai/pipecat-client-ios-daily,pipecat-ai/pipecat-client-ios-small-webrtc,pipecat-ai/pipecat-client-android,pipecat-ai/pipecat-client-android-transports,pipecat-ai/pipecat-client-cxx,pipecat-ai/pipecat-client-cxx-daily,pipecat-ai/pipecat-esp32"
|
|
24
|
+
|
|
25
|
+
# UI components & voice UI kit
|
|
26
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/voice-ui-kit,pipecat-ai/pipecat-ui"
|
|
27
|
+
|
|
28
|
+
# Conversation flows & structured dialogues
|
|
29
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-flows,pipecat-ai/pipecat-flows-editor"
|
|
30
|
+
|
|
31
|
+
# Cloud, CLI, and dev tools
|
|
32
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-cli,pipecat-ai/tail,pipecat-ai/whisker,pipecat-ai/skills"
|
|
33
|
+
|
|
34
|
+
# Quickstart templates
|
|
35
|
+
# (pipecat-quickstart* repos are archived — use the CLI: `uv tool install pipecat-ai-cli` then `pipecat init quickstart`)
|
|
36
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-prebuilt"
|
|
37
|
+
|
|
38
|
+
# Audio, turn detection & benchmarks
|
|
39
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/smart-turn,pipecat-ai/hosted-smart-turn,pipecat-ai/pipecat-krisp,pipecat-ai/stt-benchmark,pipecat-ai/gb-benchmarks"
|
|
40
|
+
|
|
41
|
+
# Example apps & demos
|
|
42
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/peekaboo,pipecat-ai/gemini-live-web-starter,pipecat-ai/instant-voice-demo,pipecat-ai/openai-realtime-todo-example,pipecat-ai/pipecat.ai-agents,pipecat-ai/pipecat-mcp-server"
|
|
43
|
+
|
|
44
|
+
# Gradient Bang ecosystem
|
|
45
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/gradient-bang,pipecat-ai/gradient-bang-subagents,pipecat-ai/gradient-bang-synth-forge,pipecat-ai/gb-context-viewer"
|
|
46
|
+
|
|
47
|
+
# NVIDIA integrations
|
|
48
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/nvidia-sgmaker"
|
|
49
|
+
|
|
50
|
+
# iOS demo apps
|
|
51
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-client-ios-gemini-live-websocket-demo,pipecat-ai/pipecat-client-ios-openai-realtime-webrtc-demo"
|
|
52
|
+
|
|
53
|
+
# --------------------------------------------------------------------------
|
|
54
|
+
# All recommended pipecat-ai repos in one line (copy and uncomment):
|
|
55
|
+
# PIPECAT_HUB_EXTRA_REPOS="pipecat-ai/pipecat-client-web,pipecat-ai/pipecat-client-web-transports,pipecat-ai/pipecat-client-react-native-transports,pipecat-ai/pipecat-websocket-transport,pipecat-ai/pipecat-client-ios,pipecat-ai/pipecat-client-ios-daily,pipecat-ai/pipecat-client-ios-small-webrtc,pipecat-ai/pipecat-client-ios-gemini-live-websocket-demo,pipecat-ai/pipecat-client-ios-openai-realtime-webrtc-demo,pipecat-ai/pipecat-client-android,pipecat-ai/pipecat-client-android-transports,pipecat-ai/pipecat-client-cxx,pipecat-ai/pipecat-client-cxx-daily,pipecat-ai/pipecat-esp32,pipecat-ai/voice-ui-kit,pipecat-ai/pipecat-ui,pipecat-ai/pipecat-flows,pipecat-ai/pipecat-flows-editor,pipecat-ai/pipecat-cli,pipecat-ai/tail,pipecat-ai/whisker,pipecat-ai/skills,pipecat-ai/pipecat-prebuilt,pipecat-ai/smart-turn,pipecat-ai/hosted-smart-turn,pipecat-ai/pipecat-krisp,pipecat-ai/stt-benchmark,pipecat-ai/gb-benchmarks,pipecat-ai/peekaboo,pipecat-ai/gemini-live-web-starter,pipecat-ai/instant-voice-demo,pipecat-ai/openai-realtime-todo-example,pipecat-ai/pipecat.ai-agents,pipecat-ai/pipecat-mcp-server,pipecat-ai/gradient-bang,pipecat-ai/gradient-bang-subagents,pipecat-ai/gradient-bang-synth-forge,pipecat-ai/gb-context-viewer,pipecat-ai/nvidia-sgmaker"
|
|
56
|
+
# --------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
# Entire repos to skip locally if an upstream source is tainted.
|
|
59
|
+
# PIPECAT_HUB_TAINTED_REPOS="your-org/bad-repo,other-org/paused-repo"
|
|
60
|
+
|
|
61
|
+
# Specific upstream refs to skip locally.
|
|
62
|
+
# Format: org/repo@ref where ref is a tag or commit SHA/prefix.
|
|
63
|
+
# PIPECAT_HUB_TAINTED_REFS="pipecat-ai/pipecat@v0.0.9,pipecat-ai/pipecat-examples@deadbeef"
|
|
64
|
+
|
|
65
|
+
# --------------------------------------------------------------------------
|
|
66
|
+
# Startup model pre-warm (default: on)
|
|
67
|
+
# --------------------------------------------------------------------------
|
|
68
|
+
# On `serve` boot, the hub loads the embedding model (and cross-encoder if
|
|
69
|
+
# enabled) so the first MCP query doesn't pay a cold-start cost. On Windows
|
|
70
|
+
# CPU this can otherwise hang the first query for 30-130s — longer than
|
|
71
|
+
# Claude Code's tool-permission window, which surfaces as a spurious
|
|
72
|
+
# disconnect.
|
|
73
|
+
#
|
|
74
|
+
# Set to 0 to skip pre-warm (faster boot, slower first query):
|
|
75
|
+
# PIPECAT_HUB_WARMUP=0
|
|
76
|
+
|
|
77
|
+
# --------------------------------------------------------------------------
|
|
78
|
+
# Index-staleness footer (default: 7 days)
|
|
79
|
+
# --------------------------------------------------------------------------
|
|
80
|
+
# When the local index is older than this many days, every tool response (MCP
|
|
81
|
+
# and the CLI subcommands) carries an `index_staleness` field nudging you to
|
|
82
|
+
# run `refresh`. The field is absent while the index is fresh.
|
|
83
|
+
#
|
|
84
|
+
# Set to 0 (or any value <= 0) to disable the footer entirely. Non-numeric or
|
|
85
|
+
# non-finite values (e.g. inf, nan) are rejected with a warning and fall back
|
|
86
|
+
# to the 7-day default.
|
|
87
|
+
# PIPECAT_HUB_STALE_AFTER_DAYS=7
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a crash, error, or unexpected behavior
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: what-happened
|
|
7
|
+
attributes:
|
|
8
|
+
label: What happened?
|
|
9
|
+
description: Describe the bug and how to reproduce it.
|
|
10
|
+
placeholder: |
|
|
11
|
+
1. Ran `pipecat-context-hub refresh --force`
|
|
12
|
+
2. Got error: "ChromaDB collection not found"
|
|
13
|
+
validations:
|
|
14
|
+
required: true
|
|
15
|
+
|
|
16
|
+
- type: textarea
|
|
17
|
+
id: expected
|
|
18
|
+
attributes:
|
|
19
|
+
label: Expected behavior
|
|
20
|
+
description: What should have happened instead?
|
|
21
|
+
validations:
|
|
22
|
+
required: true
|
|
23
|
+
|
|
24
|
+
- type: textarea
|
|
25
|
+
id: environment
|
|
26
|
+
attributes:
|
|
27
|
+
label: Environment
|
|
28
|
+
description: |
|
|
29
|
+
Run this in your terminal and paste the output:
|
|
30
|
+
```
|
|
31
|
+
echo "Python: $(python3 --version)" && echo "uv: $(uv --version)" && echo "OS: $(uname -srm)" && uv run pipecat-context-hub --version 2>/dev/null || echo "version: unknown"
|
|
32
|
+
```
|
|
33
|
+
render: text
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: logs
|
|
39
|
+
attributes:
|
|
40
|
+
label: Logs / error output
|
|
41
|
+
description: Paste any relevant error messages or stack traces.
|
|
42
|
+
render: text
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
name: Retrieval Quality Issue
|
|
2
|
+
description: Report missing, irrelevant, or poorly ranked results from the MCP server
|
|
3
|
+
labels: ["retrieval-quality"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
## Before filing
|
|
9
|
+
|
|
10
|
+
Run the diagnostic prompt below in your coding agent (Claude Code, Cursor, etc.)
|
|
11
|
+
to generate a structured report. Paste the output in the **Diagnostic Report** field.
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: what-happened
|
|
15
|
+
attributes:
|
|
16
|
+
label: What happened?
|
|
17
|
+
description: What did you search for, and what was wrong with the results?
|
|
18
|
+
placeholder: |
|
|
19
|
+
I searched for "WebSocket transport" using search_docs but got results
|
|
20
|
+
about HTTP transports instead. The actual WebSocket docs page wasn't
|
|
21
|
+
in the results at all.
|
|
22
|
+
validations:
|
|
23
|
+
required: true
|
|
24
|
+
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: expected
|
|
27
|
+
attributes:
|
|
28
|
+
label: What did you expect?
|
|
29
|
+
description: What result or content should have been returned?
|
|
30
|
+
placeholder: |
|
|
31
|
+
I expected the docs page at /guides/learn/transports with the WebSocket
|
|
32
|
+
section to be the top result.
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
35
|
+
|
|
36
|
+
- type: dropdown
|
|
37
|
+
id: issue-type
|
|
38
|
+
attributes:
|
|
39
|
+
label: Issue type
|
|
40
|
+
options:
|
|
41
|
+
- Missing result (expected content not returned)
|
|
42
|
+
- Wrong ranking (right content buried below irrelevant results)
|
|
43
|
+
- Bad chunking (result truncated or split at wrong boundary)
|
|
44
|
+
- Stale content (result is outdated, index not reflecting latest)
|
|
45
|
+
- Other
|
|
46
|
+
validations:
|
|
47
|
+
required: true
|
|
48
|
+
|
|
49
|
+
- type: dropdown
|
|
50
|
+
id: tool
|
|
51
|
+
attributes:
|
|
52
|
+
label: Which MCP tool?
|
|
53
|
+
options:
|
|
54
|
+
- search_docs
|
|
55
|
+
- search_examples
|
|
56
|
+
- search_api
|
|
57
|
+
- get_doc
|
|
58
|
+
- get_example
|
|
59
|
+
- get_code_snippet
|
|
60
|
+
- check_deprecation
|
|
61
|
+
validations:
|
|
62
|
+
required: true
|
|
63
|
+
|
|
64
|
+
- type: textarea
|
|
65
|
+
id: diagnostic-report
|
|
66
|
+
attributes:
|
|
67
|
+
label: Diagnostic Report
|
|
68
|
+
description: |
|
|
69
|
+
Paste the output from the diagnostic prompt below. Copy the prompt into your
|
|
70
|
+
coding agent, fill in YOUR_QUERY and YOUR_TOOL, and paste the full output here.
|
|
71
|
+
render: markdown
|
|
72
|
+
validations:
|
|
73
|
+
required: true
|
|
74
|
+
|
|
75
|
+
- type: textarea
|
|
76
|
+
id: diagnostic-prompt
|
|
77
|
+
attributes:
|
|
78
|
+
label: Diagnostic Prompt (copy this into your agent)
|
|
79
|
+
description: Copy the prompt below, replace the placeholders, and run it in your coding agent.
|
|
80
|
+
render: markdown
|
|
81
|
+
value: |
|
|
82
|
+
```
|
|
83
|
+
I'm diagnosing a retrieval quality issue with the pipecat-context-hub MCP server.
|
|
84
|
+
Run the following steps using the MCP tools and format the output as a single
|
|
85
|
+
markdown report I can paste into a GitHub issue.
|
|
86
|
+
|
|
87
|
+
## Parameters
|
|
88
|
+
- Query: "YOUR_QUERY_HERE"
|
|
89
|
+
- Tool: YOUR_TOOL_HERE (search_docs | search_examples | search_api | get_code_snippet)
|
|
90
|
+
- Filters used: YOUR_FILTERS_HERE (e.g., area="guides", domain="backend", class_name="DailyTransport", or "none")
|
|
91
|
+
- Pipecat version (if applicable): YOUR_VERSION_HERE (e.g., "0.0.95" or "not set")
|
|
92
|
+
|
|
93
|
+
## Steps
|
|
94
|
+
|
|
95
|
+
1. **Hub status** — call `get_hub_status` and report:
|
|
96
|
+
- server_version
|
|
97
|
+
- last_refresh_at
|
|
98
|
+
- total_records and counts_by_type
|
|
99
|
+
- framework_version (if set)
|
|
100
|
+
|
|
101
|
+
2. **Reproduce the search** — call the failing tool with the exact query and
|
|
102
|
+
filters above. For the results, report:
|
|
103
|
+
- Number of hits returned
|
|
104
|
+
- For each of the top 5 hits: score, title or chunk_id, snippet (first 100 chars),
|
|
105
|
+
match_type, version_compatibility (if present), citation.path
|
|
106
|
+
- The full evidence report: confidence, low_confidence, confidence_rationale,
|
|
107
|
+
next_retrieval_queries
|
|
108
|
+
|
|
109
|
+
3. **Broaden the search** — re-run the same query with all filters removed and
|
|
110
|
+
limit=20. Report:
|
|
111
|
+
- Did the expected result appear? At what rank and score?
|
|
112
|
+
- If yes, which filter excluded it?
|
|
113
|
+
- If no, proceed to step 4.
|
|
114
|
+
|
|
115
|
+
4. **Check if content is indexed** — if the expected result is a doc page, try
|
|
116
|
+
`get_doc(path="EXPECTED_PATH")`. If it's an API symbol, try
|
|
117
|
+
`search_api(query="SYMBOL_NAME", limit=5)`. If it's an example, try
|
|
118
|
+
`search_examples(query="EXAMPLE_NAME", limit=5)`. Report:
|
|
119
|
+
- Was the content found by direct lookup?
|
|
120
|
+
- If found: what was its chunk_id, content_type, and metadata?
|
|
121
|
+
- If not found: the content is likely not indexed.
|
|
122
|
+
|
|
123
|
+
5. **Try alternative queries** — run 2-3 rephrased queries or multi-concept
|
|
124
|
+
queries (using ` + ` syntax) against the same tool. Report:
|
|
125
|
+
- Each query tried and the top 3 results (score, title/chunk_id)
|
|
126
|
+
- Did any alternative surface the expected result?
|
|
127
|
+
|
|
128
|
+
## Output format
|
|
129
|
+
|
|
130
|
+
Format everything as a single markdown block with these sections:
|
|
131
|
+
- **Hub Status**: table of status fields
|
|
132
|
+
- **Original Query Results**: numbered list of top 5 hits with scores
|
|
133
|
+
- **Evidence Report**: confidence, rationale, and next queries
|
|
134
|
+
- **Broadened Search**: whether expected result appeared and at what rank
|
|
135
|
+
- **Direct Lookup**: whether content exists in the index
|
|
136
|
+
- **Alternative Queries**: table of queries tried and top results
|
|
137
|
+
- **Diagnosis**: your assessment of why the result is missing or poorly ranked
|
|
138
|
+
(e.g., "content not indexed", "filter too narrow", "embedding mismatch",
|
|
139
|
+
"chunking split the relevant content", "staleness penalty")
|
|
140
|
+
```
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- "chore/**"
|
|
8
|
+
- "feature/**"
|
|
9
|
+
- "bug/**"
|
|
10
|
+
- "refactor/**"
|
|
11
|
+
pull_request:
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
quality:
|
|
18
|
+
name: Quality (py${{ matrix.python-version }})
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
# Floor (3.12) + ceiling (3.14, the highest version requires-python allows).
|
|
24
|
+
python-version: ["3.12", "3.14"]
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
|
|
28
|
+
- uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: ${{ matrix.python-version }}
|
|
31
|
+
|
|
32
|
+
- name: Install uv
|
|
33
|
+
uses: astral-sh/setup-uv@v7.6.0
|
|
34
|
+
with:
|
|
35
|
+
version: "0.9.18"
|
|
36
|
+
|
|
37
|
+
- name: Sync dependencies
|
|
38
|
+
run: uv sync --frozen --extra dev --group dev
|
|
39
|
+
|
|
40
|
+
- name: Ruff
|
|
41
|
+
run: uv run ruff check src/ tests/
|
|
42
|
+
|
|
43
|
+
- name: Mypy
|
|
44
|
+
run: uv run mypy src/ tests/
|
|
45
|
+
|
|
46
|
+
- name: Pytest
|
|
47
|
+
run: uv run pytest tests/ -v
|
|
48
|
+
|
|
49
|
+
# Stable required-status-check name. Branch protection requires "Quality";
|
|
50
|
+
# the matrix above reports per-leg names ("Quality (py3.12)", …), so this
|
|
51
|
+
# gate aggregates them under the single name protection expects. Bump the
|
|
52
|
+
# matrix without touching branch-protection settings.
|
|
53
|
+
quality-gate:
|
|
54
|
+
name: Quality
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
needs: [quality]
|
|
57
|
+
if: always()
|
|
58
|
+
steps:
|
|
59
|
+
- name: Require all Quality matrix legs to pass
|
|
60
|
+
env:
|
|
61
|
+
RESULT: ${{ needs.quality.result }}
|
|
62
|
+
run: |
|
|
63
|
+
echo "Quality matrix aggregate result: $RESULT"
|
|
64
|
+
test "$RESULT" = "success"
|
|
65
|
+
|
|
66
|
+
windows-smoke:
|
|
67
|
+
name: Windows smoke (chromadb 1.x, py${{ matrix.python-version }})
|
|
68
|
+
runs-on: windows-latest
|
|
69
|
+
strategy:
|
|
70
|
+
fail-fast: false
|
|
71
|
+
matrix:
|
|
72
|
+
# 3.14 proves the cp314 compiled stack (torch/onnxruntime/tokenizers)
|
|
73
|
+
# installs and the chromadb 1.x index paths work on Windows — the platform
|
|
74
|
+
# where cp314 wheel availability was least certain.
|
|
75
|
+
python-version: ["3.12", "3.14"]
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/checkout@v4
|
|
78
|
+
|
|
79
|
+
- uses: actions/setup-python@v5
|
|
80
|
+
with:
|
|
81
|
+
python-version: ${{ matrix.python-version }}
|
|
82
|
+
|
|
83
|
+
- name: Install uv
|
|
84
|
+
uses: astral-sh/setup-uv@v7.6.0
|
|
85
|
+
with:
|
|
86
|
+
version: "0.9.18"
|
|
87
|
+
|
|
88
|
+
- name: Sync dependencies
|
|
89
|
+
# Proves chromadb 1.5.9 (and the rest of the stack) resolves and installs
|
|
90
|
+
# from wheels on Windows — the primary cross-platform risk of the 1.x bump.
|
|
91
|
+
run: uv sync --frozen --extra dev --group dev
|
|
92
|
+
|
|
93
|
+
- name: ChromaDB index smoke
|
|
94
|
+
# Scope: the chromadb 1.5.9 cross-platform risk surface plus the
|
|
95
|
+
# path-handling tests that previously assumed POSIX separators. `Sync
|
|
96
|
+
# dependencies` above already proved the wheel installs on Windows; the
|
|
97
|
+
# chromadb tests then build real ChromaDB 1.x indexes in temp dirs and
|
|
98
|
+
# exercise the upsert/query/get paths + Client.close lifecycle, the
|
|
99
|
+
# non-mutating format-detection probe (reads chroma.sqlite3), and
|
|
100
|
+
# metadata typing.
|
|
101
|
+
#
|
|
102
|
+
# test_taxonomy / test_github_ingest / test_cli / test_hub_status are now
|
|
103
|
+
# included: the ingest layer normalizes logical repo-relative paths to
|
|
104
|
+
# forward slashes via Path.as_posix() (github_ingest.py, taxonomy.py), so
|
|
105
|
+
# stored `path` / `source_url` / taxonomy keys are "/"-separated on every
|
|
106
|
+
# platform and these tests pass under Windows "\\". tests/integration/ is
|
|
107
|
+
# still excluded (its serve tests use POSIX-only select() on pipes);
|
|
108
|
+
# Linux CI runs everything.
|
|
109
|
+
run: >-
|
|
110
|
+
uv run pytest -v
|
|
111
|
+
tests/unit/test_index_store.py
|
|
112
|
+
tests/unit/test_format_detection.py
|
|
113
|
+
tests/unit/test_metadata_types.py
|
|
114
|
+
tests/unit/test_taxonomy.py
|
|
115
|
+
tests/unit/test_github_ingest.py
|
|
116
|
+
tests/unit/test_cli.py
|
|
117
|
+
tests/unit/test_hub_status.py
|
|
118
|
+
|
|
119
|
+
security:
|
|
120
|
+
name: Security
|
|
121
|
+
runs-on: ubuntu-latest
|
|
122
|
+
steps:
|
|
123
|
+
- uses: actions/checkout@v4
|
|
124
|
+
|
|
125
|
+
- uses: actions/setup-python@v5
|
|
126
|
+
with:
|
|
127
|
+
python-version: "3.12"
|
|
128
|
+
|
|
129
|
+
- name: Install uv
|
|
130
|
+
uses: astral-sh/setup-uv@v7.6.0
|
|
131
|
+
with:
|
|
132
|
+
version: "0.9.18"
|
|
133
|
+
|
|
134
|
+
- name: Sync dependencies
|
|
135
|
+
run: uv sync --frozen --extra dev --group dev
|
|
136
|
+
|
|
137
|
+
- name: Dependency Audit
|
|
138
|
+
# KEEP IN SYNC with the `audit-deps` recipe in justfile — the local
|
|
139
|
+
# recipe must mirror this --ignore-vuln set exactly so `just audit-deps`
|
|
140
|
+
# passes iff this gate passes. Enforced by tests/unit/test_audit_sync.py
|
|
141
|
+
# (drift fails the suite).
|
|
142
|
+
#
|
|
143
|
+
# PYSEC-2026-139 (torch, CVE-2026-4538): local-only pt2-loader
|
|
144
|
+
# deserialization with no upstream fix released. Reached only via
|
|
145
|
+
# sentence-transformers; the hub never loads untrusted pt2 artifacts.
|
|
146
|
+
#
|
|
147
|
+
# CVE-2026-45829 (chromadb, GHSA-f4j7-r4q5-qw2c): pre-auth code injection
|
|
148
|
+
# in chromadb's HTTP SERVER mode — arbitrary code execution via the
|
|
149
|
+
# /api/v2/.../collections endpoint with a malicious model repo and
|
|
150
|
+
# trust_remote_code=true. Affects 1.0.0-1.5.9 with no fixed release yet
|
|
151
|
+
# (1.5.9 is the latest 1.x). Unreachable here: the hub runs the embedded
|
|
152
|
+
# PersistentClient only (no server, no HTTP endpoint, no listener) and
|
|
153
|
+
# never uses chromadb's embedding functions / trust_remote_code.
|
|
154
|
+
#
|
|
155
|
+
# CVE-2025-3000 (torch, GHSA-rrmf-rvhw-rf47 / PYSEC-2025-194): memory
|
|
156
|
+
# corruption in torch.jit.script. Low severity, local-only, and no
|
|
157
|
+
# upstream fix released (vulnerable range <= 2.12.0, no patched version).
|
|
158
|
+
# Unreachable here: the hub uses sentence-transformers embeddings and the
|
|
159
|
+
# cross-encoder reranker; it never calls torch.jit.script.
|
|
160
|
+
#
|
|
161
|
+
# The unfiltered biweekly security-audit.yml job re-surfaces all three so
|
|
162
|
+
# the ignores cannot silently outlive their upstream patches.
|
|
163
|
+
run: >-
|
|
164
|
+
uv run pip-audit --local --progress-spinner off
|
|
165
|
+
--ignore-vuln PYSEC-2026-139
|
|
166
|
+
--ignore-vuln CVE-2026-45829
|
|
167
|
+
--ignore-vuln CVE-2025-3000
|
|
168
|
+
|
|
169
|
+
- name: Bandit
|
|
170
|
+
run: uv run bandit -r src
|
|
171
|
+
|
|
172
|
+
- name: Generate SBOM
|
|
173
|
+
run: |
|
|
174
|
+
mkdir -p artifacts/security
|
|
175
|
+
uv run cyclonedx-py environment --output-reproducible --of JSON -o artifacts/security/sbom.json
|
|
176
|
+
|
|
177
|
+
- name: Upload SBOM
|
|
178
|
+
uses: actions/upload-artifact@v4
|
|
179
|
+
with:
|
|
180
|
+
name: sbom
|
|
181
|
+
path: artifacts/security/sbom.json
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publishes pipecat-context-hub to PyPI via trusted publishing (OIDC — no API
|
|
4
|
+
# tokens stored in the repo).
|
|
5
|
+
#
|
|
6
|
+
# Two entry points:
|
|
7
|
+
# - Publishing a GitHub release (the normal path, see docs/CONTRIBUTING.md
|
|
8
|
+
# "Release Process") builds, verifies, and uploads to PyPI.
|
|
9
|
+
# - workflow_dispatch publishes to TestPyPI — a dry-run path for verifying
|
|
10
|
+
# the build and the trusted-publishing wiring without touching the real
|
|
11
|
+
# index.
|
|
12
|
+
#
|
|
13
|
+
# Naming: the PyPI distribution is `pipecat-ai-context-hub` (org convention —
|
|
14
|
+
# official packages are pipecat-ai*); the command and MCP server name stay
|
|
15
|
+
# `pipecat-context-hub`. A console-script alias makes
|
|
16
|
+
# `uvx pipecat-ai-context-hub <cmd>` resolve.
|
|
17
|
+
#
|
|
18
|
+
# One-time setup: the project is published under the `pipecat` PyPI org
|
|
19
|
+
# (https://pypi.org/org/pipecat/). A PyPI org owner adds a GitHub trusted
|
|
20
|
+
# publisher — for the first release, as a "pending publisher" from the
|
|
21
|
+
# `pipecat` org's "Publishing" settings (the project does not exist yet) — with
|
|
22
|
+
# owner: pipecat-ai (GitHub org), repository: pipecat-context-hub,
|
|
23
|
+
# workflow: release.yml, environment: pypi (testpypi on test.pypi.org),
|
|
24
|
+
# project name: pipecat-ai-context-hub.
|
|
25
|
+
# See docs/CONTRIBUTING.md "Maintainer Setup" for the full flow.
|
|
26
|
+
# Until that exists, the publish jobs fail with an OIDC error — the build job
|
|
27
|
+
# still validates the artifacts.
|
|
28
|
+
|
|
29
|
+
on:
|
|
30
|
+
release:
|
|
31
|
+
types: [published]
|
|
32
|
+
workflow_dispatch:
|
|
33
|
+
|
|
34
|
+
permissions:
|
|
35
|
+
contents: read
|
|
36
|
+
|
|
37
|
+
# uv CLI version, single source of truth for all jobs below. Keep in sync with
|
|
38
|
+
# the `astral-sh/setup-uv` version pinned in `.github/workflows/ci.yml`.
|
|
39
|
+
env:
|
|
40
|
+
UV_VERSION: "0.9.18"
|
|
41
|
+
|
|
42
|
+
jobs:
|
|
43
|
+
build:
|
|
44
|
+
name: Build & verify artifacts
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
|
|
48
|
+
|
|
49
|
+
# Pinned to 3.12 for a reproducible release build; the published sdist +
|
|
50
|
+
# wheel are version-agnostic. Update alongside the ci.yml matrix floor.
|
|
51
|
+
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
|
52
|
+
with:
|
|
53
|
+
python-version: "3.12"
|
|
54
|
+
|
|
55
|
+
- name: Install uv
|
|
56
|
+
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
|
57
|
+
with:
|
|
58
|
+
version: ${{ env.UV_VERSION }}
|
|
59
|
+
|
|
60
|
+
- name: Build sdist + wheel
|
|
61
|
+
run: uv build
|
|
62
|
+
|
|
63
|
+
- name: Check distribution metadata
|
|
64
|
+
run: uvx twine check --strict dist/*
|
|
65
|
+
|
|
66
|
+
- name: Tag matches package version (release only)
|
|
67
|
+
# Guards the "forgot to bump pyproject before tagging" release: the
|
|
68
|
+
# tag vX.Y.Z must equal the version baked into the wheel. The
|
|
69
|
+
# _SERVER_VERSION half of the pair is enforced by the unit suite
|
|
70
|
+
# (tests/unit/test_server.py::TestVersionConsistency) in regular CI.
|
|
71
|
+
if: github.event_name == 'release'
|
|
72
|
+
# TAG is passed via env (not interpolated into the script body) so a
|
|
73
|
+
# crafted tag name cannot inject shell — see GitHub's workflow-injection
|
|
74
|
+
# guidance.
|
|
75
|
+
env:
|
|
76
|
+
TAG: ${{ github.event.release.tag_name }}
|
|
77
|
+
run: |
|
|
78
|
+
wheels=(dist/*.whl)
|
|
79
|
+
test "${#wheels[@]}" -eq 1 || {
|
|
80
|
+
echo "::error::expected exactly one wheel in dist/, found ${#wheels[@]}: ${wheels[*]}"
|
|
81
|
+
exit 1
|
|
82
|
+
}
|
|
83
|
+
WHEEL_VERSION=$(unzip -p "${wheels[0]}" '*.dist-info/METADATA' | awk '/^Version:/{print $2; exit}')
|
|
84
|
+
echo "wheel=$WHEEL_VERSION tag=$TAG"
|
|
85
|
+
test "v$WHEEL_VERSION" = "$TAG" || {
|
|
86
|
+
echo "::error::Tag $TAG does not match package version $WHEEL_VERSION — bump pyproject.toml and _SERVER_VERSION before tagging."
|
|
87
|
+
exit 1
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
- name: Wheel smoke test (clean venv, away from the repo)
|
|
91
|
+
# Installs the built wheel into a fresh venv and exercises it from a
|
|
92
|
+
# directory outside the checkout, so works-only-in-repo assumptions
|
|
93
|
+
# (missing package data, path expectations) fail here instead of on
|
|
94
|
+
# users. `serve` on an empty index must exit 2 with the refresh hint —
|
|
95
|
+
# proving the console script, imports, and config defaults all work
|
|
96
|
+
# from the wheel alone.
|
|
97
|
+
run: |
|
|
98
|
+
uv venv /tmp/wheel-smoke
|
|
99
|
+
VIRTUAL_ENV=/tmp/wheel-smoke uv pip install dist/*.whl
|
|
100
|
+
cd /tmp
|
|
101
|
+
/tmp/wheel-smoke/bin/pipecat-context-hub --help
|
|
102
|
+
set +e
|
|
103
|
+
PIPECAT_HUB_DATA_DIR=$(mktemp -d) /tmp/wheel-smoke/bin/pipecat-context-hub serve 2>/tmp/serve-err.txt
|
|
104
|
+
code=$?
|
|
105
|
+
set -e
|
|
106
|
+
cat /tmp/serve-err.txt
|
|
107
|
+
test "$code" -eq 2 || { echo "::error::expected exit 2 on empty index, got $code"; exit 1; }
|
|
108
|
+
grep -q "refresh" /tmp/serve-err.txt
|
|
109
|
+
|
|
110
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
111
|
+
with:
|
|
112
|
+
name: dist
|
|
113
|
+
path: dist/
|
|
114
|
+
if-no-files-found: error
|
|
115
|
+
|
|
116
|
+
publish-pypi:
|
|
117
|
+
name: Publish to PyPI
|
|
118
|
+
needs: build
|
|
119
|
+
if: github.event_name == 'release'
|
|
120
|
+
runs-on: ubuntu-latest
|
|
121
|
+
environment:
|
|
122
|
+
name: pypi
|
|
123
|
+
url: https://pypi.org/project/pipecat-ai-context-hub/
|
|
124
|
+
permissions:
|
|
125
|
+
# Trusted publishing: PyPI validates the workflow's OIDC token instead
|
|
126
|
+
# of an API key. Requires the trusted-publisher config described at the
|
|
127
|
+
# top of this file.
|
|
128
|
+
id-token: write
|
|
129
|
+
steps:
|
|
130
|
+
- name: Install uv
|
|
131
|
+
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
|
132
|
+
with:
|
|
133
|
+
version: ${{ env.UV_VERSION }}
|
|
134
|
+
|
|
135
|
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
136
|
+
with:
|
|
137
|
+
name: dist
|
|
138
|
+
path: dist/
|
|
139
|
+
|
|
140
|
+
- name: Publish
|
|
141
|
+
run: uv publish
|
|
142
|
+
|
|
143
|
+
publish-testpypi:
|
|
144
|
+
name: Publish to TestPyPI (dry run)
|
|
145
|
+
needs: build
|
|
146
|
+
if: github.event_name == 'workflow_dispatch'
|
|
147
|
+
runs-on: ubuntu-latest
|
|
148
|
+
environment:
|
|
149
|
+
name: testpypi
|
|
150
|
+
url: https://test.pypi.org/project/pipecat-ai-context-hub/
|
|
151
|
+
permissions:
|
|
152
|
+
id-token: write
|
|
153
|
+
steps:
|
|
154
|
+
- name: Install uv
|
|
155
|
+
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
|
|
156
|
+
with:
|
|
157
|
+
version: ${{ env.UV_VERSION }}
|
|
158
|
+
|
|
159
|
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
160
|
+
with:
|
|
161
|
+
name: dist
|
|
162
|
+
path: dist/
|
|
163
|
+
|
|
164
|
+
- name: Publish to TestPyPI
|
|
165
|
+
# TestPyPI rejects re-uploads of an existing version; for repeat dry
|
|
166
|
+
# runs bump the version locally or accept the failure as "already
|
|
167
|
+
# validated".
|
|
168
|
+
run: uv publish --publish-url https://test.pypi.org/legacy/
|
|
169
|
+
|