trytilde 3.0.1__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 (135) hide show
  1. tilde/__init__.py +114 -0
  2. tilde/__main__.py +9 -0
  3. tilde/_cancel.py +50 -0
  4. tilde/_inference.py +106 -0
  5. tilde/_invocation.py +26 -0
  6. tilde/_otlp.py +35 -0
  7. tilde/_tools.py +182 -0
  8. tilde/_transport.py +28 -0
  9. tilde/agent_event_ingress/__init__.py +0 -0
  10. tilde/agent_event_ingress/v1/__init__.py +0 -0
  11. tilde/agent_event_ingress/v1/sidecars_connect.py +748 -0
  12. tilde/agent_event_ingress/v1/sidecars_pb2.py +128 -0
  13. tilde/agent_event_ingress/v1/sidecars_pb2.pyi +471 -0
  14. tilde/agent_host/__init__.py +0 -0
  15. tilde/agent_host/v1/__init__.py +0 -0
  16. tilde/agent_host/v1/agent_pb2.py +43 -0
  17. tilde/agent_host/v1/agent_pb2.pyi +56 -0
  18. tilde/channels.py +212 -0
  19. tilde/chat_proxy.py +295 -0
  20. tilde/clients.py +127 -0
  21. tilde/context.py +1006 -0
  22. tilde/deploy.py +420 -0
  23. tilde/discovery.py +127 -0
  24. tilde/fastapi.py +69 -0
  25. tilde/host.py +481 -0
  26. tilde/logging.py +213 -0
  27. tilde/management/__init__.py +0 -0
  28. tilde/management/v1/__init__.py +0 -0
  29. tilde/management/v1/access_connect.py +465 -0
  30. tilde/management/v1/access_pb2.py +57 -0
  31. tilde/management/v1/access_pb2.pyi +102 -0
  32. tilde/management/v1/agents_connect.py +668 -0
  33. tilde/management/v1/agents_pb2.py +73 -0
  34. tilde/management/v1/agents_pb2.pyi +132 -0
  35. tilde/management/v1/connections_connect.py +806 -0
  36. tilde/management/v1/connections_pb2.py +93 -0
  37. tilde/management/v1/connections_pb2.pyi +186 -0
  38. tilde/management/v1/deployments_connect.py +919 -0
  39. tilde/management/v1/deployments_pb2.py +109 -0
  40. tilde/management/v1/deployments_pb2.pyi +306 -0
  41. tilde/management/v1/identities_connect.py +660 -0
  42. tilde/management/v1/identities_pb2.py +74 -0
  43. tilde/management/v1/identities_pb2.pyi +167 -0
  44. tilde/management/v1/inference_connect.py +424 -0
  45. tilde/management/v1/inference_pb2.py +69 -0
  46. tilde/management/v1/inference_pb2.pyi +158 -0
  47. tilde/management/v1/logs_connect.py +278 -0
  48. tilde/management/v1/logs_pb2.py +56 -0
  49. tilde/management/v1/logs_pb2.pyi +123 -0
  50. tilde/management/v1/prompts_connect.py +290 -0
  51. tilde/management/v1/prompts_pb2.py +49 -0
  52. tilde/management/v1/prompts_pb2.pyi +36 -0
  53. tilde/management/v1/skills_connect.py +1815 -0
  54. tilde/management/v1/skills_pb2.py +147 -0
  55. tilde/management/v1/skills_pb2.pyi +324 -0
  56. tilde/management/v1/tilde_chat_connect.py +290 -0
  57. tilde/management/v1/tilde_chat_pb2.py +48 -0
  58. tilde/management/v1/tilde_chat_pb2.pyi +29 -0
  59. tilde/management/v1/tools_connect.py +1416 -0
  60. tilde/management/v1/tools_pb2.py +135 -0
  61. tilde/management/v1/tools_pb2.pyi +341 -0
  62. tilde/management/v1/tracing_connect.py +513 -0
  63. tilde/management/v1/tracing_pb2.py +78 -0
  64. tilde/management/v1/tracing_pb2.pyi +231 -0
  65. tilde/messages.py +129 -0
  66. tilde/prompts.py +130 -0
  67. tilde/provider/__init__.py +0 -0
  68. tilde/provider/tilde/__init__.py +0 -0
  69. tilde/provider/tilde/v1/__init__.py +0 -0
  70. tilde/provider/tilde/v1/chat_connect.py +2090 -0
  71. tilde/provider/tilde/v1/chat_pb2.py +165 -0
  72. tilde/provider/tilde/v1/chat_pb2.pyi +478 -0
  73. tilde/provider/v1/__init__.py +0 -0
  74. tilde/provider/v1/connections_connect.py +205 -0
  75. tilde/provider/v1/connections_pb2.py +49 -0
  76. tilde/provider/v1/connections_pb2.pyi +58 -0
  77. tilde/run/__init__.py +0 -0
  78. tilde/run/v1/__init__.py +0 -0
  79. tilde/run/v1/run_connect.py +367 -0
  80. tilde/run/v1/run_pb2.py +57 -0
  81. tilde/run/v1/run_pb2.pyi +80 -0
  82. tilde/runtime/__init__.py +0 -0
  83. tilde/runtime/v1/__init__.py +0 -0
  84. tilde/runtime/v1/agents_connect.py +473 -0
  85. tilde/runtime/v1/agents_pb2.py +61 -0
  86. tilde/runtime/v1/agents_pb2.pyi +86 -0
  87. tilde/runtime/v1/cache_pb2.py +38 -0
  88. tilde/runtime/v1/cache_pb2.pyi +13 -0
  89. tilde/runtime/v1/chat_connect.py +1460 -0
  90. tilde/runtime/v1/chat_pb2.py +130 -0
  91. tilde/runtime/v1/chat_pb2.pyi +275 -0
  92. tilde/runtime/v1/controls_connect.py +282 -0
  93. tilde/runtime/v1/controls_pb2.py +47 -0
  94. tilde/runtime/v1/controls_pb2.pyi +49 -0
  95. tilde/runtime/v1/prompts_connect.py +225 -0
  96. tilde/runtime/v1/prompts_pb2.py +43 -0
  97. tilde/runtime/v1/prompts_pb2.pyi +20 -0
  98. tilde/runtime/v1/skills_connect.py +655 -0
  99. tilde/runtime/v1/skills_pb2.py +77 -0
  100. tilde/runtime/v1/skills_pb2.pyi +154 -0
  101. tilde/setup/__init__.py +0 -0
  102. tilde/setup/v1/__init__.py +0 -0
  103. tilde/setup/v1/connections_connect.py +595 -0
  104. tilde/setup/v1/connections_pb2.py +101 -0
  105. tilde/setup/v1/connections_pb2.pyi +232 -0
  106. tilde/setup/v1/identity_verification_connect.py +282 -0
  107. tilde/setup/v1/identity_verification_pb2.py +49 -0
  108. tilde/setup/v1/identity_verification_pb2.pyi +35 -0
  109. tilde/skills.py +383 -0
  110. tilde/tool_host/v1/tool_host_connect.py +314 -0
  111. tilde/tool_host/v1/tool_host_pb2.py +66 -0
  112. tilde/tool_host/v1/tool_host_pb2.pyi +115 -0
  113. tilde/tool_hosts.py +515 -0
  114. tilde/tracing.py +147 -0
  115. tilde/types/__init__.py +0 -0
  116. tilde/types/v1/__init__.py +0 -0
  117. tilde/types/v1/access_pb2.py +47 -0
  118. tilde/types/v1/access_pb2.pyi +123 -0
  119. tilde/types/v1/agent_pb2.py +53 -0
  120. tilde/types/v1/agent_pb2.pyi +151 -0
  121. tilde/types/v1/chat_pb2.py +81 -0
  122. tilde/types/v1/chat_pb2.pyi +316 -0
  123. tilde/types/v1/connections_pb2.py +79 -0
  124. tilde/types/v1/connections_pb2.pyi +268 -0
  125. tilde/types/v1/deployment_pb2.py +51 -0
  126. tilde/types/v1/deployment_pb2.pyi +129 -0
  127. tilde/types/v1/prompt_pb2.py +45 -0
  128. tilde/types/v1/prompt_pb2.pyi +96 -0
  129. tilde/types/v1/runtime_event_pb2.py +62 -0
  130. tilde/types/v1/runtime_event_pb2.pyi +243 -0
  131. tilde/types/v1/skill_pb2.py +49 -0
  132. tilde/types/v1/skill_pb2.pyi +150 -0
  133. trytilde-3.0.1.dist-info/METADATA +325 -0
  134. trytilde-3.0.1.dist-info/RECORD +135 -0
  135. trytilde-3.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,748 @@
