Bladeren bron

Vendor chattolib 0.5.0b15.post1, which fixes the mangled start_dm stub

Upstream re-published 0.5.0b15 as .post1 today. The only difference in the
library is two files, and both are the fix for a generator bug this repo
worked around: _protoc_plugin._method_name is acronym-aware now ("StartDM" ->
start_dm, not start_d_m), so rooms_connect carries start_dm again. The vendored
diff is exactly those two files.

That workaround (7455813) was "start_dm called a non-existent stub". It is
obsolete, and so is any reading of the docs that says the client cannot deliver
the call at all — which was never the reason we do not call it. Only a person can
start a DM on Chatto, so chatto_send_dm reports that precondition and posts into
the room that already exists. Those texts already give the server rule as the
reason and stay as they are.

.post1 is sdist-only, which the vendoring script already handles (--no-binary
chattolib), so the tree is byte-identical apart from the two files. A .postN
re-upload keeps the server target, so the floor stays Chatto v0.5.0-beta.15;
version restated in AGENTS.md, README.md and VENDORING.md per the refresh rule.
Paul Klumpp 2 weken geleden
bovenliggende
commit
2fdfeeccf4
25 gewijzigde bestanden met toevoegingen van 45 en 33 verwijderingen
  1. 3 2
      AGENTS.md
  2. 2 2
      README.md
  3. 1 1
      VENDORING.md
  4. 1 1
      vendor/common/bin/httpx
  5. 1 1
      vendor/common/bin/idna
  6. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/INSTALLER
  7. 1 1
      vendor/common/chattolib-0.5.0b15.post1.dist-info/METADATA
  8. 12 12
      vendor/common/chattolib-0.5.0b15.post1.dist-info/RECORD
  9. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/REQUESTED
  10. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/WHEEL
  11. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/licenses/LICENSE
  12. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/licenses/LICENSES/Apache-2.0.txt
  13. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/licenses/LICENSES/MPL-2.0.txt
  14. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/top_level.txt
  15. 0 0
      vendor/common/chattolib-0.5.0b15.post1.dist-info/uv_build.json
  16. 2 2
      vendor/common/chattolib/_pb/chatto/api/v1/rooms_connect.py
  17. 14 3
      vendor/common/chattolib/_protoc_plugin.py
  18. 1 1
      vendor/common/httpx-0.28.1.dist-info/RECORD
  19. 1 1
      vendor/common/idna-3.20.dist-info/RECORD
  20. 1 1
      vendor/platform/linux-aarch64/bin/websockets
  21. 1 1
      vendor/platform/linux-aarch64/websockets-17.2.dist-info/RECORD
  22. 1 1
      vendor/platform/linux-x86_64/bin/websockets
  23. 1 1
      vendor/platform/linux-x86_64/websockets-17.2.dist-info/RECORD
  24. 1 1
      vendor/platform/macos-arm64/bin/websockets
  25. 1 1
      vendor/platform/macos-arm64/websockets-17.2.dist-info/RECORD

+ 3 - 2
AGENTS.md

@@ -34,11 +34,12 @@ consumption — because the bot is a Chatto client just like the browser. Read
 how the platform itself models a problem before inventing our own shape (its
 presence-overlay pattern is what shaped the roster projection below).
 
