From 83a4965c741ab0396fdff2dfb316ab1024614dc0 Mon Sep 17 00:00:00 2001 From: Bai Li Date: Wed, 23 Sep 2026 14:37:56 -0700 Subject: [PATCH 1/8] fix(criteria): search the whole command in command_executed, not just the first 2000 chars The ReDoS bound truncated every command to its first 2000 characters, so a checked command at the end of a long heredoc script was scored as never run. Search the rest of the command in bounded, line-aligned windows instead. Co-Authored-By: Claude Opus 5.5 --- .claude/notes/contracts.md | 9 +- src/coder_eval/criteria/command_executed.py | 63 ++++++++++---- tests/test_command_executed.py | 96 ++++++++++++++++++--- 3 files changed, 139 insertions(+), 29 deletions(-) diff --git a/.claude/notes/contracts.md b/.claude/notes/contracts.md index 268c6baa..c99ae5e6 100644 --- a/.claude/notes/contracts.md +++ b/.claude/notes/contracts.md @@ -95,9 +95,12 @@ the raw text alone can stop counting. It is memoized because the early-stop watcher re-scans the whole accumulated trajectory on every tool-call event, normalizing the same command many times per run. -The regex search window is capped to bound ReDoS on a large command string, and -normalization runs over that same truncated window, so `shlex` never sees more than the cap -and needs no separate guard. +Each regex search is bounded to 2000 characters to limit ReDoS on a large command string, +but the whole command is searched: the first 2000 characters, then the rest in windows that +start and end on logical-line boundaries. Agents write long heredoc scripts that end in the +command a task checks for (`cat > x < bool: @@ -97,16 +102,43 @@ def _normalize_shell(cmd_text: str) -> str | None: return " ".join(tokens) +def _search_windows(cmd_text: str) -> list[str]: + """Slices of ``cmd_text`` a pattern is searched in, each at most ``_MAX_PATTERN_SEARCH_LEN``. + + The first window is the leading ``_MAX_PATTERN_SEARCH_LEN`` characters. The rest + of the command is packed into windows that start and end on logical-line + boundaries (a backslash-continued line stays whole), so a command on a line after + a long heredoc is still seen. A single logical line longer than the bound is cut + into bound-sized pieces overlapping by ``_WINDOW_OVERLAP``. Work stays linear in + the command length and each regex search stays within the ReDoS bound. + """ + cap = _MAX_PATTERN_SEARCH_LEN + if len(cmd_text) <= cap: + return [cmd_text] + bounds: list[tuple[int, int]] = [] + start = end = 0 + for line_end in [m.end() for m in _LOGICAL_LINE_END.finditer(cmd_text)] + [len(cmd_text)]: + if line_end - start > cap: + if end > start: + bounds.append((start, end)) + start = end + while line_end - start > cap: + bounds.append((start, start + cap)) + start += cap - _WINDOW_OVERLAP + end = line_end + if end > start: + bounds.append((start, end)) + return [cmd_text[:cap]] + [cmd_text[s:e] for s, e in bounds if s > 0] + + def _match_haystacks(cmd_text: str, *, is_shell: bool) -> list[str]: """Strings a pattern may match against for one command. - Always the raw ``cmd_text`` truncated to the ReDoS bound; when ``is_shell``, - additionally the quote-resolved, wrapper-stripped form of that **same - truncated window** (see :func:`_normalize_shell`). Normalizing the already- - truncated slice keeps both haystacks describing the same window, so quote- - stripping can never slide content from past the cap into the match, and - caps ``shlex`` input at ``_MAX_PATTERN_SEARCH_LEN`` for free. Matching is - "either" — a pattern hits the command if it matches ANY haystack. + Every search window of ``cmd_text`` (see :func:`_search_windows`); when + ``is_shell``, additionally the quote-resolved, wrapper-stripped form of each + window (see :func:`_normalize_shell`). Normalizing per window keeps every + haystack within the ReDoS bound and caps ``shlex`` input for free. Matching is + "either" -- a pattern hits the command if it matches ANY haystack. ``is_shell`` is decided once by the caller (a Bash tool whose ``command`` is a non-empty ``str``) and passed in, rather than re-derived here from @@ -114,12 +146,13 @@ def _match_haystacks(cmd_text: str, *, is_shell: bool) -> list[str]: its params to JSON, where shell tokenization is meaningless, and must NOT be normalized (else stripped JSON quotes could newly satisfy an exclusion). """ - window = cmd_text[:_MAX_PATTERN_SEARCH_LEN] - haystacks = [window] - if is_shell: - normalized = _normalize_shell(window) - if normalized is not None and normalized != window: - haystacks.append(normalized) + haystacks: list[str] = [] + for window in _search_windows(cmd_text): + haystacks.append(window) + if is_shell: + normalized = _normalize_shell(window) + if normalized is not None and normalized != window: + haystacks.append(normalized) return haystacks diff --git a/tests/test_command_executed.py b/tests/test_command_executed.py index 6462390a..94edf0fb 100644 --- a/tests/test_command_executed.py +++ b/tests/test_command_executed.py @@ -2,7 +2,13 @@ from datetime import datetime -from coder_eval.criteria.command_executed import _MAX_PATTERN_SEARCH_LEN, _match_haystacks, _normalize_shell +from coder_eval.criteria.command_executed import ( + _MAX_PATTERN_SEARCH_LEN, + _WINDOW_OVERLAP, + _match_haystacks, + _normalize_shell, + _search_windows, +) from coder_eval.evaluation.checker import SuccessChecker from coder_eval.models import CommandExecutedCriterion from coder_eval.models.results import TurnRecord @@ -1072,18 +1078,12 @@ def test_bash_record_without_command_is_not_shell_normalized(self): result = SuccessChecker(sandbox).check(criterion, turn_records=turn_records) assert result.score == 1.0 - def test_normalized_haystack_shares_the_raw_truncation_window(self): - """Both haystacks describe the same <=2000-char window (no past-cap leak). - - Normalization runs over the already-truncated window. Normalizing the - FULL command would let quote-stripping slide content from past the cap - into the normalized haystack and change the verdict of a task relying on - the 2000-char bound. - """ - cmd = "bash -lc " + ("word " * 600) + "TARGET" # TARGET sits well past 2000 chars + def test_long_single_line_is_searched_in_bounded_windows(self): + """A match past the bound on one long line is found, and no haystack exceeds the bound.""" + cmd = "bash -lc " + ("word " * 600) + "TARGET" haystacks = _match_haystacks(cmd, is_shell=True) assert all(len(h) <= _MAX_PATTERN_SEARCH_LEN for h in haystacks) - assert not any("TARGET" in h for h in haystacks) + assert any("TARGET" in h for h in haystacks) def test_negative_assertion_not_dodged_by_quoting(self): """A quote-obfuscated retired call is still caught by a max_count=0 gate.""" @@ -1101,3 +1101,77 @@ def test_negative_assertion_not_dodged_by_quoting(self): ) result = SuccessChecker(sandbox).check(criterion, turn_records=turn_records) assert result.score == 0.0 + + +def _heredoc_then(tail: str, body_lines: int = 60) -> str: + body = "\n".join(f" line_{i} = {'x' * 60}" for i in range(body_lines)) + return f"cat > build.py <<'EOF'\n{body}\nEOF\n{tail}" + + +class TestSearchWindows: + """The pattern search covers the whole command, one bounded window at a time.""" + + def test_short_command_is_a_single_window(self): + assert _search_windows("uip agent validate .") == ["uip agent validate ."] + + def test_every_window_is_bounded_and_the_first_keeps_the_leading_slice(self): + cmd = _heredoc_then("cd .. && uip agent validate .", body_lines=300) + windows = _search_windows(cmd) + assert len(cmd) > 4 * _MAX_PATTERN_SEARCH_LEN + assert windows[0] == cmd[:_MAX_PATTERN_SEARCH_LEN] + assert all(len(w) <= _MAX_PATTERN_SEARCH_LEN for w in windows) + assert windows[-1].endswith("cd .. && uip agent validate .") + + def test_later_windows_start_on_a_line(self): + cmd = _heredoc_then("uip agent refresh .") + for w in _search_windows(cmd)[1:]: + assert cmd[cmd.index(w) - 1] == "\n" + + def test_backslash_continuation_stays_in_one_window(self): + pad = "x" * (_MAX_PATTERN_SEARCH_LEN - 40) + cmd = f"echo {pad}\ngh pr create \\\n --title t \\\n --body b" + assert any("gh pr create \\\n --title t \\\n --body b" in w for w in _search_windows(cmd)) + + def test_long_line_pieces_overlap(self): + line = "a" * (3 * _MAX_PATTERN_SEARCH_LEN) + windows = _search_windows(line) + assert windows[1].startswith(line[_MAX_PATTERN_SEARCH_LEN - _WINDOW_OVERLAP : _MAX_PATTERN_SEARCH_LEN]) + marker = "b" * _WINDOW_OVERLAP + split = line[: _MAX_PATTERN_SEARCH_LEN - 100] + marker + line[_MAX_PATTERN_SEARCH_LEN:] + assert any(marker in w for w in _search_windows(split)) + + def test_command_after_long_heredoc_satisfies_min_count(self): + cmd = _heredoc_then("cd .. && uip agent refresh MyAgent && uip agent validate MyAgent --output json") + assert cmd.index("uip agent validate") > _MAX_PATTERN_SEARCH_LEN + turn_records = [_make_turn([_make_command(parameters={"command": cmd})])] + criterion = CommandExecutedCriterion( + description="validates the agent", + tool_name="Bash", + command_pattern=r"uip\s+agent\s+validate", + min_count=1, + ) + assert SuccessChecker(MockSandbox()).check(criterion, turn_records=turn_records).score == 1.0 + + def test_forbidden_command_after_long_heredoc_trips_max_count(self): + cmd = _heredoc_then("uip or users list") + turn_records = [_make_turn([_make_command(parameters={"command": cmd})])] + criterion = CommandExecutedCriterion( + description="must NOT use retired `uip or users list`", + tool_name="Bash", + command_pattern=r"uip\s+or\s+users\s+list", + min_count=0, + max_count=0, + ) + assert SuccessChecker(MockSandbox()).check(criterion, turn_records=turn_records).score == 0.0 + + def test_exclusion_after_long_heredoc_drops_the_command(self): + cmd = _heredoc_then("uip agent validate . --dry-run") + turn_records = [_make_turn([_make_command(parameters={"command": cmd})])] + criterion = CommandExecutedCriterion( + description="real validate, not a dry run", + tool_name="Bash", + command_pattern=r"uip\s+agent\s+validate", + exclude_pattern=r"--dry-run", + min_count=1, + ) + assert SuccessChecker(MockSandbox()).check(criterion, turn_records=turn_records).score == 0.0 From 479663d5e04ed799d9ae78fb41163c824f983f55 Mon Sep 17 00:00:00 2001 From: Bai Li Date: Wed, 23 Sep 2026 16:43:39 -0700 Subject: [PATCH 2/8] build(deps): bump harness SDKs and CLIs to latest - claude-agent-sdk 0.2.124 -> 0.2.159 (bundles Claude Code 2.1.281) and the image's Claude Code 2.1.177 -> 2.1.281, so the CLI the SDK runs and the one reported in environment_info agree. 2.1.281 knows Opus 5.5 and the current Sonnet 5 price, so claude-code turn costs match list pricing again. - openai-codex / openai-codex-cli-bin 0.144.4 -> 0.156.1 - google-antigravity 0.1.8 -> 0.1.18: workspace containment moved into localharness, so policy.workspace_only() no longer carries a path predicate; the test now checks the resolved workspaces cover the skill roots. - Pi 0.84.4 -> 0.87.1, anthropic 1.0.0 -> 1.8.0, litellm 1.98.0 -> 1.102.1, harbor 0.22.0 -> 0.23.0, uipath 2.10.31 -> 2.14.25 - Ignore pydantic's ReadOnly TypedDict warning from litellm>=1.102 types, and regenerate the codex golden for the two null fields the new SDK serializes. Co-Authored-By: Claude Opus 5.5 --- docker/Dockerfile | 4 +- docker/Dockerfile.runtime | 4 +- pyproject.toml | 16 +- .../expected/codex_g_items_rebuild.json | 2 +- tests/test_antigravity_agent.py | 27 +-- uv.lock | 185 ++++++++++++------ 6 files changed, 149 insertions(+), 89 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e3ff04ab..ed8e5c5c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -30,7 +30,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # tag and is bumped deliberately -- mirrors the codex CLI pin # (`openai-codex-cli-bin==…` in pyproject). Leaving it at `@latest` let Docker # layer caching freeze it nondeterministically across rebuilds. -ARG CLAUDE_CODE_VERSION=2.1.177 +ARG CLAUDE_CODE_VERSION=2.1.281 RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* \ @@ -39,7 +39,7 @@ RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ # Pi Node CLI, pinned — same rationale as the Claude Code pin above (the agent # binary is a dominant non-model driver of results; @latest would freeze # nondeterministically under layer caching). Node 22 + npm are already present. -ARG PI_VERSION=0.84.4 +ARG PI_VERSION=0.87.1 RUN npm install -g @earendil-works/pi-coding-agent@${PI_VERSION} # uv: matches host sandbox.py's `uv venv` + `uv pip install` fast path diff --git a/docker/Dockerfile.runtime b/docker/Dockerfile.runtime index fd79c373..07202937 100644 --- a/docker/Dockerfile.runtime +++ b/docker/Dockerfile.runtime @@ -66,7 +66,7 @@ RUN export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="${SAFE_CHAIN_MINIMUM_PACKA # --- 3. Node LTS + the Claude Code CLI, under the kit dir. ------------------- ARG NODE_VERSION=22.14.0 -ARG CLAUDE_CODE_VERSION=2.1.177 +ARG CLAUDE_CODE_VERSION=2.1.281 # Download to a file first so a bad URL fails the build loudly (a piped # `curl | tar` would mask a 404 and only surface later as a missing npm), and # verify the tarball against nodejs.org's published SHASUMS256 before extracting @@ -109,6 +109,6 @@ RUN chmod +x /usr/local/bin/coder_eval_entrypoint.sh # label; labels don't survive `COPY --from`). The claude-code pin mirrors the # framework image — a parity test (tests/test_image_from_dockerfiles.py) enforces it. ARG CODER_EVAL_VERSION=unknown -ARG CLAUDE_CODE_VERSION=2.1.177 +ARG CLAUDE_CODE_VERSION=2.1.281 LABEL org.coder-eval.version="${CODER_EVAL_VERSION}" LABEL org.coder-eval.claude-code-version="${CLAUDE_CODE_VERSION}" diff --git a/pyproject.toml b/pyproject.toml index b102d698..94bde554 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ dependencies = [ # explicitly since our code/tests construct httpx2 types directly. Capped to # mirror anthropic's own bound on it (`httpx2<3,>=2.0.0`). "httpx2>=2.12.0,<3.0.0", - "claude-agent-sdk>=0.2.124", + "claude-agent-sdk>=0.2.159", "anyio>=4.14.2", "radon>=6.0.1", "tqdm>=4.67.3", @@ -112,7 +112,7 @@ litellm = [ # Without this extra, the framework still installs and runs; Codex-dependent # code paths fail at dispatch with a clear hint pointing back here. codex = [ - "openai-codex>=0.144.4", + "openai-codex>=0.156.1", ] # Optional extra that enables Antigravity agent support: # - AntigravityAgent implementation using Google's official google-antigravity SDK @@ -131,7 +131,7 @@ codex = [ # Without this extra the framework still installs and runs; Antigravity-dependent # code paths fail at start() with a clear hint pointing back here. antigravity = [ - "google-antigravity==0.1.8", + "google-antigravity==0.1.18", ] # Optional extra that enables OpenCode agent support. # @@ -180,7 +180,7 @@ pi = [] # back here (it is not needed to EXPORT a task to Harbor format, only to run coder-eval # itself as Harbor's agent). harbor = [ - "harbor==0.22.0", + "harbor==0.23.0", ] [project.scripts] @@ -212,14 +212,14 @@ packages = ["src/coder_eval"] allow-direct-references = true [tool.uv] -# openai-codex 0.144.4 hardpins `openai-codex-cli-bin==0.144.4` (a stable +# openai-codex 0.156.1 hardpins `openai-codex-cli-bin==0.156.1` (a stable # release; the SDK version now tracks the codex CLI version line). Naming it # here documents and holds the pinned cli-bin build — the harness binary is a # dominant non-model driver of eval results, so it travels with the coder_eval # release tag and is bumped deliberately (mirrors the antigravity localharness -# and claude-code CLI pins). 0.144.4 publishes manylinux wheels (x86_64 + +# and claude-code CLI pins). 0.156.1 publishes manylinux wheels (x86_64 + # aarch64), so CI/Linux installs work. -override-dependencies = ["openai-codex-cli-bin==0.144.4"] +override-dependencies = ["openai-codex-cli-bin==0.156.1"] constraint-dependencies = [ # Fix known CVEs in transitive dependencies @@ -443,6 +443,8 @@ filterwarnings = [ "ignore::DeprecationWarning", # Ignore deprecation warnings from dependencies "ignore::PendingDeprecationWarning", "ignore::ResourceWarning", # Ignore unclosed resources (handled by cleanup) + # litellm>=1.102 TypedDicts mark fields ReadOnly; pydantic warns when it builds their schema + "ignore:Item '.*' on TypedDict class '.*' is using the `ReadOnly` qualifier:UserWarning", ] # Coverage integration (when using --cov) diff --git a/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json b/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json index c73dd11b..bd23e300 100644 --- a/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json +++ b/tests/_fixtures/golden_streams/expected/codex_g_items_rebuild.json @@ -1,5 +1,5 @@ { - "agent_output": "{\n \"completed_at\": null,\n \"duration_ms\": 1500,\n \"error\": null,\n \"id\": \"turn_1\",\n \"items\": [\n {\n \"id\": \"m1\",\n \"memory_citation\": null,\n \"phase\": null,\n \"text\": \"rebuilt from items\",\n \"type\": \"agentMessage\"\n }\n ],\n \"items_view\": \"TurnItemsView.full\",\n \"started_at\": null,\n \"status\": \"TurnStatus.completed\"\n}", + "agent_output": "{\n \"completed_at\": null,\n \"duration_ms\": 1500,\n \"error\": null,\n \"id\": \"turn_1\",\n \"items\": [\n {\n \"delivery\": null,\n \"id\": \"m1\",\n \"memory_citation\": null,\n \"phase\": null,\n \"questions\": null,\n \"text\": \"rebuilt from items\",\n \"type\": \"agentMessage\"\n }\n ],\n \"items_view\": \"TurnItemsView.full\",\n \"started_at\": null,\n \"status\": \"TurnStatus.completed\"\n}", "assistant_turn_count": 1, "commands": [], "crash_reason": null, diff --git a/tests/test_antigravity_agent.py b/tests/test_antigravity_agent.py index db1b45c0..b86de7c7 100644 --- a/tests/test_antigravity_agent.py +++ b/tests/test_antigravity_agent.py @@ -11,6 +11,7 @@ from collections.abc import Callable from datetime import datetime, timedelta from itertools import pairwise +from pathlib import Path from types import ModuleType, SimpleNamespace from typing import Any @@ -146,31 +147,23 @@ def test_resolve_workspaces_includes_workdir_and_skill_roots(tmp_path): ] -def test_workspace_only_permits_skill_reads_with_resolved_workspaces(tmp_path): - """Drives the harness's real ``workspace_only`` policy: a skill read is denied when - scoped to the workdir alone (the bug), but permitted once the resolved skill roots - join ``workspaces`` (the fix). ``skills_paths`` feeds discovery, not the file-tool - allowlist, so the roots must be in ``workspaces`` for the agent to read SKILL.md.""" - policy = pytest.importorskip("google.antigravity.hooks.policy") - ag_types = pytest.importorskip("google.antigravity.types") - +def test_resolved_workspaces_cover_skill_reads(tmp_path): + """The harness confines file tools to ``workspaces`` (enforced inside localharness + since google-antigravity 0.1.18, not by a Python-side predicate), and + ``skills_paths`` feeds discovery, not that allowlist, so the resolved skill roots + must be in ``workspaces`` for the agent to read SKILL.md.""" repo = tmp_path / "skills-repo" _make_skill(repo / "skills", "uipath-sdd") - skill_md = repo / "skills" / "uipath-sdd" / "SKILL.md" + skill_md = (repo / "skills" / "uipath-sdd" / "SKILL.md").resolve() workdir = tmp_path / "work" workdir.mkdir() agent = AntigravityAgent(parse_agent_config(type="antigravity", plugins=[{"type": "local", "path": str(repo)}])) agent.working_directory = workdir - skills_paths = agent._resolve_skills_paths(None) - - def read_denied(workspaces) -> bool: - policies = policy.workspace_only([str(w) for w in workspaces]) - tc = ag_types.ToolCall(name="read_file", canonical_path=str(skill_md)) - return any(p.when(tc) for p in policies if p.when is not None) + workspaces = [Path(w).resolve() for w in agent._resolve_workspaces(agent._resolve_skills_paths(None))] - assert read_denied([workdir]) is True # workdir only: out-of-workspace → denied - assert read_denied(agent._resolve_workspaces(skills_paths)) is False # resolved workspaces permit it + assert not skill_md.is_relative_to(workdir.resolve()) + assert any(skill_md.is_relative_to(w) for w in workspaces) def test_to_token_usage_maps_gemini_buckets(): diff --git a/uv.lock b/uv.lock index aa0b0b0d..3e9c5dd8 100644 --- a/uv.lock +++ b/uv.lock @@ -20,7 +20,7 @@ constraints = [ { name = "starlette", specifier = ">=1.3.1" }, { name = "urllib3", specifier = ">=2.6.3" }, ] -overrides = [{ name = "openai-codex-cli-bin", specifier = "==0.144.4" }] +overrides = [{ name = "openai-codex-cli-bin", specifier = "==0.156.1" }] [[package]] name = "absl-py" @@ -153,7 +153,7 @@ wheels = [ [[package]] name = "anthropic" -version = "1.0.0" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -164,9 +164,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/aa/4978e58035bd6c638c7b483450a68b7ef2d732ab78885e27bb9db0cff1a2/anthropic-1.0.0.tar.gz", hash = "sha256:42be3c97604af7252c5898413aee076ace6c46e9bca0d0d90ceb77c7d3719027", size = 1077769, upload-time = "2026-08-20T19:59:00.565Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/b8/f4de0e90bbd641e86a1d6b20e017442033a2c1d2f5381799f82057115bd7/anthropic-1.8.0.tar.gz", hash = "sha256:9c1783ed90f409617749a61c5ab98e20624a572626f2e0a15cea03ed8e1401e5", size = 1221762, upload-time = "2026-09-22T16:25:38.167Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/5b/db4a854aebf5d33a5ab714c46af6eb85ee44f390ed29b7b325c00b9f11ed/anthropic-1.0.0-py3-none-any.whl", hash = "sha256:32dd52e9e1d774393b27182f451398ba4262287a4d0eab30887f89f1481b3ae4", size = 1171725, upload-time = "2026-08-20T19:58:58.725Z" }, + { url = "https://files.pythonhosted.org/packages/5b/18/5d25a703b66ba34e9277f875f692a3bea3b0ff4d47ee5d188521a01cdd2a/anthropic-1.8.0-py3-none-any.whl", hash = "sha256:79a4516a21e64fd7b15be1a49ebf544bd6376c96a971a77365358823a2717bc6", size = 1348276, upload-time = "2026-09-22T16:25:36.515Z" }, ] [[package]] @@ -388,6 +388,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] +[[package]] +name = "chardet" +version = "7.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/cd61c567092a6cec796144510a68aff158ebfc1df82950a45bae65f28413/chardet-7.6.0.tar.gz", hash = "sha256:93d9df6089ded42ed1fe9f57e272c0b74bd0464d45c0c7d50f09f26f31105c3c", size = 914462, upload-time = "2026-08-14T20:36:59.305Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/29/16a7419edfbd60e901e6a797cbc3e038cb2a81903bc16c029db755f0156f/chardet-7.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:57e6846cc13ce1ff59979f4ec9da770c57e12aa99046073f632de5a51d9a6f20", size = 1088449, upload-time = "2026-08-14T20:36:34.723Z" }, + { url = "https://files.pythonhosted.org/packages/1d/36/3a14b0f8ddeb302f157281ca656a3ce6874b78e2d6af03682f520b487245/chardet-7.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:089e3bb81a0a07e94f15461ded9f9ee66d349615b1a9fd557d4de1003e2fc12e", size = 1065126, upload-time = "2026-08-14T20:36:36.21Z" }, + { url = "https://files.pythonhosted.org/packages/d2/4c/f59a39c2bfe4ac99baba8da842e8d2ea0b84dff7ba53a96e7ad8c71602d7/chardet-7.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:43ea433e43a23c55e8e17f3fad1e07f5cfe5450c73124b95b0d849c21ad379ee", size = 1482492, upload-time = "2026-08-14T20:36:37.649Z" }, + { url = "https://files.pythonhosted.org/packages/bd/eb/93e8036681157f2217a18769927a035984526e6dbd5e91f28a375ca41c14/chardet-7.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b5d31f9b7f793e15e81cca877e7ccd72bffffa2a3443a9d47be9dfee84fad69", size = 1514185, upload-time = "2026-08-14T20:36:39.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/04/0066d7ab2c135e404a6fa166bb7fa49d1c7bf7af07b86ed95b1c48a348c7/chardet-7.6.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54b6a8d3b219560fa5cf4c28df932c37471afe047afdc152067104e741f38c1", size = 1454420, upload-time = "2026-08-14T20:36:40.549Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9f/e965f1d9eddfb86cf118f980d329cbee43c4ac4b562448b369a6b6ef36af/chardet-7.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:b3b4c96c4df93899b3c8b9e8159e06b1f55c66d7ca384d91481108e251a06eb0", size = 1159067, upload-time = "2026-08-14T20:36:41.816Z" }, + { url = "https://files.pythonhosted.org/packages/cf/78/e14991c9487277ed7d006fff58f3084ac792ed94cced081788abb95df70c/chardet-7.6.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c6061adf247ab5dda173b67010e13904c6071717660c7c8077fb50aca362b264", size = 1087678, upload-time = "2026-08-14T20:36:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/7a/40/0f95e04cb1820e0a582cd6d86bbf26be8302a94ccf330f8ba5f69735389d/chardet-7.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fc1e1571321baf8927582fe34363ad7f02279f11c8c2839c14b4c76894148db6", size = 1065310, upload-time = "2026-08-14T20:36:44.489Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a1/04404dcc9d6e1253b02583e562d2c7ddca50a7e91f460d62eff7e1d07c92/chardet-7.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8900f6c7cf6b015b17a51767cc6144689059ba1cdceaa383d29eb037ac28579e", size = 1485028, upload-time = "2026-08-14T20:36:45.797Z" }, + { url = "https://files.pythonhosted.org/packages/f4/88/360064c4c7d9d0664561dae03b74c871d2f5332b329f5c99f1c997fb869a/chardet-7.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cedbc584789eb2edfde20fd03669972a833ce6019e60014ae613f9bfc440e8e3", size = 1510242, upload-time = "2026-08-14T20:36:47.206Z" }, + { url = "https://files.pythonhosted.org/packages/43/4c/302869fa1c69a5a41e4e78782680b12552ffd4286c3ae3c839b7b8df53d4/chardet-7.6.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5dc835e40e0e09c2c3eab43731a8b5127834f42786dda09ba2f4b699ccd527a", size = 1456456, upload-time = "2026-08-14T20:36:48.668Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a9/ff4fef15ed25fc3f945a3b981ae0f43c8559b3fbedb40267e59e583d105b/chardet-7.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:0f304de7041afaec0195ad6464937cd112392002e9d72ed15d55f20a9abd3a13", size = 1159103, upload-time = "2026-08-14T20:36:50.107Z" }, + { url = "https://files.pythonhosted.org/packages/31/44/94e6f89485ce6c630e8fec6d388e3fa747e58b7246b0cc8c5c532ba98650/chardet-7.6.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a4f0a368ad04d5def08bdfaa17c7e15e71552f93923dc2aa9b2f7d9dee02fbb6", size = 1120302, upload-time = "2026-08-14T20:36:51.484Z" }, + { url = "https://files.pythonhosted.org/packages/e0/cd/8e68ba12f13aaf4ee82d54ef8a1f83d62942e7a6bc1e579dd2d530a3e26e/chardet-7.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:75d6c3a4d2046d49e83d2d2206eb073a1f390743e856d90c1bbc19949b26acf4", size = 1093157, upload-time = "2026-08-14T20:36:52.987Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f6/6a35342b9efa69dcceab0ea8966571c6442a59c336bf460f0a2af95ed234/chardet-7.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:459e2b1c98f9a86a4698112aa42dffa802bbbff883c1ff144071f87224125862", size = 1521213, upload-time = "2026-08-14T20:36:54.812Z" }, + { url = "https://files.pythonhosted.org/packages/df/8c/8f09bfabbaedae45caa72b996e96d5e3f6436dfddc55c1311ffa2f6bd7d2/chardet-7.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bdb6f03107b7ace3f44e0edd91aa24456ee558787df265cc19daf45785b31c7", size = 1528427, upload-time = "2026-08-14T20:36:56.224Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3d/2540627b193112e08b8045f3cad9295570866208555aa6625b63cc69c6cd/chardet-7.6.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:0c44a32da32cc8b23d6b20d98ace15ec7600950e4955d1bf5ab1f849b0187fdb", size = 1087374, upload-time = "2026-08-14T21:04:14.994Z" }, + { url = "https://files.pythonhosted.org/packages/fe/de/dac4f550cde73c4732b4916e72ec489ae36933fbbd1697e4122d3ae2e9dd/chardet-7.6.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:7bbc8a9652c7f859c593847f220c1d264f25749369abb1a267b404ee8cceb209", size = 1064688, upload-time = "2026-08-14T21:04:16.806Z" }, + { url = "https://files.pythonhosted.org/packages/06/45/f4f3f288496797d2cf1d1e9036f920ed2b4c79787b21c42a3314f4a6d532/chardet-7.6.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83512a475a2f3886166aa0bca1bbb39343a4eb3186dd5532127d6f2591d09118", size = 1486320, upload-time = "2026-08-14T21:04:18.535Z" }, + { url = "https://files.pythonhosted.org/packages/c0/81/3ca30c16e6c6015b737fca22d9342957cc617d8a65329d3e963ad754a31b/chardet-7.6.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:271ab71ec1be61dbbce0436de0848895c03eae051c379e937a39573d9ce403d9", size = 1515374, upload-time = "2026-08-14T21:04:20.724Z" }, + { url = "https://files.pythonhosted.org/packages/6e/98/163a75b8b3372a6b6503f5f5a4154a222ac135c7a706b5d176f8e4b237a2/chardet-7.6.0-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da86fc1b40ff5996fbb5e4c2d2dca770eac2c893cef157dacc050b8b4d929846", size = 1469504, upload-time = "2026-08-14T21:04:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/d7/4f/3ad1b1bd27ae7f0d3d13cf711366525cd781a9e067950d8a09aa280916cb/chardet-7.6.0-cp315-cp315-win_amd64.whl", hash = "sha256:b73f277c1ac09c4f8076c4214b816c7aa78a0a2f0cb7156742f4303f856bedc3", size = 1158551, upload-time = "2026-08-14T21:04:24.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/92/22a609c68c5123ebdccd8fe1a80e423609012ce20166de19a2ed3955b2f7/chardet-7.6.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:61238d5945b36af9a2ad13494f8969b7deb3c3b4abe223e54670c064e73f5328", size = 1119186, upload-time = "2026-08-14T21:04:25.761Z" }, + { url = "https://files.pythonhosted.org/packages/29/35/75a90143e4200e197f4f6cf5895d379e22bc785d0c7711120df18fa5347c/chardet-7.6.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:f2ec3c78cc6b54bf8e091ec4ee885473078b5d7ef18ab1b01c86ae1e98bf88f7", size = 1092596, upload-time = "2026-08-14T21:04:27.884Z" }, + { url = "https://files.pythonhosted.org/packages/d1/2c/b6d5f47d878c46e04ae6fcb58e0969467925bc0819b333c682e0c41bbc5c/chardet-7.6.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:167d7ba3ee08b654e36d7b43ebd9a36606c9a12e2fabdb361757a095ca3b7e3d", size = 1516644, upload-time = "2026-08-14T21:04:29.624Z" }, + { url = "https://files.pythonhosted.org/packages/25/d2/2bc3f1066c6f27bc3fa3a98dfd8a2a9c1e969a9d6bdc1edcd35278791fc4/chardet-7.6.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f14f46ef1977e41ce1f4814ca6984cea7f8b6baf8cbc6626ef7bf3d13cf7ea13", size = 1533221, upload-time = "2026-08-14T21:04:31.39Z" }, + { url = "https://files.pythonhosted.org/packages/cf/6e/5a0b348fa4cd7847567a28c6e697ccf58391960bfd13a6e7473ee23ca2f2/chardet-7.6.0-py3-none-any.whl", hash = "sha256:4076d795897ce45239825956a1334e134322ecc4bfe84dbb12acd5390de0fbc1", size = 680279, upload-time = "2026-08-14T20:36:57.763Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.6" @@ -447,20 +482,21 @@ wheels = [ [[package]] name = "claude-agent-sdk" -version = "0.2.124" +version = "0.2.159" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, + { name = "jsonschema" }, { name = "mcp" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/5f/55c18111253f66158d8f8dc99b0e8f3398272145fee1984ac67d3050d788/claude_agent_sdk-0.2.124.tar.gz", hash = "sha256:ea2207d55f81b6773d5be8928e1c5e1206f49ee402cafd5eb1cc09d389dd4bae", size = 304107, upload-time = "2026-07-20T22:27:26.957Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/b2/81eb389ace55434f0119b99b62c10a7ac206def6c92ee0768eb389b0c900/claude_agent_sdk-0.2.159.tar.gz", hash = "sha256:e1905e2637b27971bb561bb6ad317aeb3d50619be5261bfa7ff2e9c2be0f0fd1", size = 354571, upload-time = "2026-09-23T20:26:37.386Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/27/9412242d21ed1f9d45d78c28b28cdbbf24ba1470005a5adf439f2bb2d2e6/claude_agent_sdk-0.2.124-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b52f600ec0c694ac0f54a4e9a4905a014bca8e9fcdad9db96067e123ee030ec9", size = 73073509, upload-time = "2026-07-20T22:27:30.405Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f7/65a84a50cb5de82b3247be83914acecac65d5c890591b1f93ba3479d2235/claude_agent_sdk-0.2.124-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:33f0a45bc3c1768d35838461d76189d897769d31b7fabd1ba540e67669af8094", size = 78211990, upload-time = "2026-07-20T22:27:34.877Z" }, - { url = "https://files.pythonhosted.org/packages/f6/83/4a545978ab9e90844616ad121c3ccbbdf28f15968d1a75f0376739ffabf3/claude_agent_sdk-0.2.124-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:46d1c4e9abffbf5c801fe362fe21436287e3d3b75714ee908a04f1c440a05ab7", size = 82657033, upload-time = "2026-07-20T22:27:39.01Z" }, - { url = "https://files.pythonhosted.org/packages/3e/e1/ada3be7fa95f8a96ac9f23d27609513bd05bebc6ce8a2730b8ffe96db12c/claude_agent_sdk-0.2.124-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:7eaf8a1a746f9fd10ba534101d89188308688990be2d6f9adea9361a4c08c7b7", size = 83708175, upload-time = "2026-07-20T22:27:42.736Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/bbb0dce553c5efbf646fb535e0f0d26610e93d51f57e92bffa7aca1593e3/claude_agent_sdk-0.2.124-py3-none-win_amd64.whl", hash = "sha256:128c6dcb2058d829697d98a93ab2f6c35d35fac0ecabeef478a051959dbe5fbe", size = 83603754, upload-time = "2026-07-20T22:27:46.553Z" }, + { url = "https://files.pythonhosted.org/packages/ec/06/87d76aced98f7b71cede2ebf4ae7808e52df9d3819c7f4c7b8c3d2a225b6/claude_agent_sdk-0.2.159-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ba7f152560dca5001a0bc46ed13b7da14eb14b419faed25bb1af821bfa95d3de", size = 91937244, upload-time = "2026-09-23T20:26:41.375Z" }, + { url = "https://files.pythonhosted.org/packages/f4/cf/c65a1f2419fa4b2085a53e91cef41569fde4910057c3709b8ab4303be1fd/claude_agent_sdk-0.2.159-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:87f553fda74e2f57e00f2bcb1705ab9311a937f97571f4f9eceea2bd411b6e32", size = 96294436, upload-time = "2026-09-23T20:26:45.117Z" }, + { url = "https://files.pythonhosted.org/packages/f1/20/f01e211524f3d8edfe7c2ea26ac595d21afab443810cbedeca5c76f7ead0/claude_agent_sdk-0.2.159-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:b03683d12d217b0b6c189c88a3d260a045171e7fdc9f23e2d0dfb05ff3276834", size = 101405973, upload-time = "2026-09-23T20:26:48.799Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d5/de876f9b05c2a94c1d03222b6a5908b1d27f695cf862b237f04d92008d62/claude_agent_sdk-0.2.159-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:d3ba57c187b07c87702b94e2b62dd7c61ed874899defcbb35bb5cef4cb94ace1", size = 101764831, upload-time = "2026-09-23T20:26:53.25Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f2/b315c307a4199cb698a6b6f9e0e90cb8da4b0c8b3d00c68e9007c4a778d1/claude_agent_sdk-0.2.159-py3-none-win_amd64.whl", hash = "sha256:cc1b92ae56f42ade2d083ef2d2e5edb4aa8c7a6d856818a9b8f60cf6ae746f3a", size = 104353298, upload-time = "2026-09-23T20:26:57.913Z" }, ] [[package]] @@ -538,17 +574,17 @@ requires-dist = [ { name = "anyio", specifier = ">=4.14.2" }, { name = "azure-monitor-opentelemetry-exporter", specifier = ">=1.0.0b30,<1.1.0" }, { name = "bandit", extras = ["toml"], marker = "extra == 'dev'", specifier = ">=1.9.4" }, - { name = "claude-agent-sdk", specifier = ">=0.2.124" }, + { name = "claude-agent-sdk", specifier = ">=0.2.159" }, { name = "click", specifier = ">=8.3.3" }, { name = "defusedxml", marker = "extra == 'dev'", specifier = ">=0.7.1" }, - { name = "google-antigravity", marker = "extra == 'antigravity'", specifier = "==0.1.8" }, - { name = "harbor", marker = "extra == 'harbor'", specifier = "==0.22.0" }, + { name = "google-antigravity", marker = "extra == 'antigravity'", specifier = "==0.1.18" }, + { name = "harbor", marker = "extra == 'harbor'", specifier = "==0.23.0" }, { name = "httpx2", specifier = ">=2.12.0,<3.0.0" }, { name = "jmespath", specifier = ">=1.1.0" }, { name = "jsonschema", specifier = ">=4.26.0" }, { name = "litellm", marker = "extra == 'litellm'", specifier = ">=1.95.0,<2.0.0" }, { name = "mcp", marker = "extra == 'dev'", specifier = ">=1.28.1" }, - { name = "openai-codex", marker = "extra == 'codex'", specifier = ">=0.144.4" }, + { name = "openai-codex", marker = "extra == 'codex'", specifier = ">=0.156.1" }, { name = "opentelemetry-sdk", specifier = ">=1.30.0,<2.0.0" }, { name = "pip-audit", marker = "extra == 'dev'", specifier = ">=2.10.0" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=4.5.1" }, @@ -924,7 +960,7 @@ wheels = [ [[package]] name = "google-antigravity" -version = "0.1.8" +version = "0.1.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py" }, @@ -936,11 +972,12 @@ dependencies = [ { name = "websockets" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/5f/0f5d6b210faddb4e6d2b0c25072ae0b2430294f5dec0b4eabecc196ea32b/google_antigravity-0.1.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:be5a4853ae7cb7bff4fbba44073cbed96e1fdcdeebd9602b324bf3abe5614ab2", size = 31829862, upload-time = "2026-07-23T19:20:02.908Z" }, - { url = "https://files.pythonhosted.org/packages/a7/cb/2d74bfc57e9f7f579a97f8b445599639ac4a101bcf44bab2a9c58c1f634f/google_antigravity-0.1.8-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:06773b250668993cf59e3a90ba00f1d6fc52483612d9463aa3e71e4a2a30a20b", size = 37289461, upload-time = "2026-07-23T19:20:06.571Z" }, - { url = "https://files.pythonhosted.org/packages/93/54/9972ecf8e0b5e3d12067550462078be9babf8dc0f686e80ffe70daef0cad/google_antigravity-0.1.8-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:bd912cc0ac74fef8026c227500b7de06b3749a78f0148b99d9033e8c952787e0", size = 39396935, upload-time = "2026-07-23T19:20:09.493Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ee/52f63973142aa00b722d7d841b60991798352564538f8533c9eb27bb9546/google_antigravity-0.1.8-py3-none-win_amd64.whl", hash = "sha256:edc1690c3116d1da31b033951d62a56a005f73d13486ced1d11564c0b98ca244", size = 36678881, upload-time = "2026-07-23T19:20:13.11Z" }, - { url = "https://files.pythonhosted.org/packages/a1/f6/503b6efb48903cfca252fb22077c15849da302e3d3f4d7a7b7cd2438e146/google_antigravity-0.1.8-py3-none-win_arm64.whl", hash = "sha256:999bdc9ed8d413a6abff96b15105e72b7c596fcd7fce41448f6613ee0947a8b4", size = 33138761, upload-time = "2026-07-23T19:20:16.811Z" }, + { url = "https://files.pythonhosted.org/packages/4e/57/c53855740f8372635d266acfeaad7cd7f7a446d3d98c8b0f57b21443117f/google_antigravity-0.1.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c13d51210945d3a154febb900c2c3077625c99322ceafe48f6a2e009254f1361", size = 37943163, upload-time = "2026-09-22T22:03:24.685Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ef/088996f82e4e636dc94d58225d0a7e855b3026b3925f259c7b15b229e55d/google_antigravity-0.1.18-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:16b4069be48b83e0ff01cfd79761e8408ec164ef21aec6c03485e63c5cd94ffb", size = 40251073, upload-time = "2026-09-22T22:03:28.331Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1b/a261fb20a1554611dad99b4b5e8d2674f0f4861c42ff5902ed69a22b19c3/google_antigravity-0.1.18-py3-none-manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:14772cc17f7f89f1d47d26ff3aa1cb443596122f8b9844df1dbed7e18d35b73c", size = 38828002, upload-time = "2026-09-22T22:03:31.459Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4e/f13bd23d26667abf5d90aa94e01e7902536343a417bc389de1b58ce986b3/google_antigravity-0.1.18-py3-none-manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:d22943eece2ba465101a65cb431440e037d3d00d5948babb5a271b68f8e1973d", size = 42782040, upload-time = "2026-09-22T22:03:35.077Z" }, + { url = "https://files.pythonhosted.org/packages/d6/14/6ebe59d4442e8a16cf63cc59a7d31b849161cc3252b6ed46ae2a1e5aadb0/google_antigravity-0.1.18-py3-none-win_amd64.whl", hash = "sha256:b6a37e4924fb01d5f66b4f3d2a49f7ee56672a6038a44ab556d68df9bef6c0c5", size = 44211098, upload-time = "2026-09-22T22:03:38.79Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2e/24412c27b5fe85adf9509cc7c44fccc661be7af0526d085d333d00cae3fe/google_antigravity-0.1.18-py3-none-win_arm64.whl", hash = "sha256:ad790a8b9abcaa756a737584d8333728a01328a772d8002e6aa0297da1781a89", size = 40072554, upload-time = "2026-09-22T22:03:42.204Z" }, ] [[package]] @@ -1015,7 +1052,7 @@ wheels = [ [[package]] name = "harbor" -version = "0.22.0" +version = "0.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dirhash" }, @@ -1023,6 +1060,7 @@ dependencies = [ { name = "filelock" }, { name = "httpx" }, { name = "jinja2" }, + { name = "jsonschema" }, { name = "litellm" }, { name = "packaging" }, { name = "pathspec" }, @@ -1040,9 +1078,9 @@ dependencies = [ { name = "typer" }, { name = "uvicorn" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/12/a0/a37532fb647b93ef709b63a7fbdf613a84837a569fdd88f69dd7105bf093/harbor-0.22.0.tar.gz", hash = "sha256:becf0ce354026cc37899855e0a0d2687cd5188034a43635849245069aad0938b", size = 1832554, upload-time = "2026-08-22T03:22:39.798Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/3a/b05d0e8752d5d531e56fbb2955f0e656c0a9b5fbcd202dbad7313b29d4df/harbor-0.23.0.tar.gz", hash = "sha256:a8b87e98db59877228bb36d2c24757cc422a3144ffaf31a1f88955c65c911e4d", size = 1907464, upload-time = "2026-09-12T04:55:11.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/12/d517f1ca18738f7be78a210b13264c64bace531fdf644632128966aca530/harbor-0.22.0-py3-none-any.whl", hash = "sha256:4c4c6571b3d160ed0cb45b82918136751fb08e7b8596412723ac00dde12eeabb", size = 2058718, upload-time = "2026-08-22T03:22:38.071Z" }, + { url = "https://files.pythonhosted.org/packages/19/c7/607ff037dff1f40d1f941b9854742d66fd43630274fd4e7b8de8480dad34/harbor-0.23.0-py3-none-any.whl", hash = "sha256:8747400dbb2a5e2298e1338e17e88eba38433c0433fd700f34d1a9021bba5c37", size = 2142100, upload-time = "2026-09-12T04:55:10.014Z" }, ] [[package]] @@ -1348,7 +1386,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.98.0" +version = "1.102.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1366,15 +1404,15 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/97/c9da198af273d700bf44d7d82eb21c5b8078c82574b31856b71b1298234b/litellm-1.98.0.tar.gz", hash = "sha256:0e6ba5d645a73ca6d0ffb4e8ec539d94b6e8fad691f2a54c6819011e6d0de8bf", size = 17577139, upload-time = "2026-08-22T22:19:21.931Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/f0/acc98d2c47215aac9bda2c7d18c3d08e025b50ba3dadd7c449fa34811d15/litellm-1.102.1.tar.gz", hash = "sha256:7216f46e6a1eba50f4dbb6000afdb1f5b77360eb498a4f341fc655191108cfd4", size = 18489222, upload-time = "2026-09-23T03:59:02.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/90/2ef5e33b0a67b309be124a77e5098a261beffe28439221dbbc28e5f02e2e/litellm-1.98.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9fda3497f1ec4686c943ce2aeab5767f8fb4a5989305d4b28d6d5d7e488b850c", size = 24026097, upload-time = "2026-08-22T22:19:03.567Z" }, - { url = "https://files.pythonhosted.org/packages/b0/56/b4569b4ef3640732d5770e0d3f46a395fd20f35594db1f65629595daed00/litellm-1.98.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:b89b6a0fc179d881191579f5309e622173dca802ee991b92e382acb918eea437", size = 23683944, upload-time = "2026-08-22T22:19:06.952Z" }, - { url = "https://files.pythonhosted.org/packages/d9/a7/9f03de0e8d767ff27964ea99bbf07e4c37a12f9d3c168c09f40e068535d4/litellm-1.98.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3a95260f087a4cf763da85bbeeb2efa82caec243ad2394c9e6362ff747963738", size = 23824066, upload-time = "2026-08-22T22:19:09.714Z" }, - { url = "https://files.pythonhosted.org/packages/69/de/ab46b521e2a6e6a94a5cb91ba3debd6c4e922feaeb47158a389400b0a0fe/litellm-1.98.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:150993180bf049feafa3e20cf46ca0978c69cc66e2ef1639a47e852c682a4721", size = 24190393, upload-time = "2026-08-22T22:19:12.156Z" }, - { url = "https://files.pythonhosted.org/packages/c5/0a/d2f549d906b9b267b38b406dde721eb93db21b46ec907ae0a7a2a89a50f6/litellm-1.98.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:54d0bc2aba84644de5e84a265f24e5d436d91592ca5b7cc61cee478db297b0c3", size = 23901211, upload-time = "2026-08-22T22:19:14.708Z" }, - { url = "https://files.pythonhosted.org/packages/85/08/1bd1653297d9c92eaf04425f8a21da817fcde12e1d9469394c543df19d72/litellm-1.98.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5e546d4af197c257d320299af11f4619f8e5a29f9bb7ce2d9974dd4b1e045499", size = 24290140, upload-time = "2026-08-22T22:19:17.145Z" }, - { url = "https://files.pythonhosted.org/packages/de/91/14d11ad7e290137400e5b30bcf23de86f811085f4a46756f60684ed0f064/litellm-1.98.0-cp310-abi3-win_amd64.whl", hash = "sha256:1daac9a9a9d052fdbe58ee711c9924dc81d349d4621286cbd96d77baa12158c4", size = 24079638, upload-time = "2026-08-22T22:19:19.558Z" }, + { url = "https://files.pythonhosted.org/packages/21/fa/fe602c696b916db036675eb6f8b0ad27a8dd398f0190a8a813596b4c0405/litellm-1.102.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:01550e79e052249dc5df53631ed9bdff030ca7c2a22107c5ce482d53ecf5c8d8", size = 27063920, upload-time = "2026-09-23T03:58:38.074Z" }, + { url = "https://files.pythonhosted.org/packages/68/08/5f52917ea864a9a63278005341e92d840d3d70ddb933f63b35f5aecc32d5/litellm-1.102.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:da73fe3f6a1bf70232d752f7e1fe49f5d4d9473c02972553e0d0f7b514b280c7", size = 26553980, upload-time = "2026-09-23T03:58:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/7e/aa/a3ff2c79855f5d8cb0aa14bae0dfad0e1512f654fb0b654eec1702f2fbeb/litellm-1.102.1-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:296c49171d7b80e6298fdf1bb18c7b69a826b82ae2b917bc6f5a80f153ee8b29", size = 26850103, upload-time = "2026-09-23T03:58:45.15Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ff/ef3186da67f297edfa5c01a6b92ee7b2b2406056b0a7415945e0cf490a2d/litellm-1.102.1-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b36c46e89e2fc50f42848120ed03a31c7347103cbaa733421f8843915b6f3355", size = 27352604, upload-time = "2026-09-23T03:58:48.456Z" }, + { url = "https://files.pythonhosted.org/packages/d6/86/74f6ad713dc63700d5c40828708d64118db105a62a2919c9cdecddd6b966/litellm-1.102.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7c4ffead69cf010fe3f551d2941bd6190bdaa816b98d5ebc85df67096724180", size = 26919523, upload-time = "2026-09-23T03:58:51.904Z" }, + { url = "https://files.pythonhosted.org/packages/86/09/ba63c28d3373389022d8686396f26b28ac89c1e324e2b1fa00b4578e9b63/litellm-1.102.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c5fcfbe322e3052f96fa92409fc61ec9712a7b2b567e7760e057b17b7587d021", size = 27475133, upload-time = "2026-09-23T03:58:55.204Z" }, + { url = "https://files.pythonhosted.org/packages/69/e7/6a1613821f7cead31d17c4c84b1d1939b6c9a33226ba638a7e31610ce060/litellm-1.102.1-cp310-abi3-win_amd64.whl", hash = "sha256:b2c24cad24c637b20e91f6dd7b812971a5fa64ad2330213e517ff8f38d25c0d8", size = 27407273, upload-time = "2026-09-23T03:58:58.799Z" }, ] [[package]] @@ -1708,30 +1746,31 @@ wheels = [ [[package]] name = "openai-codex" -version = "0.144.4" +version = "0.156.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openai-codex-cli-bin" }, + { name = "packaging" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/7d/4b999b0ddd05c22d83cc2e879c95e1e92e3b7808b58ac561c4ea91fca1c4/openai_codex-0.144.4.tar.gz", hash = "sha256:91c63a7cb213441569f130e593386b34657ab9e726ae88af255f0ecb8de08ea5", size = 68324, upload-time = "2026-07-17T23:42:17.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/5a/ddc9ff30b38a361d5679cca79b1d0b4db70359a859fcb1b321e9c7423dd2/openai_codex-0.156.1.tar.gz", hash = "sha256:84de33cc7bf39f974423bd7568a5662d4eb1c685e6f9808c6160f1a68338a0c8", size = 87930, upload-time = "2026-09-23T02:51:35.714Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/35/5d2a13e38d91278019f18757ac10426d2649b7ec6f031818c792f64559e9/openai_codex-0.144.4-py3-none-any.whl", hash = "sha256:de1513a6e94b9a8d7728a3b74298bc1469428ade10ba0ef2d5db47dd1cb606f5", size = 76244, upload-time = "2026-07-17T23:42:15.658Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/6909bc7a4a4329e9642ee1a3862ec0a224420694bbf02fdb6336db6213e2/openai_codex-0.156.1-py3-none-any.whl", hash = "sha256:6a11313e86027dd2da00f1af475388a578a19076ae8150b0f1c305d8564c973f", size = 96056, upload-time = "2026-09-23T02:51:34.189Z" }, ] [[package]] name = "openai-codex-cli-bin" -version = "0.144.4" +version = "0.156.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/30/7e457c007a32aa7333a78438a9f532504c3b77a1ea57e7808855712c2c0f/openai_codex_cli_bin-0.144.4-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:4d587d152d5f0aa25f21ded4d08aac5150da48639b29fc3e57b2a8b413d06903", size = 126851183, upload-time = "2026-07-15T00:14:00.171Z" }, - { url = "https://files.pythonhosted.org/packages/65/eb/64c180514a2cc3e2500e486813f5a8d7f7e349342e9bebd78d99ddd9791a/openai_codex_cli_bin-0.144.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:05db505a9c7f020f58b70837a94e00d32a50086986c267bcc44ea97b573d4a05", size = 116474758, upload-time = "2026-07-15T00:14:08.177Z" }, - { url = "https://files.pythonhosted.org/packages/85/34/921ab692c7ed140941a91e39b84c6deafddb45072793f3a5f6dcbf86f59a/openai_codex_cli_bin-0.144.4-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:cd4bb31b8a477a3adba22139c8c493693fa5292ba21e86eef08ace3e96c41294", size = 119437596, upload-time = "2026-07-15T00:14:17.418Z" }, - { url = "https://files.pythonhosted.org/packages/25/62/39e630cf8b7b2e2444a5a6669235a6cd88004869a25bb7f3f629ed35638c/openai_codex_cli_bin-0.144.4-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:4106229c38f37245c3eea8d904426afd45b8bf19831765715647f5402f757c06", size = 128817757, upload-time = "2026-07-15T00:14:30.539Z" }, - { url = "https://files.pythonhosted.org/packages/23/24/318f91a95baaff845307e529d138d42a7202e6bd0e626556058eab3dead5/openai_codex_cli_bin-0.144.4-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d2d3fada11731938e3d3e3660819d5324b7f92e825a0ed5aede63100b36ffc9a", size = 119437594, upload-time = "2026-07-15T00:14:39.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/a0/65e6fd3a6fba52639937801d9ce517b0c48026458723bb9f08eb07a1dd35/openai_codex_cli_bin-0.144.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:70fb62ed7755e332dd8b00ed48e22ee16df10f4a977335039e237cd330490df3", size = 128817755, upload-time = "2026-07-15T00:14:47.849Z" }, - { url = "https://files.pythonhosted.org/packages/e3/8a/3ab5fc97352e8f780d472c8dd6d7504d6a670cd7dede106d461ac1171999/openai_codex_cli_bin-0.144.4-py3-none-win_amd64.whl", hash = "sha256:56e142974467332f1f669b89f2636e06b3ada09413512abb2f24c33b4a4f59fc", size = 140595092, upload-time = "2026-07-15T00:14:58.484Z" }, - { url = "https://files.pythonhosted.org/packages/70/1a/3aa52ab8f89e0f596b6eea835e3f3494697da51917d3231f5f48f92e2bcb/openai_codex_cli_bin-0.144.4-py3-none-win_arm64.whl", hash = "sha256:2ad01058db7181323ae7c6217e560702e38c4f107595b99ab1d0abc9f184890a", size = 130665105, upload-time = "2026-07-15T00:15:08.861Z" }, + { url = "https://files.pythonhosted.org/packages/52/1e/d60201465b08022d7f12898db6fe24cff937e515e0a1c186cd958f4299fd/openai_codex_cli_bin-0.156.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:142b29633e1c4a4cdb1ffb2c8d4cf334d0d0ab322673875802acfe562af05fd9", size = 130059695, upload-time = "2026-09-23T02:50:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7c/d768e1e721f6e0aff62314b9605291f873c7546b97c24ccb9b5c055e3104/openai_codex_cli_bin-0.156.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7cc8269e2af695d6b00be1a9d6f48243b3b992bce5f408b0910e75a369e67dd1", size = 119241989, upload-time = "2026-09-23T02:50:22.568Z" }, + { url = "https://files.pythonhosted.org/packages/92/a4/26633fff0fe965eaa6cb66af3a11339ea77455d4dc4f69bcb1e9d2335ca3/openai_codex_cli_bin-0.156.1-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:c725c0721949a81b2eae75e9468b280813a3e40bb3ce319b34f9bfbb69d4de0e", size = 127318762, upload-time = "2026-09-23T02:50:26.86Z" }, + { url = "https://files.pythonhosted.org/packages/fc/49/dd321e5e3ddb20d5aa768db20e7989d6e093d940f6bf30b742f1c70acac5/openai_codex_cli_bin-0.156.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:84a12567ca54ba6ae4ed755911c04e7cdf658315f8719963c8daa8592d8fe068", size = 136219225, upload-time = "2026-09-23T02:50:31.479Z" }, + { url = "https://files.pythonhosted.org/packages/12/0c/10f97974677278408b828997d2ccbd3cf6dd38b1730bee0040c2e0633fc8/openai_codex_cli_bin-0.156.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:b81cc09f04575fa7471e39dad678700a7e209c81031a8f86cb175c1f6c0ace40", size = 136944600, upload-time = "2026-09-23T02:50:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/86/3c/06c1e948a143805e6dbef43f3bd5d530c9040814b2a28ac7d4980cb77337/openai_codex_cli_bin-0.156.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:950627ab801703e061f2404105ed8216bb9728befbb09d853003a2678b9dbab2", size = 145984819, upload-time = "2026-09-23T02:50:40.776Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/d97a26ffda3b2ecd703aebec11770abe68513ac12e08c1c52c1721eee488/openai_codex_cli_bin-0.156.1-py3-none-win_amd64.whl", hash = "sha256:81ab68fdadf448af52736282619875e10d365d93dd7442e94925899e77b99e7d", size = 145804807, upload-time = "2026-09-23T02:50:45.739Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1f/505234ed2b7803db1966bcf92ce5b923f7e78768bab8540d916f8ce86394/openai_codex_cli_bin-0.156.1-py3-none-win_arm64.whl", hash = "sha256:1b192fcbac53f4c13b7c637ab44d67f2731b700a8b32ae314d04b4f880e85a9f", size = 134709984, upload-time = "2026-09-23T02:50:50.49Z" }, ] [[package]] @@ -1838,11 +1877,11 @@ wheels = [ [[package]] name = "packaging" -version = "26.0" +version = "26.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, ] [[package]] @@ -3099,7 +3138,7 @@ wheels = [ [[package]] name = "uipath" -version = "2.10.31" +version = "2.14.25" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "applicationinsights" }, @@ -3115,37 +3154,49 @@ dependencies = [ { name = "pysignalr" }, { name = "python-dotenv" }, { name = "python-socketio" }, + { name = "pyyaml" }, { name = "rich" }, { name = "tenacity" }, { name = "truststore" }, { name = "uipath-core" }, + { name = "uipath-ipc" }, { name = "uipath-platform" }, { name = "uipath-runtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/07/ba72ccad8e41416d9ba40ef7617cb2fa296b2b3b1807c9023b1d10c8bb82/uipath-2.10.31.tar.gz", hash = "sha256:8d71edfab76226eb5106d27bf43950b8863aaae6f1a88e0b251251c4929d4ed1", size = 2885044, upload-time = "2026-03-25T16:50:04.962Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/19/afdfcf3fd7aaa4e4fdaaee06d61d674f248283cef30390129a0001fd4638/uipath-2.14.25.tar.gz", hash = "sha256:cf1830e196084d1b84f092ce6524e20e5546345c6828c39e79ab86807aa82bed", size = 4587736, upload-time = "2026-09-23T08:07:06.754Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/23/d47328741b6872426c50a5e79427c141dd729aa99be26187261448005f1a/uipath-2.10.31-py3-none-any.whl", hash = "sha256:eca52f4ad5c36779931b9695a3f24d69dbb76e8ec5e08df8e0b9b5e3538264ca", size = 366322, upload-time = "2026-03-25T16:50:03Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c0/1bccbc778a7cbf180a9b7d80a7a98c6d934e01d00fedad414cb2d5677b6b/uipath-2.14.25-py3-none-any.whl", hash = "sha256:505f75509f6bad657379408bef2ae35084b8a32dd6c9f4ceeb71438c52fb0a5b", size = 452485, upload-time = "2026-09-23T08:07:04.148Z" }, ] [[package]] name = "uipath-core" -version = "0.5.7" +version = "0.5.32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-instrumentation" }, { name = "opentelemetry-sdk" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/67/cea2367246d8332bbcc4a4410a7287824d89a6b23795ef1a238f215c1c55/uipath_core-0.5.7.tar.gz", hash = "sha256:977b00a80dd38cd6abd49329861c6155f523079d0645341fead9e5cb195cdd9d", size = 112660, upload-time = "2026-03-13T16:32:31.136Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/0b/deb01dc671b075d88841f017a7c394e1b6f6869a9b3c027333cce587d59f/uipath_core-0.5.32.tar.gz", hash = "sha256:f709cc0b6a24d779b1b2200943512bedfc0842bac983ad0a9c668f35a991f4e7", size = 131009, upload-time = "2026-08-19T13:10:13.789Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/a9/37c9f603dd6ba72e8c6fab9fc0c0d6f2aebe78280e831138917671c255ce/uipath_core-0.5.7-py3-none-any.whl", hash = "sha256:ab42306028245d333b2e08e6a8bbf5cffe00caf7a5cb5d7aa40f05e698173ed2", size = 42045, upload-time = "2026-03-13T16:32:29.823Z" }, + { url = "https://files.pythonhosted.org/packages/2a/af/8c8641ea4b1596158ce47d6917d320a093bef9d7d93f781aeb03ee1ecf50/uipath_core-0.5.32-py3-none-any.whl", hash = "sha256:0a08644b6805db42be11257446947e419d14bb75e9c3ad82c4eee2509a5181da", size = 55123, upload-time = "2026-08-19T13:10:12.238Z" }, +] + +[[package]] +name = "uipath-ipc" +version = "2.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/ee/182b16ff0cd205cb172def92349e7625e36d5b2ba11bdcb98bee43ccf548/uipath_ipc-2.5.3.tar.gz", hash = "sha256:823cdd1192c72ca786bfd3cbff65f88e2b02c33f450046f13e572022b7e6b870", size = 86363, upload-time = "2026-09-15T15:32:58.24Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/33/eebf6d9b5021d0517d5b7ca0f27bac48dda68530a2322bc04fd3c636e737/uipath_ipc-2.5.3-py3-none-any.whl", hash = "sha256:139852a85c8235f7f98959053a97ed748e9a051ddef952b99e49b6097c36d7ad", size = 50342, upload-time = "2026-09-15T15:32:56.962Z" }, ] [[package]] name = "uipath-platform" -version = "0.1.8" +version = "0.2.32" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "anyio" }, { name = "httpx" }, { name = "pydantic-function-models" }, { name = "sqlparse" }, @@ -3153,21 +3204,23 @@ dependencies = [ { name = "truststore" }, { name = "uipath-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/2c/eb7cec36eb96aea845a621e97d6149f38e06d8d41f9012400a0e514e20f1/uipath_platform-0.1.8.tar.gz", hash = "sha256:b8ef2f1f6d04e4568a278a01b84cd0d32df17f0d37444633aa0b04afae5fa71b", size = 285358, upload-time = "2026-03-24T14:11:07.996Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/dd/479c515c44a992ff9601929a3736943c9c0f9d84770714846fea4f545b8c/uipath_platform-0.2.32.tar.gz", hash = "sha256:ec3663947c8e29271b9f4b0bff688b8a38b6683b931b2e425c136a698099bc93", size = 453576, upload-time = "2026-09-18T09:41:21Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/66/873bee9a829ea673f2251babe2e0a1140e6a41022b48df6e64d146e4962e/uipath_platform-0.1.8-py3-none-any.whl", hash = "sha256:91ce82613133a61f72cadaa0f23e6d74f6b2049bb0258bbccc06862b8f8ab321", size = 176303, upload-time = "2026-03-24T14:11:06.319Z" }, + { url = "https://files.pythonhosted.org/packages/80/dd/48a06fb1001c6fee2f507a20d8cdd02e7db7ba33e21ae43fe0c82d445202/uipath_platform-0.2.32-py3-none-any.whl", hash = "sha256:e67b116a37f1bb4bedb0671bbc5b9991a9f236b2f3481471486f1769500e3e6a", size = 294433, upload-time = "2026-09-18T09:41:19.201Z" }, ] [[package]] name = "uipath-runtime" -version = "0.10.0" +version = "0.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "chardet" }, { name = "uipath-core" }, + { name = "vadersentiment" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/64/69462ee01a5607ce36b1fa152c52ac72fb28abe0aa049394406fc0b31525/uipath_runtime-0.10.0.tar.gz", hash = "sha256:d27d58e2252f506c8c0e00f814b37c3863150e8ffcde8e4c6ab14bd98febd3df", size = 139626, upload-time = "2026-03-24T19:42:43.738Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/8f/14ff9ccf152b6d97c0881f6b40d3e01037045ee52c467ed00dbb2319a0cb/uipath_runtime-0.13.5.tar.gz", hash = "sha256:923e4514f3d868f3711211fee6e2dd39f76c6aaf7354fec9e80cdc5e6fad5d80", size = 250415, upload-time = "2026-09-10T09:32:53.126Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/ed/9c0e97a078b96e4d3742ea3515cb30886b08579cd08077cd42a159adf70d/uipath_runtime-0.10.0-py3-none-any.whl", hash = "sha256:4f52df0b56f54e70fcf34fbf74e223d02b97b5a6fd6d8f64bc06782bb5484b07", size = 42097, upload-time = "2026-03-24T19:42:42.359Z" }, + { url = "https://files.pythonhosted.org/packages/95/88/b851e75b3c70bbedde1e24d5b5f38035863ed3d50e8facb75ac7d2db40b8/uipath_runtime-0.13.5-py3-none-any.whl", hash = "sha256:d5eb7d578689f67d5dd631d28a092954c9a8797e130e16fe46e2895e4b0656ac", size = 98513, upload-time = "2026-09-10T09:32:51.404Z" }, ] [[package]] @@ -3192,6 +3245,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", size = 71376, upload-time = "2026-06-03T22:01:29.037Z" }, ] +[[package]] +name = "vadersentiment" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/8c/4a48c10a50f750ae565e341e697d74a38075a3e43ff0df6f1ab72e186902/vaderSentiment-3.3.2.tar.gz", hash = "sha256:5d7c06e027fc8b99238edb0d53d970cf97066ef97654009890b83703849632f9", size = 2466783, upload-time = "2020-05-22T15:06:32.81Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/fc/310e16254683c1ed35eeb97386986d6c00bc29df17ce280aed64d55537e9/vaderSentiment-3.3.2-py2.py3-none-any.whl", hash = "sha256:3bf1d243b98b1afad575b9f22bc2cb1e212b94ff89ca74f8a23a588d024ea311", size = 125950, upload-time = "2020-05-22T15:07:00.052Z" }, +] + [[package]] name = "virtualenv" version = "21.2.0" From 7f279abc420131f3e38ed4263714b84b5d91dc93 Mon Sep 17 00:00:00 2001 From: Bai Li Date: Wed, 23 Sep 2026 17:05:33 -0700 Subject: [PATCH 3/8] fix(harbor): declare SUPPORTS_ATIF as a ClassVar to match harbor 0.23 harbor 0.23.0 annotates BaseAgent.SUPPORTS_ATIF as ClassVar[bool], so the plain bool override fails pyright's reportIncompatibleVariableOverride. Co-Authored-By: Claude Opus 5.5 --- src/coder_eval/harbor/agent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coder_eval/harbor/agent.py b/src/coder_eval/harbor/agent.py index ba35efce..55b09124 100644 --- a/src/coder_eval/harbor/agent.py +++ b/src/coder_eval/harbor/agent.py @@ -20,7 +20,7 @@ from __future__ import annotations import shlex -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, ClassVar from coder_eval.harbor.agent_paths import AGENT_TASK_YAML_PATH @@ -62,7 +62,7 @@ class CoderEvalAgent(BaseInstalledAgent): on PATH there exactly as ``tests/test.sh`` assumes it is for grading. """ - SUPPORTS_ATIF: bool = True + SUPPORTS_ATIF: ClassVar[bool] = True @staticmethod def name() -> str: From e36eabdbc5497a31e192dde8e55239975ff02b8e Mon Sep 17 00:00:00 2001 From: Bai Li Date: Wed, 23 Sep 2026 17:38:14 -0700 Subject: [PATCH 4/8] build(deps): hold the SDK bump to releases past CI's 48h package-age gate CI's safe-chain rejects any package published less than 48 hours ago, so every Linux job failed at install. Relocked with every package cut off at 2026-09-21T23:00Z: claude-agent-sdk 0.2.157 (bundles Claude Code 2.1.277), anthropic 1.7.0, openai-codex and cli-bin 0.155.1, google-antigravity 0.1.17, litellm 1.102.0, uipath 2.14.23; Claude Code image ARG 2.1.277 and Pi 0.87.0. Claude Code 2.1.277 prices Sonnet 5 at list but has no Opus 5.5 entry, so Opus 5.5 runs still cost at its $5/$25 fallback until the next bump to 2.1.280 or later. Co-Authored-By: Claude Opus 5.5 --- docker/Dockerfile | 4 +- docker/Dockerfile.runtime | 4 +- pyproject.toml | 12 ++--- tests/test_antigravity_agent.py | 8 +-- uv.lock | 89 ++++++++++++++++----------------- 5 files changed, 58 insertions(+), 59 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index ed8e5c5c..a43d1e2c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -30,7 +30,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # tag and is bumped deliberately -- mirrors the codex CLI pin # (`openai-codex-cli-bin==…` in pyproject). Leaving it at `@latest` let Docker # layer caching freeze it nondeterministically across rebuilds. -ARG CLAUDE_CODE_VERSION=2.1.281 +ARG CLAUDE_CODE_VERSION=2.1.277 RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* \ @@ -39,7 +39,7 @@ RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ # Pi Node CLI, pinned — same rationale as the Claude Code pin above (the agent # binary is a dominant non-model driver of results; @latest would freeze # nondeterministically under layer caching). Node 22 + npm are already present. -ARG PI_VERSION=0.87.1 +ARG PI_VERSION=0.87.0 RUN npm install -g @earendil-works/pi-coding-agent@${PI_VERSION} # uv: matches host sandbox.py's `uv venv` + `uv pip install` fast path diff --git a/docker/Dockerfile.runtime b/docker/Dockerfile.runtime index 07202937..c386088d 100644 --- a/docker/Dockerfile.runtime +++ b/docker/Dockerfile.runtime @@ -66,7 +66,7 @@ RUN export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="${SAFE_CHAIN_MINIMUM_PACKA # --- 3. Node LTS + the Claude Code CLI, under the kit dir. ------------------- ARG NODE_VERSION=22.14.0 -ARG CLAUDE_CODE_VERSION=2.1.281 +ARG CLAUDE_CODE_VERSION=2.1.277 # Download to a file first so a bad URL fails the build loudly (a piped # `curl | tar` would mask a 404 and only surface later as a missing npm), and # verify the tarball against nodejs.org's published SHASUMS256 before extracting @@ -109,6 +109,6 @@ RUN chmod +x /usr/local/bin/coder_eval_entrypoint.sh # label; labels don't survive `COPY --from`). The claude-code pin mirrors the # framework image — a parity test (tests/test_image_from_dockerfiles.py) enforces it. ARG CODER_EVAL_VERSION=unknown -ARG CLAUDE_CODE_VERSION=2.1.281 +ARG CLAUDE_CODE_VERSION=2.1.277 LABEL org.coder-eval.version="${CODER_EVAL_VERSION}" LABEL org.coder-eval.claude-code-version="${CLAUDE_CODE_VERSION}" diff --git a/pyproject.toml b/pyproject.toml index 94bde554..26e2c43c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ dependencies = [ # explicitly since our code/tests construct httpx2 types directly. Capped to # mirror anthropic's own bound on it (`httpx2<3,>=2.0.0`). "httpx2>=2.12.0,<3.0.0", - "claude-agent-sdk>=0.2.159", + "claude-agent-sdk>=0.2.157", "anyio>=4.14.2", "radon>=6.0.1", "tqdm>=4.67.3", @@ -112,7 +112,7 @@ litellm = [ # Without this extra, the framework still installs and runs; Codex-dependent # code paths fail at dispatch with a clear hint pointing back here. codex = [ - "openai-codex>=0.156.1", + "openai-codex>=0.155.1", ] # Optional extra that enables Antigravity agent support: # - AntigravityAgent implementation using Google's official google-antigravity SDK @@ -131,7 +131,7 @@ codex = [ # Without this extra the framework still installs and runs; Antigravity-dependent # code paths fail at start() with a clear hint pointing back here. antigravity = [ - "google-antigravity==0.1.18", + "google-antigravity==0.1.17", ] # Optional extra that enables OpenCode agent support. # @@ -212,14 +212,14 @@ packages = ["src/coder_eval"] allow-direct-references = true [tool.uv] -# openai-codex 0.156.1 hardpins `openai-codex-cli-bin==0.156.1` (a stable +# openai-codex 0.155.1 hardpins `openai-codex-cli-bin==0.155.1` (a stable # release; the SDK version now tracks the codex CLI version line). Naming it # here documents and holds the pinned cli-bin build — the harness binary is a # dominant non-model driver of eval results, so it travels with the coder_eval # release tag and is bumped deliberately (mirrors the antigravity localharness -# and claude-code CLI pins). 0.156.1 publishes manylinux wheels (x86_64 + +# and claude-code CLI pins). 0.155.1 publishes manylinux wheels (x86_64 + # aarch64), so CI/Linux installs work. -override-dependencies = ["openai-codex-cli-bin==0.156.1"] +override-dependencies = ["openai-codex-cli-bin==0.155.1"] constraint-dependencies = [ # Fix known CVEs in transitive dependencies diff --git a/tests/test_antigravity_agent.py b/tests/test_antigravity_agent.py index b86de7c7..18770d53 100644 --- a/tests/test_antigravity_agent.py +++ b/tests/test_antigravity_agent.py @@ -148,10 +148,10 @@ def test_resolve_workspaces_includes_workdir_and_skill_roots(tmp_path): def test_resolved_workspaces_cover_skill_reads(tmp_path): - """The harness confines file tools to ``workspaces`` (enforced inside localharness - since google-antigravity 0.1.18, not by a Python-side predicate), and - ``skills_paths`` feeds discovery, not that allowlist, so the resolved skill roots - must be in ``workspaces`` for the agent to read SKILL.md.""" + """The harness confines file tools to ``workspaces`` (enforced inside localharness, + not by a Python-side predicate), and ``skills_paths`` feeds discovery, not that + allowlist, so the resolved skill roots must be in ``workspaces`` for the agent to + read SKILL.md.""" repo = tmp_path / "skills-repo" _make_skill(repo / "skills", "uipath-sdd") skill_md = (repo / "skills" / "uipath-sdd" / "SKILL.md").resolve() diff --git a/uv.lock b/uv.lock index 3e9c5dd8..d8a865ed 100644 --- a/uv.lock +++ b/uv.lock @@ -20,7 +20,7 @@ constraints = [ { name = "starlette", specifier = ">=1.3.1" }, { name = "urllib3", specifier = ">=2.6.3" }, ] -overrides = [{ name = "openai-codex-cli-bin", specifier = "==0.156.1" }] +overrides = [{ name = "openai-codex-cli-bin", specifier = "==0.155.1" }] [[package]] name = "absl-py" @@ -153,7 +153,7 @@ wheels = [ [[package]] name = "anthropic" -version = "1.8.0" +version = "1.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -164,9 +164,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/b8/f4de0e90bbd641e86a1d6b20e017442033a2c1d2f5381799f82057115bd7/anthropic-1.8.0.tar.gz", hash = "sha256:9c1783ed90f409617749a61c5ab98e20624a572626f2e0a15cea03ed8e1401e5", size = 1221762, upload-time = "2026-09-22T16:25:38.167Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/8b/4210dd090000ba35d07cee9105530794911d955788c3992b4882df49eaac/anthropic-1.7.0.tar.gz", hash = "sha256:0ab1b04668606ba1ae93f6d9e8dcc2e0c4f0debebd4eea4773a3a595f0836db1", size = 1181035, upload-time = "2026-09-18T16:13:05.262Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/18/5d25a703b66ba34e9277f875f692a3bea3b0ff4d47ee5d188521a01cdd2a/anthropic-1.8.0-py3-none-any.whl", hash = "sha256:79a4516a21e64fd7b15be1a49ebf544bd6376c96a971a77365358823a2717bc6", size = 1348276, upload-time = "2026-09-22T16:25:36.515Z" }, + { url = "https://files.pythonhosted.org/packages/c0/dc/74995efda028421917f4caabd24db1373ee0742573a2363fff1a21191441/anthropic-1.7.0-py3-none-any.whl", hash = "sha256:6b681b6ee00f232bb54f50f9a0d6d30e7be368c1b6f754bfd470c8385b8b6058", size = 1255606, upload-time = "2026-09-18T16:13:03.725Z" }, ] [[package]] @@ -482,7 +482,7 @@ wheels = [ [[package]] name = "claude-agent-sdk" -version = "0.2.159" +version = "0.2.157" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -490,13 +490,12 @@ dependencies = [ { name = "mcp" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/b2/81eb389ace55434f0119b99b62c10a7ac206def6c92ee0768eb389b0c900/claude_agent_sdk-0.2.159.tar.gz", hash = "sha256:e1905e2637b27971bb561bb6ad317aeb3d50619be5261bfa7ff2e9c2be0f0fd1", size = 354571, upload-time = "2026-09-23T20:26:37.386Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/e3/444df1691c864a8349067686719b43e714fc43d3853fb1b2ebc2097e2a6e/claude_agent_sdk-0.2.157.tar.gz", hash = "sha256:4ce6f41bc965fcb4a9d11bd7a3cac266975c75b632f3d74a26f55f0fffb3160a", size = 346579, upload-time = "2026-09-18T18:21:10.306Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/06/87d76aced98f7b71cede2ebf4ae7808e52df9d3819c7f4c7b8c3d2a225b6/claude_agent_sdk-0.2.159-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ba7f152560dca5001a0bc46ed13b7da14eb14b419faed25bb1af821bfa95d3de", size = 91937244, upload-time = "2026-09-23T20:26:41.375Z" }, - { url = "https://files.pythonhosted.org/packages/f4/cf/c65a1f2419fa4b2085a53e91cef41569fde4910057c3709b8ab4303be1fd/claude_agent_sdk-0.2.159-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:87f553fda74e2f57e00f2bcb1705ab9311a937f97571f4f9eceea2bd411b6e32", size = 96294436, upload-time = "2026-09-23T20:26:45.117Z" }, - { url = "https://files.pythonhosted.org/packages/f1/20/f01e211524f3d8edfe7c2ea26ac595d21afab443810cbedeca5c76f7ead0/claude_agent_sdk-0.2.159-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:b03683d12d217b0b6c189c88a3d260a045171e7fdc9f23e2d0dfb05ff3276834", size = 101405973, upload-time = "2026-09-23T20:26:48.799Z" }, - { url = "https://files.pythonhosted.org/packages/bf/d5/de876f9b05c2a94c1d03222b6a5908b1d27f695cf862b237f04d92008d62/claude_agent_sdk-0.2.159-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:d3ba57c187b07c87702b94e2b62dd7c61ed874899defcbb35bb5cef4cb94ace1", size = 101764831, upload-time = "2026-09-23T20:26:53.25Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f2/b315c307a4199cb698a6b6f9e0e90cb8da4b0c8b3d00c68e9007c4a778d1/claude_agent_sdk-0.2.159-py3-none-win_amd64.whl", hash = "sha256:cc1b92ae56f42ade2d083ef2d2e5edb4aa8c7a6d856818a9b8f60cf6ae746f3a", size = 104353298, upload-time = "2026-09-23T20:26:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e8/3e9cc23eb5a5a01a0e2ee931a17db2785f95407525d50366af06a4a5469c/claude_agent_sdk-0.2.157-py3-none-macosx_11_0_arm64.whl", hash = "sha256:dd6a2c7aa1901e43b827411d62f2327aed82f53ed8ca6b076eaa5be4a1fc681f", size = 92744001, upload-time = "2026-09-18T18:21:15.969Z" }, + { url = "https://files.pythonhosted.org/packages/49/eb/e5095703a8efbe504ec468cab039543caabfc0ea3327c735a3d1b60e57ac/claude_agent_sdk-0.2.157-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:ebf3f514c61db9be01bbf6d1acb0d993247340583b3559d2df75e3822f618bbb", size = 97352326, upload-time = "2026-09-18T18:21:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f4/64505beb3c757b863753d6556539554704ec9168cb96454dc6463b14df85/claude_agent_sdk-0.2.157-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:a58089e0c11364db2ec7a139e09b36a4fb9c95817a758bee7b28e0434f55c0b6", size = 102701030, upload-time = "2026-09-18T18:21:27.065Z" }, + { url = "https://files.pythonhosted.org/packages/03/8f/2a7c121469fd16d1d6465bec180726c54f6e151b12e50835283b4285d1ce/claude_agent_sdk-0.2.157-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:bd126b2edee3a247b2c7c4cee1f5a3ea68ef748288ec0650db88dd3918e5471a", size = 102830653, upload-time = "2026-09-18T18:21:32.948Z" }, ] [[package]] @@ -574,17 +573,17 @@ requires-dist = [ { name = "anyio", specifier = ">=4.14.2" }, { name = "azure-monitor-opentelemetry-exporter", specifier = ">=1.0.0b30,<1.1.0" }, { name = "bandit", extras = ["toml"], marker = "extra == 'dev'", specifier = ">=1.9.4" }, - { name = "claude-agent-sdk", specifier = ">=0.2.159" }, + { name = "claude-agent-sdk", specifier = ">=0.2.157" }, { name = "click", specifier = ">=8.3.3" }, { name = "defusedxml", marker = "extra == 'dev'", specifier = ">=0.7.1" }, - { name = "google-antigravity", marker = "extra == 'antigravity'", specifier = "==0.1.18" }, + { name = "google-antigravity", marker = "extra == 'antigravity'", specifier = "==0.1.17" }, { name = "harbor", marker = "extra == 'harbor'", specifier = "==0.23.0" }, { name = "httpx2", specifier = ">=2.12.0,<3.0.0" }, { name = "jmespath", specifier = ">=1.1.0" }, { name = "jsonschema", specifier = ">=4.26.0" }, { name = "litellm", marker = "extra == 'litellm'", specifier = ">=1.95.0,<2.0.0" }, { name = "mcp", marker = "extra == 'dev'", specifier = ">=1.28.1" }, - { name = "openai-codex", marker = "extra == 'codex'", specifier = ">=0.156.1" }, + { name = "openai-codex", marker = "extra == 'codex'", specifier = ">=0.155.1" }, { name = "opentelemetry-sdk", specifier = ">=1.30.0,<2.0.0" }, { name = "pip-audit", marker = "extra == 'dev'", specifier = ">=2.10.0" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=4.5.1" }, @@ -960,7 +959,7 @@ wheels = [ [[package]] name = "google-antigravity" -version = "0.1.18" +version = "0.1.17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py" }, @@ -972,12 +971,12 @@ dependencies = [ { name = "websockets" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/57/c53855740f8372635d266acfeaad7cd7f7a446d3d98c8b0f57b21443117f/google_antigravity-0.1.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c13d51210945d3a154febb900c2c3077625c99322ceafe48f6a2e009254f1361", size = 37943163, upload-time = "2026-09-22T22:03:24.685Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ef/088996f82e4e636dc94d58225d0a7e855b3026b3925f259c7b15b229e55d/google_antigravity-0.1.18-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:16b4069be48b83e0ff01cfd79761e8408ec164ef21aec6c03485e63c5cd94ffb", size = 40251073, upload-time = "2026-09-22T22:03:28.331Z" }, - { url = "https://files.pythonhosted.org/packages/7d/1b/a261fb20a1554611dad99b4b5e8d2674f0f4861c42ff5902ed69a22b19c3/google_antigravity-0.1.18-py3-none-manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:14772cc17f7f89f1d47d26ff3aa1cb443596122f8b9844df1dbed7e18d35b73c", size = 38828002, upload-time = "2026-09-22T22:03:31.459Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4e/f13bd23d26667abf5d90aa94e01e7902536343a417bc389de1b58ce986b3/google_antigravity-0.1.18-py3-none-manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:d22943eece2ba465101a65cb431440e037d3d00d5948babb5a271b68f8e1973d", size = 42782040, upload-time = "2026-09-22T22:03:35.077Z" }, - { url = "https://files.pythonhosted.org/packages/d6/14/6ebe59d4442e8a16cf63cc59a7d31b849161cc3252b6ed46ae2a1e5aadb0/google_antigravity-0.1.18-py3-none-win_amd64.whl", hash = "sha256:b6a37e4924fb01d5f66b4f3d2a49f7ee56672a6038a44ab556d68df9bef6c0c5", size = 44211098, upload-time = "2026-09-22T22:03:38.79Z" }, - { url = "https://files.pythonhosted.org/packages/4e/2e/24412c27b5fe85adf9509cc7c44fccc661be7af0526d085d333d00cae3fe/google_antigravity-0.1.18-py3-none-win_arm64.whl", hash = "sha256:ad790a8b9abcaa756a737584d8333728a01328a772d8002e6aa0297da1781a89", size = 40072554, upload-time = "2026-09-22T22:03:42.204Z" }, + { url = "https://files.pythonhosted.org/packages/c6/14/8c20a94fc8513aedc7506b4eb8c02daf919b5fb0862bc60575ad8b549ed6/google_antigravity-0.1.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6f1054252ca5d5dd287aa00d8d9258befa5e82bc93de4844a8ac1d396a20e018", size = 38853047, upload-time = "2026-09-16T17:37:39.265Z" }, + { url = "https://files.pythonhosted.org/packages/52/06/a73f2dca06ac7f9019a5d4fd873e41191eb4ddbd865b93881babf0000ba7/google_antigravity-0.1.17-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:b6570e846f433428ee217a64bc9f3fac3ffea8a5760bff39df5e38ec1e24678d", size = 41182724, upload-time = "2026-09-16T17:37:43.57Z" }, + { url = "https://files.pythonhosted.org/packages/49/26/d9e362c0c1688869d4ad53be5625c732103e37f1c93b0ca639d2a007b2de/google_antigravity-0.1.17-py3-none-manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:3e77325e66adf972e7135d8751206c786b8226805c364addc1e4cb543563d858", size = 39936481, upload-time = "2026-09-16T17:37:47.624Z" }, + { url = "https://files.pythonhosted.org/packages/65/1a/589fa7eed624446559e3a5f2d926297265e03c833fdfdea6ca3d30d9469a/google_antigravity-0.1.17-py3-none-manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:24fa246bf3bb930cce15c844ca5985a6053edd5465effb994b886078d67dbc68", size = 43989109, upload-time = "2026-09-16T17:37:51.982Z" }, + { url = "https://files.pythonhosted.org/packages/63/f4/bc6706f7759a1e54a28ff3dec1233d4ec7caabc7d17fbfb791fa101e9aa2/google_antigravity-0.1.17-py3-none-win_amd64.whl", hash = "sha256:c1e9d73cfe7649dede28f13a6db74c71e46e6c3c992a397941db8bd313587cb8", size = 45145262, upload-time = "2026-09-16T17:37:56.404Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/58093cfb51c3b2a13384372f8de5098cb4aa2d8350ef5f45b70c3354ca13/google_antigravity-0.1.17-py3-none-win_arm64.whl", hash = "sha256:df9bf8263d604b71d401349607fc686026bfee04d207da166a1ceea6ecb4c499", size = 40948609, upload-time = "2026-09-16T17:38:01.493Z" }, ] [[package]] @@ -1386,7 +1385,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.102.1" +version = "1.102.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1404,15 +1403,15 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/f0/acc98d2c47215aac9bda2c7d18c3d08e025b50ba3dadd7c449fa34811d15/litellm-1.102.1.tar.gz", hash = "sha256:7216f46e6a1eba50f4dbb6000afdb1f5b77360eb498a4f341fc655191108cfd4", size = 18489222, upload-time = "2026-09-23T03:59:02.189Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/b7/16d3734082cb82ea19346553dd622b072bdb52707dccdc59e482fb390a87/litellm-1.102.0.tar.gz", hash = "sha256:d2d6abe095bce53743b0ad5a80a93dbad58698d18e1a3f3e57a922ece8657bde", size = 18471341, upload-time = "2026-09-20T04:41:39.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/fa/fe602c696b916db036675eb6f8b0ad27a8dd398f0190a8a813596b4c0405/litellm-1.102.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:01550e79e052249dc5df53631ed9bdff030ca7c2a22107c5ce482d53ecf5c8d8", size = 27063920, upload-time = "2026-09-23T03:58:38.074Z" }, - { url = "https://files.pythonhosted.org/packages/68/08/5f52917ea864a9a63278005341e92d840d3d70ddb933f63b35f5aecc32d5/litellm-1.102.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:da73fe3f6a1bf70232d752f7e1fe49f5d4d9473c02972553e0d0f7b514b280c7", size = 26553980, upload-time = "2026-09-23T03:58:41.942Z" }, - { url = "https://files.pythonhosted.org/packages/7e/aa/a3ff2c79855f5d8cb0aa14bae0dfad0e1512f654fb0b654eec1702f2fbeb/litellm-1.102.1-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:296c49171d7b80e6298fdf1bb18c7b69a826b82ae2b917bc6f5a80f153ee8b29", size = 26850103, upload-time = "2026-09-23T03:58:45.15Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ff/ef3186da67f297edfa5c01a6b92ee7b2b2406056b0a7415945e0cf490a2d/litellm-1.102.1-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b36c46e89e2fc50f42848120ed03a31c7347103cbaa733421f8843915b6f3355", size = 27352604, upload-time = "2026-09-23T03:58:48.456Z" }, - { url = "https://files.pythonhosted.org/packages/d6/86/74f6ad713dc63700d5c40828708d64118db105a62a2919c9cdecddd6b966/litellm-1.102.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f7c4ffead69cf010fe3f551d2941bd6190bdaa816b98d5ebc85df67096724180", size = 26919523, upload-time = "2026-09-23T03:58:51.904Z" }, - { url = "https://files.pythonhosted.org/packages/86/09/ba63c28d3373389022d8686396f26b28ac89c1e324e2b1fa00b4578e9b63/litellm-1.102.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c5fcfbe322e3052f96fa92409fc61ec9712a7b2b567e7760e057b17b7587d021", size = 27475133, upload-time = "2026-09-23T03:58:55.204Z" }, - { url = "https://files.pythonhosted.org/packages/69/e7/6a1613821f7cead31d17c4c84b1d1939b6c9a33226ba638a7e31610ce060/litellm-1.102.1-cp310-abi3-win_amd64.whl", hash = "sha256:b2c24cad24c637b20e91f6dd7b812971a5fa64ad2330213e517ff8f38d25c0d8", size = 27407273, upload-time = "2026-09-23T03:58:58.799Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7a/8dcbd1e8c438e9aefa0a22fc3e6637a8eb49ac08350faf93c83d4382f219/litellm-1.102.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9f3cae21e99ea71005cf53ea2cd8ad516f98914ab321dd866ef53fd0fca8eb5c", size = 27038974, upload-time = "2026-09-20T04:41:12.814Z" }, + { url = "https://files.pythonhosted.org/packages/82/2a/aa970437c7fdd9c8ea8a9c206571d26154e22670bd99e51988f21320d622/litellm-1.102.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:dabb40d4ae015d319582d93f80d3d4bd8c3c479a4227d7b130f46bc272e81e39", size = 26529035, upload-time = "2026-09-20T04:41:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/77/02/4d6a48071b90b98aee38e7b826f9205fd9cbf54b22498e77fd7d7cda8f88/litellm-1.102.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b2efcee314f78a46cb46624a29eb67eb949c123d9d830eb0bc452c235f6282bd", size = 26825158, upload-time = "2026-09-20T04:41:20.682Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9b/0db0c6327a31efe808ebc245b3ab3290196fb50f5e2a649d4f2835d722d4/litellm-1.102.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:76cd80a9a8eb97da62dfa695b3277b80845657cbabdc9fb4db085cde0012f31c", size = 27327658, upload-time = "2026-09-20T04:41:25.607Z" }, + { url = "https://files.pythonhosted.org/packages/63/9d/7e19e74d366ec1fafa410c7760131687e516ced9fef312d57340f0969ce0/litellm-1.102.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db15cb7ee0c1afd07c5312039ee248d74f381bbe10eb1b951b4f2e6f358ebbe7", size = 26894580, upload-time = "2026-09-20T04:41:29.148Z" }, + { url = "https://files.pythonhosted.org/packages/03/9e/f98b0937da3027a8c2dbc2a8a5bd8e1d038d3ba2e038e112f83397f4a2d0/litellm-1.102.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d03e18095383b9a6f22485149d1f11e99c7a0cd9748b4736676bb4d2f89fe5b2", size = 27450189, upload-time = "2026-09-20T04:41:32.829Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/8e1d939b5b13027c5e8b3f7a5fddeae769bf7d08e67ef922e46af9eb1cf0/litellm-1.102.0-cp310-abi3-win_amd64.whl", hash = "sha256:fbcbaff335ce6ce17aa3c659a5c2b5605a2d8780001abbc1a716c3b10bd55e8e", size = 27382227, upload-time = "2026-09-20T04:41:36.571Z" }, ] [[package]] @@ -1746,31 +1745,31 @@ wheels = [ [[package]] name = "openai-codex" -version = "0.156.1" +version = "0.155.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openai-codex-cli-bin" }, { name = "packaging" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/5a/ddc9ff30b38a361d5679cca79b1d0b4db70359a859fcb1b321e9c7423dd2/openai_codex-0.156.1.tar.gz", hash = "sha256:84de33cc7bf39f974423bd7568a5662d4eb1c685e6f9808c6160f1a68338a0c8", size = 87930, upload-time = "2026-09-23T02:51:35.714Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/3e/8bc1702c189e9f744c4fd6c2a7cb0003839b5844bb3914279d5414bd8724/openai_codex-0.155.1.tar.gz", hash = "sha256:9706342a04571b6c5c1fddebf9a3202727574026bf4b988c37515c8eca07a8c8", size = 86819, upload-time = "2026-09-20T00:41:06.051Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/5d/6909bc7a4a4329e9642ee1a3862ec0a224420694bbf02fdb6336db6213e2/openai_codex-0.156.1-py3-none-any.whl", hash = "sha256:6a11313e86027dd2da00f1af475388a578a19076ae8150b0f1c305d8564c973f", size = 96056, upload-time = "2026-09-23T02:51:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7e/190b3188ad4e0933fad0850bd641d274f2e002055f86d2f880c6e6647ede/openai_codex-0.155.1-py3-none-any.whl", hash = "sha256:cc7eee57ab2803a59b5125f25190839af37689f09812f0fca6565d722303cf5d", size = 94950, upload-time = "2026-09-20T00:41:04.574Z" }, ] [[package]] name = "openai-codex-cli-bin" -version = "0.156.1" +version = "0.155.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/1e/d60201465b08022d7f12898db6fe24cff937e515e0a1c186cd958f4299fd/openai_codex_cli_bin-0.156.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:142b29633e1c4a4cdb1ffb2c8d4cf334d0d0ab322673875802acfe562af05fd9", size = 130059695, upload-time = "2026-09-23T02:50:14.733Z" }, - { url = "https://files.pythonhosted.org/packages/fd/7c/d768e1e721f6e0aff62314b9605291f873c7546b97c24ccb9b5c055e3104/openai_codex_cli_bin-0.156.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7cc8269e2af695d6b00be1a9d6f48243b3b992bce5f408b0910e75a369e67dd1", size = 119241989, upload-time = "2026-09-23T02:50:22.568Z" }, - { url = "https://files.pythonhosted.org/packages/92/a4/26633fff0fe965eaa6cb66af3a11339ea77455d4dc4f69bcb1e9d2335ca3/openai_codex_cli_bin-0.156.1-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:c725c0721949a81b2eae75e9468b280813a3e40bb3ce319b34f9bfbb69d4de0e", size = 127318762, upload-time = "2026-09-23T02:50:26.86Z" }, - { url = "https://files.pythonhosted.org/packages/fc/49/dd321e5e3ddb20d5aa768db20e7989d6e093d940f6bf30b742f1c70acac5/openai_codex_cli_bin-0.156.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:84a12567ca54ba6ae4ed755911c04e7cdf658315f8719963c8daa8592d8fe068", size = 136219225, upload-time = "2026-09-23T02:50:31.479Z" }, - { url = "https://files.pythonhosted.org/packages/12/0c/10f97974677278408b828997d2ccbd3cf6dd38b1730bee0040c2e0633fc8/openai_codex_cli_bin-0.156.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:b81cc09f04575fa7471e39dad678700a7e209c81031a8f86cb175c1f6c0ace40", size = 136944600, upload-time = "2026-09-23T02:50:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/86/3c/06c1e948a143805e6dbef43f3bd5d530c9040814b2a28ac7d4980cb77337/openai_codex_cli_bin-0.156.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:950627ab801703e061f2404105ed8216bb9728befbb09d853003a2678b9dbab2", size = 145984819, upload-time = "2026-09-23T02:50:40.776Z" }, - { url = "https://files.pythonhosted.org/packages/db/0f/d97a26ffda3b2ecd703aebec11770abe68513ac12e08c1c52c1721eee488/openai_codex_cli_bin-0.156.1-py3-none-win_amd64.whl", hash = "sha256:81ab68fdadf448af52736282619875e10d365d93dd7442e94925899e77b99e7d", size = 145804807, upload-time = "2026-09-23T02:50:45.739Z" }, - { url = "https://files.pythonhosted.org/packages/bd/1f/505234ed2b7803db1966bcf92ce5b923f7e78768bab8540d916f8ce86394/openai_codex_cli_bin-0.156.1-py3-none-win_arm64.whl", hash = "sha256:1b192fcbac53f4c13b7c637ab44d67f2731b700a8b32ae314d04b4f880e85a9f", size = 134709984, upload-time = "2026-09-23T02:50:50.49Z" }, + { url = "https://files.pythonhosted.org/packages/41/21/07d6c7c4c2337301c76facedb030d5da8dc990af6e98968550bc0f550f0f/openai_codex_cli_bin-0.155.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:60a965742afb946ffe9d86b9f58aa4f2422e0d8ad9060bc1cb52c35290e8966b", size = 125209614, upload-time = "2026-09-20T00:39:54.179Z" }, + { url = "https://files.pythonhosted.org/packages/9f/da/17cc1912de60e64025380d918082bc9ac4820b43488a81af7c2eea25c3bc/openai_codex_cli_bin-0.155.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:20f06ff5ba6f10782cb9794b3e1f7bfd01e919a7526c57eece852cee0cbff024", size = 115206116, upload-time = "2026-09-20T00:40:00.265Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4d/d9752b112e3c2d099b84d84a8ad77b8b028d4a01516a65a212aff99d5a27/openai_codex_cli_bin-0.155.1-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:ecb4d79b4f12a12bec13f1f3c611602a72b8eea1b1fe522113040bf6c98e91c8", size = 121002606, upload-time = "2026-09-20T00:40:05.789Z" }, + { url = "https://files.pythonhosted.org/packages/60/43/27c4046e33f65122ba215cbe2f1c8d63757759bbe5237f12c42e83d071da/openai_codex_cli_bin-0.155.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:b1e3324cae6a042669bf188e02734ea04f0364ab5b2f6df5350cfe6aca724eee", size = 129970486, upload-time = "2026-09-20T00:40:11.913Z" }, + { url = "https://files.pythonhosted.org/packages/c2/de/f0ba2235e0c634baa8c6d14962ebae26c92248147b424875de4dc3778d0b/openai_codex_cli_bin-0.155.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:a86c888dc8eee6f2117ebcf118047aba860d384eeacb83273495aec32c052023", size = 130614828, upload-time = "2026-09-20T00:40:17.785Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f8/9c38cd4c1f154160a2c8fb351cf4e208cc6d2f956d0bf8c1b5c6c4c6dfe5/openai_codex_cli_bin-0.155.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:73ef57161f17e8475f76e8f020d6501c0b2db4b5014ec3fa6db85ab804743209", size = 139725322, upload-time = "2026-09-20T00:40:23.757Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6c/4b8c104406caa61b098a0de6a6f016cb19b59bf1d5198080aab8fda955ea/openai_codex_cli_bin-0.155.1-py3-none-win_amd64.whl", hash = "sha256:aabe5e39c474afb05b09b264242564d3f704e06468a5d1ee87bc5eb5c869a45f", size = 140425725, upload-time = "2026-09-20T00:40:30.644Z" }, + { url = "https://files.pythonhosted.org/packages/8d/71/0f2f38f0b27094017ade74dcf74e358f3540397e0a4ccc19d38b89549ac8/openai_codex_cli_bin-0.155.1-py3-none-win_arm64.whl", hash = "sha256:ec489d8cc3488a5a1dd19b768aa189c82dd43c5c151a2a6f78652f017c8fdadf", size = 129631031, upload-time = "2026-09-20T00:40:36.844Z" }, ] [[package]] @@ -3138,7 +3137,7 @@ wheels = [ [[package]] name = "uipath" -version = "2.14.25" +version = "2.14.23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "applicationinsights" }, @@ -3163,9 +3162,9 @@ dependencies = [ { name = "uipath-platform" }, { name = "uipath-runtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/19/afdfcf3fd7aaa4e4fdaaee06d61d674f248283cef30390129a0001fd4638/uipath-2.14.25.tar.gz", hash = "sha256:cf1830e196084d1b84f092ce6524e20e5546345c6828c39e79ab86807aa82bed", size = 4587736, upload-time = "2026-09-23T08:07:06.754Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/5d/4e0d95c1dce7f9e21f21d9ad2b5f23c17205cb5e8b05bb46c144fa2bd2ff/uipath-2.14.23.tar.gz", hash = "sha256:158286f38f8e4c06289696b21b2074b8ff07bae257fc6a847e0ba495831d0eff", size = 4580955, upload-time = "2026-09-21T07:52:20.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/c0/1bccbc778a7cbf180a9b7d80a7a98c6d934e01d00fedad414cb2d5677b6b/uipath-2.14.25-py3-none-any.whl", hash = "sha256:505f75509f6bad657379408bef2ae35084b8a32dd6c9f4ceeb71438c52fb0a5b", size = 452485, upload-time = "2026-09-23T08:07:04.148Z" }, + { url = "https://files.pythonhosted.org/packages/24/f5/cd511279106e1dbd0113042235bd594836453262f295b0ea586e2e85d426/uipath-2.14.23-py3-none-any.whl", hash = "sha256:aedd7d5693f7554af935fd54830aa69015eb8c657885e3d495e23fe5afc3a66b", size = 452401, upload-time = "2026-09-21T07:52:18.995Z" }, ] [[package]] From 66161c633f622b956446756fbe968153e7cd76ba Mon Sep 17 00:00:00 2001 From: Bai Li Date: Thu, 24 Sep 2026 14:06:35 -0700 Subject: [PATCH 5/8] build(deps): exempt claude-agent-sdk from the 48h package-age gate and take the latest SDK CI's safe-chain holds back any package younger than 48h. claude-agent-sdk bundles the Claude Code CLI, and new-model support (Opus 5.5 pricing landed in 2.1.280) ships there faster than that window, so it joins openai-codex in the exclusion list. The repo secret SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS is set and replaces the literal fallback, so the entry is appended outside the `||` in pr-checks, release and publish-testpypi. The image ARG lists get it too. Lock: claude-agent-sdk 0.2.159 (bundles Claude Code 2.1.281, ships a win_amd64 wheel, which fixes the Windows smoke), openai-codex and cli-bin 0.156.1 (already exempt), google-antigravity 0.1.18 (image-only install, not gated), anthropic 1.8.0, uipath 2.14.24. litellm stays at 1.102.0 and harbor at 0.23.0, the newest that clear the gate. Image ARGs: Claude Code 2.1.281, Pi 0.87.1. The pyproject floors for claude-agent-sdk and openai-codex stay at 0.2.157 and 0.155.1: skills and coder_eval_uipath CI do not exempt these packages, so a higher floor would break their installs of the next release until the new versions age in. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/pr-checks.yml | 11 +++-- .github/workflows/publish-testpypi.yml | 2 +- .github/workflows/release.yml | 2 +- docker/Dockerfile | 14 +++--- docker/Dockerfile.runtime | 6 +-- pyproject.toml | 8 +-- uv.lock | 67 +++++++++++++------------- 7 files changed, 56 insertions(+), 54 deletions(-) diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index e8d999ef..1690fba9 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -38,11 +38,12 @@ env: TELEMETRY_ENABLED: "false" # The `uipath-*` pool enforces a minimum package-age safe-chain check on installs. # Workflow-level so every installing job inherits it; per-job copies are how some - # jobs previously ended up with no exclusions at all. The literal is the operative - # value — no secret of that name exists at repo or org level, so the bare `secrets.` - # reference this replaced resolved to an empty list. (Image builds carry their own - # list in docker/Dockerfile; deliberately not the same set.) - SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }} + # jobs previously ended up with no exclusions at all. A repo secret of this name + # replaces the literal when set, so claude-agent-sdk sits outside the `||`: its wheel + # bundles the Claude Code CLI, and new-model support ships there faster than the + # gate window. (Image builds carry their own list in docker/Dockerfile; deliberately + # not the same set.) + SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }},claude-agent-sdk jobs: quality-gate: diff --git a/.github/workflows/publish-testpypi.yml b/.github/workflows/publish-testpypi.yml index bc365ca1..6fa73488 100644 --- a/.github/workflows/publish-testpypi.yml +++ b/.github/workflows/publish-testpypi.yml @@ -38,7 +38,7 @@ jobs: timeout-minutes: 10 env: # `uv build` resolves build deps under the pool's safe-chain gate. - SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }} + SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }},claude-agent-sdk environment: name: testpypi url: https://test.pypi.org/project/coder-eval/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c3ebdc09..4478caf9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -75,7 +75,7 @@ jobs: # Load-bearing on the release path: the pool enforces a package-age safe-chain # check on uv installs. Same expression as pr-checks.yml (see the comment there), # so a package can't pass PR CI and then fail the release install. - SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }} + SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }},claude-agent-sdk steps: # Only a real release (main) needs the app token: semantic-release pushes the diff --git a/docker/Dockerfile b/docker/Dockerfile index a43d1e2c..b79f75b4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -30,7 +30,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # tag and is bumped deliberately -- mirrors the codex CLI pin # (`openai-codex-cli-bin==…` in pyproject). Leaving it at `@latest` let Docker # layer caching freeze it nondeterministically across rebuilds. -ARG CLAUDE_CODE_VERSION=2.1.277 +ARG CLAUDE_CODE_VERSION=2.1.281 RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* \ @@ -39,7 +39,7 @@ RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ # Pi Node CLI, pinned — same rationale as the Claude Code pin above (the agent # binary is a dominant non-model driver of results; @latest would freeze # nondeterministically under layer caching). Node 22 + npm are already present. -ARG PI_VERSION=0.87.0 +ARG PI_VERSION=0.87.1 RUN npm install -g @earendil-works/pi-coding-agent@${PI_VERSION} # uv: matches host sandbox.py's `uv venv` + `uv pip install` fast path @@ -84,12 +84,12 @@ COPY experiments/default.yaml ./experiments/default.yaml # pulls the `uipath` SDK from public PyPI (no credentials required). ARG CODER_EVAL_UV_EXTRAS="" -# safe-chain min-age exclusions for the codex cli-bin pin (see pyproject [tool.uv]) -# and the pinned Antigravity harness. Codex and Antigravity are always installed, -# so the default excludes their pinned packages from the min-age gate (the -# google-antigravity release tracks the rapidly-moving Gemini harness and may be +# safe-chain min-age exclusions for the codex cli-bin pin (see pyproject [tool.uv]), +# the pinned Antigravity harness, and claude-agent-sdk (its wheel bundles the Claude +# Code CLI). All three are always installed, so the default excludes their pinned +# packages from the min-age gate (each tracks a rapidly-moving harness and may be # newer than the gate window); callers may override. -ARG SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="openai-codex-cli-bin,openai-codex,google-antigravity" +ARG SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="openai-codex-cli-bin,openai-codex,google-antigravity,claude-agent-sdk" # All extras (codex, antigravity, litellm, and the opt-in uipath) resolve from # public PyPI per uv.lock, so the build needs no private-index credentials. diff --git a/docker/Dockerfile.runtime b/docker/Dockerfile.runtime index c386088d..9b9eba30 100644 --- a/docker/Dockerfile.runtime +++ b/docker/Dockerfile.runtime @@ -53,7 +53,7 @@ COPY pyproject.toml uv.lock README.md ./ COPY src/ ./src/ COPY experiments/default.yaml ./experiments/default.yaml -ARG SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="openai-codex-cli-bin,openai-codex" +ARG SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="openai-codex-cli-bin,openai-codex,claude-agent-sdk" # Install the locked deps, then coder_eval itself NON-editable. An editable/path # install would leave the package source at /src (outside the kit), so the # `COPY --from /opt/coder-eval` overlay would ship a venv that can't import @@ -66,7 +66,7 @@ RUN export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="${SAFE_CHAIN_MINIMUM_PACKA # --- 3. Node LTS + the Claude Code CLI, under the kit dir. ------------------- ARG NODE_VERSION=22.14.0 -ARG CLAUDE_CODE_VERSION=2.1.277 +ARG CLAUDE_CODE_VERSION=2.1.281 # Download to a file first so a bad URL fails the build loudly (a piped # `curl | tar` would mask a 404 and only surface later as a missing npm), and # verify the tarball against nodejs.org's published SHASUMS256 before extracting @@ -109,6 +109,6 @@ RUN chmod +x /usr/local/bin/coder_eval_entrypoint.sh # label; labels don't survive `COPY --from`). The claude-code pin mirrors the # framework image — a parity test (tests/test_image_from_dockerfiles.py) enforces it. ARG CODER_EVAL_VERSION=unknown -ARG CLAUDE_CODE_VERSION=2.1.277 +ARG CLAUDE_CODE_VERSION=2.1.281 LABEL org.coder-eval.version="${CODER_EVAL_VERSION}" LABEL org.coder-eval.claude-code-version="${CLAUDE_CODE_VERSION}" diff --git a/pyproject.toml b/pyproject.toml index 26e2c43c..47958966 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -131,7 +131,7 @@ codex = [ # Without this extra the framework still installs and runs; Antigravity-dependent # code paths fail at start() with a clear hint pointing back here. antigravity = [ - "google-antigravity==0.1.17", + "google-antigravity==0.1.18", ] # Optional extra that enables OpenCode agent support. # @@ -212,14 +212,14 @@ packages = ["src/coder_eval"] allow-direct-references = true [tool.uv] -# openai-codex 0.155.1 hardpins `openai-codex-cli-bin==0.155.1` (a stable +# openai-codex 0.156.1 hardpins `openai-codex-cli-bin==0.156.1` (a stable # release; the SDK version now tracks the codex CLI version line). Naming it # here documents and holds the pinned cli-bin build — the harness binary is a # dominant non-model driver of eval results, so it travels with the coder_eval # release tag and is bumped deliberately (mirrors the antigravity localharness -# and claude-code CLI pins). 0.155.1 publishes manylinux wheels (x86_64 + +# and claude-code CLI pins). 0.156.1 publishes manylinux wheels (x86_64 + # aarch64), so CI/Linux installs work. -override-dependencies = ["openai-codex-cli-bin==0.155.1"] +override-dependencies = ["openai-codex-cli-bin==0.156.1"] constraint-dependencies = [ # Fix known CVEs in transitive dependencies diff --git a/uv.lock b/uv.lock index d8a865ed..d4d8966f 100644 --- a/uv.lock +++ b/uv.lock @@ -20,7 +20,7 @@ constraints = [ { name = "starlette", specifier = ">=1.3.1" }, { name = "urllib3", specifier = ">=2.6.3" }, ] -overrides = [{ name = "openai-codex-cli-bin", specifier = "==0.155.1" }] +overrides = [{ name = "openai-codex-cli-bin", specifier = "==0.156.1" }] [[package]] name = "absl-py" @@ -153,7 +153,7 @@ wheels = [ [[package]] name = "anthropic" -version = "1.7.0" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -164,9 +164,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/8b/4210dd090000ba35d07cee9105530794911d955788c3992b4882df49eaac/anthropic-1.7.0.tar.gz", hash = "sha256:0ab1b04668606ba1ae93f6d9e8dcc2e0c4f0debebd4eea4773a3a595f0836db1", size = 1181035, upload-time = "2026-09-18T16:13:05.262Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/b8/f4de0e90bbd641e86a1d6b20e017442033a2c1d2f5381799f82057115bd7/anthropic-1.8.0.tar.gz", hash = "sha256:9c1783ed90f409617749a61c5ab98e20624a572626f2e0a15cea03ed8e1401e5", size = 1221762, upload-time = "2026-09-22T16:25:38.167Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/dc/74995efda028421917f4caabd24db1373ee0742573a2363fff1a21191441/anthropic-1.7.0-py3-none-any.whl", hash = "sha256:6b681b6ee00f232bb54f50f9a0d6d30e7be368c1b6f754bfd470c8385b8b6058", size = 1255606, upload-time = "2026-09-18T16:13:03.725Z" }, + { url = "https://files.pythonhosted.org/packages/5b/18/5d25a703b66ba34e9277f875f692a3bea3b0ff4d47ee5d188521a01cdd2a/anthropic-1.8.0-py3-none-any.whl", hash = "sha256:79a4516a21e64fd7b15be1a49ebf544bd6376c96a971a77365358823a2717bc6", size = 1348276, upload-time = "2026-09-22T16:25:36.515Z" }, ] [[package]] @@ -482,7 +482,7 @@ wheels = [ [[package]] name = "claude-agent-sdk" -version = "0.2.157" +version = "0.2.159" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -490,12 +490,13 @@ dependencies = [ { name = "mcp" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/e3/444df1691c864a8349067686719b43e714fc43d3853fb1b2ebc2097e2a6e/claude_agent_sdk-0.2.157.tar.gz", hash = "sha256:4ce6f41bc965fcb4a9d11bd7a3cac266975c75b632f3d74a26f55f0fffb3160a", size = 346579, upload-time = "2026-09-18T18:21:10.306Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/b2/81eb389ace55434f0119b99b62c10a7ac206def6c92ee0768eb389b0c900/claude_agent_sdk-0.2.159.tar.gz", hash = "sha256:e1905e2637b27971bb561bb6ad317aeb3d50619be5261bfa7ff2e9c2be0f0fd1", size = 354571, upload-time = "2026-09-23T20:26:37.386Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/e8/3e9cc23eb5a5a01a0e2ee931a17db2785f95407525d50366af06a4a5469c/claude_agent_sdk-0.2.157-py3-none-macosx_11_0_arm64.whl", hash = "sha256:dd6a2c7aa1901e43b827411d62f2327aed82f53ed8ca6b076eaa5be4a1fc681f", size = 92744001, upload-time = "2026-09-18T18:21:15.969Z" }, - { url = "https://files.pythonhosted.org/packages/49/eb/e5095703a8efbe504ec468cab039543caabfc0ea3327c735a3d1b60e57ac/claude_agent_sdk-0.2.157-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:ebf3f514c61db9be01bbf6d1acb0d993247340583b3559d2df75e3822f618bbb", size = 97352326, upload-time = "2026-09-18T18:21:21.007Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f4/64505beb3c757b863753d6556539554704ec9168cb96454dc6463b14df85/claude_agent_sdk-0.2.157-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:a58089e0c11364db2ec7a139e09b36a4fb9c95817a758bee7b28e0434f55c0b6", size = 102701030, upload-time = "2026-09-18T18:21:27.065Z" }, - { url = "https://files.pythonhosted.org/packages/03/8f/2a7c121469fd16d1d6465bec180726c54f6e151b12e50835283b4285d1ce/claude_agent_sdk-0.2.157-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:bd126b2edee3a247b2c7c4cee1f5a3ea68ef748288ec0650db88dd3918e5471a", size = 102830653, upload-time = "2026-09-18T18:21:32.948Z" }, + { url = "https://files.pythonhosted.org/packages/ec/06/87d76aced98f7b71cede2ebf4ae7808e52df9d3819c7f4c7b8c3d2a225b6/claude_agent_sdk-0.2.159-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ba7f152560dca5001a0bc46ed13b7da14eb14b419faed25bb1af821bfa95d3de", size = 91937244, upload-time = "2026-09-23T20:26:41.375Z" }, + { url = "https://files.pythonhosted.org/packages/f4/cf/c65a1f2419fa4b2085a53e91cef41569fde4910057c3709b8ab4303be1fd/claude_agent_sdk-0.2.159-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:87f553fda74e2f57e00f2bcb1705ab9311a937f97571f4f9eceea2bd411b6e32", size = 96294436, upload-time = "2026-09-23T20:26:45.117Z" }, + { url = "https://files.pythonhosted.org/packages/f1/20/f01e211524f3d8edfe7c2ea26ac595d21afab443810cbedeca5c76f7ead0/claude_agent_sdk-0.2.159-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:b03683d12d217b0b6c189c88a3d260a045171e7fdc9f23e2d0dfb05ff3276834", size = 101405973, upload-time = "2026-09-23T20:26:48.799Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d5/de876f9b05c2a94c1d03222b6a5908b1d27f695cf862b237f04d92008d62/claude_agent_sdk-0.2.159-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:d3ba57c187b07c87702b94e2b62dd7c61ed874899defcbb35bb5cef4cb94ace1", size = 101764831, upload-time = "2026-09-23T20:26:53.25Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f2/b315c307a4199cb698a6b6f9e0e90cb8da4b0c8b3d00c68e9007c4a778d1/claude_agent_sdk-0.2.159-py3-none-win_amd64.whl", hash = "sha256:cc1b92ae56f42ade2d083ef2d2e5edb4aa8c7a6d856818a9b8f60cf6ae746f3a", size = 104353298, upload-time = "2026-09-23T20:26:57.913Z" }, ] [[package]] @@ -576,7 +577,7 @@ requires-dist = [ { name = "claude-agent-sdk", specifier = ">=0.2.157" }, { name = "click", specifier = ">=8.3.3" }, { name = "defusedxml", marker = "extra == 'dev'", specifier = ">=0.7.1" }, - { name = "google-antigravity", marker = "extra == 'antigravity'", specifier = "==0.1.17" }, + { name = "google-antigravity", marker = "extra == 'antigravity'", specifier = "==0.1.18" }, { name = "harbor", marker = "extra == 'harbor'", specifier = "==0.23.0" }, { name = "httpx2", specifier = ">=2.12.0,<3.0.0" }, { name = "jmespath", specifier = ">=1.1.0" }, @@ -959,7 +960,7 @@ wheels = [ [[package]] name = "google-antigravity" -version = "0.1.17" +version = "0.1.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "absl-py" }, @@ -971,12 +972,12 @@ dependencies = [ { name = "websockets" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/14/8c20a94fc8513aedc7506b4eb8c02daf919b5fb0862bc60575ad8b549ed6/google_antigravity-0.1.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6f1054252ca5d5dd287aa00d8d9258befa5e82bc93de4844a8ac1d396a20e018", size = 38853047, upload-time = "2026-09-16T17:37:39.265Z" }, - { url = "https://files.pythonhosted.org/packages/52/06/a73f2dca06ac7f9019a5d4fd873e41191eb4ddbd865b93881babf0000ba7/google_antigravity-0.1.17-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:b6570e846f433428ee217a64bc9f3fac3ffea8a5760bff39df5e38ec1e24678d", size = 41182724, upload-time = "2026-09-16T17:37:43.57Z" }, - { url = "https://files.pythonhosted.org/packages/49/26/d9e362c0c1688869d4ad53be5625c732103e37f1c93b0ca639d2a007b2de/google_antigravity-0.1.17-py3-none-manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:3e77325e66adf972e7135d8751206c786b8226805c364addc1e4cb543563d858", size = 39936481, upload-time = "2026-09-16T17:37:47.624Z" }, - { url = "https://files.pythonhosted.org/packages/65/1a/589fa7eed624446559e3a5f2d926297265e03c833fdfdea6ca3d30d9469a/google_antigravity-0.1.17-py3-none-manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:24fa246bf3bb930cce15c844ca5985a6053edd5465effb994b886078d67dbc68", size = 43989109, upload-time = "2026-09-16T17:37:51.982Z" }, - { url = "https://files.pythonhosted.org/packages/63/f4/bc6706f7759a1e54a28ff3dec1233d4ec7caabc7d17fbfb791fa101e9aa2/google_antigravity-0.1.17-py3-none-win_amd64.whl", hash = "sha256:c1e9d73cfe7649dede28f13a6db74c71e46e6c3c992a397941db8bd313587cb8", size = 45145262, upload-time = "2026-09-16T17:37:56.404Z" }, - { url = "https://files.pythonhosted.org/packages/a7/4d/58093cfb51c3b2a13384372f8de5098cb4aa2d8350ef5f45b70c3354ca13/google_antigravity-0.1.17-py3-none-win_arm64.whl", hash = "sha256:df9bf8263d604b71d401349607fc686026bfee04d207da166a1ceea6ecb4c499", size = 40948609, upload-time = "2026-09-16T17:38:01.493Z" }, + { url = "https://files.pythonhosted.org/packages/4e/57/c53855740f8372635d266acfeaad7cd7f7a446d3d98c8b0f57b21443117f/google_antigravity-0.1.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c13d51210945d3a154febb900c2c3077625c99322ceafe48f6a2e009254f1361", size = 37943163, upload-time = "2026-09-22T22:03:24.685Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ef/088996f82e4e636dc94d58225d0a7e855b3026b3925f259c7b15b229e55d/google_antigravity-0.1.18-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:16b4069be48b83e0ff01cfd79761e8408ec164ef21aec6c03485e63c5cd94ffb", size = 40251073, upload-time = "2026-09-22T22:03:28.331Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1b/a261fb20a1554611dad99b4b5e8d2674f0f4861c42ff5902ed69a22b19c3/google_antigravity-0.1.18-py3-none-manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:14772cc17f7f89f1d47d26ff3aa1cb443596122f8b9844df1dbed7e18d35b73c", size = 38828002, upload-time = "2026-09-22T22:03:31.459Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4e/f13bd23d26667abf5d90aa94e01e7902536343a417bc389de1b58ce986b3/google_antigravity-0.1.18-py3-none-manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:d22943eece2ba465101a65cb431440e037d3d00d5948babb5a271b68f8e1973d", size = 42782040, upload-time = "2026-09-22T22:03:35.077Z" }, + { url = "https://files.pythonhosted.org/packages/d6/14/6ebe59d4442e8a16cf63cc59a7d31b849161cc3252b6ed46ae2a1e5aadb0/google_antigravity-0.1.18-py3-none-win_amd64.whl", hash = "sha256:b6a37e4924fb01d5f66b4f3d2a49f7ee56672a6038a44ab556d68df9bef6c0c5", size = 44211098, upload-time = "2026-09-22T22:03:38.79Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2e/24412c27b5fe85adf9509cc7c44fccc661be7af0526d085d333d00cae3fe/google_antigravity-0.1.18-py3-none-win_arm64.whl", hash = "sha256:ad790a8b9abcaa756a737584d8333728a01328a772d8002e6aa0297da1781a89", size = 40072554, upload-time = "2026-09-22T22:03:42.204Z" }, ] [[package]] @@ -1745,31 +1746,31 @@ wheels = [ [[package]] name = "openai-codex" -version = "0.155.1" +version = "0.156.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "openai-codex-cli-bin" }, { name = "packaging" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/3e/8bc1702c189e9f744c4fd6c2a7cb0003839b5844bb3914279d5414bd8724/openai_codex-0.155.1.tar.gz", hash = "sha256:9706342a04571b6c5c1fddebf9a3202727574026bf4b988c37515c8eca07a8c8", size = 86819, upload-time = "2026-09-20T00:41:06.051Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/5a/ddc9ff30b38a361d5679cca79b1d0b4db70359a859fcb1b321e9c7423dd2/openai_codex-0.156.1.tar.gz", hash = "sha256:84de33cc7bf39f974423bd7568a5662d4eb1c685e6f9808c6160f1a68338a0c8", size = 87930, upload-time = "2026-09-23T02:51:35.714Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/7e/190b3188ad4e0933fad0850bd641d274f2e002055f86d2f880c6e6647ede/openai_codex-0.155.1-py3-none-any.whl", hash = "sha256:cc7eee57ab2803a59b5125f25190839af37689f09812f0fca6565d722303cf5d", size = 94950, upload-time = "2026-09-20T00:41:04.574Z" }, + { url = "https://files.pythonhosted.org/packages/ff/5d/6909bc7a4a4329e9642ee1a3862ec0a224420694bbf02fdb6336db6213e2/openai_codex-0.156.1-py3-none-any.whl", hash = "sha256:6a11313e86027dd2da00f1af475388a578a19076ae8150b0f1c305d8564c973f", size = 96056, upload-time = "2026-09-23T02:51:34.189Z" }, ] [[package]] name = "openai-codex-cli-bin" -version = "0.155.1" +version = "0.156.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/21/07d6c7c4c2337301c76facedb030d5da8dc990af6e98968550bc0f550f0f/openai_codex_cli_bin-0.155.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:60a965742afb946ffe9d86b9f58aa4f2422e0d8ad9060bc1cb52c35290e8966b", size = 125209614, upload-time = "2026-09-20T00:39:54.179Z" }, - { url = "https://files.pythonhosted.org/packages/9f/da/17cc1912de60e64025380d918082bc9ac4820b43488a81af7c2eea25c3bc/openai_codex_cli_bin-0.155.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:20f06ff5ba6f10782cb9794b3e1f7bfd01e919a7526c57eece852cee0cbff024", size = 115206116, upload-time = "2026-09-20T00:40:00.265Z" }, - { url = "https://files.pythonhosted.org/packages/2c/4d/d9752b112e3c2d099b84d84a8ad77b8b028d4a01516a65a212aff99d5a27/openai_codex_cli_bin-0.155.1-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:ecb4d79b4f12a12bec13f1f3c611602a72b8eea1b1fe522113040bf6c98e91c8", size = 121002606, upload-time = "2026-09-20T00:40:05.789Z" }, - { url = "https://files.pythonhosted.org/packages/60/43/27c4046e33f65122ba215cbe2f1c8d63757759bbe5237f12c42e83d071da/openai_codex_cli_bin-0.155.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:b1e3324cae6a042669bf188e02734ea04f0364ab5b2f6df5350cfe6aca724eee", size = 129970486, upload-time = "2026-09-20T00:40:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/c2/de/f0ba2235e0c634baa8c6d14962ebae26c92248147b424875de4dc3778d0b/openai_codex_cli_bin-0.155.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:a86c888dc8eee6f2117ebcf118047aba860d384eeacb83273495aec32c052023", size = 130614828, upload-time = "2026-09-20T00:40:17.785Z" }, - { url = "https://files.pythonhosted.org/packages/d2/f8/9c38cd4c1f154160a2c8fb351cf4e208cc6d2f956d0bf8c1b5c6c4c6dfe5/openai_codex_cli_bin-0.155.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:73ef57161f17e8475f76e8f020d6501c0b2db4b5014ec3fa6db85ab804743209", size = 139725322, upload-time = "2026-09-20T00:40:23.757Z" }, - { url = "https://files.pythonhosted.org/packages/ad/6c/4b8c104406caa61b098a0de6a6f016cb19b59bf1d5198080aab8fda955ea/openai_codex_cli_bin-0.155.1-py3-none-win_amd64.whl", hash = "sha256:aabe5e39c474afb05b09b264242564d3f704e06468a5d1ee87bc5eb5c869a45f", size = 140425725, upload-time = "2026-09-20T00:40:30.644Z" }, - { url = "https://files.pythonhosted.org/packages/8d/71/0f2f38f0b27094017ade74dcf74e358f3540397e0a4ccc19d38b89549ac8/openai_codex_cli_bin-0.155.1-py3-none-win_arm64.whl", hash = "sha256:ec489d8cc3488a5a1dd19b768aa189c82dd43c5c151a2a6f78652f017c8fdadf", size = 129631031, upload-time = "2026-09-20T00:40:36.844Z" }, + { url = "https://files.pythonhosted.org/packages/52/1e/d60201465b08022d7f12898db6fe24cff937e515e0a1c186cd958f4299fd/openai_codex_cli_bin-0.156.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:142b29633e1c4a4cdb1ffb2c8d4cf334d0d0ab322673875802acfe562af05fd9", size = 130059695, upload-time = "2026-09-23T02:50:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7c/d768e1e721f6e0aff62314b9605291f873c7546b97c24ccb9b5c055e3104/openai_codex_cli_bin-0.156.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7cc8269e2af695d6b00be1a9d6f48243b3b992bce5f408b0910e75a369e67dd1", size = 119241989, upload-time = "2026-09-23T02:50:22.568Z" }, + { url = "https://files.pythonhosted.org/packages/92/a4/26633fff0fe965eaa6cb66af3a11339ea77455d4dc4f69bcb1e9d2335ca3/openai_codex_cli_bin-0.156.1-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:c725c0721949a81b2eae75e9468b280813a3e40bb3ce319b34f9bfbb69d4de0e", size = 127318762, upload-time = "2026-09-23T02:50:26.86Z" }, + { url = "https://files.pythonhosted.org/packages/fc/49/dd321e5e3ddb20d5aa768db20e7989d6e093d940f6bf30b742f1c70acac5/openai_codex_cli_bin-0.156.1-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:84a12567ca54ba6ae4ed755911c04e7cdf658315f8719963c8daa8592d8fe068", size = 136219225, upload-time = "2026-09-23T02:50:31.479Z" }, + { url = "https://files.pythonhosted.org/packages/12/0c/10f97974677278408b828997d2ccbd3cf6dd38b1730bee0040c2e0633fc8/openai_codex_cli_bin-0.156.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:b81cc09f04575fa7471e39dad678700a7e209c81031a8f86cb175c1f6c0ace40", size = 136944600, upload-time = "2026-09-23T02:50:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/86/3c/06c1e948a143805e6dbef43f3bd5d530c9040814b2a28ac7d4980cb77337/openai_codex_cli_bin-0.156.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:950627ab801703e061f2404105ed8216bb9728befbb09d853003a2678b9dbab2", size = 145984819, upload-time = "2026-09-23T02:50:40.776Z" }, + { url = "https://files.pythonhosted.org/packages/db/0f/d97a26ffda3b2ecd703aebec11770abe68513ac12e08c1c52c1721eee488/openai_codex_cli_bin-0.156.1-py3-none-win_amd64.whl", hash = "sha256:81ab68fdadf448af52736282619875e10d365d93dd7442e94925899e77b99e7d", size = 145804807, upload-time = "2026-09-23T02:50:45.739Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1f/505234ed2b7803db1966bcf92ce5b923f7e78768bab8540d916f8ce86394/openai_codex_cli_bin-0.156.1-py3-none-win_arm64.whl", hash = "sha256:1b192fcbac53f4c13b7c637ab44d67f2731b700a8b32ae314d04b4f880e85a9f", size = 134709984, upload-time = "2026-09-23T02:50:50.49Z" }, ] [[package]] @@ -3137,7 +3138,7 @@ wheels = [ [[package]] name = "uipath" -version = "2.14.23" +version = "2.14.24" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "applicationinsights" }, @@ -3162,9 +3163,9 @@ dependencies = [ { name = "uipath-platform" }, { name = "uipath-runtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/5d/4e0d95c1dce7f9e21f21d9ad2b5f23c17205cb5e8b05bb46c144fa2bd2ff/uipath-2.14.23.tar.gz", hash = "sha256:158286f38f8e4c06289696b21b2074b8ff07bae257fc6a847e0ba495831d0eff", size = 4580955, upload-time = "2026-09-21T07:52:20.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/35/51d7c6ecf1e7f6c7a0d07cf735f214ac8a6ad2af1c82b39ff27d612ab9cd/uipath-2.14.24.tar.gz", hash = "sha256:12cec2c00e225d4cbe2e03945e4b90a931caeebbb3cba8f7f571b0848d7b212d", size = 4588042, upload-time = "2026-09-22T07:25:40.392Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/f5/cd511279106e1dbd0113042235bd594836453262f295b0ea586e2e85d426/uipath-2.14.23-py3-none-any.whl", hash = "sha256:aedd7d5693f7554af935fd54830aa69015eb8c657885e3d495e23fe5afc3a66b", size = 452401, upload-time = "2026-09-21T07:52:18.995Z" }, + { url = "https://files.pythonhosted.org/packages/dc/e4/c24e2afd0faa7ddbf1fb69c0230c21232866a69caa0402d7a4c3416742be/uipath-2.14.24-py3-none-any.whl", hash = "sha256:59f10d89b290808acf2a9d1ee16be11dbb9f8fd0e3cc4725e6464ef467cbc06a", size = 452707, upload-time = "2026-09-22T07:25:38.451Z" }, ] [[package]] From af239b9e58096e0815169173a1994be24b442c82 Mon Sep 17 00:00:00 2001 From: Bai Li Date: Thu, 24 Sep 2026 14:10:55 -0700 Subject: [PATCH 6/8] ci(harbor): exempt claude-agent-sdk from the package-age gate in Harbor E2E Harbor E2E installs the locked deps on the same safe-chain pool but carried no exclusion list, so it blocked claude-agent-sdk 0.2.159. It now uses the same workflow-level expression as pr-checks. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/harbor-e2e.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/harbor-e2e.yml b/.github/workflows/harbor-e2e.yml index 0fcf0143..4a8eb757 100644 --- a/.github/workflows/harbor-e2e.yml +++ b/.github/workflows/harbor-e2e.yml @@ -29,6 +29,8 @@ env: # Anthropic-credit spend off this path; DirectRoute is exercised elsewhere. API_BACKEND: "bedrock" CLAUDE_CODE_USE_BEDROCK: "1" + # Same expression as pr-checks.yml (see the comment there). + SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS: ${{ secrets.SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS || 'openai-codex-cli-bin,openai-codex' }},claude-agent-sdk jobs: harbor-e2e: From 44739f513bd02e0b2401b74cf677d0b1296ae854 Mon Sep 17 00:00:00 2001 From: Bai Li Date: Fri, 25 Sep 2026 13:37:57 -0700 Subject: [PATCH 7/8] fix(criteria): search past the 2000-char bound only in Bash commands A non-Bash tool's params are matched as JSON, so windowing them made a long Write/Edit body count as a command: a doc mentioning a retired command past char 2000 tripped a max_count: 0 gate without a tool_name filter, and later windows dropped the "content" key that skills' api-workflow discovery patterns guard on. Those tools keep the leading 2000 chars. Re-grading is unchanged: 35 fail->pass / 0 pass->fail on the 2026-09-23 Opus 5.5 run, 0/0 on the Sonnet 5 nightly. Also records the long-command behavior in the Task Definition Guide so suites know exclude_pattern and max_count gates now see the whole command, and drops comments that repeated the constant names. Co-Authored-By: Claude Opus 5.5 --- .claude/notes/contracts.md | 4 ++- docs/TASK_DEFINITION_GUIDE.md | 2 ++ src/coder_eval/criteria/command_executed.py | 39 +++++++++++---------- tests/test_command_executed.py | 12 +++++++ 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/.claude/notes/contracts.md b/.claude/notes/contracts.md index c99ae5e6..fdb4a931 100644 --- a/.claude/notes/contracts.md +++ b/.claude/notes/contracts.md @@ -100,7 +100,9 @@ but the whole command is searched: the first 2000 characters, then the rest in w start and end on logical-line boundaries. Agents write long heredoc scripts that end in the command a task checks for (`cat > x < str | None: def _search_windows(cmd_text: str) -> list[str]: """Slices of ``cmd_text`` a pattern is searched in, each at most ``_MAX_PATTERN_SEARCH_LEN``. - The first window is the leading ``_MAX_PATTERN_SEARCH_LEN`` characters. The rest - of the command is packed into windows that start and end on logical-line - boundaries (a backslash-continued line stays whole), so a command on a line after - a long heredoc is still seen. A single logical line longer than the bound is cut - into bound-sized pieces overlapping by ``_WINDOW_OVERLAP``. Work stays linear in - the command length and each regex search stays within the ReDoS bound. + The first window is the leading ``_MAX_PATTERN_SEARCH_LEN`` characters, so every + match the single leading window found is still found. The rest of the command is + packed into windows that start and end on logical-line boundaries (a + backslash-continued line stays whole), so a command on a line after a long heredoc + is still seen. A single logical line longer than the bound is cut into bound-sized + pieces overlapping by ``_WINDOW_OVERLAP``, so a match up to that long is never + split. Work stays linear in the command length and each regex search stays within + the ReDoS bound. """ cap = _MAX_PATTERN_SEARCH_LEN if len(cmd_text) <= cap: @@ -134,11 +133,14 @@ def _search_windows(cmd_text: str) -> list[str]: def _match_haystacks(cmd_text: str, *, is_shell: bool) -> list[str]: """Strings a pattern may match against for one command. - Every search window of ``cmd_text`` (see :func:`_search_windows`); when - ``is_shell``, additionally the quote-resolved, wrapper-stripped form of each - window (see :func:`_normalize_shell`). Normalizing per window keeps every - haystack within the ReDoS bound and caps ``shlex`` input for free. Matching is - "either" -- a pattern hits the command if it matches ANY haystack. + When ``is_shell``, every search window of ``cmd_text`` (see + :func:`_search_windows`) plus the quote-resolved, wrapper-stripped form of each + window (see :func:`_normalize_shell`). Otherwise only the leading + ``_MAX_PATTERN_SEARCH_LEN`` characters: a non-shell tool's params are JSON, and a + later window of a Write/Edit body is file content, not something the agent ran. + Normalizing per window keeps every haystack within the ReDoS bound and caps + ``shlex`` input for free. Matching is "either" -- a pattern hits the command if it + matches ANY haystack. ``is_shell`` is decided once by the caller (a Bash tool whose ``command`` is a non-empty ``str``) and passed in, rather than re-derived here from @@ -146,13 +148,14 @@ def _match_haystacks(cmd_text: str, *, is_shell: bool) -> list[str]: its params to JSON, where shell tokenization is meaningless, and must NOT be normalized (else stripped JSON quotes could newly satisfy an exclusion). """ + if not is_shell: + return [cmd_text[:_MAX_PATTERN_SEARCH_LEN]] haystacks: list[str] = [] for window in _search_windows(cmd_text): haystacks.append(window) - if is_shell: - normalized = _normalize_shell(window) - if normalized is not None and normalized != window: - haystacks.append(normalized) + normalized = _normalize_shell(window) + if normalized is not None and normalized != window: + haystacks.append(normalized) return haystacks diff --git a/tests/test_command_executed.py b/tests/test_command_executed.py index 94edf0fb..edc1ce2f 100644 --- a/tests/test_command_executed.py +++ b/tests/test_command_executed.py @@ -1175,3 +1175,15 @@ def test_exclusion_after_long_heredoc_drops_the_command(self): min_count=1, ) assert SuccessChecker(MockSandbox()).check(criterion, turn_records=turn_records).score == 0.0 + + def test_non_shell_tool_body_past_the_bound_is_not_searched(self): + content = "y" * (2 * _MAX_PATTERN_SEARCH_LEN) + "\nDo not run `uip or users list`, it is retired.\n" + write = _make_command(tool_name="Write", parameters={"file_path": "/work/NOTES.md", "content": content}) + turn_records = [_make_turn([write])] + criterion = CommandExecutedCriterion( + description="must NOT use retired `uip or users list`", + command_pattern=r"uip\s+or\s+users\s+list", + min_count=0, + max_count=0, + ) + assert SuccessChecker(MockSandbox()).check(criterion, turn_records=turn_records).score == 1.0 From 96bee6fddf3c373cf5559a6daaf220d3dc07e7d4 Mon Sep 17 00:00:00 2001 From: Bai Li Date: Fri, 25 Sep 2026 13:37:57 -0700 Subject: [PATCH 8/8] docs(agents): update Pi and Antigravity references for the harness bump - Pi 0.87.1: same stream event names, identical JSON serializer and the same --help thinking levels as 0.84.4, so the grammar citations move up. - Antigravity 0.1.18 enforces workspaces inside localharness, not through a Python-side workspace_only policy; docstrings and the pinned version in ANTIGRAVITY.md now say so. The rewritten workspace test only restated the test above it, so its rationale moves there and it is deleted. Co-Authored-By: Claude Opus 5.5 --- docs/agents/ANTIGRAVITY.md | 2 +- src/coder_eval/agents/antigravity_agent.py | 8 ++++---- src/coder_eval/agents/pi_agent.py | 4 ++-- src/coder_eval/models/agent_config.py | 2 +- tests/test_antigravity_agent.py | 24 +++------------------- 5 files changed, 11 insertions(+), 29 deletions(-) diff --git a/docs/agents/ANTIGRAVITY.md b/docs/agents/ANTIGRAVITY.md index fa84e82e..ccc37db1 100644 --- a/docs/agents/ANTIGRAVITY.md +++ b/docs/agents/ANTIGRAVITY.md @@ -27,7 +27,7 @@ working directory — both required for an unattended eval. pip install 'coder-eval[antigravity]' ``` -This pulls in `google-antigravity` (pinned to `0.1.8`), whose wheel bundles the +This pulls in `google-antigravity` (pinned to `0.1.18`), whose wheel bundles the platform `localharness` binary. As with the other agents the SDK is imported lazily — a base install without the extra still runs end-to-end; Antigravity tasks fail at dispatch with a clear hint to install the extra. diff --git a/src/coder_eval/agents/antigravity_agent.py b/src/coder_eval/agents/antigravity_agent.py index 6e3f1edb..b77de618 100644 --- a/src/coder_eval/agents/antigravity_agent.py +++ b/src/coder_eval/agents/antigravity_agent.py @@ -275,7 +275,7 @@ def _resolve_skills_paths(self, plugin_tools_dir: str | None) -> list[str]: return roots def _resolve_workspaces(self, skills_paths: list[str]) -> list[str]: - """Workspace roots for the harness's ``workspace_only`` file-tool policy. + """Workspace roots the harness confines its file tools to. The sandbox working directory (the write target) plus the resolved skill roots. ``skills_paths`` drives DISCOVERY only; the file-tool allowlist is @@ -341,9 +341,9 @@ async def start( cfg = LocalAgentConfig( model=self._effective_model(), api_key=api_key, - # File tools are confined to ``workspaces`` by the auto-prepended - # workspace_only policy — see _resolve_workspaces for why the skill - # roots must be in here and not only in ``skills_paths``. + # The harness confines file tools to ``workspaces``; see + # _resolve_workspaces for why the skill roots must be in here and + # not only in ``skills_paths``. workspaces=self._resolve_workspaces(skills_paths), # Autonomous execution: approve every tool call, which the default # policy would deny. ``permission_mode`` is deliberately NOT mapped diff --git a/src/coder_eval/agents/pi_agent.py b/src/coder_eval/agents/pi_agent.py index 0f981426..01ef13bb 100644 --- a/src/coder_eval/agents/pi_agent.py +++ b/src/coder_eval/agents/pi_agent.py @@ -5,7 +5,7 @@ protocol so :class:`EventCollector` builds the ``TurnRecord``. The design mirrors :mod:`coder_eval.agents.opencode_agent`. -Three grammar facts that are not obvious from the event names (``pi`` 0.84.4): +Three grammar facts that are not obvious from the event names (``pi`` 0.87.1): - ``agent_start`` can appear MORE THAN ONCE per invocation — Pi auto-retries a transient provider error internally — and ``agent_end`` is therefore NOT @@ -149,7 +149,7 @@ "disallowed_tools", ) -# The full recognized Pi vocabulary (from `pi` 0.84.4). A clean exit that +# The full recognized Pi vocabulary (from `pi` 0.87.1). A clean exit that # recognized NOTHING from this set is vocabulary drift and is crashed, not scored. # Rationale: .claude/notes/agents.md § Why a clean exit can still be a crash _RECOGNIZED_EVENTS = frozenset( diff --git a/src/coder_eval/models/agent_config.py b/src/coder_eval/models/agent_config.py index ad3cb90f..a9aef571 100644 --- a/src/coder_eval/models/agent_config.py +++ b/src/coder_eval/models/agent_config.py @@ -362,7 +362,7 @@ class OpenCodeAgentConfig(BaseAgentConfig): # A STRICT SUPERSET of ThinkingLevel, so Pi gets its own literal -- reuse would -# forbid valid Pi levels. Confirmed against ``pi --help`` on Pi 0.84.4. +# forbid valid Pi levels. Confirmed against ``pi --help`` on Pi 0.87.1. type PiThinkingLevel = Literal["off", "minimal", "low", "medium", "high", "xhigh", "max"] diff --git a/tests/test_antigravity_agent.py b/tests/test_antigravity_agent.py index 18770d53..35b74734 100644 --- a/tests/test_antigravity_agent.py +++ b/tests/test_antigravity_agent.py @@ -11,7 +11,6 @@ from collections.abc import Callable from datetime import datetime, timedelta from itertools import pairwise -from pathlib import Path from types import ModuleType, SimpleNamespace from typing import Any @@ -135,7 +134,9 @@ def test_resolve_skills_paths_empty_without_sources(): def test_resolve_workspaces_includes_workdir_and_skill_roots(tmp_path): - """workspaces = sandbox workdir + resolved skill roots, so SKILL.md stays readable.""" + """workspaces = sandbox workdir + resolved skill roots. The harness confines file tools to + ``workspaces``, and ``skills_paths`` feeds discovery only, so a skill root missing here + is discovered and then denied on every read of its SKILL.md.""" repo = tmp_path / "skills-repo" _make_skill(repo / "skills", "uipath-sdd") agent = AntigravityAgent(parse_agent_config(type="antigravity", plugins=[{"type": "local", "path": str(repo)}])) @@ -147,25 +148,6 @@ def test_resolve_workspaces_includes_workdir_and_skill_roots(tmp_path): ] -def test_resolved_workspaces_cover_skill_reads(tmp_path): - """The harness confines file tools to ``workspaces`` (enforced inside localharness, - not by a Python-side predicate), and ``skills_paths`` feeds discovery, not that - allowlist, so the resolved skill roots must be in ``workspaces`` for the agent to - read SKILL.md.""" - repo = tmp_path / "skills-repo" - _make_skill(repo / "skills", "uipath-sdd") - skill_md = (repo / "skills" / "uipath-sdd" / "SKILL.md").resolve() - workdir = tmp_path / "work" - workdir.mkdir() - - agent = AntigravityAgent(parse_agent_config(type="antigravity", plugins=[{"type": "local", "path": str(repo)}])) - agent.working_directory = workdir - workspaces = [Path(w).resolve() for w in agent._resolve_workspaces(agent._resolve_skills_paths(None))] - - assert not skill_md.is_relative_to(workdir.resolve()) - assert any(skill_md.is_relative_to(w) for w in workspaces) - - def test_to_token_usage_maps_gemini_buckets(): """Gemini UsageMetadata → coder_eval TokenUsage: uncached=prompt-cached, cache_read=cached, cache_creation=0, output=candidates+thoughts."""