1
+ # Generated from tilde/agent_event_ingress/v1/sidecars.proto. DO NOT EDIT.
2
+ # Generated by protoc-gen-connectrpc-py v0.12.1 with parameter "protobuf=google".
3
+ # ruff: noqa: PGH004
4
+ # ruff: noqa
5
+ # fmt: off
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Protocol, TYPE_CHECKING
10
+
11
+ from connectrpc.client import ConnectClient, ConnectClientSync
12
+ from connectrpc.code import Code
13
+ from connectrpc.compat import google_protobuf_binary_codec, google_protobuf_codecs
14
+ from connectrpc.compression.gzip import GzipCompression
15
+ from connectrpc.errors import ConnectError
16
+ from connectrpc.method import IdempotencyLevel, MethodInfo
17
+ from connectrpc.protocol import ProtocolType
18
+ from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, DEFAULT_READ_MAX_BYTES, Endpoint, EndpointSync
19
+ from pyqwest import Client, SyncClient
20
+
21
+ from .sidecars_pb2 import DownloadAttachmentRequest, DownloadAttachmentResponse, ForwardRequest, ForwardResponse, HydrateRequest, HydrateResponse, PublishRequest, PublishResponse, RelayRequest, RelayResponse, ResolveParticipantRequest, ResolveParticipantResponse, UploadAttachmentRequest, UploadAttachmentResponse, WatchRequest, WatchResponse
22
+
23
+ if TYPE_CHECKING:
24
+ from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
25
+
26
+ from connectrpc.codec import Codec
27
+ from connectrpc.compression import Compression
28
+ from connectrpc.interceptor import Interceptor, InterceptorSync
29
+ from connectrpc.request import Headers, RequestContext
30
+
31
+
32
+
33
+ _DEFAULT_CODECS = google_protobuf_codecs()
34
+ _PROTO_BINARY_CODEC = google_protobuf_binary_codec()
35
+ _GZIP_COMPRESSION = GzipCompression()
36
+
37
+ class SidecarService(Protocol):
38
+ """
39
+ Sidecars dial the gateway; every call authenticates one agent deployment token.
40
+ The gateway never opens a connection to a sidecar. Postgres is the record; a
41
+ replica is a cache plus a write-behind queue plus the executor for the threads
42
+ it holds a lease on.
43
+ """
44
+ def watch(self, request: WatchRequest, ctx: RequestContext[WatchRequest, WatchResponse], /) -> AsyncIterator[WatchResponse]:
45
+ """
46
+ Held open for the life of a replica: a snapshot first, then configuration,
47
+ lease changes and directives as they change.
48
+ """
49
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
50
+
51
+ async def publish(self, request: PublishRequest, ctx: RequestContext[PublishRequest, PublishResponse], /) -> PublishResponse:
52
+ """
53
+ Heartbeats, typed events, directive results, lease releases and telemetry, in order.
54
+ """
55
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
56
+
57
+ async def hydrate(self, request: HydrateRequest, ctx: RequestContext[HydrateRequest, HydrateResponse], /) -> HydrateResponse:
58
+ """
59
+ Conversation state from the projection, taking the thread lease in the same call when asked.
60
+ """
61
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
62
+
63
+ async def forward(self, request: ForwardRequest, ctx: RequestContext[ForwardRequest, ForwardResponse], /) -> ForwardResponse:
64
+ """
65
+ Run one ingress call on a live replica and relay its answer.
66
+ """
67
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
68
+
69
+ async def upload_attachment(self, request: UploadAttachmentRequest, ctx: RequestContext[UploadAttachmentRequest, UploadAttachmentResponse], /) -> UploadAttachmentResponse:
70
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
71
+
72
+ async def download_attachment(self, request: DownloadAttachmentRequest, ctx: RequestContext[DownloadAttachmentRequest, DownloadAttachmentResponse], /) -> DownloadAttachmentResponse:
73
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
74
+
75
+ async def resolve_participant(self, request: ResolveParticipantRequest, ctx: RequestContext[ResolveParticipantRequest, ResolveParticipantResponse], /) -> ResolveParticipantResponse:
76
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
77
+
78
+ async def relay(self, request: RelayRequest, ctx: RequestContext[RelayRequest, RelayResponse], /) -> RelayResponse:
79
+ """
80
+ Registry RPCs from the agent process, re-verified at the gateway.
81
+ """
82
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
83
+
84
+
85
+ class SidecarServiceASGIApplication(ConnectASGIApplication[SidecarService]):
86
+ def __init__(
87
+ self,
88
+ service: SidecarService | AsyncGenerator[SidecarService],
89
+ *,
90
+ interceptors: Iterable[Interceptor] = (),
91
+ read_max_bytes: int | None = DEFAULT_READ_MAX_BYTES,
92
+ compressions: Iterable[Compression] | None = None,
93
+ codecs: Iterable[Codec] | None = _DEFAULT_CODECS,
94
+ ) -> None:
95
+ super().__init__(
96
+ service=service,
97
+ endpoints=lambda svc: {
98
+ "/tilde.agent_event_ingress.v1.SidecarService/Watch": Endpoint.server_stream(
99
+ method=MethodInfo(
100
+ name="Watch",
101
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
102
+ input=WatchRequest,
103
+ output=WatchResponse,
104
+ idempotency_level=IdempotencyLevel.UNKNOWN,
105
+ ),
106
+ function=svc.watch,
107
+ ),
108
+ "/tilde.agent_event_ingress.v1.SidecarService/Publish": Endpoint.unary(
109
+ method=MethodInfo(
110
+ name="Publish",
111
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
112
+ input=PublishRequest,
113
+ output=PublishResponse,
114
+ idempotency_level=IdempotencyLevel.UNKNOWN,
115
+ ),
116
+ function=svc.publish,
117
+ ),
118
+ "/tilde.agent_event_ingress.v1.SidecarService/Hydrate": Endpoint.unary(
119
+ method=MethodInfo(
120
+ name="Hydrate",
121
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
122
+ input=HydrateRequest,
123
+ output=HydrateResponse,
124
+ idempotency_level=IdempotencyLevel.UNKNOWN,
125
+ ),
126
+ function=svc.hydrate,
127
+ ),
128
+ "/tilde.agent_event_ingress.v1.SidecarService/Forward": Endpoint.unary(
129
+ method=MethodInfo(
130
+ name="Forward",
131
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
132
+ input=ForwardRequest,
133
+ output=ForwardResponse,
134
+ idempotency_level=IdempotencyLevel.UNKNOWN,
135
+ ),
136
+ function=svc.forward,
137
+ ),
138
+ "/tilde.agent_event_ingress.v1.SidecarService/UploadAttachment": Endpoint.unary(
139
+ method=MethodInfo(
140
+ name="UploadAttachment",
141
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
142
+ input=UploadAttachmentRequest,
143
+ output=UploadAttachmentResponse,
144
+ idempotency_level=IdempotencyLevel.UNKNOWN,
145
+ ),
146
+ function=svc.upload_attachment,
147
+ ),
148
+ "/tilde.agent_event_ingress.v1.SidecarService/DownloadAttachment": Endpoint.unary(
149
+ method=MethodInfo(
150
+ name="DownloadAttachment",
151
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
152
+ input=DownloadAttachmentRequest,
153
+ output=DownloadAttachmentResponse,
154
+ idempotency_level=IdempotencyLevel.UNKNOWN,
155
+ ),
156
+ function=svc.download_attachment,
157
+ ),
158
+ "/tilde.agent_event_ingress.v1.SidecarService/ResolveParticipant": Endpoint.unary(
159
+ method=MethodInfo(
160
+ name="ResolveParticipant",
161
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
162
+ input=ResolveParticipantRequest,
163
+ output=ResolveParticipantResponse,
164
+ idempotency_level=IdempotencyLevel.UNKNOWN,
165
+ ),
166
+ function=svc.resolve_participant,
167
+ ),
168
+ "/tilde.agent_event_ingress.v1.SidecarService/Relay": Endpoint.unary(
169
+ method=MethodInfo(
170
+ name="Relay",
171
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
172
+ input=RelayRequest,
173
+ output=RelayResponse,
174
+ idempotency_level=IdempotencyLevel.UNKNOWN,
175
+ ),
176
+ function=svc.relay,
177
+ ),
178
+ },
179
+ interceptors=interceptors,
180
+ read_max_bytes=read_max_bytes,
181
+ compressions=compressions,
182
+ codecs=codecs,
183
+ )
184
+
185
+ @property
186
+ def path(self) -> str:
187
+ """Returns the URL path to mount the application to when serving multiple applications."""
188
+ return "/tilde.agent_event_ingress.v1.SidecarService"
189
+
190
+
191
+ class SidecarServiceClient(ConnectClient):
192
+ """
193
+ Sidecars dial the gateway; every call authenticates one agent deployment token.
194
+ The gateway never opens a connection to a sidecar. Postgres is the record; a
195
+ replica is a cache plus a write-behind queue plus the executor for the threads
196
+ it holds a lease on.
197
+ """
198
+ def __init__(
199
+ self,
200
+ address: str,
201
+ *,
202
+ codec: Codec | None = _PROTO_BINARY_CODEC,
203
+ protocol: ProtocolType = ProtocolType.CONNECT,
204
+ accept_compression: Iterable[Compression] | None = None,
205
+ send_compression: Compression | None = _GZIP_COMPRESSION,
206
+ timeout_ms: int | None = None,
207
+ read_max_bytes: int | None = None,
208
+ interceptors: Iterable[Interceptor] = (),
209
+ http_client: Client | None = None,
210
+ ) -> None:
211
+ super().__init__(
212
+ address=address,
213
+ codec=codec,
214
+ protocol=protocol,
215
+ accept_compression=accept_compression,
216
+ send_compression=send_compression,
217
+ timeout_ms=timeout_ms,
218
+ read_max_bytes=read_max_bytes,
219
+ interceptors=interceptors,
220
+ http_client=http_client,
221
+ )
222
+ def watch(
223
+ self,
224
+ request: WatchRequest,
225
+ *,
226
+ headers: Headers | Mapping[str, str] | None = None,
227
+ timeout_ms: int | None = None,
228
+ ) -> AsyncIterator[WatchResponse]:
229
+ """
230
+ Held open for the life of a replica: a snapshot first, then configuration,
231
+ lease changes and directives as they change.
232
+ """
233
+ return self.execute_server_stream(
234
+ request=request,
235
+ method=MethodInfo(
236
+ name="Watch",
237
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
238
+ input=WatchRequest,
239
+ output=WatchResponse,
240
+ idempotency_level=IdempotencyLevel.UNKNOWN,
241
+ ),
242
+ headers=headers,
243
+ timeout_ms=timeout_ms,
244
+ )
245
+
246
+ async def publish(
247
+ self,
248
+ request: PublishRequest,
249
+ *,
250
+ headers: Headers | Mapping[str, str] | None = None,
251
+ timeout_ms: int | None = None,
252
+ ) -> PublishResponse:
253
+ """
254
+ Heartbeats, typed events, directive results, lease releases and telemetry, in order.
255
+ """
256
+ return await self.execute_unary(
257
+ request=request,
258
+ method=MethodInfo(
259
+ name="Publish",
260
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
261
+ input=PublishRequest,
262
+ output=PublishResponse,
263
+ idempotency_level=IdempotencyLevel.UNKNOWN,
264
+ ),
265
+ headers=headers,
266
+ timeout_ms=timeout_ms,
267
+ )
268
+
269
+ async def hydrate(
270
+ self,
271
+ request: HydrateRequest,
272
+ *,
273
+ headers: Headers | Mapping[str, str] | None = None,
274
+ timeout_ms: int | None = None,
275
+ ) -> HydrateResponse:
276
+ """
277
+ Conversation state from the projection, taking the thread lease in the same call when asked.
278
+ """
279
+ return await self.execute_unary(
280
+ request=request,
281
+ method=MethodInfo(
282
+ name="Hydrate",
283
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
284
+ input=HydrateRequest,
285
+ output=HydrateResponse,
286
+ idempotency_level=IdempotencyLevel.UNKNOWN,
287
+ ),
288
+ headers=headers,
289
+ timeout_ms=timeout_ms,
290
+ )
291
+
292
+ async def forward(
293
+ self,
294
+ request: ForwardRequest,
295
+ *,
296
+ headers: Headers | Mapping[str, str] | None = None,
297
+ timeout_ms: int | None = None,
298
+ ) -> ForwardResponse:
299
+ """
300
+ Run one ingress call on a live replica and relay its answer.
301
+ """
302
+ return await self.execute_unary(
303
+ request=request,
304
+ method=MethodInfo(
305
+ name="Forward",
306
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
307
+ input=ForwardRequest,
308
+ output=ForwardResponse,
309
+ idempotency_level=IdempotencyLevel.UNKNOWN,
310
+ ),
311
+ headers=headers,
312
+ timeout_ms=timeout_ms,
313
+ )
314
+
315
+ async def upload_attachment(
316
+ self,
317
+ request: UploadAttachmentRequest,
318
+ *,
319
+ headers: Headers | Mapping[str, str] | None = None,
320
+ timeout_ms: int | None = None,
321
+ ) -> UploadAttachmentResponse:
322
+ return await self.execute_unary(
323
+ request=request,
324
+ method=MethodInfo(
325
+ name="UploadAttachment",
326
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
327
+ input=UploadAttachmentRequest,
328
+ output=UploadAttachmentResponse,
329
+ idempotency_level=IdempotencyLevel.UNKNOWN,
330
+ ),
331
+ headers=headers,
332
+ timeout_ms=timeout_ms,
333
+ )
334
+
335
+ async def download_attachment(
336
+ self,
337
+ request: DownloadAttachmentRequest,
338
+ *,
339
+ headers: Headers | Mapping[str, str] | None = None,
340
+ timeout_ms: int | None = None,
341
+ ) -> DownloadAttachmentResponse:
342
+ return await self.execute_unary(
343
+ request=request,
344
+ method=MethodInfo(
345
+ name="DownloadAttachment",
346
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
347
+ input=DownloadAttachmentRequest,
348
+ output=DownloadAttachmentResponse,
349
+ idempotency_level=IdempotencyLevel.UNKNOWN,
350
+ ),
351
+ headers=headers,
352
+ timeout_ms=timeout_ms,
353
+ )
354
+
355
+ async def resolve_participant(
356
+ self,
357
+ request: ResolveParticipantRequest,
358
+ *,
359
+ headers: Headers | Mapping[str, str] | None = None,
360
+ timeout_ms: int | None = None,
361
+ ) -> ResolveParticipantResponse:
362
+ return await self.execute_unary(
363
+ request=request,
364
+ method=MethodInfo(
365
+ name="ResolveParticipant",
366
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
367
+ input=ResolveParticipantRequest,
368
+ output=ResolveParticipantResponse,
369
+ idempotency_level=IdempotencyLevel.UNKNOWN,
370
+ ),
371
+ headers=headers,
372
+ timeout_ms=timeout_ms,
373
+ )
374
+
375
+ async def relay(
376
+ self,
377
+ request: RelayRequest,
378
+ *,
379
+ headers: Headers | Mapping[str, str] | None = None,
380
+ timeout_ms: int | None = None,
381
+ ) -> RelayResponse:
382
+ """
383
+ Registry RPCs from the agent process, re-verified at the gateway.
384
+ """
385
+ return await self.execute_unary(
386
+ request=request,
387
+ method=MethodInfo(
388
+ name="Relay",
389
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
390
+ input=RelayRequest,
391
+ output=RelayResponse,
392
+ idempotency_level=IdempotencyLevel.UNKNOWN,
393
+ ),
394
+ headers=headers,
395
+ timeout_ms=timeout_ms,
396
+ )
397
+
398
+ class SidecarServiceSync(Protocol):
399
+ """
400
+ Sidecars dial the gateway; every call authenticates one agent deployment token.
401
+ The gateway never opens a connection to a sidecar. Postgres is the record; a
402
+ replica is a cache plus a write-behind queue plus the executor for the threads
403
+ it holds a lease on.
404
+ """
405
+ def watch(self, request: WatchRequest, ctx: RequestContext[WatchRequest, WatchResponse], /) -> Iterator[WatchResponse]:
406
+ """
407
+ Held open for the life of a replica: a snapshot first, then configuration,
408
+ lease changes and directives as they change.
409
+ """
410
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
411
+
412
+ def publish(self, request: PublishRequest, ctx: RequestContext[PublishRequest, PublishResponse], /) -> PublishResponse:
413
+ """
414
+ Heartbeats, typed events, directive results, lease releases and telemetry, in order.
415
+ """
416
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
417
+
418
+ def hydrate(self, request: HydrateRequest, ctx: RequestContext[HydrateRequest, HydrateResponse], /) -> HydrateResponse:
419
+ """
420
+ Conversation state from the projection, taking the thread lease in the same call when asked.
421
+ """
422
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
423
+
424
+ def forward(self, request: ForwardRequest, ctx: RequestContext[ForwardRequest, ForwardResponse], /) -> ForwardResponse:
425
+ """
426
+ Run one ingress call on a live replica and relay its answer.
427
+ """
428
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
429
+
430
+ def upload_attachment(self, request: UploadAttachmentRequest, ctx: RequestContext[UploadAttachmentRequest, UploadAttachmentResponse], /) -> UploadAttachmentResponse:
431
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
432
+
433
+ def download_attachment(self, request: DownloadAttachmentRequest, ctx: RequestContext[DownloadAttachmentRequest, DownloadAttachmentResponse], /) -> DownloadAttachmentResponse:
434
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
435
+
436
+ def resolve_participant(self, request: ResolveParticipantRequest, ctx: RequestContext[ResolveParticipantRequest, ResolveParticipantResponse], /) -> ResolveParticipantResponse:
437
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
438
+
439
+ def relay(self, request: RelayRequest, ctx: RequestContext[RelayRequest, RelayResponse], /) -> RelayResponse:
440
+ """
441
+ Registry RPCs from the agent process, re-verified at the gateway.
442
+ """
443
+ raise ConnectError(Code.UNIMPLEMENTED, 'Not implemented')
444
+
445
+
446
+ class SidecarServiceWSGIApplication(ConnectWSGIApplication):
447
+ def __init__(
448
+ self,
449
+ service: SidecarServiceSync,
450
+ interceptors: Iterable[InterceptorSync] = (),
451
+ read_max_bytes: int | None = DEFAULT_READ_MAX_BYTES,
452
+ compressions: Iterable[Compression] | None = None,
453
+ codecs: Iterable[Codec] | None = _DEFAULT_CODECS,
454
+ ) -> None:
455
+ super().__init__(
456
+ endpoints={
457
+ "/tilde.agent_event_ingress.v1.SidecarService/Watch": EndpointSync.server_stream(
458
+ method=MethodInfo(
459
+ name="Watch",
460
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
461
+ input=WatchRequest,
462
+ output=WatchResponse,
463
+ idempotency_level=IdempotencyLevel.UNKNOWN,
464
+ ),
465
+ function=service.watch,
466
+ ),
467
+ "/tilde.agent_event_ingress.v1.SidecarService/Publish": EndpointSync.unary(
468
+ method=MethodInfo(
469
+ name="Publish",
470
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
471
+ input=PublishRequest,
472
+ output=PublishResponse,
473
+ idempotency_level=IdempotencyLevel.UNKNOWN,
474
+ ),
475
+ function=service.publish,
476
+ ),
477
+ "/tilde.agent_event_ingress.v1.SidecarService/Hydrate": EndpointSync.unary(
478
+ method=MethodInfo(
479
+ name="Hydrate",
480
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
481
+ input=HydrateRequest,
482
+ output=HydrateResponse,
483
+ idempotency_level=IdempotencyLevel.UNKNOWN,
484
+ ),
485
+ function=service.hydrate,
486
+ ),
487
+ "/tilde.agent_event_ingress.v1.SidecarService/Forward": EndpointSync.unary(
488
+ method=MethodInfo(
489
+ name="Forward",
490
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
491
+ input=ForwardRequest,
492
+ output=ForwardResponse,
493
+ idempotency_level=IdempotencyLevel.UNKNOWN,
494
+ ),
495
+ function=service.forward,
496
+ ),
497
+ "/tilde.agent_event_ingress.v1.SidecarService/UploadAttachment": EndpointSync.unary(
498
+ method=MethodInfo(
499
+ name="UploadAttachment",
500
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
501
+ input=UploadAttachmentRequest,
502
+ output=UploadAttachmentResponse,
503
+ idempotency_level=IdempotencyLevel.UNKNOWN,
504
+ ),
505
+ function=service.upload_attachment,
506
+ ),
507
+ "/tilde.agent_event_ingress.v1.SidecarService/DownloadAttachment": EndpointSync.unary(
508
+ method=MethodInfo(
509
+ name="DownloadAttachment",
510
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
511
+ input=DownloadAttachmentRequest,
512
+ output=DownloadAttachmentResponse,
513
+ idempotency_level=IdempotencyLevel.UNKNOWN,
514
+ ),
515
+ function=service.download_attachment,
516
+ ),
517
+ "/tilde.agent_event_ingress.v1.SidecarService/ResolveParticipant": EndpointSync.unary(
518
+ method=MethodInfo(
519
+ name="ResolveParticipant",
520
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
521
+ input=ResolveParticipantRequest,
522
+ output=ResolveParticipantResponse,
523
+ idempotency_level=IdempotencyLevel.UNKNOWN,
524
+ ),
525
+ function=service.resolve_participant,
526
+ ),
527
+ "/tilde.agent_event_ingress.v1.SidecarService/Relay": EndpointSync.unary(
528
+ method=MethodInfo(
529
+ name="Relay",
530
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
531
+ input=RelayRequest,
532
+ output=RelayResponse,
533
+ idempotency_level=IdempotencyLevel.UNKNOWN,
534
+ ),
535
+ function=service.relay,
536
+ ),
537
+ },
538
+ interceptors=interceptors,
539
+ read_max_bytes=read_max_bytes,
540
+ compressions=compressions,
541
+ codecs=codecs,
542
+ )
543
+
544
+ @property
545
+ def path(self) -> str:
546
+ """Returns the URL path to mount the application to when serving multiple applications."""
547
+ return "/tilde.agent_event_ingress.v1.SidecarService"
548
+
549
+
550
+ class SidecarServiceClientSync(ConnectClientSync):
551
+ """
552
+ Sidecars dial the gateway; every call authenticates one agent deployment token.
553
+ The gateway never opens a connection to a sidecar. Postgres is the record; a
554
+ replica is a cache plus a write-behind queue plus the executor for the threads
555
+ it holds a lease on.
556
+ """
557
+ def __init__(
558
+ self,
559
+ address: str,
560
+ *,
561
+ codec: Codec | None = _PROTO_BINARY_CODEC,
562
+ protocol: ProtocolType = ProtocolType.CONNECT,
563
+ accept_compression: Iterable[Compression] | None = None,
564
+ send_compression: Compression | None = _GZIP_COMPRESSION,
565
+ timeout_ms: int | None = None,
566
+ read_max_bytes: int | None = None,
567
+ interceptors: Iterable[InterceptorSync] = (),
568
+ http_client: SyncClient | None = None,
569
+ ) -> None:
570
+ super().__init__(
571
+ address=address,
572
+ codec=codec,
573
+ protocol=protocol,
574
+ accept_compression=accept_compression,
575
+ send_compression=send_compression,
576
+ timeout_ms=timeout_ms,
577
+ read_max_bytes=read_max_bytes,
578
+ interceptors=interceptors,
579
+ http_client=http_client,
580
+ )
581
+ def watch(
582
+ self,
583
+ request: WatchRequest,
584
+ *,
585
+ headers: Headers | Mapping[str, str] | None = None,
586
+ timeout_ms: int | None = None,
587
+ ) -> Iterator[WatchResponse]:
588
+ """
589
+ Held open for the life of a replica: a snapshot first, then configuration,
590
+ lease changes and directives as they change.
591
+ """
592
+ return self.execute_server_stream(
593
+ request=request,
594
+ method=MethodInfo(
595
+ name="Watch",
596
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
597
+ input=WatchRequest,
598
+ output=WatchResponse,
599
+ idempotency_level=IdempotencyLevel.UNKNOWN,
600
+ ),
601
+ headers=headers,
602
+ timeout_ms=timeout_ms,
603
+ )
604
+ def publish(
605
+ self,
606
+ request: PublishRequest,
607
+ *,
608
+ headers: Headers | Mapping[str, str] | None = None,
609
+ timeout_ms: int | None = None,
610
+ ) -> PublishResponse:
611
+ """
612
+ Heartbeats, typed events, directive results, lease releases and telemetry, in order.
613
+ """
614
+ return self.execute_unary(
615
+ request=request,
616
+ method=MethodInfo(
617
+ name="Publish",
618
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
619
+ input=PublishRequest,
620
+ output=PublishResponse,
621
+ idempotency_level=IdempotencyLevel.UNKNOWN,
622
+ ),
623
+ headers=headers,
624
+ timeout_ms=timeout_ms,
625
+ )
626
+ def hydrate(
627
+ self,
628
+ request: HydrateRequest,
629
+ *,
630
+ headers: Headers | Mapping[str, str] | None = None,
631
+ timeout_ms: int | None = None,
632
+ ) -> HydrateResponse:
633
+ """
634
+ Conversation state from the projection, taking the thread lease in the same call when asked.
635
+ """
636
+ return self.execute_unary(
637
+ request=request,
638
+ method=MethodInfo(
639
+ name="Hydrate",
640
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
641
+ input=HydrateRequest,
642
+ output=HydrateResponse,
643
+ idempotency_level=IdempotencyLevel.UNKNOWN,
644
+ ),
645
+ headers=headers,
646
+ timeout_ms=timeout_ms,
647
+ )
648
+ def forward(
649
+ self,
650
+ request: ForwardRequest,
651
+ *,
652
+ headers: Headers | Mapping[str, str] | None = None,
653
+ timeout_ms: int | None = None,
654
+ ) -> ForwardResponse:
655
+ """
656
+ Run one ingress call on a live replica and relay its answer.
657
+ """
658
+ return self.execute_unary(
659
+ request=request,
660
+ method=MethodInfo(
661
+ name="Forward",
662
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
663
+ input=ForwardRequest,
664
+ output=ForwardResponse,
665
+ idempotency_level=IdempotencyLevel.UNKNOWN,
666
+ ),
667
+ headers=headers,
668
+ timeout_ms=timeout_ms,
669
+ )
670
+ def upload_attachment(
671
+ self,
672
+ request: UploadAttachmentRequest,
673
+ *,
674
+ headers: Headers | Mapping[str, str] | None = None,
675
+ timeout_ms: int | None = None,
676
+ ) -> UploadAttachmentResponse:
677
+ return self.execute_unary(
678
+ request=request,
679
+ method=MethodInfo(
680
+ name="UploadAttachment",
681
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
682
+ input=UploadAttachmentRequest,
683
+ output=UploadAttachmentResponse,
684
+ idempotency_level=IdempotencyLevel.UNKNOWN,
685
+ ),
686
+ headers=headers,
687
+ timeout_ms=timeout_ms,
688
+ )
689
+ def download_attachment(
690
+ self,
691
+ request: DownloadAttachmentRequest,
692
+ *,
693
+ headers: Headers | Mapping[str, str] | None = None,
694
+ timeout_ms: int | None = None,
695
+ ) -> DownloadAttachmentResponse:
696
+ return self.execute_unary(
697
+ request=request,
698
+ method=MethodInfo(
699
+ name="DownloadAttachment",
700
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
701
+ input=DownloadAttachmentRequest,
702
+ output=DownloadAttachmentResponse,
703
+ idempotency_level=IdempotencyLevel.UNKNOWN,
704
+ ),
705
+ headers=headers,
706
+ timeout_ms=timeout_ms,
707
+ )
708
+ def resolve_participant(
709
+ self,
710
+ request: ResolveParticipantRequest,
711
+ *,
712
+ headers: Headers | Mapping[str, str] | None = None,
713
+ timeout_ms: int | None = None,
714
+ ) -> ResolveParticipantResponse:
715
+ return self.execute_unary(
716
+ request=request,
717
+ method=MethodInfo(
718
+ name="ResolveParticipant",
719
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
720
+ input=ResolveParticipantRequest,
721
+ output=ResolveParticipantResponse,
722
+ idempotency_level=IdempotencyLevel.UNKNOWN,
723
+ ),
724
+ headers=headers,
725
+ timeout_ms=timeout_ms,
726
+ )
727
+ def relay(
728
+ self,
729
+ request: RelayRequest,
730
+ *,
731
+ headers: Headers | Mapping[str, str] | None = None,
732
+ timeout_ms: int | None = None,
733
+ ) -> RelayResponse:
734
+ """
735
+ Registry RPCs from the agent process, re-verified at the gateway.
736
+ """
737
+ return self.execute_unary(
738
+ request=request,
739
+ method=MethodInfo(
740
+ name="Relay",
741
+ service_name="tilde.agent_event_ingress.v1.SidecarService",
742
+ input=RelayRequest,
743
+ output=RelayResponse,
744
+ idempotency_level=IdempotencyLevel.UNKNOWN,
745
+ ),
746
+ headers=headers,
747
+ timeout_ms=timeout_ms,
748
+ )