-The vendored copy is upstream `chattolib[realtime]` 0.5.0b15 (realtime
+The vendored copy is upstream `chattolib[realtime]` 0.5.0b15.post1 (realtime
 protocol 4 — the revision chattolib sends in `RealtimeSubscribe.protocol_version`).
 chattolib versions track the Chatto server release they target,
 so this copy pairs with Chatto v0.5.0-beta.15, which is also the server floor
-this build claims to support. Refreshing `vendor/` via `vendor_chattolib.sh`
+this build claims to support (a `.postN` re-upload keeps the server target and
+moves only the library build). Refreshing `vendor/` via `vendor_chattolib.sh`
 can move that floor (see VENDORING.md) — after each refresh, restate the new
 version here and in README.md.
 

+ 2 - 2
README.md

@@ -4,7 +4,7 @@ A [Chatto](https://github.com/chattocorp/chatto) platform adapter plugin for [He
 
 All API interaction goes through [chattolib](https://github.com/TheCodemancerLtd/chattolib): a persistent WebSocket realtime connection delivers inbound events, ConnectRPC over HTTP handles outbound messages, reactions, uploads and more. Messages are processed through the full Hermes Agent pipeline (tool use, memory, reasoning) and answered in real time.
 
-Tested against Chatto v0.5.0-beta.15 with the vendored `chattolib[realtime]` 0.5.0b15 (realtime protocol 4). chattolib versions track the Chatto server release they target, so this build pairs with Chatto v0.5.0-beta.15; Chatto servers older than v0.5.0-beta.15 are not supported by this build.
+Tested against Chatto v0.5.0-beta.15 with the vendored `chattolib[realtime]` 0.5.0b15.post1 (realtime protocol 4). chattolib versions track the Chatto server release they target, so this build pairs with Chatto v0.5.0-beta.15; Chatto servers older than v0.5.0-beta.15 are not supported by this build.
 
 Before setup, here's the part most people want to know: how Hermes behaves once it's in your Chatto instance.
 
@@ -473,7 +473,7 @@ grep -i "chatto\|websocket\|realtime" ~/.hermes/logs/gateway.log | tail -30
 ## Notes
 
 - **Self-hosted friendly**: Works with any self-hosted Chatto instance. No cloud account or subscription required.
-- **Minimal dependencies**: Only requires `chattolib[realtime]==0.5.0b15`, which is vendored — nothing to install.
+- **Minimal dependencies**: Only requires `chattolib[realtime]==0.5.0b15.post1`, which is vendored — nothing to install.
 - **No message backfill**: Events missed while the gateway is down are gone — Chatto keeps no replay for the bot. Redelivered events after a reconnect are recognised and processed only once; anything genuinely new starts from the moment of reconnection.
 
 ## Acknowledgements

+ 1 - 1
VENDORING.md

@@ -91,7 +91,7 @@ PLATFORMS="linux-x86_64 linux-aarch64 macos-arm64 windows-amd64" ./vendor_chatto
 
 # Pin a specific chattolib version (keep the [realtime] extra — without it
 # websockets is not vendored and the event stream cannot start)
-CHATTOLIB_SPEC="chattolib[realtime]==0.5.0b15" ./vendor_chattolib.sh
+CHATTOLIB_SPEC="chattolib[realtime]==0.5.0b15.post1" ./vendor_chattolib.sh
 ```
 
 The script passes `--only-binary :all: --no-binary chattolib`. Everything must

+ 1 - 1
vendor/common/bin/httpx

@@ -1,4 +1,4 @@
-#!/tmp/opencode/plugin-tools-review/.venv/bin/python3
+#!/home/paul/.paseo/worktrees/02u7s3t4/clingy-porcupine/.venv/bin/python3
 # -*- coding: utf-8 -*-
 import sys
 from httpx import main

+ 1 - 1
vendor/common/bin/idna

@@ -1,4 +1,4 @@
-#!/tmp/opencode/plugin-tools-review/.venv/bin/python3
+#!/home/paul/.paseo/worktrees/02u7s3t4/clingy-porcupine/.venv/bin/python3
 # -*- coding: utf-8 -*-
 import sys
 from idna.cli import main

+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/INSTALLER → vendor/common/chattolib-0.5.0b15.post1.dist-info/INSTALLER


+ 1 - 1
vendor/common/chattolib-0.5.0b15.dist-info/METADATA → vendor/common/chattolib-0.5.0b15.post1.dist-info/METADATA

@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: chattolib
-Version: 0.5.0b15
+Version: 0.5.0b15.post1
 Summary: Async Python client library for the Chatto webchat Connect API
 Author-email: Felix <chatto@f3l1x.it>
 License-Expression: MPL-2.0 AND Apache-2.0

+ 12 - 12
vendor/common/chattolib-0.5.0b15.dist-info/RECORD → vendor/common/chattolib-0.5.0b15.post1.dist-info/RECORD

@@ -1,13 +1,13 @@
-chattolib-0.5.0b15.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
-chattolib-0.5.0b15.dist-info/METADATA,sha256=W7A-kenV31dfGiQ8ESVBqQ4iVJNfHtcbgZqbidg3px4,4936
-chattolib-0.5.0b15.dist-info/RECORD,,
-chattolib-0.5.0b15.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-chattolib-0.5.0b15.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
-chattolib-0.5.0b15.dist-info/licenses/LICENSE,sha256=Pz2eACSxkhsGfW9_iN60pgy-enjnbGTj8df8O3ebnQQ,16726
-chattolib-0.5.0b15.dist-info/licenses/LICENSES/Apache-2.0.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
-chattolib-0.5.0b15.dist-info/licenses/LICENSES/MPL-2.0.txt,sha256=Pz2eACSxkhsGfW9_iN60pgy-enjnbGTj8df8O3ebnQQ,16726
-chattolib-0.5.0b15.dist-info/top_level.txt,sha256=vgsGOu_BQfCunqwDpfv3epJ86-g6s0va3aAYlwUW1Cg,10
-chattolib-0.5.0b15.dist-info/uv_build.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
+chattolib-0.5.0b15.post1.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
+chattolib-0.5.0b15.post1.dist-info/METADATA,sha256=Msn_Wc7M5ePOdN8cRk-lTjSFrW3tgMF7LAeq-ppIxXM,4942
+chattolib-0.5.0b15.post1.dist-info/RECORD,,
+chattolib-0.5.0b15.post1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+chattolib-0.5.0b15.post1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
+chattolib-0.5.0b15.post1.dist-info/licenses/LICENSE,sha256=Pz2eACSxkhsGfW9_iN60pgy-enjnbGTj8df8O3ebnQQ,16726
+chattolib-0.5.0b15.post1.dist-info/licenses/LICENSES/Apache-2.0.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
+chattolib-0.5.0b15.post1.dist-info/licenses/LICENSES/MPL-2.0.txt,sha256=Pz2eACSxkhsGfW9_iN60pgy-enjnbGTj8df8O3ebnQQ,16726
+chattolib-0.5.0b15.post1.dist-info/top_level.txt,sha256=vgsGOu_BQfCunqwDpfv3epJ86-g6s0va3aAYlwUW1Cg,10
+chattolib-0.5.0b15.post1.dist-info/uv_build.json,sha256=RBNvo1WzZ4oRRq0W9-hknpT7T8If536DEMBg9hyq_4o,2
 chattolib/__init__.py,sha256=baJ3jHj7jkcOU5QBk9wu72Q1pqbStc6IjNSifTP63kI,3581
 chattolib/_codegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 chattolib/_codegen/protoc_gen_request_pb2.py,sha256=ctc_R6vciqBWr8Ki2eYWCwQnxXYg9t9OsPMVrjobK5M,1636
@@ -66,7 +66,7 @@ chattolib/_pb/chatto/api/v1/roles_pb2.py,sha256=5tKAU6WVrpqR0E4RcoKmg917ZlO-S10e
 chattolib/_pb/chatto/api/v1/room_directory_connect.py,sha256=BM2TbQJyrrli4_ZUju4AXSldKwoeazPMgq9l-Zu7QOg,7666
 chattolib/_pb/chatto/api/v1/room_directory_pb2.py,sha256=9bjfQqOM107zMqasQ9dJIg3KlAzi-0HNC8k85Nnc_VM,9787
 chattolib/_pb/chatto/api/v1/room_timeline_pb2.py,sha256=jUtZ9QNyHrI3WeOMYUgWaVEUuwn2nbNKUY7PjbsfgGo,9392
-chattolib/_pb/chatto/api/v1/rooms_connect.py,sha256=kcClN9zTPx25WS6D-4EJ13_OOKorb8JqGqqirbMvAps,30769
+chattolib/_pb/chatto/api/v1/rooms_connect.py,sha256=7BM1TpIgDntfaPKsdLKlItXWPEhMLiUtjK0XBDvtkBE,30767
 chattolib/_pb/chatto/api/v1/rooms_pb2.py,sha256=VkD7SDRFe5IogoW4I1lPSF7DGKsR-w5ONIQVYkxPc-8,23008
 chattolib/_pb/chatto/api/v1/server_pb2.py,sha256=4PLXiRaKo1aciExrEivskzOsAP-kSpa-iGeu0xSlLpM,2667
 chattolib/_pb/chatto/api/v1/server_state_connect.py,sha256=icUFtOoUTyjJEG_-lzFoqtT-nPYghnUvLK6lFcJyFDc,3944
@@ -93,7 +93,7 @@ chattolib/_pb/chatto/realtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
 chattolib/_pb/chatto/realtime/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
 chattolib/_pb/chatto/realtime/v1/events_pb2.py,sha256=XWwDdn0PTdr-7pySQmtyYQhFyntzi9FDxj1Uh9tXpdc,14517
 chattolib/_pb/chatto/realtime/v1/realtime_pb2.py,sha256=tFQapRdKrkuu26zhI9Z5m1dRyIxft0GRhlPyMGYSFBY,11308
-chattolib/_protoc_plugin.py,sha256=zp_ZFOrzQfYSVq_kUzJzvSFqOUdGDZKIMLkfQAXNWLs,8480
+chattolib/_protoc_plugin.py,sha256=ksfXIJT_Z7UIAMVkeVjaIXa2QEdIaYJz8VVbRYbp_p0,8996
 chattolib/_transport.py,sha256=WwnK3jIsWGoR6mi1YOt8hX72albS6O3ZD4kv5gZWo9Y,7510
 chattolib/bot.py,sha256=wHQzXOynp8Pi7S0lJClsdXcGDk637f3rOcQXtrYYb8I,22883
 chattolib/client.py,sha256=J3WfKrlGiD05awKPWKjXeHitQ71cgo4CJcNjteXcUUc,85417

+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/REQUESTED → vendor/common/chattolib-0.5.0b15.post1.dist-info/REQUESTED


+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/WHEEL → vendor/common/chattolib-0.5.0b15.post1.dist-info/WHEEL


+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/licenses/LICENSE → vendor/common/chattolib-0.5.0b15.post1.dist-info/licenses/LICENSE


+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/licenses/LICENSES/Apache-2.0.txt → vendor/common/chattolib-0.5.0b15.post1.dist-info/licenses/LICENSES/Apache-2.0.txt


+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/licenses/LICENSES/MPL-2.0.txt → vendor/common/chattolib-0.5.0b15.post1.dist-info/licenses/LICENSES/MPL-2.0.txt


+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/top_level.txt → vendor/common/chattolib-0.5.0b15.post1.dist-info/top_level.txt


+ 0 - 0
vendor/common/chattolib-0.5.0b15.dist-info/uv_build.json → vendor/common/chattolib-0.5.0b15.post1.dist-info/uv_build.json


+ 2 - 2
vendor/common/chattolib/_pb/chatto/api/v1/rooms_connect.py

@@ -105,7 +105,7 @@ class RoomServiceClient(ConnectClient):
             headers=headers,
         )
 
-    async def start_d_m(self, request: chatto_api_v1_rooms_pb2.StartDMRequest, *, headers: dict[str, str] | None = None) -> chatto_api_v1_rooms_pb2.StartDMResponse:
+    async def start_dm(self, request: chatto_api_v1_rooms_pb2.StartDMRequest, *, headers: dict[str, str] | None = None) -> chatto_api_v1_rooms_pb2.StartDMResponse:
         return await self.execute_unary(
             request=request,
             method=MethodInfo(
@@ -419,7 +419,7 @@ class RoomServiceClientSync(ConnectClientSync):
             headers=headers,
         )
 
-    def start_d_m(self, request: chatto_api_v1_rooms_pb2.StartDMRequest, *, headers: dict[str, str] | None = None) -> chatto_api_v1_rooms_pb2.StartDMResponse:
+    def start_dm(self, request: chatto_api_v1_rooms_pb2.StartDMRequest, *, headers: dict[str, str] | None = None) -> chatto_api_v1_rooms_pb2.StartDMResponse:
         return self.execute_unary(
             request=request,
             method=MethodInfo(

+ 14 - 3
vendor/common/chattolib/_protoc_plugin.py

@@ -54,11 +54,22 @@ _HEADER = "# Generated by chattolib's protoc plugin (protoc-gen-chattolib). DO N
 
 
 def _method_name(m: Any) -> str:
-    """snake_case the RPC name, matching Python method naming."""
+    """snake_case the RPC name, matching Python method naming.
+
+    Acronym-aware: consecutive capitals (an acronym like ``DM`` in
+    ``StartDM``) do NOT get split apart — ``StartDM`` -> ``start_dm``,
+    not ``start_d_m``. An underscore is inserted before an uppercase run
+    only at a word boundary: after a lowercase/digit, or before the final
+    capital of a run that is followed by a lowercase letter.
+    """
+    name = m.name
     out = []
-    for i, ch in enumerate(m.name):
+    for i, ch in enumerate(name):
         if ch.isupper() and i:
-            out.append("_")
+            prev = name[i - 1]
+            nxt = name[i + 1] if i + 1 < len(name) else ""
+            if not prev.isupper() or nxt.islower():
+                out.append("_")
         out.append(ch.lower())
     return "".join(out)
 

+ 1 - 1
vendor/common/httpx-0.28.1.dist-info/RECORD

@@ -1,4 +1,4 @@
-bin/httpx,sha256=zPigzwnYXsLcj5251CDcXu32UO8YrhEJvPN3cE79v08,322
+bin/httpx,sha256=czdBEaAWU7fpcxSlbwKc-zi3s9OSfyCbxd_N7CT56SA,342
 httpx-0.28.1.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
 httpx-0.28.1.dist-info/METADATA,sha256=_rubD48-gNV8gZnDBPNcQzboWB0dGNeYPJJ2a4J5OyU,7052
 httpx-0.28.1.dist-info/RECORD,,

+ 1 - 1
vendor/common/idna-3.20.dist-info/RECORD

@@ -1,4 +1,4 @@
-bin/idna,sha256=W8SrhFisvAOxGFDsU7YI5UcQUY_uGJNwasa-UZG9WbM,325
+bin/idna,sha256=ylmFz6zvi9t3jzll-M6E9YGE9BXknOO6Ez80zgBZWc4,345
 idna-3.20.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
 idna-3.20.dist-info/METADATA,sha256=29jBTB5MoeDJgkptvHy794iE8461LZEUjNMCX2ceS4U,7207
 idna-3.20.dist-info/RECORD,,

+ 1 - 1
vendor/platform/linux-aarch64/bin/websockets

@@ -1,4 +1,4 @@
-#!/tmp/opencode/plugin-tools-review/.venv/bin/python3
+#!/home/paul/.paseo/worktrees/02u7s3t4/clingy-porcupine/.venv/bin/python3
 # -*- coding: utf-8 -*-
 import sys
 from websockets.cli import main

+ 1 - 1
vendor/platform/linux-aarch64/websockets-17.2.dist-info/RECORD

@@ -1,4 +1,4 @@
-bin/websockets,sha256=6lZ8JjO5SEmNpLr66BLIJlF6UgHBn3ZSc07QAZneCA0,331
+bin/websockets,sha256=AGGFJV_GG4da2SbZbypam-CD5Geds29dhek1uf2VwA0,351
 websockets-17.2.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
 websockets-17.2.dist-info/METADATA,sha256=DV8SedCV57qE7yFhSvCCLcUAzLLlG3w6Ge2nFZstreQ,6336
 websockets-17.2.dist-info/RECORD,,

+ 1 - 1
vendor/platform/linux-x86_64/bin/websockets

@@ -1,4 +1,4 @@
-#!/tmp/opencode/plugin-tools-review/.venv/bin/python3
+#!/home/paul/.paseo/worktrees/02u7s3t4/clingy-porcupine/.venv/bin/python3
 # -*- coding: utf-8 -*-
 import sys
 from websockets.cli import main

+ 1 - 1
vendor/platform/linux-x86_64/websockets-17.2.dist-info/RECORD

@@ -1,4 +1,4 @@
-bin/websockets,sha256=6lZ8JjO5SEmNpLr66BLIJlF6UgHBn3ZSc07QAZneCA0,331
+bin/websockets,sha256=AGGFJV_GG4da2SbZbypam-CD5Geds29dhek1uf2VwA0,351
 websockets-17.2.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
 websockets-17.2.dist-info/METADATA,sha256=DV8SedCV57qE7yFhSvCCLcUAzLLlG3w6Ge2nFZstreQ,6336
 websockets-17.2.dist-info/RECORD,,

+ 1 - 1
vendor/platform/macos-arm64/bin/websockets

@@ -1,4 +1,4 @@
-#!/tmp/opencode/plugin-tools-review/.venv/bin/python3
+#!/home/paul/.paseo/worktrees/02u7s3t4/clingy-porcupine/.venv/bin/python3
 # -*- coding: utf-8 -*-
 import sys
 from websockets.cli import main

+ 1 - 1
vendor/platform/macos-arm64/websockets-17.2.dist-info/RECORD

@@ -1,4 +1,4 @@
-bin/websockets,sha256=6lZ8JjO5SEmNpLr66BLIJlF6UgHBn3ZSc07QAZneCA0,331
+bin/websockets,sha256=AGGFJV_GG4da2SbZbypam-CD5Geds29dhek1uf2VwA0,351
 websockets-17.2.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
 websockets-17.2.dist-info/METADATA,sha256=DV8SedCV57qE7yFhSvCCLcUAzLLlG3w6Ge2nFZstreQ,6336
 websockets-17.2.dist-info/RECORD,,