agentflow-runtime 1.1.0__tar.gz → 1.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.
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/.gitignore +4 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/CHANGELOG.md +81 -2
- agentflow_runtime-1.2.0/PKG-INFO +255 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/README.md +37 -21
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/pyproject.toml +40 -6
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/outbox.py +2 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/monitors/freshness_monitor.py +1 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/validators/schema_validator.py +3 -3
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/analytics.py +9 -7
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/auth/key_rotation.py +3 -2
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/auth/manager.py +3 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/auth/middleware.py +14 -4
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/admin_ui.py +2 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/lineage.py +9 -3
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/stream.py +4 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/security.py +13 -2
- agentflow_runtime-1.2.0/src/serving/audit_publisher.py +80 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/backends/duckdb_backend.py +2 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/cache.py +10 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/db_pool.py +3 -1
- agentflow_runtime-1.2.0/src/serving/duckdb_connection.py +72 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/entity_type_registry.py +3 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/engine.py +2 -1
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/search_index.py +2 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/sql_guard.py +25 -0
- agentflow_runtime-1.1.0/PKG-INFO +0 -55
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/LICENSE +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/requirements.txt +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/constants.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/cdc/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/cdc/normalizer.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/connectors/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/connectors/mysql_cdc.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/connectors/postgres_cdc.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/producers/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/producers/event_producer.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/schemas/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/schemas/events.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/ingestion/tenant_router.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/logger.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/orchestration/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/orchestration/dags/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/orchestration/dags/daily_batch.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/event_replayer.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/flink_jobs/Dockerfile +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/flink_jobs/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/flink_jobs/checkpointing.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/flink_jobs/session_aggregation.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/flink_jobs/session_aggregator.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/flink_jobs/stream_processor.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/iceberg_sink.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/local_pipeline.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/tracing.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/transformations/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/processing/transformations/enrichment.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/monitors/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/monitors/metrics_collector.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/validators/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/validators/semantic_validator.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/alert_dispatcher.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/alerts/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/alerts/dispatcher.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/alerts/escalation.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/alerts/evaluator.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/alerts/history.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/auth/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/main.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/middleware/logging.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/middleware/tracing.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/rate_limiter.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/admin.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/agent_query.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/alerts.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/batch.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/contracts.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/deadletter.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/search.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/slo.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/routers/webhooks.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/telemetry.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/templates/admin.html +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/versioning.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/api/webhook_dispatcher.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/backends/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/backends/clickhouse_backend.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/masking.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/catalog.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/contract_registry.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/nl_engine.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/__init__.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/contracts.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/entity_queries.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/metric_queries.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/nl_queries.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/sql_builder.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query/sql_guard.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/query_engine.py +0 -0
- {agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/serving/semantic_layer/schema_evolution.py +0 -0
|
@@ -72,6 +72,7 @@ mutants/
|
|
|
72
72
|
/rep.md
|
|
73
73
|
/more_help.md
|
|
74
74
|
/About_DE_project.md
|
|
75
|
+
/audit_*.md
|
|
75
76
|
/RELEASING.md
|
|
76
77
|
sdk/agentflow/**/__pycache__/
|
|
77
78
|
sdk/agentflow/**/*.py[cod]
|
|
@@ -84,5 +85,8 @@ integrations/agentflow_integrations/**/*.py[cod]
|
|
|
84
85
|
agentflow_bench_debug*.duckdb*
|
|
85
86
|
agentflow_demo_api.duckdb*
|
|
86
87
|
|
|
88
|
+
# Local autopilot runtime state.
|
|
89
|
+
.autopilot/
|
|
90
|
+
|
|
87
91
|
# Security scan workdir (generated by .github/workflows/security.yml safety job)
|
|
88
92
|
.tmp-security/
|
|
@@ -4,6 +4,51 @@ All notable changes to AgentFlow are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.0] - 2026-05-23
|
|
8
|
+
|
|
9
|
+
### Documentation
|
|
10
|
+
|
|
11
|
+
- Documented the demo-key requirement, current DuckDB/ClickHouse serving
|
|
12
|
+
story, Docker Redis dependency for the local demo, example-agent dry-run
|
|
13
|
+
flow, and local compose environment placeholders.
|
|
14
|
+
- Refreshed release, SDK, and integrations docs after the live v1.1.0
|
|
15
|
+
registry publish: README status, release-readiness handoff, SDK README,
|
|
16
|
+
integrations local-install note, and the T31 task closeout now match the
|
|
17
|
+
current post-release state.
|
|
18
|
+
- Prepared npm publishing for Trusted Publishing through GitHub Actions OIDC:
|
|
19
|
+
the TypeScript SDK publish workflow now requires npm CLI 11.5.1+ and no
|
|
20
|
+
longer passes `NPM_TOKEN` to the production `npm publish` step.
|
|
21
|
+
- Recorded the npm Trusted Publishing handoff: the new package was first
|
|
22
|
+
published as `@yuliaedomskikh/agentflow-client@1.1.0`, Trusted Publisher
|
|
23
|
+
setup succeeded for `brownjuly2003-code/agentflow` with workflow
|
|
24
|
+
`publish-npm.yml`, CLI `npm trust list` readback is complete, and future
|
|
25
|
+
recovery-code use must keep a two-code reserve through the
|
|
26
|
+
`npm-recovery-codes` skill.
|
|
27
|
+
- Documented the completed replacement npm account bootstrap for
|
|
28
|
+
`yulia.edomskikh@gmail.com`, the saved 2FA recovery-code reserve, and the
|
|
29
|
+
switch of future TypeScript SDK publishing to
|
|
30
|
+
`@yuliaedomskikh/agentflow-client`.
|
|
31
|
+
- Clarified that legacy `NPM_TOKEN` revocation remains blocked until a
|
|
32
|
+
successful trusted-publish workflow run for `@yuliaedomskikh/agentflow-client`
|
|
33
|
+
and accepted external-gate intake evidence exist.
|
|
34
|
+
- Added a project-local Pi skill at `.pi/skills/external-gate-evidence-intake`
|
|
35
|
+
for external release-gate evidence intake without adding runtime dependencies.
|
|
36
|
+
- Added a production CDC onboarding runbook that blocks real source attachment
|
|
37
|
+
until source ownership, table scope, network path, credential ownership,
|
|
38
|
+
monitoring, and rollback decisions are recorded.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Treated corrupt Redis cache payloads as cache misses instead of surfacing
|
|
43
|
+
JSON decode failures to API requests.
|
|
44
|
+
- Fixed TypeScript SDK SSE parsing so a final frame with `id:` or `event:`
|
|
45
|
+
metadata before `data:` is still emitted.
|
|
46
|
+
- Made the TypeScript SDK unit-test script include all `sdk-ts/tests` files and
|
|
47
|
+
included `CHANGELOG.md` in the npm dry-run package contents.
|
|
48
|
+
- Allowed packaged SDK starter templates to include placeholder
|
|
49
|
+
`.env.example.tmpl` files while keeping the release artifact checker strict
|
|
50
|
+
for real `.env` files, API-key configs, webhook configs, and secret paths.
|
|
51
|
+
|
|
7
52
|
### Security (audit follow-up sprint 2026-04-27/28)
|
|
8
53
|
|
|
9
54
|
Two external audits delivered against `4a13d36` (Claude Opus + Codex p1–p9,
|
|
@@ -78,7 +123,10 @@ off by default (enable per cluster).
|
|
|
78
123
|
`npm ci` + `npm test` + `npm audit` before publish. New `npm-audit` job
|
|
79
124
|
added to `security.yml`. `aquasecurity/trivy-action` pinned from
|
|
80
125
|
`@master` to `0.28.0`. Safety scope now includes
|
|
81
|
-
`integrations/pyproject.toml` resolved requirements.
|
|
126
|
+
`integrations/pyproject.toml` resolved requirements. TypeScript SDK npm
|
|
127
|
+
publishing now targets `@yuliaedomskikh/agentflow-client` because npm org scope
|
|
128
|
+
`@agentflow` is already owned by another project and the previous user scope is
|
|
129
|
+
legacy.
|
|
82
130
|
|
|
83
131
|
**Vulnerable dep bumps:** `dagster>=1.13.1` (GHSA-mjw2-v2hm-wj34
|
|
84
132
|
SQL injection via dynamic partition keys), `langchain-core>=1.2.22`
|
|
@@ -147,7 +195,7 @@ so the test bypass flag does not leak across `TestClient` instances
|
|
|
147
195
|
(closes Codex review P2 on auth/middleware persistence).
|
|
148
196
|
|
|
149
197
|
**Documentation hygiene (Codex p6):** TypeScript SDK examples now
|
|
150
|
-
import from `"@agentflow
|
|
198
|
+
import from `"@yuliaedomskikh/agentflow-client"` (was `"agentflow"`); placeholder
|
|
151
199
|
`https://api.agentflow.dev` examples replaced with
|
|
152
200
|
`http://localhost:8000`; clone URL points at
|
|
153
201
|
`brownjuly2003-code/agentflow`; `docs/quality.md` marked stale;
|
|
@@ -172,6 +220,37 @@ README that maps findings to the six closing commits.
|
|
|
172
220
|
|
|
173
221
|
### Added
|
|
174
222
|
|
|
223
|
+
- **DV2.0 multi-branch demo** (merged via `ddfb863` from
|
|
224
|
+
`feat/dv2-multi-branch`, sessions 1-5). Live Data Vault 2.0
|
|
225
|
+
warehouse on a self-hosted kind cluster with ClickHouse 25.5,
|
|
226
|
+
Postgres 17, and MinIO. Five branches (MSK / SPB / EKB / DXB / ALA),
|
|
227
|
+
three source systems (1C + Bitrix24 + WMS Excel), three jurisdictions
|
|
228
|
+
(RU / UAE / KZ). Artifacts:
|
|
229
|
+
- `warehouse/agentflow/dv2/raw_vault/` — 8 hubs + 8 links + 39
|
|
230
|
+
satellites (generator + jinja template + spec.yaml).
|
|
231
|
+
- `warehouse/agentflow/dv2/business_vault/` — 5 per-branch MDM views
|
|
232
|
+
plus `bv_order_canonical` with `*_source` audit columns.
|
|
233
|
+
- `infrastructure/dv2/` — kind topology, ClickHouse / Postgres / MinIO
|
|
234
|
+
StatefulSets, dbt mart runner, Argo Workflows installer and
|
|
235
|
+
`dv2-refresh` WorkflowTemplate, cold-offload CronJob fanout (5).
|
|
236
|
+
- `warehouse/agentflow/dv2/postgres_oltp/` — pull-based PostgreSQL()
|
|
237
|
+
bridge + push-based MaterializedPostgreSQL CDC (single-DB pattern).
|
|
238
|
+
- `warehouse/agentflow/dv2/postgres_oltp/fanout/` — per-branch CDC
|
|
239
|
+
fan-out via per-database split (`ops_msk_db`, `ops_dxb_db` →
|
|
240
|
+
`oltp_cdc_msk`, `oltp_cdc_dxb`). Native workaround for the
|
|
241
|
+
`materialized_postgresql_publication_name` setting being unsupported
|
|
242
|
+
in ClickHouse 25.5; PeerDB OSS was the originally-planned route but
|
|
243
|
+
does not fit on the 8 GB demo iMac alongside kind + CH + PG + MinIO.
|
|
244
|
+
- `warehouse/agentflow/dv2/dbt/` — three mart models
|
|
245
|
+
(`customer_360`, `branch_pnl`, `returns_velocity`) with 12 data
|
|
246
|
+
tests and a k8s Job runner.
|
|
247
|
+
- `docs/dv2-multi-branch/` — architecture diagram, demo evidence
|
|
248
|
+
(15 sections), 2-minute pitch script, recording-day runbook,
|
|
249
|
+
asciinema cast (`demo.cast`, 42 s, 130×35) plus runner, plain-text
|
|
250
|
+
transcript, self-contained HTML player embed, and a voice-over
|
|
251
|
+
MP4 (`demo_voiced.mp4`, ~92 s) — cast slowed to match a Russian
|
|
252
|
+
TTS narration of the pitch (reproducible via
|
|
253
|
+
`docs/dv2-multi-branch/build/build_voiced_demo.sh`).
|
|
175
254
|
- **Debezium/Kafka Connect CDC operationalization**: local compose now
|
|
176
255
|
brings up Postgres/MySQL source databases, Kafka Connect, Debezium
|
|
177
256
|
connector registration, and raw CDC topic bootstrap for the AgentFlow
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentflow-runtime
|
|
3
|
+
Version: 1.2.0
|
|
4
|
+
Summary: Real-time data platform serving context to AI agents
|
|
5
|
+
License: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
|
+
Requires-Dist: bcrypt<6,>=5
|
|
9
|
+
Requires-Dist: confluent-kafka<3,>=2.5
|
|
10
|
+
Requires-Dist: dagster<2,>=1.13.1
|
|
11
|
+
Requires-Dist: duckdb<2,>=1.1
|
|
12
|
+
Requires-Dist: fastapi<1,>=0.111
|
|
13
|
+
Requires-Dist: httpx<1,>=0.27
|
|
14
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2,>=1.41
|
|
15
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi<1,>=0.62b0
|
|
16
|
+
Requires-Dist: opentelemetry-instrumentation-httpx<1,>=0.62b0
|
|
17
|
+
Requires-Dist: opentelemetry-sdk<2,>=1.41
|
|
18
|
+
Requires-Dist: pandera<1,>=0.20
|
|
19
|
+
Requires-Dist: prometheus-client<1,>=0.21
|
|
20
|
+
Requires-Dist: pyarrow<19,>=17
|
|
21
|
+
Requires-Dist: pydantic-settings<3,>=2.5
|
|
22
|
+
Requires-Dist: pydantic<3,>=2.9
|
|
23
|
+
Requires-Dist: pyyaml<7,>=6
|
|
24
|
+
Requires-Dist: sqlglot<31,>=30
|
|
25
|
+
Requires-Dist: structlog<26,>=24.4
|
|
26
|
+
Requires-Dist: uvicorn[standard]<1,>=0.30
|
|
27
|
+
Provides-Extra: cloud
|
|
28
|
+
Requires-Dist: boto3<2,>=1.35; extra == 'cloud'
|
|
29
|
+
Requires-Dist: pyiceberg[pyiceberg-core]<1,>=0.7; extra == 'cloud'
|
|
30
|
+
Provides-Extra: contract
|
|
31
|
+
Requires-Dist: schemathesis==4.10.2; extra == 'contract'
|
|
32
|
+
Provides-Extra: dev
|
|
33
|
+
Requires-Dist: bandit<2,>=1.9; extra == 'dev'
|
|
34
|
+
Requires-Dist: build<2,>=1.2; extra == 'dev'
|
|
35
|
+
Requires-Dist: hatchling<2,>=1.25; extra == 'dev'
|
|
36
|
+
Requires-Dist: hypothesis<7,>=6; extra == 'dev'
|
|
37
|
+
Requires-Dist: jsonschema<5,>=4; extra == 'dev'
|
|
38
|
+
Requires-Dist: mypy<2,>=1.11; extra == 'dev'
|
|
39
|
+
Requires-Dist: pytest-asyncio<1,>=0.24; extra == 'dev'
|
|
40
|
+
Requires-Dist: pytest-cov<6,>=5; extra == 'dev'
|
|
41
|
+
Requires-Dist: pytest<9,>=8.3; extra == 'dev'
|
|
42
|
+
Requires-Dist: ruff<1,>=0.6; extra == 'dev'
|
|
43
|
+
Requires-Dist: testcontainers[kafka]<5,>=4.9; extra == 'dev'
|
|
44
|
+
Provides-Extra: flink
|
|
45
|
+
Requires-Dist: apache-flink==1.19.1; extra == 'flink'
|
|
46
|
+
Provides-Extra: integrations
|
|
47
|
+
Requires-Dist: langchain-core<2,>=1.2.22; extra == 'integrations'
|
|
48
|
+
Requires-Dist: langchain-text-splitters<2,>=1.1.2; extra == 'integrations'
|
|
49
|
+
Requires-Dist: langchain<2,>=0.3.30; extra == 'integrations'
|
|
50
|
+
Requires-Dist: langsmith<1,>=0.7.31; extra == 'integrations'
|
|
51
|
+
Requires-Dist: llama-index-core<1,>=0.12; extra == 'integrations'
|
|
52
|
+
Provides-Extra: llm
|
|
53
|
+
Requires-Dist: anthropic<1,>=0.39; extra == 'llm'
|
|
54
|
+
Provides-Extra: load
|
|
55
|
+
Requires-Dist: locust<3,>=2.29; extra == 'load'
|
|
56
|
+
Description-Content-Type: text/markdown
|
|
57
|
+
|
|
58
|
+
# AgentFlow
|
|
59
|
+
|
|
60
|
+
> Real-time data platform for AI agents. Live entity lookups, typed contracts, dual-language SDKs, and release-gated delivery.
|
|
61
|
+
|
|
62
|
+
[](docs/release-readiness.md)
|
|
63
|
+
[](https://codecov.io/gh/brownjuly2003-code/agentflow)
|
|
64
|
+
[](pyproject.toml)
|
|
65
|
+
[](LICENSE)
|
|
66
|
+
|
|
67
|
+
## Why this exists
|
|
68
|
+
|
|
69
|
+
Most agent demos work until they have to answer from live business state. Support, ops, and merch workflows need current orders, metrics, and health signals while the conversation is happening, not a stale warehouse snapshot and not a pile of one-off service adapters.
|
|
70
|
+
|
|
71
|
+
AgentFlow turns that problem into one serving boundary:
|
|
72
|
+
|
|
73
|
+
- streaming ingestion for operational events
|
|
74
|
+
- a semantic layer that exposes entities, metrics, and query endpoints
|
|
75
|
+
- typed contracts so SDKs and callers know what shape to expect
|
|
76
|
+
- Python and TypeScript clients that speak the same API surface
|
|
77
|
+
|
|
78
|
+
## Highlights
|
|
79
|
+
|
|
80
|
+
- **Release-line gate:** 752 passed, 4 skipped on 2026-05-04; GitHub environments `staging` and `production` have required reviewers. The 2026-04-27 audit closure sprint (Codex p1–p9 + Opus) shipped six commits closing all P0/P1/P2 findings — see [docs/audits/2026-04-27/README.md](docs/audits/2026-04-27/README.md) and Release Readiness for the live status
|
|
81
|
+
- **Sub-second entity lookups in the checked-in baseline**: entity p50 `38-55 ms`, entity p99 `290-320 ms`, aggregate p50 `56 ms` at `50` users for `60s`
|
|
82
|
+
- **Historical performance remediation is documented**: the serving path moved from an original ~`26,000 ms` baseline to the current `43-55 ms` release range
|
|
83
|
+
- **Dual SDK parity** for Python and TypeScript, including retry policies, circuit breakers, batching, pagination, and contract pinning
|
|
84
|
+
- **Postgres/MySQL CDC path** through Debezium and Kafka Connect, with local compose, Helm manifests, and canonical CDC normalization
|
|
85
|
+
- **Security hardening in the hot path**: parameterized queries, `sqlglot` AST validation for NL-to-SQL, and a Bandit baseline gate for new findings only
|
|
86
|
+
- **Release workflow coverage**: chaos smoke on PRs, performance regression gate, contract drift checks, and a Terraform apply workflow with OIDC-ready auth
|
|
87
|
+
|
|
88
|
+
## Quick start
|
|
89
|
+
|
|
90
|
+
> **Upgrading from v1.0.x?** See the [v1.1 migration guide](docs/migration/v1.1.md) before installing.
|
|
91
|
+
|
|
92
|
+
Prerequisites:
|
|
93
|
+
|
|
94
|
+
- Python `3.11+`
|
|
95
|
+
- `make`
|
|
96
|
+
- Docker Compose (`make demo` starts Redis)
|
|
97
|
+
|
|
98
|
+
PowerShell 7+:
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
git clone https://github.com/brownjuly2003-code/agentflow.git
|
|
102
|
+
cd agentflow
|
|
103
|
+
. .\scripts\setup.ps1
|
|
104
|
+
make demo
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
macOS / Linux:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
git clone https://github.com/brownjuly2003-code/agentflow.git
|
|
111
|
+
cd agentflow
|
|
112
|
+
source ./scripts/setup.sh
|
|
113
|
+
make demo
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`make demo` seeds local data, starts Redis, and serves the API on `http://localhost:8000`. Swagger UI is available at `http://localhost:8000/docs`.
|
|
117
|
+
|
|
118
|
+
Try it:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
curl http://localhost:8000/v1/entity/order/ORD-20260404-1001
|
|
122
|
+
|
|
123
|
+
curl -X POST http://localhost:8000/v1/query \
|
|
124
|
+
-H "Content-Type: application/json" \
|
|
125
|
+
-d '{"question":"Show me top 3 products"}'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Local demo runs without API-key enforcement unless you explicitly configure `AGENTFLOW_API_KEYS_FILE`.
|
|
129
|
+
|
|
130
|
+
## Architecture
|
|
131
|
+
|
|
132
|
+
```text
|
|
133
|
+
Event sources -> Kafka -> Flink -> Iceberg ----\
|
|
134
|
+
-> Semantic layer -> FastAPI -> Agent / SDK
|
|
135
|
+
Local demo -> local_pipeline -> DuckDB ------/
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Stack:
|
|
139
|
+
|
|
140
|
+
- **Ingestion**: Kafka producers, Debezium/Kafka Connect CDC, and a local synthetic pipeline
|
|
141
|
+
- **Processing**: Flink plus validation and enrichment stages
|
|
142
|
+
- **Storage**: Iceberg for production-shaped tables, DuckDB for the local serving path
|
|
143
|
+
- **Serving**: FastAPI, contract registry, lineage, search, and operational endpoints
|
|
144
|
+
- **Orchestration**: Dagster
|
|
145
|
+
- **IaC**: Terraform, Helm, Docker Compose, and a Fly.io demo config
|
|
146
|
+
|
|
147
|
+
See [docs/architecture.md](docs/architecture.md) for the detailed design, trade-offs, and deployment topologies.
|
|
148
|
+
|
|
149
|
+
CDC source capture is standardized on Debezium/Kafka Connect; downstream consumers use the canonical AgentFlow CDC contract defined in [ADR 0005](docs/decisions/0005-cdc-ingestion-strategy.md).
|
|
150
|
+
|
|
151
|
+
## What's inside
|
|
152
|
+
|
|
153
|
+
| Area | Files |
|
|
154
|
+
|------|-------|
|
|
155
|
+
| API core | `src/serving/api/` |
|
|
156
|
+
| Semantic layer | `src/serving/semantic_layer/` |
|
|
157
|
+
| Python SDK | `sdk/agentflow/` |
|
|
158
|
+
| TypeScript SDK | `sdk-ts/src/` |
|
|
159
|
+
| Agent integrations | `integrations/agentflow_integrations/` (LangChain, LlamaIndex, CrewAI, MCP) |
|
|
160
|
+
| Flink jobs | `src/processing/flink_jobs/` |
|
|
161
|
+
| Test suites | `tests/` |
|
|
162
|
+
| Planning trail | `docs/plans/` |
|
|
163
|
+
| Public site | `site/` |
|
|
164
|
+
| IaC | `infrastructure/terraform/`, `infrastructure/dv2/`, `helm/`, `k8s/` |
|
|
165
|
+
| DV2.0 warehouse | `warehouse/agentflow/dv2/` (hubs / links / satellites + X5 loader) |
|
|
166
|
+
|
|
167
|
+
## Documentation
|
|
168
|
+
|
|
169
|
+
- [Interactive Technical Walkthrough](docs/index.md) - MkDocs Material guide with Mermaid architecture, API, SDK, deployment, observability, and troubleshooting pages
|
|
170
|
+
- [Architecture](docs/architecture.md) - system context, data flow, failure modes
|
|
171
|
+
- [Operational Runbook](docs/runbook.md) - local stack, CDC capture, incident response, and maintenance commands
|
|
172
|
+
- [API Reference](docs/api-reference.md) - endpoint-by-endpoint examples for curl, Python, and TypeScript
|
|
173
|
+
- [Security Audit](docs/security-audit.md) - threat model, controls, and evidence
|
|
174
|
+
- [Competitive Analysis](docs/competitive-analysis.md) - positioning and trade-offs
|
|
175
|
+
- [CDC Deployment Plan](docs/plans/2026-04-debezium-kafka-connect-deployment-plan.md) - Debezium/Kafka Connect rollout decisions and implementation trail
|
|
176
|
+
- [Glossary](docs/glossary.md) - interview-ready explanations of the core technical terms
|
|
177
|
+
- [Release Readiness](docs/release-readiness.md) - checked release evidence through `v1.1.0` and current external-gate handoffs
|
|
178
|
+
- [Customer Discovery Tracker](docs/customer-discovery-tracker.md) - synthetic/modelled PMF planning surface and real-evidence gap
|
|
179
|
+
- [Pricing Validation Plan](docs/pricing-validation-plan.md) - pricing/WTP questions, evidence gates, and current real-evidence gap
|
|
180
|
+
- [AWS OIDC Setup](docs/operations/aws-oidc-setup.md) - Terraform apply readiness handoff
|
|
181
|
+
- [Immutable Retention Evidence Handoff](docs/operations/immutable-retention-evidence-handoff.md) - external audit-retention evidence checklist
|
|
182
|
+
- [Production CDC Source Onboarding](docs/operations/cdc-production-onboarding.md) - production CDC decision record and no-go gates
|
|
183
|
+
- [External Gate Evidence Intake Checklist](docs/operations/external-gate-evidence-intake.md) - required owner evidence before blocked external gates can close
|
|
184
|
+
- [Public Production-Hardware Benchmark Plan](docs/perf/public-production-hardware-benchmark-plan.md) - benchmark evidence plan for `c8g.4xlarge+`
|
|
185
|
+
- [External Pen-Test Attestation Handoff](docs/operations/external-pen-test-attestation-handoff.md) - third-party pen-test evidence checklist
|
|
186
|
+
- [Audit History](docs/audit-history.md) - baseline-to-release remediation trail
|
|
187
|
+
- [Publication Checklist](docs/publication-checklist.md) - final GitHub publishing checklist
|
|
188
|
+
- [Fly.io Demo Deploy](deploy/fly/README.md) - minimal hosted demo instructions
|
|
189
|
+
- [DV2.0 Multi-Branch Extension](docs/dv2-multi-branch/SESSION_HANDOFF.md) - Data Vault 2.0 model for mid-market e-com with 5 locations / 3 jurisdictions; [schema](docs/dv2-multi-branch/schema_dv2.md), [end-to-end flow](docs/dv2-multi-branch/architecture.md), [live demo evidence](docs/dv2-multi-branch/demo_evidence.md), [k8s manifests](infrastructure/dv2/README.md)
|
|
190
|
+
- [Contributing](CONTRIBUTING.md) - development and PR expectations
|
|
191
|
+
- [Changelog](CHANGELOG.md) - project release notes
|
|
192
|
+
|
|
193
|
+
## Development
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# verified release slice
|
|
197
|
+
python -m pytest tests/unit tests/integration tests/sdk -q
|
|
198
|
+
|
|
199
|
+
# benchmark and regression gate
|
|
200
|
+
python scripts/run_benchmark.py
|
|
201
|
+
python scripts/check_performance.py --baseline docs/benchmark-baseline.json --current .artifacts/load/results.json --max-regress 20
|
|
202
|
+
|
|
203
|
+
# benchmark trend: [.github/perf-history.json](.github/perf-history.json) is appended on every main push;
|
|
204
|
+
# render the history locally with `make perf-plot` (writes docs/perf/history.html).
|
|
205
|
+
|
|
206
|
+
# contracts and security
|
|
207
|
+
python scripts/generate_contracts.py --check
|
|
208
|
+
bandit -r src sdk --ini .bandit --severity-level medium -f json -o .tmp/bandit-current.json
|
|
209
|
+
python scripts/bandit_diff.py .bandit-baseline.json .tmp/bandit-current.json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Status
|
|
213
|
+
|
|
214
|
+
**v1.1.0** is published to PyPI, npm, and GitHub.
|
|
215
|
+
The 2026-04-27 audit closure sprint landed six commits on `main`
|
|
216
|
+
that close all P0/P1/P2 findings from the Claude
|
|
217
|
+
Opus + Codex p1–p9 audits: tenant isolation across the control plane,
|
|
218
|
+
SQL guard centralization, entity allowlist enforcement on every read
|
|
219
|
+
surface, secrets scrubbed and rotated, helm `runAsNonRoot` /
|
|
220
|
+
NetworkPolicy / PodDisruptionBudget, npm lockfile + `npm audit` clean,
|
|
221
|
+
vulnerable dep bumps (`dagster>=1.13.1`, `langchain-core>=1.2.22`),
|
|
222
|
+
trivy pinned, OpenAPI drift gate, branch protection with 12 required
|
|
223
|
+
status checks, GitHub Actions environment reviewers, and Python SDK
|
|
224
|
+
alignment with the server v1 contract (F1–F10). Recent local full-suite
|
|
225
|
+
verification: `752 passed, 4 skipped` on 2026-05-04 after clarifying the
|
|
226
|
+
external-gate handoff. The post-v1.1 CDC operationalization
|
|
227
|
+
for Debezium / Kafka Connect is checked in, while production source
|
|
228
|
+
onboarding remains pending; see [docs/release-readiness.md](docs/release-readiness.md).
|
|
229
|
+
Remaining external gates are AWS OIDC role setup for real Terraform apply,
|
|
230
|
+
external immutable audit retention if claimed beyond local hash-chain evidence,
|
|
231
|
+
production CDC source onboarding, real PMF/pricing evidence, public benchmark
|
|
232
|
+
publication on production hardware, external pen-test attestation, and legacy
|
|
233
|
+
npm `NPM_TOKEN` revocation after a successful new-package trusted-publish run.
|
|
234
|
+
npm Trusted Publishing readback for the new package is complete. A project-local
|
|
235
|
+
Pi skill for evidence intake lives at `.pi/skills/external-gate-evidence-intake`.
|
|
236
|
+
|
|
237
|
+
## Screenshots
|
|
238
|
+
|
|
239
|
+
| Admin UI | API docs |
|
|
240
|
+
|----------|----------|
|
|
241
|
+
| <img src="docs/screenshots/admin-ui.png" alt="AgentFlow admin UI" width="420"> | <img src="docs/screenshots/swagger-docs.png" alt="AgentFlow API docs" width="420"> |
|
|
242
|
+
|
|
243
|
+
| Landing page | Benchmark run |
|
|
244
|
+
|--------------|---------------|
|
|
245
|
+
| <img src="docs/screenshots/landing-page.png" alt="AgentFlow landing page" width="420"> | <img src="docs/screenshots/benchmark-terminal.png" alt="AgentFlow benchmark terminal" width="420"> |
|
|
246
|
+
|
|
247
|
+
Capture notes and publish-time checks are listed in [docs/publication-checklist.md](docs/publication-checklist.md).
|
|
248
|
+
|
|
249
|
+
## License
|
|
250
|
+
|
|
251
|
+
MIT. See [LICENSE](LICENSE).
|
|
252
|
+
|
|
253
|
+
## Credits
|
|
254
|
+
|
|
255
|
+
Built as a data-engineering reference project during the `2026-04-10` -> `2026-04-20` release cycle, with the full implementation trail preserved in `docs/plans/`.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Real-time data platform for AI agents. Live entity lookups, typed contracts, dual-language SDKs, and release-gated delivery.
|
|
4
4
|
|
|
5
|
-
[](docs/release-readiness.md)
|
|
6
6
|
[](https://codecov.io/gh/brownjuly2003-code/agentflow)
|
|
7
7
|
[](pyproject.toml)
|
|
8
8
|
[](LICENSE)
|
|
@@ -20,7 +20,7 @@ AgentFlow turns that problem into one serving boundary:
|
|
|
20
20
|
|
|
21
21
|
## Highlights
|
|
22
22
|
|
|
23
|
-
- **
|
|
23
|
+
- **Release-line gate:** 752 passed, 4 skipped on 2026-05-04; GitHub environments `staging` and `production` have required reviewers. The 2026-04-27 audit closure sprint (Codex p1–p9 + Opus) shipped six commits closing all P0/P1/P2 findings — see [docs/audits/2026-04-27/README.md](docs/audits/2026-04-27/README.md) and Release Readiness for the live status
|
|
24
24
|
- **Sub-second entity lookups in the checked-in baseline**: entity p50 `38-55 ms`, entity p99 `290-320 ms`, aggregate p50 `56 ms` at `50` users for `60s`
|
|
25
25
|
- **Historical performance remediation is documented**: the serving path moved from an original ~`26,000 ms` baseline to the current `43-55 ms` release range
|
|
26
26
|
- **Dual SDK parity** for Python and TypeScript, including retry policies, circuit breakers, batching, pagination, and contract pinning
|
|
@@ -104,10 +104,12 @@ CDC source capture is standardized on Debezium/Kafka Connect; downstream consume
|
|
|
104
104
|
| Test suites | `tests/` |
|
|
105
105
|
| Planning trail | `docs/plans/` |
|
|
106
106
|
| Public site | `site/` |
|
|
107
|
-
| IaC | `infrastructure/terraform/`, `helm/`, `k8s/` |
|
|
107
|
+
| IaC | `infrastructure/terraform/`, `infrastructure/dv2/`, `helm/`, `k8s/` |
|
|
108
|
+
| DV2.0 warehouse | `warehouse/agentflow/dv2/` (hubs / links / satellites + X5 loader) |
|
|
108
109
|
|
|
109
110
|
## Documentation
|
|
110
111
|
|
|
112
|
+
- [Interactive Technical Walkthrough](docs/index.md) - MkDocs Material guide with Mermaid architecture, API, SDK, deployment, observability, and troubleshooting pages
|
|
111
113
|
- [Architecture](docs/architecture.md) - system context, data flow, failure modes
|
|
112
114
|
- [Operational Runbook](docs/runbook.md) - local stack, CDC capture, incident response, and maintenance commands
|
|
113
115
|
- [API Reference](docs/api-reference.md) - endpoint-by-endpoint examples for curl, Python, and TypeScript
|
|
@@ -115,10 +117,19 @@ CDC source capture is standardized on Debezium/Kafka Connect; downstream consume
|
|
|
115
117
|
- [Competitive Analysis](docs/competitive-analysis.md) - positioning and trade-offs
|
|
116
118
|
- [CDC Deployment Plan](docs/plans/2026-04-debezium-kafka-connect-deployment-plan.md) - Debezium/Kafka Connect rollout decisions and implementation trail
|
|
117
119
|
- [Glossary](docs/glossary.md) - interview-ready explanations of the core technical terms
|
|
118
|
-
- [Release Readiness](docs/release-readiness.md) - checked release evidence through `v1.1.0` and current
|
|
120
|
+
- [Release Readiness](docs/release-readiness.md) - checked release evidence through `v1.1.0` and current external-gate handoffs
|
|
121
|
+
- [Customer Discovery Tracker](docs/customer-discovery-tracker.md) - synthetic/modelled PMF planning surface and real-evidence gap
|
|
122
|
+
- [Pricing Validation Plan](docs/pricing-validation-plan.md) - pricing/WTP questions, evidence gates, and current real-evidence gap
|
|
123
|
+
- [AWS OIDC Setup](docs/operations/aws-oidc-setup.md) - Terraform apply readiness handoff
|
|
124
|
+
- [Immutable Retention Evidence Handoff](docs/operations/immutable-retention-evidence-handoff.md) - external audit-retention evidence checklist
|
|
125
|
+
- [Production CDC Source Onboarding](docs/operations/cdc-production-onboarding.md) - production CDC decision record and no-go gates
|
|
126
|
+
- [External Gate Evidence Intake Checklist](docs/operations/external-gate-evidence-intake.md) - required owner evidence before blocked external gates can close
|
|
127
|
+
- [Public Production-Hardware Benchmark Plan](docs/perf/public-production-hardware-benchmark-plan.md) - benchmark evidence plan for `c8g.4xlarge+`
|
|
128
|
+
- [External Pen-Test Attestation Handoff](docs/operations/external-pen-test-attestation-handoff.md) - third-party pen-test evidence checklist
|
|
119
129
|
- [Audit History](docs/audit-history.md) - baseline-to-release remediation trail
|
|
120
130
|
- [Publication Checklist](docs/publication-checklist.md) - final GitHub publishing checklist
|
|
121
131
|
- [Fly.io Demo Deploy](deploy/fly/README.md) - minimal hosted demo instructions
|
|
132
|
+
- [DV2.0 Multi-Branch Extension](docs/dv2-multi-branch/SESSION_HANDOFF.md) - Data Vault 2.0 model for mid-market e-com with 5 locations / 3 jurisdictions; [schema](docs/dv2-multi-branch/schema_dv2.md), [end-to-end flow](docs/dv2-multi-branch/architecture.md), [live demo evidence](docs/dv2-multi-branch/demo_evidence.md), [k8s manifests](infrastructure/dv2/README.md)
|
|
122
133
|
- [Contributing](CONTRIBUTING.md) - development and PR expectations
|
|
123
134
|
- [Changelog](CHANGELOG.md) - project release notes
|
|
124
135
|
|
|
@@ -143,33 +154,38 @@ python scripts/bandit_diff.py .bandit-baseline.json .tmp/bandit-current.json
|
|
|
143
154
|
|
|
144
155
|
## Status
|
|
145
156
|
|
|
146
|
-
**v1.1.0** is
|
|
147
|
-
The 2026-04-27 audit closure sprint landed six commits on
|
|
148
|
-
|
|
157
|
+
**v1.1.0** is published to PyPI, npm, and GitHub.
|
|
158
|
+
The 2026-04-27 audit closure sprint landed six commits on `main`
|
|
159
|
+
that close all P0/P1/P2 findings from the Claude
|
|
149
160
|
Opus + Codex p1–p9 audits: tenant isolation across the control plane,
|
|
150
161
|
SQL guard centralization, entity allowlist enforcement on every read
|
|
151
162
|
surface, secrets scrubbed and rotated, helm `runAsNonRoot` /
|
|
152
163
|
NetworkPolicy / PodDisruptionBudget, npm lockfile + `npm audit` clean,
|
|
153
164
|
vulnerable dep bumps (`dagster>=1.13.1`, `langchain-core>=1.2.22`),
|
|
154
165
|
trivy pinned, OpenAPI drift gate, branch protection with 12 required
|
|
155
|
-
status checks,
|
|
156
|
-
(F1–F10).
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
[docs/release-readiness.md](docs/release-readiness.md).
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
166
|
+
status checks, GitHub Actions environment reviewers, and Python SDK
|
|
167
|
+
alignment with the server v1 contract (F1–F10). Recent local full-suite
|
|
168
|
+
verification: `752 passed, 4 skipped` on 2026-05-04 after clarifying the
|
|
169
|
+
external-gate handoff. The post-v1.1 CDC operationalization
|
|
170
|
+
for Debezium / Kafka Connect is checked in, while production source
|
|
171
|
+
onboarding remains pending; see [docs/release-readiness.md](docs/release-readiness.md).
|
|
172
|
+
Remaining external gates are AWS OIDC role setup for real Terraform apply,
|
|
173
|
+
external immutable audit retention if claimed beyond local hash-chain evidence,
|
|
174
|
+
production CDC source onboarding, real PMF/pricing evidence, public benchmark
|
|
175
|
+
publication on production hardware, external pen-test attestation, and legacy
|
|
176
|
+
npm `NPM_TOKEN` revocation after a successful new-package trusted-publish run.
|
|
177
|
+
npm Trusted Publishing readback for the new package is complete. A project-local
|
|
178
|
+
Pi skill for evidence intake lives at `.pi/skills/external-gate-evidence-intake`.
|
|
164
179
|
|
|
165
180
|
## Screenshots
|
|
166
181
|
|
|
167
|
-
|
|
182
|
+
| Admin UI | API docs |
|
|
183
|
+
|----------|----------|
|
|
184
|
+
| <img src="docs/screenshots/admin-ui.png" alt="AgentFlow admin UI" width="420"> | <img src="docs/screenshots/swagger-docs.png" alt="AgentFlow API docs" width="420"> |
|
|
168
185
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
- `benchmark-terminal.png`
|
|
186
|
+
| Landing page | Benchmark run |
|
|
187
|
+
|--------------|---------------|
|
|
188
|
+
| <img src="docs/screenshots/landing-page.png" alt="AgentFlow landing page" width="420"> | <img src="docs/screenshots/benchmark-terminal.png" alt="AgentFlow benchmark terminal" width="420"> |
|
|
173
189
|
|
|
174
190
|
Capture notes and publish-time checks are listed in [docs/publication-checklist.md](docs/publication-checklist.md).
|
|
175
191
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agentflow-runtime"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.2.0"
|
|
4
4
|
description = "Real-time data platform serving context to AI agents"
|
|
5
|
+
readme = "README.md"
|
|
5
6
|
requires-python = ">=3.11"
|
|
6
7
|
license = { text = "MIT" }
|
|
7
8
|
|
|
@@ -115,12 +116,13 @@ line-length = 100
|
|
|
115
116
|
|
|
116
117
|
[tool.ruff.lint]
|
|
117
118
|
select = ["E", "F", "W", "I", "N", "UP", "S", "B", "A", "C4", "PT"]
|
|
118
|
-
ignore = ["S101", "S311"
|
|
119
|
+
ignore = ["S101", "S311"]
|
|
119
120
|
|
|
120
121
|
[tool.ruff.lint.per-file-ignores]
|
|
121
122
|
"tests/**/*.py" = [
|
|
122
123
|
"S603",
|
|
123
124
|
"S607",
|
|
125
|
+
"S608",
|
|
124
126
|
"S310",
|
|
125
127
|
"S104",
|
|
126
128
|
"S106",
|
|
@@ -132,16 +134,44 @@ ignore = ["S101", "S311", "S608"]
|
|
|
132
134
|
"A002",
|
|
133
135
|
"E501",
|
|
134
136
|
]
|
|
137
|
+
"src/orchestration/dags/daily_batch.py" = [
|
|
138
|
+
"S608",
|
|
139
|
+
]
|
|
140
|
+
"src/serving/api/routers/lineage.py" = [
|
|
141
|
+
"S608",
|
|
142
|
+
]
|
|
143
|
+
"src/serving/api/routers/slo.py" = [
|
|
144
|
+
"S608",
|
|
145
|
+
]
|
|
146
|
+
"src/serving/api/routers/stream.py" = [
|
|
147
|
+
"S608",
|
|
148
|
+
]
|
|
135
149
|
"src/serving/backends/clickhouse_backend.py" = [
|
|
136
150
|
"S310",
|
|
151
|
+
"S608",
|
|
137
152
|
"E501",
|
|
138
153
|
]
|
|
139
154
|
"src/serving/backends/duckdb_backend.py" = [
|
|
155
|
+
"S608",
|
|
140
156
|
"E501",
|
|
141
157
|
]
|
|
158
|
+
"src/serving/semantic_layer/nl_engine.py" = [
|
|
159
|
+
"S608",
|
|
160
|
+
]
|
|
161
|
+
"src/serving/semantic_layer/query/entity_queries.py" = [
|
|
162
|
+
"S608",
|
|
163
|
+
]
|
|
164
|
+
"src/serving/semantic_layer/query/nl_queries.py" = [
|
|
165
|
+
"S608",
|
|
166
|
+
]
|
|
167
|
+
"src/serving/semantic_layer/search_index.py" = [
|
|
168
|
+
"S608",
|
|
169
|
+
]
|
|
142
170
|
|
|
143
171
|
[tool.pytest.ini_options]
|
|
144
172
|
testpaths = ["tests"]
|
|
173
|
+
addopts = ["-p", "no:schemathesis", "--basetemp=.tmp/pytest-basetemp"]
|
|
174
|
+
cache_dir = ".tmp/pytest-cache"
|
|
145
175
|
markers = [
|
|
146
176
|
"integration: marks tests requiring Docker services",
|
|
147
177
|
"requires_docker: marks tests that require local Docker",
|
|
@@ -180,6 +210,10 @@ ignore_missing_imports = true
|
|
|
180
210
|
module = "src.processing.flink_jobs.*"
|
|
181
211
|
ignore_errors = true
|
|
182
212
|
|
|
213
|
+
[[tool.mypy.overrides]]
|
|
214
|
+
module = "src.quality.validators.*"
|
|
215
|
+
disallow_untyped_defs = true
|
|
216
|
+
|
|
183
217
|
[tool.agentflow.dependency-profiles.profiles.runtime]
|
|
184
218
|
editable-installs = ["."]
|
|
185
219
|
|
|
@@ -299,17 +333,17 @@ job = "mutation"
|
|
|
299
333
|
profile = "test"
|
|
300
334
|
|
|
301
335
|
[[tool.agentflow.dependency-profiles.targets]]
|
|
302
|
-
name = "performance.
|
|
336
|
+
name = "performance.perf-baseline"
|
|
303
337
|
kind = "workflow"
|
|
304
338
|
path = ".github/workflows/performance.yml"
|
|
305
|
-
job = "
|
|
339
|
+
job = "perf-baseline"
|
|
306
340
|
profile = "perf"
|
|
307
341
|
|
|
308
342
|
[[tool.agentflow.dependency-profiles.targets]]
|
|
309
|
-
name = "perf-regression.perf-
|
|
343
|
+
name = "perf-regression.perf-smoke"
|
|
310
344
|
kind = "workflow"
|
|
311
345
|
path = ".github/workflows/perf-regression.yml"
|
|
312
|
-
job = "perf-
|
|
346
|
+
job = "perf-smoke"
|
|
313
347
|
profile = "perf"
|
|
314
348
|
|
|
315
349
|
[[tool.agentflow.dependency-profiles.targets]]
|
|
@@ -13,6 +13,7 @@ from confluent_kafka import KafkaException
|
|
|
13
13
|
from opentelemetry import trace
|
|
14
14
|
|
|
15
15
|
from src.processing.tracing import inject_trace_to_kafka_headers, telemetry_disabled
|
|
16
|
+
from src.serving.duckdb_connection import connect_duckdb
|
|
16
17
|
|
|
17
18
|
logger = structlog.get_logger()
|
|
18
19
|
tracer = trace.get_tracer("agentflow.outbox")
|
|
@@ -51,7 +52,7 @@ class OutboxProcessor:
|
|
|
51
52
|
if conn is None and duckdb_path is None:
|
|
52
53
|
raise ValueError("duckdb_path or conn is required")
|
|
53
54
|
self._owns_conn = conn is None
|
|
54
|
-
self._conn = conn if conn is not None else
|
|
55
|
+
self._conn = conn if conn is not None else connect_duckdb(str(duckdb_path))
|
|
55
56
|
self._producer = producer or self._produce_to_kafka
|
|
56
57
|
self._bootstrap_servers = bootstrap_servers or DEFAULT_KAFKA_BOOTSTRAP
|
|
57
58
|
self._max_retries = max_retries
|
{agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/monitors/freshness_monitor.py
RENAMED
|
@@ -158,7 +158,7 @@ class FreshnessMonitor:
|
|
|
158
158
|
)
|
|
159
159
|
|
|
160
160
|
|
|
161
|
-
if __name__ == "__main__":
|
|
161
|
+
if __name__ == "__main__": # pragma: no cover
|
|
162
162
|
monitor = FreshnessMonitor(
|
|
163
163
|
bootstrap_servers=os.getenv("KAFKA_BOOTSTRAP_SERVERS", "localhost:9092"),
|
|
164
164
|
topics=["events.validated", "sessions.aggregated"],
|
{agentflow_runtime-1.1.0 → agentflow_runtime-1.2.0}/src/quality/validators/schema_validator.py
RENAMED
|
@@ -7,7 +7,7 @@ Returns structured validation results with error details for observability.
|
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
8
|
from datetime import UTC, datetime
|
|
9
9
|
|
|
10
|
-
from pydantic import ValidationError
|
|
10
|
+
from pydantic import BaseModel, ValidationError
|
|
11
11
|
|
|
12
12
|
from src.ingestion.schemas.events import (
|
|
13
13
|
CdcEvent,
|
|
@@ -37,7 +37,7 @@ class ValidationResult:
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
# Map event type prefixes to their Pydantic models
|
|
40
|
-
_SCHEMA_MAP: dict = {
|
|
40
|
+
_SCHEMA_MAP: dict[str, type[BaseModel]] = {
|
|
41
41
|
"order.": OrderEvent,
|
|
42
42
|
"payment.": PaymentEvent,
|
|
43
43
|
"click": ClickstreamEvent,
|
|
@@ -49,7 +49,7 @@ _SCHEMA_MAP: dict = {
|
|
|
49
49
|
_CDC_SOURCES = {"postgres_cdc", "mysql_cdc"}
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
def _get_model_for_event(event_type: str)
|
|
52
|
+
def _get_model_for_event(event_type: str) -> type[BaseModel] | None:
|
|
53
53
|
for prefix, model in _SCHEMA_MAP.items():
|
|
54
54
|
if event_type.startswith(prefix) or event_type == prefix:
|
|
55
55
|
return model
|