Pre-0.1.129 the runtime's inline A2A response sniffer in
``send_a2a_message`` checked only for ``result`` / ``error`` keys and
routed the poll-mode success envelope —
``{"status": "queued", "delivery_mode": "poll", "method": "..."}`` —
to the malformed branch:
[A2A_ERROR] unexpected response shape (no result, no error): {...}
That string then propagated through ``tool_delegate_task`` into the
caller workspace's activity row, surfacing on canvas as the workspace's
task label and triggering a ~3s retry storm.
0.1.129 introduced ``a2a_response.py`` (SSOT typed parser with explicit
``Queued`` variant) + matching ``_A2A_QUEUED_PREFIX`` handling in
``a2a_tools_delegation.tool_delegate_task`` that falls back to the
durable ``/delegate`` + ``/delegations`` polling path — the correct
synchronous facade for poll-mode peers.
The existing ``>=0.1.110`` pin allowed a fresh ``pip install
codex-channel-molecule`` to resolve to a buggy wheel and reproduce the
incident. Raising the floor to 0.1.129 closes that window.
Adds a ``test_runtime_dependency_floor.py`` regression test that
parses ``pyproject.toml`` and asserts the lower bound stays at or
above 0.1.129 — bumps the version to 0.1.3 so a republish carries the
floor downstream.
Closes molecule-ai/internal#424.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
49 lines
1.9 KiB
TOML
49 lines
1.9 KiB
TOML
[build-system]
|
|
requires = ["setuptools>=68", "wheel"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "codex-channel-molecule"
|
|
version = "0.1.3"
|
|
description = "Bridge daemon for codex CLI ↔ Molecule platform — long-polls the platform inbox, runs `codex exec --resume <session>` per inbound message, replies via send_message_to_user MCP tool. Counterpart to hermes-channel-molecule."
|
|
readme = "README.md"
|
|
requires-python = ">=3.11"
|
|
license = { text = "Apache-2.0" }
|
|
authors = [{ name = "Molecule AI" }]
|
|
dependencies = [
|
|
# Floor raised from 0.1.110 → 0.1.129 to pull in the SSOT A2A response
|
|
# parser (a2a_response.py, introduced 0.1.129). Pre-0.1.129 the legacy
|
|
# inline sniffer in a2a_client.send_a2a_message treated the poll-mode
|
|
# ``{"status": "queued", "delivery_mode": "poll", "method": "..."}``
|
|
# envelope as malformed and surfaced ``[A2A_ERROR] unexpected response
|
|
# shape (no result, no error): ...`` on every reply attempt — that
|
|
# then propagated to canvas as the workspace's task label and triggered
|
|
# a ~3s retry storm. The 0.1.129+ runtime classifies the envelope as
|
|
# ``Queued`` and short-circuits to the durable /delegate-poll path
|
|
# (a2a_tools_delegation._delegate_sync_via_polling). See
|
|
# ``molecule-ai/internal#424`` and ``molecule-core#2967`` for the
|
|
# full incident + fix history.
|
|
"molecule-ai-workspace-runtime>=0.1.129",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
test = [
|
|
"pytest>=8",
|
|
"pytest-asyncio>=0.23",
|
|
]
|
|
|
|
[project.scripts]
|
|
codex-channel-molecule = "codex_channel_molecule.daemon:main"
|
|
|
|
[project.urls]
|
|
Homepage = "https://git.moleculesai.app/molecule-ai/codex-channel-molecule"
|
|
Repository = "https://git.moleculesai.app/molecule-ai/codex-channel-molecule"
|
|
|
|
[tool.setuptools.packages.find]
|
|
include = ["codex_channel_molecule*"]
|
|
exclude = ["tests*"]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
testpaths = ["tests"]
|