Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
103 lines (101 loc) · 5.08 KB
/
Copy pathpyproject.toml
File metadata and controls
103 lines (101 loc) · 5.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
[project]
name = "coda"
version = "0.18.3"
description = "CoDA - Coding Agents on Databricks Apps"
requires-python = ">=3.10"
dependencies = [
"flask>=2.0",
"flask-socketio>=5.0",
"simple-websocket>=1.0",
"claude-agent-sdk",
# Floor tracks the newest release the `exclude-newer` cooldown below allows.
# 0.124.0 / 0.125.0 / 0.126.0 existed at bump time but were published inside
# the cooldown window, so taking them would mean bypassing the supply-chain
# wait. Raise this once they age out.
"databricks-sdk>=0.123.0",
"mlflow-skinny==3.14.0",
"requests",
"tomli",
# GHSA-g6cj-pr64-35w5 / CVE-2026-69247 — cryptography >= 44.0.0, < 50.0.0
# leaks a Bleichenbacher oracle through distinguishable errors and timing
# when decrypting PKCS#7 EnvelopedData.
#
# DELIBERATELY NOT YET AT THE PATCHED 50.0.0. That release is newer than the
# `exclude-newer` cooldown below, so raising this floor makes the project
# unresolvable. Two reasons not to bump the cooldown for it:
# 1. CoDA never decrypts PKCS#7 EnvelopedData — nothing in the tree calls
# it (`git grep -i pkcs7` is empty). cryptography is here for TLS and
# for JWT signing via google-auth / pyjwt, not the affected code path.
# 2. The cooldown exists to stop us pulling a freshly-published compromised
# release. Bypassing it to dodge an unreachable CVE trades a real risk
# for a theoretical one.
# ACTION: raise to >=50.0.0 once 50.0.0 is older than the cooldown window.
"cryptography>=49.0.0",
# Security floors — make CVE-driven minimums explicit so future resolves
# can't silently downgrade. See PR description for advisory IDs.
# gitpython <= 3.1.56 carries a long run of advisories (GHSA-3f7w-8rr8-f37f,
# GHSA-94p4-4cq8-9g67, GHSA-r9mr-m37c-5fr3, GHSA-fjr4-x663-mwxc,
# GHSA-6p8h-3wgx-97gf, GHSA-3rp5-jjmw-4wv2, GHSA-rwj8-pgh3-r573,
# GHSA-956x-8gvw-wg5v, GHSA-2f96-g7mh-g2hx, GHSA-v396-v7q4-x2qj,
# GHSA-p538-c434-8v24, GHSA-539m-9xh6-q6rr). Direct, and transitive via
# mlflow-skinny.
"gitpython>=3.1.57",
"python-multipart>=0.0.31",
# GHSA-cg9f-27fq-jc2r — pyjwt < 2.13.0 mishandles issuer/audience
# validation. Transitive via databricks-sdk; pin a floor.
"pyjwt>=2.13.0",
# python-engineio <= 4.13.1 / python-socketio <= 5.16.1 carry
# Socket.IO CVEs. Both are transitive via flask-socketio; pin floors.
"python-engineio>=4.13.2",
"python-socketio>=5.16.2",
# GHSA-qccp-gfcp-xxvc + GHSA-mf9v-mfxr-j63j — urllib3 < 2.7.0 leaks
# sensitive headers across proxied redirects and bypasses the
# decompression-bomb safeguard. urllib3 is transitive; pin a floor
# so dependency resolves don't drift back.
"urllib3>=2.7.0",
# GHSA-65pc-fj4g-8rjx — idna < 3.15 lets crafted inputs bypass the
# CVE-2024-3651 fix in idna.encode(). idna is transitive; pin a floor.
"idna>=3.17",
# Upper bound is forced by our transitive ecosystem: both mlflow-skinny 3.11.x
# AND opentelemetry-api 1.41.x cap importlib-metadata<8.8. Dependabot tried
# to bump it to 9.0.0 (PR #3) and broke every deploy — explicit ceiling so
# the bot won't try again until upstream widens its caps.
"importlib-metadata<8.8",
# Upper bound is forced by databricks-sdk: 0.123.0 still declares
# `protobuf!=5.26.*,...,<7.0,>=4.25.8`. Dependabot tried to bump to
# protobuf 7.34.1 (PR #60) and broke `pip install -r requirements.txt`.
# Explicit ceiling so the bot won't try again until databricks-sdk lifts
# its <7.0 cap.
"protobuf<7",
# GHSA-vj7q-gjh5-988w + GHSA-jpw9-pfvf-9f58 + GHSA-hvrp-rf83-w775 — mcp
# < 1.28.1. Transitive via claude-agent-sdk; pin a floor.
"mcp>=1.28.1",
# GHSA-m4p7-r5rc-7g4j + GHSA-8ppf-4f7h-5ppj + GHSA-hm4w-wwcw-mr6r — pyasn1
# < 0.6.4. Transitive via pyasn1-modules <- google-auth; pin a floor.
"pyasn1>=0.6.4",
# GHSA-4xgf-cpjx-pc3j — pydantic-settings >= 2.12.0, < 2.14.2. Transitive
# via mcp; pin a floor.
"pydantic-settings>=2.14.2",
# Security floor. Earlier the `starlette<1` cap was forced by mlflow-skinny
# 3.12.0's transitive `starlette<1`; mlflow-skinny 3.14.0 lifts that cap, so
# we can take the patched starlette. Multiple advisories affect < 1.3.1
# (e.g. DoS via multipart / range handling). Transitive via fastapi.
"starlette>=1.3.1",
]
[dependency-groups]
# Dev/test-only deps — not shipped to the app container. Install with
# `uv sync --group dev` or `uv pip install --group dev`.
dev = [
"pytest>=8.0",
"pytest-timeout>=2.4",
# Playwright for the e2e suite (tests/e2e/) — drives a real browser
# against the deployed app to verify SSO + setup pipeline + security
# fixes end-to-end. Optional: tests skip cleanly when not installed.
"playwright>=1.61.0",
"pytest-playwright>=0.8.0",
]
[tool.uv]
# Exclude packages uploaded to PyPI more recently than ~30 days ago.
# This gives the community time to catch supply-chain issues before they land here.
# Bump this date when you intentionally need a newer release.
exclude-newer = "7 days"