opencode-hermes-mcp 0.4.2__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/PKG-INFO +5 -5
  2. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/README.md +3 -3
  3. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/__init__.py +2 -2
  4. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/client.py +1 -1
  5. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/controller.py +5 -5
  6. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/installer.py +1 -1
  7. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/models.py +2 -2
  8. opencode_hermes_mcp-0.5.0/opencode_hermes_mcp/pin.txt +1 -0
  9. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/server.py +1 -1
  10. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/PKG-INFO +5 -5
  11. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/pyproject.toml +2 -2
  12. opencode_hermes_mcp-0.4.2/opencode_hermes_mcp/pin.txt +0 -1
  13. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/LICENSE +0 -0
  14. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/journal.py +0 -0
  15. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/smoke_client.py +0 -0
  16. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/SOURCES.txt +0 -0
  17. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/dependency_links.txt +0 -0
  18. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/entry_points.txt +0 -0
  19. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/requires.txt +0 -0
  20. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/top_level.txt +0 -0
  21. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/setup.cfg +0 -0
  22. {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/tests/test_journal.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencode-hermes-mcp
3
- Version: 0.4.2
4
- Summary: Deterministic MCP controller between Hermes (supervisor LLM) and the permanent OpenCode server. OpenCode pin defined in opencode_hermes_mcp/pin.txt (currently 1.18.21).
3
+ Version: 0.5.0
4
+ Summary: Deterministic MCP controller between Hermes (supervisor LLM) and the permanent OpenCode server. OpenCode pin defined in opencode_hermes_mcp/pin.txt (currently 1.18.30).
5
5
  Author-email: Arthur Hottier <arthur.ho2tier@gmail.com>
6
6
  License: MIT
7
7
  Project-URL: Homepage, https://github.com/ArthurHtr/opencode-hermes-mcp
@@ -30,7 +30,7 @@ Dynamic: license-file
30
30
 
31
31
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
32
32
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](#prerequisites)
33
- [![OpenCode](https://img.shields.io/badge/OpenCode-1.18.21%20(pinned)-brightgreen.svg)](#version-pin-opencode-11821)
33
+ [![OpenCode](https://img.shields.io/badge/OpenCode-1.18.30%20(pinned)-brightgreen.svg)](#version-pin-opencode-11830)
34
34
 
35
35
  Deterministic MCP controller between **Hermes** (supervisor LLM) and the
36
36
  permanent **OpenCode** server. The controller is a state machine — no LLM —
@@ -248,9 +248,9 @@ scripts/uninstall.sh --purge-binary # + the OpenCode binary
248
248
  `uninstall.sh` never touches the git clone, the OpenCode provider config, the
249
249
  API key secret, or the binary (unless the purge flags say so).
250
250
 
251
- ## Version pin: OpenCode 1.18.21
251
+ ## Version pin: OpenCode 1.18.30
252
252
 
253
- The controller is **validated against OpenCode `1.18.21` only** (its endpoint
253
+ The controller is **validated against OpenCode `1.18.30` only** (its endpoint
254
254
  contract was verified against that binary's live `/doc`, not the web docs).
255
255
  The pin is a **single source of truth** in `opencode_hermes_mcp/pin.txt`
256
256
  (one line, no `v` prefix): `installer.py` and `scripts/upgrade.sh` both read
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
4
4
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](#prerequisites)
5
- [![OpenCode](https://img.shields.io/badge/OpenCode-1.18.21%20(pinned)-brightgreen.svg)](#version-pin-opencode-11821)
5
+ [![OpenCode](https://img.shields.io/badge/OpenCode-1.18.30%20(pinned)-brightgreen.svg)](#version-pin-opencode-11830)
6
6
 
7
7
  Deterministic MCP controller between **Hermes** (supervisor LLM) and the
8
8
  permanent **OpenCode** server. The controller is a state machine — no LLM —
@@ -220,9 +220,9 @@ scripts/uninstall.sh --purge-binary # + the OpenCode binary
220
220
  `uninstall.sh` never touches the git clone, the OpenCode provider config, the
221
221
  API key secret, or the binary (unless the purge flags say so).
222
222
 
223
- ## Version pin: OpenCode 1.18.21
223
+ ## Version pin: OpenCode 1.18.30
224
224
 
225
- The controller is **validated against OpenCode `1.18.21` only** (its endpoint
225
+ The controller is **validated against OpenCode `1.18.30` only** (its endpoint
226
226
  contract was verified against that binary's live `/doc`, not the web docs).
227
227
  The pin is a **single source of truth** in `opencode_hermes_mcp/pin.txt`
228
228
  (one line, no `v` prefix): `installer.py` and `scripts/upgrade.sh` both read
@@ -1,6 +1,6 @@
1
1
  """opencode-hermes-mcp — deterministic MCP controller between Hermes (supervisor
2
2
  LLM) and the permanent OpenCode server. No LLM: a state machine + HTTP/SSE
3
3
  client, pinned to the OpenCode version in opencode_hermes_mcp/pin.txt
4
- (currently 1.18.21)."""
4
+ (currently 1.18.30)."""
5
5
 
6
- __version__ = "0.4.2"
6
+ __version__ = "0.5.0"
@@ -1,6 +1,6 @@
1
1
  """Async HTTP/SSE client for the permanent OpenCode server.
2
2
 
3
- Contract = the live server's /doc (OpenAPI) for OpenCode 1.18.21, verified by
3
+ Contract = the live server's /doc (OpenAPI) for OpenCode 1.18.30, verified by
4
4
  probing — NOT the web docs. Non-obvious behaviours (directory scoping, etc.)
5
5
  are documented in the skill reference `mcp-controller.md`.
6
6
  """
@@ -8,7 +8,7 @@ No LLM, no inference. Responsibilities:
8
8
  * persist a small durable turn state so that answering a question or
9
9
  permission works even after the controller process restarts.
10
10
 
11
- Completion semantics (verified against live server 1.18.21 — see skill
11
+ Completion semantics (verified against live server 1.18.30 — see skill
12
12
  reference mcp-controller.md):
13
13
  * /session/status (scoped) lists only ACTIVE sessions; absence = idle;
14
14
  * `session.idle` fires BETWEEN assistant messages too — NOT terminal;
@@ -47,7 +47,7 @@ DEFAULT_RUN_TIMEOUT = 3600.0
47
47
  # After we answer a question / decide a permission, if the session goes idle
48
48
  # and makes NO further progress (no busy period, no new assistant message) for
49
49
  # this long, the turn has been terminated by the interaction resolution — most
50
- # notably a permission REJECT, where OpenCode 1.18.21 ends the turn with the
50
+ # notably a permission REJECT, where OpenCode 1.18.30 ends the turn with the
51
51
  # last assistant message still at finish='tool-calls' and no error. Without
52
52
  # this, the completion heuristic (finish != tool-calls) would wait forever.
53
53
  INTERACTION_STALL_GRACE_MS = 45_000
@@ -261,7 +261,7 @@ class Controller:
261
261
  # last assistant message is a non-terminal tool-calls tail, and there
262
262
  # is no error. That is the signature of a turn TERMINATED by the
263
263
  # interaction resolution — most notably a permission REJECT, where
264
- # OpenCode 1.18.21 ends the turn leaving the last assistant message at
264
+ # OpenCode 1.18.30 ends the turn leaving the last assistant message at
265
265
  # finish='tool-calls' with no error and no new message. Without this,
266
266
  # the completion heuristic (finish != tool-calls) would wait forever.
267
267
  #
@@ -313,7 +313,7 @@ class Controller:
313
313
  msg_created = msg_created_ms(last)
314
314
 
315
315
  # An assistant message that errored is a terminal failure — EXCEPT an
316
- # abort: OpenCode 1.18.21 marks the aborted message with
316
+ # abort: OpenCode 1.18.30 marks the aborted message with
317
317
  # error.name == "MessageAbortedError". That is a clean abort, not a
318
318
  # failure. (Handled here too, not just via the _aborted set, because
319
319
  # the SSE event from the abort can poke the wait loop before abort()
@@ -597,7 +597,7 @@ class Controller:
597
597
  # RESUME semantics. Authoritative signal that a turn is in flight
598
598
  # is the durable turn state (written at submission, cleared on
599
599
  # terminal). status_map is NOT reliable here: while another
600
- # controller process holds the SSE stream it returns {} (1.18.21
600
+ # controller process holds the SSE stream it returns {} (1.18.30
601
601
  # quirk), so we must not use "not busy" alone to decide to
602
602
  # resubmit — that would wrongly send a NEW prompt onto a turn that
603
603
  # is still running (forbidden).
@@ -35,7 +35,7 @@ from typing import NoReturn
35
35
  # Fallback only — the single source of truth is opencode_hermes_mcp/pin.txt
36
36
  # (see pinned_version()). Needed for pip installs where pin.txt is not
37
37
  # shipped next to the code.
38
- OPENCODE_VERSION = "1.18.21"
38
+ OPENCODE_VERSION = "1.18.30"
39
39
  MCP_VERSION = "1.12.4"
40
40
  BOOTSTRAP_DEPS = ["mcp==1.12.4", "rich>=13", "pyyaml>=6"]
41
41
 
@@ -18,7 +18,7 @@ STATE_DIR = os.environ.get(
18
18
  os.path.join(os.path.expanduser("~"), ".local", "state", "opencode-hermes-mcp"),
19
19
  )
20
20
 
21
- # A root agent must have mode "primary" (observed on 1.18.21). "all" is
21
+ # A root agent must have mode "primary" (observed on 1.18.30). "all" is
22
22
  # treated as usable-as-root too, in case a future version exposes it.
23
23
  ROOT_AGENT_MODES = {"primary", "all"}
24
24
 
@@ -129,7 +129,7 @@ def validate_question_answers(
129
129
  """Validate `answers` (one entry per sub-question, each a str or list[str])
130
130
  against the question's options.
131
131
 
132
- OpenCode 1.18.21 rejects (400) any answer that is not an exact option
132
+ OpenCode 1.18.30 rejects (400) any answer that is not an exact option
133
133
  label when the sub-question has options and custom=false.
134
134
  """
135
135
  subqs = question.get("questions") or []
@@ -0,0 +1 @@
1
+ 1.18.30
@@ -24,7 +24,7 @@ Tools (final surface):
24
24
  Credentials come from the environment (injected by the launcher):
25
25
  OPENCODE_SERVER_URL / OPENCODE_SERVER_USERNAME / OPENCODE_SERVER_PASSWORD
26
26
 
27
- Target: OpenCode 1.18.21. Endpoint contract = the live server's /doc,
27
+ Target: OpenCode 1.18.30. Endpoint contract = the live server's /doc,
28
28
  verified against the installed binary — not the web docs.
29
29
  """
30
30
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencode-hermes-mcp
3
- Version: 0.4.2
4
- Summary: Deterministic MCP controller between Hermes (supervisor LLM) and the permanent OpenCode server. OpenCode pin defined in opencode_hermes_mcp/pin.txt (currently 1.18.21).
3
+ Version: 0.5.0
4
+ Summary: Deterministic MCP controller between Hermes (supervisor LLM) and the permanent OpenCode server. OpenCode pin defined in opencode_hermes_mcp/pin.txt (currently 1.18.30).
5
5
  Author-email: Arthur Hottier <arthur.ho2tier@gmail.com>
6
6
  License: MIT
7
7
  Project-URL: Homepage, https://github.com/ArthurHtr/opencode-hermes-mcp
@@ -30,7 +30,7 @@ Dynamic: license-file
30
30
 
31
31
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
32
32
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](#prerequisites)
33
- [![OpenCode](https://img.shields.io/badge/OpenCode-1.18.21%20(pinned)-brightgreen.svg)](#version-pin-opencode-11821)
33
+ [![OpenCode](https://img.shields.io/badge/OpenCode-1.18.30%20(pinned)-brightgreen.svg)](#version-pin-opencode-11830)
34
34
 
35
35
  Deterministic MCP controller between **Hermes** (supervisor LLM) and the
36
36
  permanent **OpenCode** server. The controller is a state machine — no LLM —
@@ -248,9 +248,9 @@ scripts/uninstall.sh --purge-binary # + the OpenCode binary
248
248
  `uninstall.sh` never touches the git clone, the OpenCode provider config, the
249
249
  API key secret, or the binary (unless the purge flags say so).
250
250
 
251
- ## Version pin: OpenCode 1.18.21
251
+ ## Version pin: OpenCode 1.18.30
252
252
 
253
- The controller is **validated against OpenCode `1.18.21` only** (its endpoint
253
+ The controller is **validated against OpenCode `1.18.30` only** (its endpoint
254
254
  contract was verified against that binary's live `/doc`, not the web docs).
255
255
  The pin is a **single source of truth** in `opencode_hermes_mcp/pin.txt`
256
256
  (one line, no `v` prefix): `installer.py` and `scripts/upgrade.sh` both read
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "opencode-hermes-mcp"
7
- version = "0.4.2"
8
- description = "Deterministic MCP controller between Hermes (supervisor LLM) and the permanent OpenCode server. OpenCode pin defined in opencode_hermes_mcp/pin.txt (currently 1.18.21)."
7
+ version = "0.5.0"
8
+ description = "Deterministic MCP controller between Hermes (supervisor LLM) and the permanent OpenCode server. OpenCode pin defined in opencode_hermes_mcp/pin.txt (currently 1.18.30)."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
11
11
  requires-python = ">=3.11"
@@ -1 +0,0 @@
1
- 1.18.21