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.
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/PKG-INFO +5 -5
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/README.md +3 -3
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/__init__.py +2 -2
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/client.py +1 -1
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/controller.py +5 -5
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/installer.py +1 -1
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/models.py +2 -2
- opencode_hermes_mcp-0.5.0/opencode_hermes_mcp/pin.txt +1 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/server.py +1 -1
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/PKG-INFO +5 -5
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/pyproject.toml +2 -2
- opencode_hermes_mcp-0.4.2/opencode_hermes_mcp/pin.txt +0 -1
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/LICENSE +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/journal.py +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp/smoke_client.py +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/SOURCES.txt +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/dependency_links.txt +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/entry_points.txt +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/requires.txt +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/top_level.txt +0 -0
- {opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/setup.cfg +0 -0
- {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
|
-
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.
|
|
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)
|
|
32
32
|
[](#prerequisites)
|
|
33
|
-
[-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.
|
|
251
|
+
## Version pin: OpenCode 1.18.30
|
|
252
252
|
|
|
253
|
-
The controller is **validated against OpenCode `1.18.
|
|
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)
|
|
4
4
|
[](#prerequisites)
|
|
5
|
-
[-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.
|
|
223
|
+
## Version pin: OpenCode 1.18.30
|
|
224
224
|
|
|
225
|
-
The controller is **validated against OpenCode `1.18.
|
|
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.
|
|
4
|
+
(currently 1.18.30)."""
|
|
5
5
|
|
|
6
|
-
__version__ = "0.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
# 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.
|
|
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.
|
|
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
|
|
{opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/PKG-INFO
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opencode-hermes-mcp
|
|
3
|
-
Version: 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.
|
|
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)
|
|
32
32
|
[](#prerequisites)
|
|
33
|
-
[-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.
|
|
251
|
+
## Version pin: OpenCode 1.18.30
|
|
252
252
|
|
|
253
|
-
The controller is **validated against OpenCode `1.18.
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/requires.txt
RENAMED
|
File without changes
|
{opencode_hermes_mcp-0.4.2 → opencode_hermes_mcp-0.5.0}/opencode_hermes_mcp.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|