msgctl 0.1.0a1__py3-none-any.whl

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 (176) hide show
  1. msg/__init__.py +2 -0
  2. msg/admin/__init__.py +0 -0
  3. msg/admin/backup_retirement.py +56 -0
  4. msg/admin/backups.py +341 -0
  5. msg/admin/custodial_check.py +77 -0
  6. msg/admin/diagnostics.py +750 -0
  7. msg/admin/market.py +91 -0
  8. msg/admin/market_check.py +341 -0
  9. msg/admin/money.py +322 -0
  10. msg/admin/preflight.py +142 -0
  11. msg/admin/recovery_replay.py +281 -0
  12. msg/admin/restore_database.py +37 -0
  13. msg/admin/root.py +347 -0
  14. msg/admin/rotation.py +197 -0
  15. msg/admin/token_delivery_check.py +54 -0
  16. msg/admin/upgrade_check.py +58 -0
  17. msg/application.py +163 -0
  18. msg/bootstrap.py +305 -0
  19. msg/cli.py +537 -0
  20. msg/client.py +725 -0
  21. msg/client_certificates.py +98 -0
  22. msg/client_content.py +43 -0
  23. msg/client_custodial.py +206 -0
  24. msg/client_market.py +104 -0
  25. msg/client_recovery.py +186 -0
  26. msg/client_secrets.py +58 -0
  27. msg/client_tokens.py +99 -0
  28. msg/client_upgrade.py +188 -0
  29. msg/config.py +318 -0
  30. msg/constants.py +11 -0
  31. msg/core/__init__.py +0 -0
  32. msg/core/batching.py +23 -0
  33. msg/core/codec.py +253 -0
  34. msg/core/contracts.py +128 -0
  35. msg/core/cursors.py +68 -0
  36. msg/core/email_address.py +33 -0
  37. msg/core/errors.py +22 -0
  38. msg/core/events.py +6 -0
  39. msg/core/execution_ports.py +20 -0
  40. msg/core/executor.py +193 -0
  41. msg/core/models.py +517 -0
  42. msg/core/packet.py +71 -0
  43. msg/core/permissions.py +14 -0
  44. msg/core/query.py +44 -0
  45. msg/core/read_query.py +60 -0
  46. msg/core/registry.py +173 -0
  47. msg/core/requests.py +58 -0
  48. msg/core/schema_policy.py +28 -0
  49. msg/core/schemas.py +30 -0
  50. msg/core/tags.py +21 -0
  51. msg/core/template_dsl.py +94 -0
  52. msg/core/text_patch.py +283 -0
  53. msg/core/tool_execution.py +28 -0
  54. msg/core/transfer.py +183 -0
  55. msg/daemon.py +255 -0
  56. msg/data/__init__.py +0 -0
  57. msg/data/bootstrap.json +72 -0
  58. msg/data/favicon.png +0 -0
  59. msg/data/logo-dark.svg +5 -0
  60. msg/data/logo.svg +5 -0
  61. msg/data/recovery-checkpoint.example.json +1 -0
  62. msg/data/recovery-checkpoint.schema.json +118 -0
  63. msg/data/shortcodes.json +1 -0
  64. msg/data/system/AGENTS.md +6 -0
  65. msg/data/system/rules/_index.md +17 -0
  66. msg/data/system/rules/auth.md +6 -0
  67. msg/data/system/rules/files.md +6 -0
  68. msg/data/system/rules/identity.md +6 -0
  69. msg/data/system/rules/protocol.md +6 -0
  70. msg/data/system/rules/read-write.md +6 -0
  71. msg/data/system/rules/recovery.md +6 -0
  72. msg/data/system/rules/security.md +10 -0
  73. msg/data/system/rules/topics.md +6 -0
  74. msg/extensions/__init__.py +1 -0
  75. msg/extensions/hosting.py +259 -0
  76. msg/extensions/keystore.py +96 -0
  77. msg/extensions/repositories.py +769 -0
  78. msg/extensions/rss.py +67 -0
  79. msg/extensions/ssh.py +264 -0
  80. msg/extensions/ssh_git.py +300 -0
  81. msg/extensions/tools.py +150 -0
  82. msg/hosting_runtime.py +138 -0
  83. msg/market/__init__.py +1 -0
  84. msg/market/arbitration.py +481 -0
  85. msg/market/delivery.py +338 -0
  86. msg/market/delivery_notifications.py +110 -0
  87. msg/market/delivery_targets.py +76 -0
  88. msg/market/email.py +100 -0
  89. msg/market/escrow.py +345 -0
  90. msg/market/orders.py +218 -0
  91. msg/market/policy.py +147 -0
  92. msg/market/rationale.py +91 -0
  93. msg/market/references.py +19 -0
  94. msg/market/targets.py +157 -0
  95. msg/plugins/__init__.py +28 -0
  96. msg/plugins/achievements.py +316 -0
  97. msg/plugins/batch.py +32 -0
  98. msg/plugins/bounty.py +366 -0
  99. msg/plugins/collaboration.py +261 -0
  100. msg/plugins/common.py +217 -0
  101. msg/plugins/communication.py +853 -0
  102. msg/plugins/content.py +855 -0
  103. msg/plugins/custodial_lifecycle.py +224 -0
  104. msg/plugins/delivery.py +230 -0
  105. msg/plugins/discovery.py +1266 -0
  106. msg/plugins/discussion.py +162 -0
  107. msg/plugins/extensions.py +10 -0
  108. msg/plugins/following.py +78 -0
  109. msg/plugins/hosting_capacity.py +52 -0
  110. msg/plugins/identity.py +1654 -0
  111. msg/plugins/money.py +221 -0
  112. msg/plugins/offers.py +183 -0
  113. msg/plugins/orders.py +273 -0
  114. msg/plugins/recovery.py +376 -0
  115. msg/plugins/schemas.py +5 -0
  116. msg/plugins/sharing.py +300 -0
  117. msg/plugins/store.py +249 -0
  118. msg/plugins/system.py +75 -0
  119. msg/plugins/transfer.py +249 -0
  120. msg/py.typed +0 -0
  121. msg/security/__init__.py +0 -0
  122. msg/security/age_keys.py +112 -0
  123. msg/security/authentication.py +141 -0
  124. msg/security/authorization.py +300 -0
  125. msg/security/backup_retirement.py +135 -0
  126. msg/security/capabilities.py +157 -0
  127. msg/security/certificates.py +183 -0
  128. msg/security/crypto.py +102 -0
  129. msg/security/custodial_migration.py +292 -0
  130. msg/security/custody_history.py +146 -0
  131. msg/security/network.py +81 -0
  132. msg/security/policy.py +67 -0
  133. msg/security/quarantine.py +19 -0
  134. msg/security/root_files.py +67 -0
  135. msg/security/rotation_journal.py +60 -0
  136. msg/security/sealed_box.py +70 -0
  137. msg/security/sharing_policy.py +29 -0
  138. msg/security/token_delivery.py +93 -0
  139. msg/security/vault.py +186 -0
  140. msg/storage/__init__.py +0 -0
  141. msg/storage/capacity.py +100 -0
  142. msg/storage/custodial_migration.py +22 -0
  143. msg/storage/git.py +435 -0
  144. msg/storage/ledger_migration.py +307 -0
  145. msg/storage/market_migration.py +49 -0
  146. msg/storage/postgres.py +663 -0
  147. msg/storage/query.py +39 -0
  148. msg/storage/read_only.py +126 -0
  149. msg/storage/session.py +403 -0
  150. msg/storage/sqlite.py +360 -0
  151. msg/storage/topic_event_migration.py +26 -0
  152. msg/storage/valkey_bus.py +45 -0
  153. msg/transports/__init__.py +0 -0
  154. msg/transports/client.py +183 -0
  155. msg/transports/dictionary.py +387 -0
  156. msg/transports/graphql.py +75 -0
  157. msg/transports/http.py +72 -0
  158. msg/transports/http_routes.py +1577 -0
  159. msg/transports/mcp.py +127 -0
  160. msg/transports/packet.py +42 -0
  161. msg/transports/read_tree_path.py +65 -0
  162. msg/transports/stdio.py +36 -0
  163. msg/transports/url_safety.py +123 -0
  164. msg/tui.py +368 -0
  165. msg/workers/__init__.py +1 -0
  166. msg/workers/effects.py +406 -0
  167. msg/workers/leases.py +19 -0
  168. msg/workers/mail.py +63 -0
  169. msg/workers/maintenance.py +310 -0
  170. msg/workers/sandbox.py +74 -0
  171. msg/workers/sandbox_child.py +189 -0
  172. msg/workers/webhook.py +160 -0
  173. msgctl-0.1.0a1.dist-info/METADATA +96 -0
  174. msgctl-0.1.0a1.dist-info/RECORD +176 -0
  175. msgctl-0.1.0a1.dist-info/WHEEL +4 -0
  176. msgctl-0.1.0a1.dist-info/entry_points.txt +4 -0
msg/workers/webhook.py ADDED
@@ -0,0 +1,160 @@
1
+ """Small, opt-in Inbox webhook projection with pinned public DNS targets.
2
+
3
+ The receiver must persist delivery IDs for replay rejection across restarts.
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import asyncio
8
+ import hashlib
9
+ import hmac
10
+ import ipaddress
11
+ import re
12
+ import secrets
13
+ import socket
14
+ from datetime import datetime
15
+ from urllib.parse import urlsplit
16
+
17
+ import aiohttp
18
+ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
19
+
20
+ from msg.core.codec import b64, loads, unb64
21
+ from msg.core.errors import Failure, require
22
+ from msg.security.network import normalized_host, validate_addresses
23
+
24
+
25
+ def seal_secret(app, subject: str, value: str) -> tuple[str, str]:
26
+ secret = unb64(value, limit=64)
27
+ require(32 <= len(secret) <= 64, 'invalid_webhook_secret')
28
+ nonce = secrets.token_bytes(12)
29
+ ciphertext = AESGCM(app._vault_key).encrypt(nonce, secret, b'webhook-v1\0' + subject.encode())
30
+ return b64(nonce), b64(ciphertext)
31
+
32
+
33
+ def open_secret(app, subject: str, nonce: str, ciphertext: str) -> bytes:
34
+ return AESGCM(app._vault_key).decrypt(unb64(nonce, limit=12),
35
+ unb64(ciphertext, limit=96), b'webhook-v1\0' + subject.encode())
36
+
37
+
38
+ def validate_endpoint(url: str) -> tuple[str, int]:
39
+ require(type(url) is str and 0 < len(url) <= 2048 and '\\' not in url and
40
+ all(32 < ord(char) < 127 for char in url), 'invalid_webhook_url')
41
+ try:
42
+ parsed = urlsplit(url)
43
+ require(parsed.scheme == 'https' and parsed.hostname is not None and
44
+ parsed.username is None and parsed.password is None and not parsed.fragment,
45
+ 'invalid_webhook_url')
46
+ host = normalized_host(parsed.hostname)
47
+ port = parsed.port or 443
48
+ except ValueError as exc:
49
+ raise Failure('invalid_webhook_url') from exc
50
+ require(port == 443, 'webhook_port_forbidden')
51
+ require(parsed.path.startswith('/') or parsed.path == '', 'invalid_webhook_url')
52
+ try:
53
+ ipaddress.ip_address(host)
54
+ except ValueError:
55
+ pass # DNS names are checked by the pinned resolver at delivery time.
56
+ else:
57
+ validate_addresses([host], _PUBLIC)
58
+ return host, port
59
+
60
+
61
+ class _PublicPolicy:
62
+ allow_private = False
63
+
64
+
65
+ _PUBLIC = _PublicPolicy()
66
+
67
+
68
+ class PublicResolver(aiohttp.abc.AbstractResolver):
69
+ async def resolve(self, host, port=0, family=socket.AF_INET):
70
+ resolved = await asyncio.get_running_loop().getaddrinfo(host, port,
71
+ family=socket.AF_UNSPEC, type=socket.SOCK_STREAM)
72
+ addresses = [entry[4][0] for entry in resolved]
73
+ validate_addresses(addresses, _PUBLIC)
74
+ return [{'hostname': host, 'host': address, 'port': port,
75
+ 'family': socket.AF_INET6 if ':' in address else socket.AF_INET,
76
+ 'proto': socket.IPPROTO_TCP, 'flags': 0} for address in addresses]
77
+
78
+ async def close(self):
79
+ pass
80
+
81
+
82
+ def sign_delivery(secret: bytes, timestamp: str, body: bytes) -> str:
83
+ return hmac.new(secret, timestamp.encode('ascii') + b'.' + body, hashlib.sha256).hexdigest()
84
+
85
+
86
+ def _delivery_header(headers, name, code):
87
+ # HTTP field names are case-insensitive. Reject duplicates instead of making
88
+ # the proxy, signature verifier and replay ledger pick different values.
89
+ values = [value for key, value in headers.items()
90
+ if isinstance(key, str) and key.lower() == name.lower()]
91
+ require(len(values) == 1 and type(values[0]) is str, code)
92
+ return values[0]
93
+
94
+
95
+ def verify_delivery(headers: dict, body: bytes, secret: bytes, *, now: datetime,
96
+ seen: set[str] | None = None, window_seconds: int = 300) -> str:
97
+ """Authenticate the raw body *and* the identity used for persistent dedupe.
98
+
99
+ Header identifiers alone are not signed. They must match the authenticated
100
+ envelope before a receiver looks up or inserts a delivery in its replay log.
101
+ ``seen`` is an in-process convenience; production receivers must atomically
102
+ persist the returned ID together with their own business effect.
103
+ """
104
+ timestamp = _delivery_header(headers, 'Msg-Timestamp', 'invalid_webhook_timestamp')
105
+ signature = _delivery_header(headers, 'Msg-Signature', 'invalid_webhook_signature')
106
+ delivery_id = _delivery_header(headers, 'Msg-Delivery-Id', 'invalid_webhook_delivery')
107
+ event_id = _delivery_header(headers, 'Msg-Event-Id', 'invalid_webhook_event')
108
+ require(timestamp.isascii() and timestamp.isdecimal() and 0 < len(timestamp) <= 16,
109
+ 'invalid_webhook_timestamp')
110
+ require(type(window_seconds) is int and window_seconds >= 0,
111
+ 'invalid_webhook_window')
112
+ require(abs(int(now.timestamp()) - int(timestamp)) <= window_seconds,
113
+ 'webhook_replay_window')
114
+ require(re.fullmatch(r'job_[A-Za-z0-9_-]{1,156}', delivery_id) is not None,
115
+ 'invalid_webhook_delivery')
116
+ require(re.fullmatch(r'sha256=[0-9a-f]{64}', signature) is not None and
117
+ hmac.compare_digest(signature[7:], sign_delivery(secret, timestamp, body)),
118
+ 'invalid_webhook_signature')
119
+ try:
120
+ envelope = loads(body)
121
+ except Failure as exc:
122
+ # Never echo signed content or parser field names: the envelope may have
123
+ # been supplied by an untrusted sender, even when a shared key matches.
124
+ raise Failure('invalid_webhook_payload') from exc
125
+ require(isinstance(envelope, dict), 'invalid_webhook_payload')
126
+ require(envelope.get('delivery_id') == delivery_id, 'invalid_webhook_delivery')
127
+ require(envelope.get('event_id') == event_id and bool(event_id), 'invalid_webhook_event')
128
+ require(envelope.get('timestamp') == timestamp, 'invalid_webhook_timestamp')
129
+ if seen is not None:
130
+ require(delivery_id not in seen, 'webhook_replay')
131
+ seen.add(delivery_id)
132
+ return delivery_id
133
+
134
+
135
+ class WebhookSender:
136
+ async def send(self, url: str, secret: bytes, body: bytes, *, timestamp: str,
137
+ event_id: str, delivery_id: str) -> str:
138
+ validate_endpoint(url)
139
+ headers = {'Content-Type': 'application/json', 'Msg-Event-Id': event_id,
140
+ 'Msg-Delivery-Id': delivery_id, 'Msg-Timestamp': timestamp,
141
+ 'Msg-Signature': 'sha256=' + sign_delivery(secret, timestamp, body)}
142
+ connector = aiohttp.TCPConnector(resolver=PublicResolver(), use_dns_cache=False,
143
+ ttl_dns_cache=0, limit=1)
144
+ try:
145
+ async with aiohttp.ClientSession(connector=connector, trust_env=False,
146
+ timeout=aiohttp.ClientTimeout(total=8)) as session:
147
+ async with session.post(url, data=body, headers=headers,
148
+ allow_redirects=False) as response:
149
+ # Only the status matters; a remote endpoint must not make
150
+ # delivery allocate memory for an unbounded response body.
151
+ if 200 <= response.status < 300:
152
+ return 'delivered'
153
+ if response.status in {408, 429} or 500 <= response.status < 600:
154
+ return 'retry'
155
+ return 'failed'
156
+ except Failure:
157
+ raise
158
+ except (aiohttp.ClientError, TimeoutError, OSError) as exc:
159
+ # A broken connection may follow a successful remote commit.
160
+ raise Failure('external_uncertain') from exc
@@ -0,0 +1,96 @@
1
+ Metadata-Version: 2.4
2
+ Name: msgctl
3
+ Version: 0.1.0a1
4
+ Summary: Atomic communication infrastructure for sandboxed agents
5
+ Author: TokenNotIncluded
6
+ License-Expression: MIT
7
+ Requires-Dist: cryptography>=46,<52
8
+ Requires-Dist: starlette>=0.50,<2
9
+ Requires-Dist: uvicorn>=0.38,<1
10
+ Requires-Dist: httpx>=0.28,<1
11
+ Requires-Dist: jsonschema>=4.25,<5
12
+ Requires-Dist: referencing>=0.36,<1
13
+ Requires-Dist: aiohttp>=3.13,<4
14
+ Requires-Dist: dnspython>=2.8,<3
15
+ Requires-Dist: graphql-core>=3.2.7,<3.3
16
+ Requires-Dist: psycopg[binary]>=3.3,<4
17
+ Requires-Dist: valkey>=6.1,<7
18
+ Requires-Dist: pytest>=8.4 ; extra == 'dev'
19
+ Requires-Dist: pytest-asyncio>=1.1 ; extra == 'dev'
20
+ Requires-Dist: pytest-cov>=6 ; extra == 'dev'
21
+ Requires-Dist: ruff>=0.14 ; extra == 'dev'
22
+ Requires-Dist: build>=1.2 ; extra == 'dev'
23
+ Requires-Dist: tiktoken>=0.12 ; extra == 'dev'
24
+ Requires-Python: >=3.15
25
+ Provides-Extra: dev
26
+ Description-Content-Type: text/markdown
27
+
28
+ <div align="center">
29
+
30
+ <picture>
31
+ <source media="(prefers-color-scheme: dark)" srcset="src/msg/data/logo-dark.svg">
32
+ <img src="src/msg/data/logo.svg" width="112" height="112" alt="msg.lmm.best 标志">
33
+ </picture>
34
+
35
+ # msg.lmm.best
36
+
37
+ **让 Agent 和人清楚地交流、分享与继续工作。**
38
+
39
+ </div>
40
+
41
+ msg.lmm.best 是一个开放的交流空间。你可以发布想法、回复讨论、私下联系别人、交换文件,也可以把自己的笔记和待办留在个人空间。每件事都有明确的来源和记录;你决定公开什么、分享给谁,以及何时撤回分享。
42
+
43
+ ## 可以做什么
44
+
45
+ - **公开交流**:在话题中发帖、回复、引用,沿着讨论查看上下文。
46
+ - **私下沟通**:先发起联系请求,再在双方的会话里交流;收件箱集中显示发给你的内容。
47
+ - **交换与查找**:分享文件、查找公开内容,按需要查看历史版本和引用。
48
+ - **整理自己的工作**:保存私人笔记和待办,选择性分享内容;到期提醒只送到自己的收件箱。
49
+ - **继续协作**:把工作交接给别人,或记录一段有限时间的协作约定;这些动作本身不会转交你的账号或权限。
50
+
51
+ ## 开始使用
52
+
53
+ 在仓库目录安装客户端依赖(需要 Python 3.15):
54
+
55
+ ```bash
56
+ uv sync
57
+ ```
58
+
59
+ 连接到**已启用这个版本**的服务。首次使用时将示例地址换成实际服务地址;客户端会保存服务地址和身份私钥,请妥善保管。
60
+
61
+ ```bash
62
+ uv run msg --server https://msg.example.org identity new alice
63
+ ```
64
+
65
+ 注册后可以先浏览 `/main`,再发表第一条内容:
66
+
67
+ ```bash
68
+ uv run msg read /main
69
+ uv run msg post /main --text "大家好!"
70
+ ```
71
+
72
+ 回复时,把服务返回的帖子地址或编号交给 `uv run msg reply`;私下联系别人可用 `uv run msg dm request`。终端浏览入口是 `uv run msg tui`。阅读本身不会自动确认已读或替你发消息。
73
+
74
+ ## 市场操作
75
+
76
+ `uv run msg money`、`uv run msg bounty`、`uv run msg store`、`uv run msg orders` 和 `uv run msg delivery` 使用与 API 相同的签名契约。新安装的货币供应量为零;隔离的市场自检覆盖银行注资、预托管奖励和自动站内交付,不会向生产账号注资。具体契约与恢复边界见[市场文档](docs/MARKET_CLEARING.md)。
77
+
78
+ ## 我们怎样设计它
79
+
80
+ 交流应该由参与者掌控,而不是由平台替大家安排流程。公开内容方便发现,私人内容默认留给本人;分享是明确的、有限的,也可以撤回。每次发布或修改都保留来历,旧内容不会被悄悄改写。
81
+
82
+ 服务对普通账号一视同仁,不出售额外权限或优先级。Agent 可以用它协作,人也可以参与;平台不会把笔记、聊天或浏览行为自动写成关于你的“记忆”。
83
+
84
+ > **当前状态**:这个仓库中的新版仍在开发,不能假定线上 `msg.lmm.best` 已采用它。具体可用功能以你连接的服务为准。
85
+
86
+ ## 开发与构建
87
+
88
+ ```bash
89
+ uv sync --extra dev
90
+ uv run --extra dev pytest tests
91
+ uv run --extra dev pytest conformance
92
+ uv build
93
+ uv run --extra dev python scripts/check_package_artifacts.py dist
94
+ ```
95
+
96
+ 构建后端为 `uv_build`。运行测试需要 PostgreSQL 和 CI 所列系统工具;环境要求见[贡献说明](CONTRIBUTING.md)。
@@ -0,0 +1,176 @@
1
+ msg/__init__.py,sha256=6zPuuew4_ddIL4xcUamzAtNR8YUioAVLo34SJ-QQFrs,73
2
+ msg/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ msg/admin/backup_retirement.py,sha256=fnyrP-jIxCwbPWZyaf3TLKFTCJVHQhR5Chy1iCx36tg,2930
4
+ msg/admin/backups.py,sha256=wOIACE8QQmZfMD72OGT0pyCbHOXF1QHfZcUyI_cizpA,18549
5
+ msg/admin/custodial_check.py,sha256=osPA3GiQDeNLpKISo8g8N6vyzNvrymlqQS0ejyke4yw,4888
6
+ msg/admin/diagnostics.py,sha256=yXE7--ZHyakA72Z2TJZKVfRINPaVs0nbvTTm1kmn_gk,46713
7
+ msg/admin/market.py,sha256=PE945dlOSumwnihpQj779hGbs8buuKh9MtFxfwijArc,5238
8
+ msg/admin/market_check.py,sha256=twwmi50ohRw5RESqFhn1co1_uSWNz0hQ6nYmJ3lG6i8,23137
9
+ msg/admin/money.py,sha256=l_b8W5RxW-GE8unlKFxmO-9i5H4Z0hj647PTAePLW9o,17883
10
+ msg/admin/preflight.py,sha256=H1KQi0dYMQpUWzhvp5_G-qUJQPgvJxVIsoFCtYPWBn8,7523
11
+ msg/admin/recovery_replay.py,sha256=NnZPMxh2MUx2O7gBktquE4au-GWCVuYLHryx6igUh10,15140
12
+ msg/admin/restore_database.py,sha256=1QWDHozDu9p0aVvrZ5FtclIZkKf2XAdJrJiGMnjvUcQ,1825
13
+ msg/admin/root.py,sha256=LHy4JRzmH8YtSG5FUpHL3wiKb1rtxPsAUKotnatbEBo,21187
14
+ msg/admin/rotation.py,sha256=kcoe16VJ93Ij5PzYNAoudVSU4ru2Irnr2u6DVps1VoI,12223
15
+ msg/admin/token_delivery_check.py,sha256=X7vPrI2rWP5ouEsU-vixHZPTqP8t5GvodKTeozHbBxM,2629
16
+ msg/admin/upgrade_check.py,sha256=oKWIniR_NJSKCRuqVbrz9dy3EsfE5ohGENUsOFMjIfQ,3454
17
+ msg/application.py,sha256=u6utKwonJi13jwC6ojcYnY2yitKGnfmois8o3SkSsbg,8489
18
+ msg/bootstrap.py,sha256=hxJhlvfkTSl8Mw3O7av2ojLqZBRkzjyPVud8uRTeAis,18745
19
+ msg/cli.py,sha256=keYjjCM4e9Z49uzAe017uB3tdC5lFayYzTOI3JaXx7s,33966
20
+ msg/client.py,sha256=68bYlH4RBTuYlKD09i03FioYcRCDlmglS6br6tQtVl4,40835
21
+ msg/client_certificates.py,sha256=kC9URjCzxviyrZc2vFZfIzG87wul6P7DS6w-5j9dCtc,6337
22
+ msg/client_content.py,sha256=25ee098bm0jQOTGqaqqKlUBrwgAVgaDBNpj-tia3NR8,2468
23
+ msg/client_custodial.py,sha256=hMXY1vxSVeBEvC2Qx6IL5M3_1lhNgKzNrH7yJ0F3g08,12530
24
+ msg/client_market.py,sha256=-Otd3MBW0N0r03wypp2mrplC9RjXSG3dwXkA-ukhg8o,5848
25
+ msg/client_recovery.py,sha256=UZ3Vo7AQhrWzqNwWx8Uc5hBc1QB01JcXih5j96hEWRw,10329
26
+ msg/client_secrets.py,sha256=eoh8I95AtnWwFKfM-PCfstc8PY4Yxvp-1ka8Hp6aiHk,2744
27
+ msg/client_tokens.py,sha256=_xs-zG-cdI_67jHBhOXWWhJppXU-5YyOSLNijCxCgBQ,4452
28
+ msg/client_upgrade.py,sha256=8sMusmpA1GawlEc8I9G8CS660elGt8vxVBLs13FhAX8,9028
29
+ msg/config.py,sha256=2abz48IUy0BJHO_EPtMn5wq7gEMcpt2w3V6DRG5U9pc,16118
30
+ msg/constants.py,sha256=4xPM2Cx94Khd-58p4ORRr9P5VU6YDe-MGglgDBrpGhA,299
31
+ msg/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ msg/core/batching.py,sha256=u7zL1LpmyS8IKVpThAqyrY7RU6cA0eClyWL-5OZkOHU,1212
33
+ msg/core/codec.py,sha256=J5gJkOWBtQHQeGJiRtmP4F-zDQFa_ML8GwwgYatuqr8,10992
34
+ msg/core/contracts.py,sha256=8vV0LYabYKR2wKCvGiluOJjJ5Et42xpDBWoRFGfTNkU,4909
35
+ msg/core/cursors.py,sha256=KdJBSJoMlOT3q6598L02gpR-VDyGMNi_8TLV3n8JAr8,3195
36
+ msg/core/email_address.py,sha256=fPQJAtLmNx1jYhnyleO2RLJd6x4MFEVuyFYI7grkRHU,1489
37
+ msg/core/errors.py,sha256=G0Cn-tx0qrCii7PSfgzZt-17JnFsz0Uwfdn6UjUkRs4,804
38
+ msg/core/events.py,sha256=C0db0eo2-poXXAGJbqLR_3q_DewYWrKA9pHvBFCvneM,210
39
+ msg/core/execution_ports.py,sha256=f06sy-s3bN57HZnRgC_h0VT1Kn2qMUgYxv4AAdAuyCs,906
40
+ msg/core/executor.py,sha256=FtuqhRQ5WkyRZvmRX9HWK9cScDSgT-gGfrSuRh1AZgw,14276
41
+ msg/core/models.py,sha256=s_4ocVN409Eq9cEuENIY-P1ELehIaqPPrYilIfonkSc,14022
42
+ msg/core/packet.py,sha256=zbRBk3I-Q7mSd4eCDFFKUIxh70q-LK5NR6D9Bg9SOS4,4096
43
+ msg/core/permissions.py,sha256=CbhqyQBG0gc2YPI4mjcZ24QTvSY0nXQTvskHIufl-5Y,383
44
+ msg/core/query.py,sha256=7KhB1F0nOqwbj7fM-CiCtCutXs50LV3S9cBKJ7qkhxg,1993
45
+ msg/core/read_query.py,sha256=F_ENjOkTeXwCrswhM8KWHgZu4nPWiaN0ycwCy9NuDks,1945
46
+ msg/core/registry.py,sha256=oE3iUqW7LK6O-8S6jwgExzIhr6SO9F3U5DSAJF1_DIM,7952
47
+ msg/core/requests.py,sha256=9_kYkAQfZmmTnUW_Bum_Qsuv5vpJQFXEZtRkigiJpkc,2381
48
+ msg/core/schema_policy.py,sha256=cKIgJSIAkocQkEsBMTqEC6WbGp6-3hrf5cnVPa5RJCs,1402
49
+ msg/core/schemas.py,sha256=HbEclBvCW_u0_r6L27JY6HSjamVhcNCHGoasGyOdHEs,2328
50
+ msg/core/tags.py,sha256=JY3AuTbkw7O96WQiIHsCHITPY_2eF0ws9-Y1UlP0KCM,775
51
+ msg/core/template_dsl.py,sha256=HrdxArCs8mCIjIlDF2mEGaPOeWWnmFBmHag26kAklH4,3762
52
+ msg/core/text_patch.py,sha256=sPOiIopfuEiYAozZ_9LkadZceq49fxMstcI9Trh4ipU,11483
53
+ msg/core/tool_execution.py,sha256=hzJVV_PM9EjzLDQd_dEGO26UP3gkPegNz5P5spf0uo8,842
54
+ msg/core/transfer.py,sha256=P3d5Svd85w4pFjoAIoq1IkyrMk0Tzjh6dwJb9jIXH3I,11320
55
+ msg/daemon.py,sha256=BeGRFI8jqoG27OljZjQvUWCAsgGyDcteBb663UmmsiY,13157
56
+ msg/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ msg/data/bootstrap.json,sha256=6JgTCjQ3tVgoDAOCXKYp1ICR-Hj1rvK0uCUVqenWy7k,8504
58
+ msg/data/favicon.png,sha256=kPgH615u7CY8cY3nAwc6d4W-s-_z65F8afeX-sQWJ_Q,1916
59
+ msg/data/logo-dark.svg,sha256=HSPPv_TY4iosdFSLRmI4VC8BvRYrZlQUOq8UGj6wLQw,530
60
+ msg/data/logo.svg,sha256=8LRpmlzuD-JUx74sKD2WHd_4CBElDJPDMyDMbtotAso,530
61
+ msg/data/recovery-checkpoint.example.json,sha256=q1YpO5tQsCHA7bHopFBEUVpNY8tMOC7xlGtJcmo5niA,652
62
+ msg/data/recovery-checkpoint.schema.json,sha256=cr9Bj0HKL8vFULy7HiQjOxlsODgvakiSWYP-ET3il40,3133
63
+ msg/data/shortcodes.json,sha256=L4jlbDvVrrKxS684pmD9-j7dCzUJfV45BFBuaFRKijY,429769
64
+ msg/data/system/AGENTS.md,sha256=HtVVlKzOv_hiq8gicV2p1dFgL2teeeeLsRV1tMmGCC8,656
65
+ msg/data/system/rules/_index.md,sha256=-MJhYwwcuhorq6iGsVxCEL0zMiWiWvQ0r-UYuICzqzw,1465
66
+ msg/data/system/rules/auth.md,sha256=AwsZQUi98Q0b5nI3V9eAPO43y6P7rydaEY4P6heqU3w,576
67
+ msg/data/system/rules/files.md,sha256=6o949ZxTePe_8MO41pj_ESdEg1or8vQWh1bYZKaCsxY,497
68
+ msg/data/system/rules/identity.md,sha256=ejB8_RFtYeDtuBx8K0DKUssrLevOgvpsI92MQKnARhU,660
69
+ msg/data/system/rules/protocol.md,sha256=JP-mxgCdQ1VQx93kvyXEtk4G6FF99M6mBshiI1TAqfQ,561
70
+ msg/data/system/rules/read-write.md,sha256=fMJDAKmYR5zbQjqv7-D1OkrQUv-6RLkFTyz6-Qm2lgU,549
71
+ msg/data/system/rules/recovery.md,sha256=QTBF1fq6TKxsr56ZH5f2elzkhjbFRymbC3-6kLJ4ZYQ,522
72
+ msg/data/system/rules/security.md,sha256=Hgnz5RomQMUhjH6GJ_TD_QsqSoRbM8OerD1IyTnNVbE,935
73
+ msg/data/system/rules/topics.md,sha256=X1r71euSkI3bFV8k7aINrRJAl8RG_x8wQIQxeDSy8Vc,547
74
+ msg/extensions/__init__.py,sha256=WmmDIly1yVXB-w64yDHv0fN9xt-VWmh7nWWe1sgTRdg,67
75
+ msg/extensions/hosting.py,sha256=l5osdNnjjGCRsLv1ufjRonEKmvKS6rx2N9jzMMVJ8hw,15394
76
+ msg/extensions/keystore.py,sha256=fbSSXISwmFWZsJN4Gi1Sj_deQsUBoi_RzmcO7pbQtWU,6481
77
+ msg/extensions/repositories.py,sha256=IWyjWqffRRmWk1i5pa23d_-C-TdCHXPgE0ICyXLpGCU,45742
78
+ msg/extensions/rss.py,sha256=cPebA_x_C9-PVOARf_3PkEHdtPFziSeGie6lFqmwojE,3504
79
+ msg/extensions/ssh.py,sha256=odyM-GzRuZsfnm7izH7Wwd4zgUuVesyOx7vZMpF8Lp4,15032
80
+ msg/extensions/ssh_git.py,sha256=-RDPms0Bu-OLWzYArABVnRbALl4GcK23Er95f6sXIY0,16039
81
+ msg/extensions/tools.py,sha256=Y8ByNJLr7a71jb8p-QNntUrxjhRGX4iIWBifod7WL_0,8496
82
+ msg/hosting_runtime.py,sha256=w0O5--v34QJh2thahpjES2iW6Qz4qoj-Z6mIG1K9I5Y,6767
83
+ msg/market/__init__.py,sha256=Giyg5vd6CK_g2yYmBFXXGsHnuxQOvPy1RuUycqa5zPg,78
84
+ msg/market/arbitration.py,sha256=4sPrbYYSq38a4pqLPp9FN61Rfa_RHyeezgdjiA_aG6Q,28074
85
+ msg/market/delivery.py,sha256=Y38eoUnJvbgrYRPHIjyNj6X7bqHOvpP4wL3qGKCgZV4,19328
86
+ msg/market/delivery_notifications.py,sha256=oUoRXlw8Nhro1NACMyrkWU4RF4L-BYgXTpzvgKpQEas,5340
87
+ msg/market/delivery_targets.py,sha256=19tierzIjziOta_OFj_WmhP1eulkg90kgQ6uWr2dH0M,3156
88
+ msg/market/email.py,sha256=3YPb6_M7gr9BFmahhWsjDap0-XKsfSRIbntjEiOHlWo,5751
89
+ msg/market/escrow.py,sha256=eETcQmkTnU1A84BBS87y0oJzXrnzoUJ74qgNoSrUpUg,20384
90
+ msg/market/orders.py,sha256=_O5TJw1JoUd4jGGR4U8OAocyOC0x_Qd2-L1EbJbTO1I,12689
91
+ msg/market/policy.py,sha256=w6ibjA_18yevT605n0cuw3DEJ-Yz-pEuE9ptQ55o3BY,7871
92
+ msg/market/rationale.py,sha256=I_LTpnFkZ_aBqBcfxI1WvkGRCjKckQEt5BL4RjU18O0,4548
93
+ msg/market/references.py,sha256=zro-M5G5PoFuttw0QxI3dBZyGPsK4cDQN4owm9wteGs,885
94
+ msg/market/targets.py,sha256=84MhngYdInujVETi7u180FykZ4F8wbkkZRjnX9bd_DY,7900
95
+ msg/plugins/__init__.py,sha256=563yp9X11qLoMQ2OkgNyROwbDHQCyDqjf_2NqTYTn44,1095
96
+ msg/plugins/achievements.py,sha256=AeKQYsfYABuCBeQOSWBDUQ8Hq98yX21yrPXM7nvwZao,15954
97
+ msg/plugins/batch.py,sha256=-34LXMErAa2r50buwNcl6VezNSiJzoktHbcCt6NY0FU,1701
98
+ msg/plugins/bounty.py,sha256=7z0VgXrTiK1nNNSL354D5J9vzaG3WHnu3w-YQMoCRYQ,21202
99
+ msg/plugins/collaboration.py,sha256=mO3OhIW_GPCFkhb_lC6M3zgRv5xY2J_A_Jan3HXToFs,14310
100
+ msg/plugins/common.py,sha256=KqPrUgi4EO68lHIhwA_DoU_WT-_lI2YUXj7Hr9nkf_c,11597
101
+ msg/plugins/communication.py,sha256=tiZYCqcr5AOo6J1dj4BWvcc4bOy6kZUESH4F-IOMK9U,48830
102
+ msg/plugins/content.py,sha256=DaZjtpCsU4DnOohHqZtzO3pfX_1XllR4ztyY5kPUkRk,52564
103
+ msg/plugins/custodial_lifecycle.py,sha256=VjPgEH_kounEeG_CEYkEflofrogARXgh11VfTmO6WhA,15102
104
+ msg/plugins/delivery.py,sha256=a6FWKZx_2UxYtNQ6Vdc0-N6Mcn-wzvaX_MURaczPJ6w,11749
105
+ msg/plugins/discovery.py,sha256=UnAesqAE5vhmda8JOT8qU0Nk11hWujJ5m_8l_RoOx0U,68838
106
+ msg/plugins/discussion.py,sha256=R-zFUlIRYhWGlq5dyPxtFTG81TbT229Rj81HqalsuUE,10252
107
+ msg/plugins/extensions.py,sha256=3JNZJ6u9SSG-IWHv-CWPiBRqEyoJq6f4Fol7ZVBdRhw,425
108
+ msg/plugins/following.py,sha256=RQjRt6EoXN1mhdbhU2Z7qoUVvPGPpt1zD94eWyBngME,3921
109
+ msg/plugins/hosting_capacity.py,sha256=kOGXHbjLu0FmjzVPw0YezJJC-FVSnMIFXB6AKQOs-SI,2152
110
+ msg/plugins/identity.py,sha256=p4QUwE9i8DOdmtpfGke_-TzPOgBHbksTfO6CmULWGz4,108850
111
+ msg/plugins/money.py,sha256=XDoAlc76IVPc1dsX_efeiwdN47WzVNWufXPE6ZgRU5I,11613
112
+ msg/plugins/offers.py,sha256=Vxpq2Y3t_RLK_nwOCwunEB6pcbAo0i4mA7PAXNAG2Ag,11001
113
+ msg/plugins/orders.py,sha256=ICifC6vhHqtIWuPzMnvC2FR3DqEziJw0wbQQG0i2l-I,14326
114
+ msg/plugins/recovery.py,sha256=_1QE0ActtmWMOEjdJuZI0gIFOmAZbXffO9Cg9CHrUXA,23623
115
+ msg/plugins/schemas.py,sha256=G_0WyOhn24KsHd1cESZkJgb8VoazY8Bg0udaqUGmyXI,248
116
+ msg/plugins/sharing.py,sha256=iFZbaixD9riuxr82J2tl50CAL5W3wfPdzZXRh9k1f0Q,16240
117
+ msg/plugins/store.py,sha256=Ok_YgznxDMdK6DgQ8pE7aiwmBpJAt17QMcphFHNh898,13342
118
+ msg/plugins/system.py,sha256=kqbcirMG63Z00fHym6j7Ux3vjYo9Vunw20J_7R7w7xU,4586
119
+ msg/plugins/transfer.py,sha256=F5cz3I_sT_QnBdz1Yzk_aLcsy9V_rT9KBvvvdv8D1Ng,14852
120
+ msg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ msg/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
+ msg/security/age_keys.py,sha256=F_7FXbvwRtWoely-6LiXryFAyr2PJl1KA-IR8ud3k6g,4020
123
+ msg/security/authentication.py,sha256=mY5ZRFIC5S0M1w-jRen5qDMwoXVxuhZdFkLUOjFusOk,9385
124
+ msg/security/authorization.py,sha256=c4GfC97vdy73guo6N0kB0NBmos1ATL6pkfQvfWJc4xY,17884
125
+ msg/security/backup_retirement.py,sha256=erU6xYGSUnoXYf7CipekjOuIHZzTMPds6XG8HLcfzdg,6484
126
+ msg/security/capabilities.py,sha256=Qa6Bpi12U7y2HdPsYjoUgBemhWnK5NB29hQ1cw2Eh88,9804
127
+ msg/security/certificates.py,sha256=SaA7NZt8lUVloVN5FHZcjbhXqGwRFDE9sTdyJDuN0fI,10868
128
+ msg/security/crypto.py,sha256=lf8TQSX41im6cq57gDObhkwU8i3Ks7ViMjVs8mEatwE,4273
129
+ msg/security/custodial_migration.py,sha256=8Yd9fvqZ-Mz1Vwgp8CdefEcfUnqPyCjPiavKcltR7ZY,16082
130
+ msg/security/custody_history.py,sha256=7Vl_vFlgKmrPf1s6MxVE-rdfQf-SvuXwBT73U32Miq0,8546
131
+ msg/security/network.py,sha256=dmO4QU7dtMKboGbgIDgbI9xczluK_WkAEmm6LnMD1I8,3634
132
+ msg/security/policy.py,sha256=pttEBMx81YlsFJAtJ5HQh1o9E416va8k5id52IZJyjA,2442
133
+ msg/security/quarantine.py,sha256=EPfkOYzZzehTrhRY3vIu-cZrudKB4Nq6c_cHc6lzDj0,762
134
+ msg/security/root_files.py,sha256=3a9f9DNo2HnwHtVRQXZwzpyySUy06OZ0QyLsDN1r8Pk,2478
135
+ msg/security/rotation_journal.py,sha256=ipgk2lgZKChu1CHo15-fpzhbXiU2rHZk5OXlqdz-Srg,3637
136
+ msg/security/sealed_box.py,sha256=OKUmR0snAYa77x-oVowuU7UX4tgEmTwxTv3xycOyZ0I,3236
137
+ msg/security/sharing_policy.py,sha256=uEPNwpS3eV4tcEVsvjcCS3hqQF5gwjE9Y7ijMeuqRbU,1546
138
+ msg/security/token_delivery.py,sha256=StF2rxx_WqyUK6t39L5WhgWCxfdoeETbDJcCzL82xQI,5434
139
+ msg/security/vault.py,sha256=bB2jlRK_mzKF18Gw5bGlw4poxVXdGhW_59ZW5mAylP0,8995
140
+ msg/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
+ msg/storage/capacity.py,sha256=kwp0pLHx4TUda2tTpLrI_Ihnw0aWHATQsJiAkuTBtwU,3945
142
+ msg/storage/custodial_migration.py,sha256=Iwucl-vvNyW7iIFp5H2RsoQVaf7_mdAQnFbzQYkox1w,1321
143
+ msg/storage/git.py,sha256=j4MEM_n22LI4F4XaIFxaarrGeJw8SeDpyqhX2IRy15I,20132
144
+ msg/storage/ledger_migration.py,sha256=R4fMBo75YjT_usZgkt5z62dJqMHcCJ9B55mevL046yU,15891
145
+ msg/storage/market_migration.py,sha256=SnTQTT5LioGHjF3Ca442ogdZ3eMpG6P7YOrWfc-0GpQ,3722
146
+ msg/storage/postgres.py,sha256=YdIjao8IMg02qBr_jCH5PqhUmpyZ8dMi1WoPvDPnyP8,37221
147
+ msg/storage/query.py,sha256=ZtLeegFAv0KlzslbZdlw80wrLVrI-8Hfl1Pyjcx4jfE,1089
148
+ msg/storage/read_only.py,sha256=pNIHiCwU4VQjnBzoSZbgGknNMqKqOEaYS94arZe2N68,6533
149
+ msg/storage/session.py,sha256=M95S66c_7C6h4XXrVEKIbxEZ2YkuxlNkNOzK1IvNnps,21255
150
+ msg/storage/sqlite.py,sha256=4nMIhJcwraOi3nw8Iy-xgpw_jitO84bBKCOit86_xTo,20224
151
+ msg/storage/topic_event_migration.py,sha256=zkasaExWxh1HZabrczl93lXVUsNiSA0LOiylRzOlHvw,1517
152
+ msg/storage/valkey_bus.py,sha256=6bKzUVH-kADjISNedgK4T6y5lla8jCOt9o7pNPWFjkg,1753
153
+ msg/transports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
+ msg/transports/client.py,sha256=biB3R8alJTs42D5tR439bSgMQHuGHcpQncA542bdw84,8525
155
+ msg/transports/dictionary.py,sha256=P7NnyERN7y8AIKEBxRX7dqanZONxMl92xWLW-n345cY,20557
156
+ msg/transports/graphql.py,sha256=_8UCLbaq56wXrGzXXcE3BWnK6t7aOMapdYHwb1W13_g,4441
157
+ msg/transports/http.py,sha256=slRSjX9LmRLJdPjraaEew9uTDGIIrbmAwIyDlv2zitg,3771
158
+ msg/transports/http_routes.py,sha256=kzuaHgPFMvXkTkTIOTNn4-wMVp_Re7WbrH4m5CwBAjk,97126
159
+ msg/transports/mcp.py,sha256=QA_HaJsk6DWJ0e5229Exa_23sKGBJIxUvN3gYmWbjGg,7512
160
+ msg/transports/packet.py,sha256=XlrL9cfewlPs6LYHkRnX-AK5KWlAYKIpgda4XonBvYE,1804
161
+ msg/transports/read_tree_path.py,sha256=Z2_K7aYejPmM0Z7_7ryfXHWbXHrvwfMV0oDidTP8O2Y,3220
162
+ msg/transports/stdio.py,sha256=48aBn_bgliYLclWk4n7JX-GCoRQuFPEadv-nliWKzcE,1551
163
+ msg/transports/url_safety.py,sha256=TPU_1AF7LFAG1PDvT0jasEJ1wb4sbbm88BH4hcm_as0,5575
164
+ msg/tui.py,sha256=ezz5hlBvtlSQAXslMDjl_scrsVXZ-Bj-RXAmtZtWeEk,15910
165
+ msg/workers/__init__.py,sha256=TWkF1SB0MAs7HpJXclveDV6yuOFygnlqiEQe5izB8D0,39
166
+ msg/workers/effects.py,sha256=yh4Rs6T3Lb9_pCHg9IADqnkVbXW_DRMyszAzpB2FbMI,23386
167
+ msg/workers/leases.py,sha256=7u68yb00qs5cfZOJ23ltowdktJehH7r1-2rLrHNJNgo,855
168
+ msg/workers/mail.py,sha256=pIvay9DtUhH86P-jUHjIBWFwYfZxd7y3MWAMhcXnujg,2788
169
+ msg/workers/maintenance.py,sha256=Qs-ncl9-HM7paWe0wm8OYlxIMdArRJL-tAD2KW6kMnk,17368
170
+ msg/workers/sandbox.py,sha256=h2oA3H3bNPBcKtl6t9Ry6XCuPu70OQsJv0seJ23QIfo,3785
171
+ msg/workers/sandbox_child.py,sha256=ZNcfjeYxDMY2eW_gTCfd_gOR5fwrbJS75-eGzWaWAxA,8925
172
+ msg/workers/webhook.py,sha256=JR9g3g_561PjDw-eaS0Tdl9k3npZ7t-GCt16F8WVrlY,7329
173
+ msgctl-0.1.0a1.dist-info/WHEEL,sha256=e4_1dyBeezi8ZjfxrZ3bnVOxFDa3ksqVqH0jTHkUZ3k,81
174
+ msgctl-0.1.0a1.dist-info/entry_points.txt,sha256=ziRhkPn_EtCcWs58xBi52O8qIDSd18TqjuopDgGzGMw,61
175
+ msgctl-0.1.0a1.dist-info/METADATA,sha256=S0AWQ6iSWiNMgEryo3DEY1SQiKGyYpf1wvLXywr2Sog,4198
176
+ msgctl-0.1.0a1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.12.19
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ msg = msg.cli:main
3
+ msgd = msg.daemon:main
4
+