laser-sdk 0.9.0.dev1__tar.gz → 0.9.0.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/Cargo.toml +7 -6
  2. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/PKG-INFO +15 -9
  3. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/README.md +14 -8
  4. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/Cargo.lock +10 -9
  5. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/Cargo.toml +3 -3
  6. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/README.md +14 -8
  7. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/iggy_test_server.py +195 -17
  8. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/laser_sdk.pyi +109 -33
  9. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/agent_runtime.rs +8 -5
  10. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/client.rs +21 -1
  11. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/consumer_group.rs +97 -34
  12. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/context.rs +1 -1
  13. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/errors.rs +39 -0
  14. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/filters.rs +112 -55
  15. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/session_reads.rs +1 -1
  16. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/stream.rs +31 -9
  17. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/transport.rs +47 -12
  18. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_addressed_calls.py +1 -1
  19. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_agdx_envelope.py +7 -0
  20. laser_sdk-0.9.0.dev3/foreign/python/tests/test_cluster.py +467 -0
  21. laser_sdk-0.9.0.dev3/foreign/python/tests/test_cluster_filters.py +348 -0
  22. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_coordination_client.py +7 -0
  23. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_filter_surface.py +4 -0
  24. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_filters.py +198 -13
  25. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_integration.py +221 -24
  26. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_parity.py +68 -3
  27. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_pause.py +0 -1
  28. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_smoke.py +31 -0
  29. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_workflow_callbacks.py +0 -3
  30. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/laser_sdk.pyi +109 -33
  31. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/Cargo.toml +2 -0
  32. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/README.md +15 -9
  33. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/agdx.rs +1 -1
  34. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/builder.rs +53 -42
  35. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/consumer.rs +336 -68
  36. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/laser.rs +17 -9
  37. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/mod.rs +1 -0
  38. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/pause.rs +96 -79
  39. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/replies.rs +199 -120
  40. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/session.rs +1 -0
  41. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/session_reads.rs +42 -5
  42. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/capabilities.rs +5 -0
  43. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/context.rs +1 -1
  44. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/control.rs +2 -0
  45. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/cursor.rs +34 -8
  46. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/filters/client.rs +28 -20
  47. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/filters/group.rs +90 -23
  48. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/filters/mod.rs +1 -1
  49. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/filters/progress.rs +57 -0
  50. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/filters/reader.rs +1004 -91
  51. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/graph.rs +2 -0
  52. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/kv/client.rs +4 -0
  53. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/laser.rs +144 -70
  54. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/memory.rs +29 -5
  55. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/nodes.rs +60 -10
  56. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/poll.rs +104 -12
  57. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/projections.rs +65 -1
  58. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/publish_options.rs +16 -8
  59. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/snapshot.rs +31 -33
  60. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/stream/consumer_group.rs +44 -67
  61. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/stream/transport.rs +1070 -233
  62. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/stream.rs +20 -3
  63. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/types/ids.rs +57 -24
  64. laser_sdk-0.9.0.dev3/sdk/tests/future_depth.rs +121 -0
  65. laser_sdk-0.9.0.dev3/sdk/tests/integration/filtered_wait.rs +317 -0
  66. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/filters.rs +2 -3
  67. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/filters_group.rs +865 -749
  68. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/governance.rs +1 -1
  69. laser_sdk-0.9.0.dev3/sdk/tests/integration/harness.rs +379 -0
  70. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/main.rs +1 -0
  71. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/memory.rs +1 -1
  72. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/pause.rs +167 -4
  73. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/reconnect.rs +10 -70
  74. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/reliable.rs +2 -2
  75. laser_sdk-0.9.0.dev3/sdk/tests/integration/request.rs +380 -0
  76. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/session.rs +10 -6
  77. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/signing.rs +5 -5
  78. laser_sdk-0.9.0.dev3/sdk/tests/integration/streaming.rs +1900 -0
  79. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/typed_topics.rs +6 -2
  80. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/workflow.rs +1 -1
  81. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/support/test_iggy.rs +133 -21
  82. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/README.md +7 -7
  83. laser_sdk-0.9.0.dev3/wire/fixtures/control_stamped_caller.bin +0 -0
  84. laser_sdk-0.9.0.dev3/wire/fixtures/filter_mutation_configure_group.bin +0 -0
  85. laser_sdk-0.9.0.dev3/wire/fixtures/filter_mutation_configure_group.json +120 -0
  86. laser_sdk-0.9.0.dev3/wire/fixtures/filter_reply_cancelled.bin +1 -0
  87. laser_sdk-0.9.0.dev3/wire/fixtures/filter_reply_ready.bin +1 -0
  88. laser_sdk-0.9.0.dev3/wire/fixtures/filter_wait_cancel.bin +1 -0
  89. laser_sdk-0.9.0.dev3/wire/fixtures/filter_wait_request.bin +0 -0
  90. laser_sdk-0.9.0.dev3/wire/fixtures/forwarded_command_agent.bin +0 -0
  91. laser_sdk-0.9.0.dev3/wire/fixtures/forwarded_command_on_behalf_of.bin +0 -0
  92. laser_sdk-0.9.0.dev3/wire/fixtures/mutation_command_caller.bin +0 -0
  93. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/agent.rs +15 -0
  94. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/codes.rs +7 -0
  95. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/control.rs +292 -4
  96. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/destination.rs +1 -3
  97. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/dispatch.rs +4 -0
  98. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/catalog.rs +201 -13
  99. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/mod.rs +8 -7
  100. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/read.rs +215 -2
  101. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/fixtures.rs +8 -0
  102. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/forward.rs +119 -2
  103. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/hello.rs +8 -0
  104. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/http.rs +82 -0
  105. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/kv.rs +1 -1
  106. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/limits.rs +22 -0
  107. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/mutation.rs +6 -0
  108. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/session.rs +97 -6
  109. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/validate.rs +193 -5
  110. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/constants.rs +15 -0
  111. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/wire_fixtures.rs +246 -12
  112. laser_sdk-0.9.0.dev1/sdk/tests/integration/harness.rs +0 -116
  113. laser_sdk-0.9.0.dev1/sdk/tests/integration/request.rs +0 -165
  114. laser_sdk-0.9.0.dev1/sdk/tests/integration/streaming.rs +0 -651
  115. laser_sdk-0.9.0.dev1/wire/fixtures/filter_mutation_configure_group.bin +0 -0
  116. laser_sdk-0.9.0.dev1/wire/fixtures/filter_mutation_configure_group.json +0 -117
  117. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/.gitignore +0 -0
  118. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/agdx.rs +0 -0
  119. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/agent.rs +0 -0
  120. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/async_bridge.rs +0 -0
  121. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/batching.rs +0 -0
  122. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/bin/stub_gen.rs +0 -0
  123. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/blob.rs +0 -0
  124. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/chunks.rs +0 -0
  125. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/codecs.rs +0 -0
  126. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/control.rs +0 -0
  127. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/convert.rs +0 -0
  128. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/coordination.rs +0 -0
  129. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/crash_context.rs +0 -0
  130. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/destinations.rs +0 -0
  131. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/fork.rs +0 -0
  132. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/govern.rs +0 -0
  133. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/graph.rs +0 -0
  134. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/ids.rs +0 -0
  135. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/intent.rs +0 -0
  136. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/interop.rs +0 -0
  137. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/kv.rs +0 -0
  138. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/lib.rs +0 -0
  139. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/memory.rs +0 -0
  140. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/memory_handler.rs +0 -0
  141. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/parity_helpers.rs +0 -0
  142. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/projections.rs +0 -0
  143. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/publish.rs +0 -0
  144. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/query.rs +0 -0
  145. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/rbac.rs +0 -0
  146. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/reader.rs +0 -0
  147. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/registry.rs +0 -0
  148. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/schema.rs +0 -0
  149. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/session.rs +0 -0
  150. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/session_ops.rs +0 -0
  151. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/sign.rs +0 -0
  152. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/snapshot.rs +0 -0
  153. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/state_store.rs +0 -0
  154. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/swarm.rs +0 -0
  155. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/typed.rs +0 -0
  156. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/watch.rs +0 -0
  157. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/src/workflow.rs +0 -0
  158. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/conftest.py +0 -0
  159. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_agent_surface.py +0 -0
  160. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_callback_bridge.py +0 -0
  161. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_close_logging.py +0 -0
  162. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_connect_timeout.py +0 -0
  163. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_control_builders.py +0 -0
  164. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_data_surface.py +0 -0
  165. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_errors.py +0 -0
  166. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_parity_helpers.py +0 -0
  167. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_publish_failures.py +0 -0
  168. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_query_wire.py +0 -0
  169. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_rbac.py +0 -0
  170. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_readme_snippets.py +0 -0
  171. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_reconnect.py +0 -0
  172. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_record_helpers.py +0 -0
  173. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_resource_naming.py +0 -0
  174. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_resume_parity.py +0 -0
  175. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_snapshot_callbacks.py +0 -0
  176. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/tests/test_trait_hooks.py +0 -0
  177. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/foreign/python/uv.lock +0 -0
  178. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/pyproject.toml +0 -0
  179. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/LICENSE +0 -0
  180. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/NOTICE +0 -0
  181. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/certs/laserdata.crt +0 -0
  182. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/a2a.rs +0 -0
  183. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/assembler.rs +0 -0
  184. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/budget.rs +0 -0
  185. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/clock.rs +0 -0
  186. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/contract.rs +0 -0
  187. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/control.rs +0 -0
  188. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/ctx.rs +0 -0
  189. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/lease.rs +0 -0
  190. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/memory_handler.rs +0 -0
  191. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/partitioning.rs +0 -0
  192. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/registry.rs +0 -0
  193. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/router.rs +0 -0
  194. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/scope.rs +0 -0
  195. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/session_ops.rs +0 -0
  196. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/state.rs +0 -0
  197. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agent/workflow.rs +0 -0
  198. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/agui.rs +0 -0
  199. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/batching.rs +0 -0
  200. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/blob.rs +0 -0
  201. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/bridge_hops.rs +0 -0
  202. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/connect_options.rs +0 -0
  203. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/context_scope.rs +0 -0
  204. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/crash_context.rs +0 -0
  205. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/destinations.rs +0 -0
  206. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/edge_auth.rs +0 -0
  207. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/error.rs +0 -0
  208. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/filters/guard.rs +0 -0
  209. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/fork/client.rs +0 -0
  210. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/fork/mod.rs +0 -0
  211. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/govern.rs +0 -0
  212. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/intent.rs +0 -0
  213. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/kv/coordination.rs +0 -0
  214. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/kv/mod.rs +0 -0
  215. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/lib.rs +0 -0
  216. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/managed.rs +0 -0
  217. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/mcp.rs +0 -0
  218. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/message.rs +0 -0
  219. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/prelude.rs +0 -0
  220. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/provenance/keys.rs +0 -0
  221. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/provenance/mod.rs +0 -0
  222. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/provenance/runtime.rs +0 -0
  223. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/provenance/topic.rs +0 -0
  224. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/query/client.rs +0 -0
  225. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/query/mod.rs +0 -0
  226. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/rbac/mod.rs +0 -0
  227. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/retry.rs +0 -0
  228. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/schema_codecs.rs +0 -0
  229. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/sign.rs +0 -0
  230. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/state_store.rs +0 -0
  231. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/stream/producer_statistics.rs +0 -0
  232. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/stream/publish.rs +0 -0
  233. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/stream/record.rs +0 -0
  234. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/swarm.rs +0 -0
  235. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/testing.rs +0 -0
  236. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/typed.rs +0 -0
  237. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/types/mod.rs +0 -0
  238. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/src/watch.rs +0 -0
  239. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/alloc.rs +0 -0
  240. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/fixtures/retry-table.json +0 -0
  241. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/fixtures/typescript_signature.json +0 -0
  242. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/a2a.rs +0 -0
  243. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/agdx_consume.rs +0 -0
  244. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/agdx_stream.rs +0 -0
  245. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/agui.rs +0 -0
  246. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/budget.rs +0 -0
  247. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/context.rs +0 -0
  248. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/contract.rs +0 -0
  249. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/deadletter.rs +0 -0
  250. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/decomposition.rs +0 -0
  251. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/fanout.rs +0 -0
  252. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/handoff.rs +0 -0
  253. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/human_input.rs +0 -0
  254. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/managed_unsupported.rs +0 -0
  255. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/mcp.rs +0 -0
  256. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/provenance.rs +0 -0
  257. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/queue_pressure.rs +0 -0
  258. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/replay.rs +0 -0
  259. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/runtime.rs +0 -0
  260. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/shutdown.rs +0 -0
  261. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/state.rs +0 -0
  262. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/integration/warm_dedup.rs +0 -0
  263. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/signature_interop.rs +0 -0
  264. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/sdk/tests/support/owned_server.rs +0 -0
  265. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/Cargo.toml +0 -0
  266. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/LICENSE +0 -0
  267. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/NOTICE +0 -0
  268. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/accepted_operation.json +0 -0
  269. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_body_ref.bin +0 -0
  270. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_card.bin +0 -0
  271. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_chunk.bin +0 -0
  272. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_chunk_open.bin +0 -0
  273. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_chunk_terminal.bin +0 -0
  274. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_command.bin +0 -0
  275. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_command_signed.bin +0 -0
  276. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_dead_letter.bin +0 -0
  277. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_error.bin +0 -0
  278. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_error_body.bin +0 -0
  279. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_event.bin +0 -0
  280. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_chunk_late_deadline.bin +0 -0
  281. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_chunk_no_sequence.bin +0 -0
  282. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_chunk_open_no_operation.bin +0 -0
  283. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_command_no_correlation.bin +0 -0
  284. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_error_last.bin +0 -0
  285. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_event_task_state.bin +0 -0
  286. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_response_channel.bin +0 -0
  287. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_status_bad_operation.bin +0 -0
  288. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_invalid_status_no_operation.bin +0 -0
  289. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_must_understand.bin +0 -0
  290. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_presence.bin +0 -0
  291. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_record.bin +0 -0
  292. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_response.bin +0 -0
  293. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_session_end.bin +0 -0
  294. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_session_parking.bin +0 -0
  295. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_session_start.bin +0 -0
  296. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_session_status.bin +0 -0
  297. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_session_transition.bin +0 -0
  298. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_signature.bin +0 -0
  299. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_status_card.bin +0 -0
  300. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_status_session.bin +0 -0
  301. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_status_task.bin +0 -0
  302. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/agent_usage_cost.bin +0 -0
  303. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/arrow_ipc_metadata.bin +0 -0
  304. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/arrow_ipc_policy.bin +0 -0
  305. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/authz_bind_roles.bin +0 -0
  306. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/authz_get_role_reply.bin +0 -0
  307. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/authz_history_reply.bin +0 -0
  308. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/authz_history_request.bin +0 -0
  309. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/authz_role.bin +0 -0
  310. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/authz_whoami_reply.bin +0 -0
  311. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/backend_announce.bin +0 -0
  312. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/backend_announce_topology.bin +0 -0
  313. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/backend_announce_unavailable.bin +0 -0
  314. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/batch_reply.bin +0 -0
  315. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/batch_request.bin +0 -0
  316. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/browse_projections.json +0 -0
  317. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/browse_reply_decoded.bin +0 -0
  318. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/browse_reply_projections.bin +0 -0
  319. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/browse_reply_schema_registered.bin +0 -0
  320. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/browse_reply_schemas.bin +0 -0
  321. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/browse_schemas.json +0 -0
  322. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/capabilities.json +0 -0
  323. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/change_record.bin +0 -0
  324. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/checkpoint_mutation_replicated.bin +0 -0
  325. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/checkpoint_public_mutation_discriminants.bin +0 -0
  326. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/checkpoint_reply_destination.bin +0 -0
  327. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/checkpoint_reply_query_route.bin +0 -0
  328. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/checkpoint_request_public.bin +0 -0
  329. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/client_metadata_list.bin +0 -0
  330. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/client_metadata_query.bin +0 -0
  331. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/context_compaction.bin +0 -0
  332. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/context_manifest.bin +0 -0
  333. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/context_retrieval.bin +0 -0
  334. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_accept_gap.bin +0 -0
  335. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_apply_binding.bin +0 -0
  336. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_drop_schema.bin +0 -0
  337. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_filter_catalog.bin +0 -0
  338. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_register_projection.bin +0 -0
  339. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_register_schema_avro.bin +0 -0
  340. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_register_schema_json.bin +0 -0
  341. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_register_schema_protobuf.bin +0 -0
  342. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_register_session_source_all.bin +0 -0
  343. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_register_session_source_named.bin +0 -0
  344. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_remove_binding.bin +0 -0
  345. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_remove_session_source.bin +0 -0
  346. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_skip_record.bin +0 -0
  347. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/control_stamped_remove_binding.bin +0 -0
  348. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/data_stack_string_discriminants.bin +0 -0
  349. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/decode_record.bin +0 -0
  350. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/destination_checkpoint_status.bin +0 -0
  351. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/destination_issue.json +0 -0
  352. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/destination_page.json +0 -0
  353. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/dispatch_cases.json +0 -0
  354. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/error_body.json +0 -0
  355. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_ack.bin +0 -0
  356. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_ack_unfiltered.bin +0 -0
  357. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_catalog_reply_bound.bin +0 -0
  358. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_catalog_reply_configured.bin +0 -0
  359. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_catalog_reply_registered.bin +0 -0
  360. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_catalog_reply_revision_state.bin +0 -0
  361. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_catalog_reply_revisions.bin +0 -0
  362. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_catalog_reply_unbound.bin +0 -0
  363. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_codec_cases.json +0 -0
  364. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_consumer_filter.bin +0 -0
  365. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_consumer_filter.json +0 -0
  366. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_eval_cases.json +0 -0
  367. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_mutation_register.bin +0 -0
  368. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_mutation_register.json +0 -0
  369. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_mutation_revision_state.bin +0 -0
  370. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_mutation_revision_state.json +0 -0
  371. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_mutation_unbind_exact.bin +0 -0
  372. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_mutation_unbind_exact.json +0 -0
  373. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_poll_request.bin +0 -0
  374. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_poll_request_group_auto.bin +0 -0
  375. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_poll_request_group_id.bin +0 -0
  376. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_reply_acknowledged.bin +0 -0
  377. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_reply_error.bin +0 -0
  378. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_reply_page.bin +0 -0
  379. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_reply_page_unfiltered.bin +0 -0
  380. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_reply_revision_disabled.bin +0 -0
  381. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/filter_validation.json +0 -0
  382. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/fold_snapshot.bin +0 -0
  383. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/fork_create.bin +0 -0
  384. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/fork_info.json +0 -0
  385. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/fork_put.bin +0 -0
  386. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/fork_reply_created.bin +0 -0
  387. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/forwarded_command.bin +0 -0
  388. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/forwarded_command_positioned.bin +0 -0
  389. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/forwarded_command_scoped.bin +0 -0
  390. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/forwarded_query.bin +0 -0
  391. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/forwarded_query_scoped.bin +0 -0
  392. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_edge.bin +0 -0
  393. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_edge_conversation.bin +0 -0
  394. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_edge_producer.bin +0 -0
  395. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_edge_sourced.bin +0 -0
  396. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_neighbors.bin +0 -0
  397. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_neighbors_conversation.bin +0 -0
  398. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_node.bin +0 -0
  399. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_node_conversation.bin +0 -0
  400. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_node_producer.bin +0 -0
  401. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_node_sourced.bin +0 -0
  402. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_query.bin +0 -0
  403. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_query_conversation.bin +0 -0
  404. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_reply.bin +0 -0
  405. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_upsert.bin +0 -0
  406. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/graph_upsert_session.bin +0 -0
  407. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/header_block_envelope.json +0 -0
  408. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/header_block_generic.json +0 -0
  409. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/hello_reply.bin +0 -0
  410. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/hello_reply_agent.bin +0 -0
  411. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/hello_reply_features.bin +0 -0
  412. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/json_patch/cases.json +0 -0
  413. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/key_record.bin +0 -0
  414. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_cas.bin +0 -0
  415. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_cas_fenced.bin +0 -0
  416. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_cas_session.bin +0 -0
  417. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_copy.bin +0 -0
  418. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_delete_session.bin +0 -0
  419. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_entry_memory_scope.bin +0 -0
  420. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_get_barriered.bin +0 -0
  421. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_lease.bin +0 -0
  422. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_lease_renew.bin +0 -0
  423. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_move.bin +0 -0
  424. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_namespaces.bin +0 -0
  425. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_page_view.json +0 -0
  426. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_patch_session.bin +0 -0
  427. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_release.bin +0 -0
  428. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_committed.bin +0 -0
  429. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_leased.bin +0 -0
  430. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_namespaces.bin +0 -0
  431. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_page.bin +0 -0
  432. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_renewed.bin +0 -0
  433. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_stale.bin +0 -0
  434. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_reply_version_conflict.bin +0 -0
  435. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_scan.bin +0 -0
  436. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_set.bin +0 -0
  437. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/kv_set_session.bin +0 -0
  438. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/logical_schema.bin +0 -0
  439. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/logical_type_discriminants.bin +0 -0
  440. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/managed_read.bin +0 -0
  441. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/managed_reply.bin +0 -0
  442. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/managed_request.bin +0 -0
  443. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/materialization_destination.bin +0 -0
  444. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/memory_feedback_scoped.bin +0 -0
  445. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/memory_forget_scoped.bin +0 -0
  446. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/memory_item_origin.bin +0 -0
  447. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/mutation_command.bin +0 -0
  448. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/mutation_command_scoped.bin +0 -0
  449. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/producer_presence.bin +0 -0
  450. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_cancel.bin +0 -0
  451. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_envelope.bin +0 -0
  452. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_envelope_aggregate.bin +0 -0
  453. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_envelope_raw_sql.bin +0 -0
  454. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_envelope_read_your_writes.bin +0 -0
  455. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_envelope_text.bin +0 -0
  456. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_error_discriminants.bin +0 -0
  457. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_execution.json +0 -0
  458. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_page.bin +0 -0
  459. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_reply_err_stale.bin +0 -0
  460. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_reply_err_too_large.bin +0 -0
  461. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_reply_ok.bin +0 -0
  462. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_result.json +0 -0
  463. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_route.bin +0 -0
  464. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_route_page.json +0 -0
  465. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_status.bin +0 -0
  466. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_status_reply.bin +0 -0
  467. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/query_target_discriminants.bin +0 -0
  468. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/register_schema_managed.bin +0 -0
  469. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/schema_def.json +0 -0
  470. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_changes.bin +0 -0
  471. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_events.bin +0 -0
  472. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_get.bin +0 -0
  473. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_heartbeat.bin +0 -0
  474. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_empty.json +0 -0
  475. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_gap.json +0 -0
  476. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_legacy.json +0 -0
  477. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_no_retained_rows.json +0 -0
  478. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_origins.json +0 -0
  479. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_page.json +0 -0
  480. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_start.json +0 -0
  481. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_start_new.json +0 -0
  482. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_changes_truncated.json +0 -0
  483. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_error.json +0 -0
  484. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_events.json +0 -0
  485. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_info.json +0 -0
  486. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_links.json +0 -0
  487. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_page.json +0 -0
  488. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_page_rebuilding.json +0 -0
  489. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_sources.json +0 -0
  490. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_http_state.json +0 -0
  491. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_link_relation.bin +0 -0
  492. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_link_surface.bin +0 -0
  493. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_links.bin +0 -0
  494. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_list.bin +0 -0
  495. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_ref.bin +0 -0
  496. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_changes.bin +0 -0
  497. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_error.bin +0 -0
  498. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_events.bin +0 -0
  499. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_info.bin +0 -0
  500. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_links.bin +0 -0
  501. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_page.bin +0 -0
  502. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_page_rebuilding.bin +0 -0
  503. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_sources.bin +0 -0
  504. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_reply_state.bin +0 -0
  505. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_sources.bin +0 -0
  506. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_sources_lane_only.bin +0 -0
  507. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/session_state.bin +0 -0
  508. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/snapshot_page.json +0 -0
  509. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/source_ref_generation.bin +0 -0
  510. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/start_policy_discriminants.bin +0 -0
  511. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/state_delta.bin +0 -0
  512. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/state_snapshot.bin +0 -0
  513. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/table_file_page.json +0 -0
  514. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/table_metrics.json +0 -0
  515. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/table_schema_view.json +0 -0
  516. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/table_view.json +0 -0
  517. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/token_estimates.json +0 -0
  518. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/fixtures/typed_value_discriminants.bin +0 -0
  519. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/arrow.rs +0 -0
  520. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/authz.rs +0 -0
  521. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/batch.rs +0 -0
  522. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/browse.rs +0 -0
  523. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/change.rs +0 -0
  524. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/checkpoint.rs +0 -0
  525. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/clients.rs +0 -0
  526. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/codecs.rs +0 -0
  527. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/commands.rs +0 -0
  528. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/content.rs +0 -0
  529. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/encoding.rs +0 -0
  530. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/error.rs +0 -0
  531. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/cbor.rs +0 -0
  532. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/codecs.rs +0 -0
  533. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/coerce.rs +0 -0
  534. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/eval.rs +0 -0
  535. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/expr.rs +0 -0
  536. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/headers.rs +0 -0
  537. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/path.rs +0 -0
  538. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/filter/text.rs +0 -0
  539. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/fork.rs +0 -0
  540. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/framing.rs +0 -0
  541. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/graph.rs +0 -0
  542. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/hashing.rs +0 -0
  543. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/headers.rs +0 -0
  544. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/http_client.rs +0 -0
  545. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/keys.rs +0 -0
  546. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/lib.rs +0 -0
  547. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/memory.rs +0 -0
  548. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/query.rs +0 -0
  549. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/result.rs +0 -0
  550. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/schema.rs +0 -0
  551. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/snapshot.rs +0 -0
  552. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/source.rs +0 -0
  553. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/topics.rs +0 -0
  554. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/src/topology.rs +0 -0
  555. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/dispatch.rs +0 -0
  556. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/filter_eval_corpus.rs +0 -0
  557. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/headers.rs +0 -0
  558. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/json_patch.rs +0 -0
  559. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/producer_presence.rs +0 -0
  560. {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev3}/wire/tests/robustness.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  [workspace]
2
2
  exclude = ["bdd/rust", "bench", "foreign/python", "fuzz"]
3
- members = ["examples/rust", "sdk", "wire"]
3
+ members = ["examples/rust", "sdk", "test-support", "wire"]
4
4
  resolver = "2"
5
5
 
6
6
  [workspace.package]
@@ -8,7 +8,7 @@ edition = "2024"
8
8
  license = "Apache-2.0"
9
9
  repository = "https://github.com/laserdata/laser-sdk"
10
10
  rust-version = "1.98.0"
11
- version = "0.9.0-dev.1"
11
+ version = "0.9.0-dev.3"
12
12
 
13
13
  [workspace.dependencies]
14
14
  apache-avro = { version = "0.22.0" }
@@ -23,13 +23,14 @@ colored = { version = "3.1.1" }
23
23
  dashmap = { version = "6.2.1" }
24
24
  ed25519-dalek = { version = "3.0.0" }
25
25
  futures = { version = "0.3.34" }
26
- iggy = { version = "0.11.1-edge.4" }
27
- iggy_binary_protocol = { version = "0.11.1-edge.3" }
28
- iggy_common = { version = "0.11.1-edge.4" }
26
+ iggy = { version = "0.11.1-edge.9" }
27
+ iggy_binary_protocol = { version = "0.11.1-edge.8" }
28
+ iggy_common = { version = "0.11.1-edge.10" }
29
29
  json-patch = { version = "4.2.0" }
30
30
  jsonschema = { version = "0.60.1", default-features = false }
31
31
  laser-sdk = { path = "sdk" }
32
- laser-wire = { path = "wire", version = "0.9.0-dev.1" }
32
+ laser-test-support = { path = "test-support" }
33
+ laser-wire = { path = "wire", version = "0.9.0-dev.3" }
33
34
  memchr = { version = "2.8.3" }
34
35
  ouroboros = { version = "0.18.5" }
35
36
  prost = { version = "0.14.4" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: laser-sdk
3
- Version: 0.9.0.dev1
3
+ Version: 0.9.0.dev3
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -32,7 +32,7 @@ This package provides the Python Laser SDK for Apache Iggy. [LaserData, Inc.](ht
32
32
 
33
33
  Rust and Python share the data contract and Rust implementation. The bindings expose Python forms of the SDK operations, configuration, and errors. Shared examples and behavior scenarios cover language-neutral behavior.
34
34
 
35
- > This source tree targets `0.8.0`. The wire contract and public API use semantic versioning. Before `1.0.0`, minor releases can contain breaking changes.
35
+ > This source tree targets `0.9.0-dev.3`. The wire contract and public API use semantic versioning. Before `1.0.0`, minor releases can contain breaking changes.
36
36
 
37
37
  `spawn_agent(agent_id, ..., consumer_group=None)` separates agent identity from its consumer group. The default group uses the agent ID spelling. Set `consumer_group` when the deployment needs a different group.
38
38
 
@@ -74,7 +74,7 @@ Python uses the Rust client reconnect policy. TCP connections retry a failed dia
74
74
 
75
75
  `Laser.connect` calls Rust `Laser::connect`. Hosts under `*.laserdata.cloud` and `*.laserdata.com` use TLS with the bundled LaserData root CA. `LASER_TLS_CERT=<path>` selects an explicit certificate. `LASER_NO_TLS=1` disables automatic TLS. Other hosts retain their connection-string configuration.
76
76
 
77
- LaserData Cloud and Laser Stack enable managed surfaces only when their backend announcement reports ready. `await laser.refresh_capabilities()` re-probes a long-lived connection after startup or a backend restart. The returned `Capabilities` groups each managed surface: `caps.query` is a `QueryCaps` (`available`, `consistency`), `caps.kv` a `KvCaps` (`available`, `cas`, `fenced_leases`), `caps.filters` a `FilterCaps`, and `caps.destinations` a `DestinationCaps`. It also carries `versions: OpVersions | None` and the advertised backends. Apache Iggy keeps every managed surface off and reports no operation versions.
77
+ LaserData Cloud and Laser Stack enable managed surfaces only when their backend announcement reports ready. `await laser.refresh_capabilities()` re-probes a long-lived connection after startup or a backend restart. The returned `Capabilities` groups each managed surface: `caps.query` is a `QueryCaps` (`available`, `consistency`), `caps.kv` a `KvCaps` (`available`, `cas`, `fenced_leases`), `caps.filters` a `FilterCaps` (`native`, `catalog`, `group_policy_reads`, `evaluation`, and `max_wait_ms`, the longest filtered wait the server holds, zero when it holds none), and `caps.destinations` a `DestinationCaps`. It also carries `versions: OpVersions | None` and the advertised backends. Apache Iggy keeps every managed surface off and reports no operation versions.
78
78
 
79
79
  ## Connect timeout
80
80
 
@@ -101,6 +101,8 @@ print(committed.confirmations)
101
101
 
102
102
  Producers and publish builders return `SendMessagesResponse`. Each `SendMessagesConfirmationResponse` identifies a committed batch by stream, topic, partition, and first offset. The list can be empty when the server does not report offsets. Completion follows the topic durability policy.
103
103
 
104
+ On a cluster, `replication_factor` sets how many nodes store each partition of a topic the call creates, as in `readings.ensure(4, replication_factor=2)` or `readings.producer(partitions=4, replication_factor=2)`. It must be 1 to `MAX_REPLICATION_FACTOR` (32) and at most the node count. Without it the server's default applies, and an existing topic keeps its own. A factor outside 1 to 32 raises `InvalidError` before anything is sent, and the server's refusal of a factor above its node count raises `TransportError`.
105
+
104
106
  ## Batch and any payload
105
107
 
106
108
  `publish_batch` groups records for sending. A `topic(..).replay()` cursor reads retained records and saves the next offset for each partition. Each poll reads at most 10,000 messages per partition. Later polls resume from the saved offsets. Failed or canceled polls leave those offsets unchanged.
@@ -135,7 +137,7 @@ batch_committed = await producer.send_batch(
135
137
 
136
138
  consumer = topic.consumer_group("workers").consumer(
137
139
  batch_length=1000,
138
- poll_interval_ms=5,
140
+ max_wait_ms=5000,
139
141
  auto_commit="disabled",
140
142
  )
141
143
  await consumer.init()
@@ -148,7 +150,9 @@ finally:
148
150
  await consumer.shutdown()
149
151
  ```
150
152
 
151
- Header values accept ordinary Python scalar values. For an exact Apache Iggy numeric type, pass `(kind, value)`. `ConsumerMessage.header_kinds` reports the received types. The default `auto_commit="polling"` with `commit_interval_ms=0` matches the Rust default `Polling` policy. The other modes are `"all"`, `"each"`, `"every"` with `commit_every=`, `"interval"`, and `"disabled"`. A `commit_interval_ms` above zero adds a timer to the chosen mode, so `auto_commit="each"` with `commit_interval_ms=1000` stores on each message or each second. `"interval"` requires `commit_interval_ms` above zero. `next_within(wait_secs)` waits a bounded time and raises `TimeoutError` when nothing arrives, like Rust `next_within`.
153
+ Header values accept ordinary Python scalar values. For an exact Apache Iggy numeric type, pass `(kind, value)`. `ConsumerMessage.header_kinds` reports the received types. The default `auto_commit="polling"` with `commit_interval_ms=0` matches the Rust default `Polling` policy. The other modes are `"all"`, `"each"`, `"every"` with `commit_every=`, `"interval"`, and `"disabled"`. A `commit_interval_ms` above zero adds a timer to the chosen mode, so `auto_commit="each"` with `commit_interval_ms=1000` stores on each message or each second. `"interval"` requires `commit_interval_ms` above zero. `next_within(wait_secs)` waits a bounded time and raises `TimeoutError` when nothing arrives, like Rust `next_within`. A group consumer always resumes after the group's stored offset. Its `polling`, `offset` or `timestamp_micros` start only seeds a partition the group never stored, before its first read, and the native consumer of a server without group policy reads seeds only the partitions it holds when it joins, as [client behavior](../../docs/client-behavior.md#consumers-and-polling) describes.
154
+
155
+ Polls are held on the server. `max_wait_ms` (default 5000, 0 to 600000) is how long the server holds a poll that finds fewer than `min_count` new records (default 1, at most `batch_length`), and `max_bytes` (default 1048576) caps the record bytes of one reply. A new record ends the wait at once, so a caught-up consumer sees it without client-side polling. A group consumer always joins its group.
152
156
 
153
157
  With automatic commits disabled, call `commit(message)` after successful handling. `shutdown()` does not advance the offset past that commit. `Consumer` waits for new records. A `replay()` cursor reads retained records in bounded polls and stops its iterator when caught up.
154
158
 
@@ -354,7 +358,7 @@ safe_mode = ls.ConsumerFilter.json(
354
358
  )
355
359
  topic = laser.stream("orbit").topic("fleet_changes")
356
360
  group = topic.consumer_group("anomaly-desk")
357
- info = await group.create(filter=safe_mode) # Run once during setup.
361
+ info = await group.create(filter=safe_mode, filter_name="safe-mode") # Run once during setup.
358
362
 
359
363
  # Every consumer instance needs only the group name or info.id.
360
364
  consumer = group.consumer(batch_length=100, auto_commit="disabled")
@@ -368,13 +372,13 @@ finally:
368
372
 
369
373
  `batch_length=100` examines at most 100 source records per partition request. It may deliver fewer matches, including none. An empty scan advances over rejected records and does not mean end of stream. The consumer continues bounded scans and waits only when caught up. Manual `commit(record)` stores safe contiguous progress after processing. Automatic policies commit the delivered prefix at their configured cadence and at shutdown. The native Apache Iggy path retains its own documented commit timing.
370
374
 
371
- For batch handling, build `await group.reader(count=100, max_examined=1000)`, then use `next_page()` and `ack_page()`. `start=` takes `"next"`, `"first"`, `"last"`, `{"offset": n}`, or `{"timestamp": micros}`. Here `count` limits returned records, while `max_examined` independently limits the scan. Each reader joins as a member, and Iggy distributes partitions across instances. Acknowledgments preserve pending earlier work and reject stale source or policy generations. A reader keeps at most 1024 unacknowledged record-bearing pages per partition by default, so a reader that never acknowledges stops at that bound instead of growing without limit. Set `max_unacked_pages=` to change it.
375
+ For batch handling, build `await group.reader(count=100, max_examined=1000)`, then use `next_page()` and `ack_page()`. `start=` takes `"next"`, `"first"`, `"last"`, `{"offset": n}`, or `{"timestamp": micros}`. Here `count` limits returned records, while `max_examined` independently limits the scan. Each reader joins as a member, and Iggy distributes partitions across instances. Acknowledgments preserve pending earlier work and reject stale source or policy generations. A reader keeps at most 1024 unacknowledged record-bearing pages per partition by default, so a reader that never acknowledges stops at that bound instead of growing without limit. Set `max_unacked_pages=` to change it. After a round that found nothing new, the reader waits in a filtered wait the server holds until one of its partitions has a new record, at most `max_wait_ms` (default 5000) and the server's `caps.filters.max_wait_ms`. On a server that holds no filtered wait it sleeps `idle_interval_ms` instead. `ack`, `close` and the other reader calls end that wait, so they never wait for the server.
372
376
 
373
377
  For an application checkpoint inside a filtered page, call `await reader.ack_through(record)` after persisting the checkpoint and processing all preceding records on that partition. Later records in the same page stay pending. Use `ack_page` when the whole page is complete.
374
378
 
375
379
  Use separate groups for A/B revisions so their offsets remain independent, and pause or resume a revision with `set_revision_enabled`. A fresh named consumer with the default `polling="next"` starts at the first retained record, and a stable name resumes durable progress. On the native Apache Iggy path the default `auto_commit="polling"` commits each polled batch before delivery, so a later consumer can resume after records the application did not process. Disable auto-commit and commit after successful processing when that matters.
376
380
 
377
- `group.filter()` provides `configure`, `get`, `revisions`, `revise`, `set_revision_enabled`, `release`, `delete`, `preview` and `test`. `delete()` removes the group's own filter with every revision and releases the group first. Pass `operation_id` to configuration when setup must resume with the same operation ID after a lost reply. `topic.consumer_group_id(id)` addresses the saved group by numeric ID. Catalog failures, denied reads and paused revisions never broaden into unfiltered delivery. Original Apache Iggy uses native group consumption, while an older managed server without group-aware reads returns an explicit upgrade error.
381
+ `filter_name` is required with `filter`. It names the group's own filter in the catalog, follows the registered filter name rule (1 to 128 bytes of ASCII letters, digits, `-`, `_` and `.`) and need not be unique. `group.filter()` provides `configure(name, filter)`, `configure_with` and `configure_as` (`filter=` with `filter_name=`, or `filter_id=` with `revision=`), `get`, `summary`, `revisions`, `revise`, `set_revision_enabled`, `release`, `delete`, `preview` and `test`. Configuring the same digest under another name keeps the binding and renames the filter. `summary()` returns the group's own filter as a catalog row dict with the caller's `name` and the owning group under `owner`, or `None`. `delete()` removes the group's own filter with every revision and releases the group first. Pass `operation_id` to configuration when setup must resume with the same operation ID after a lost reply. `topic.consumer_group_id(id)` addresses the saved group by numeric ID. Catalog failures, denied reads and paused revisions never broaden into unfiltered delivery. Original Apache Iggy uses native group consumption, while an older managed server without group-aware reads returns an explicit upgrade error.
378
382
 
379
383
  Filters support JSON, CBOR, Avro, Protobuf and typed headers. Avro and Protobuf filters use registered writer schemas, immutable schema IDs in the filter, and the `agdx.sid` header on each record. Headers-only filters work with any payload format and never decode the payload. `CompiledFilter.compile(filter).evaluate(payload)` runs the evaluator locally, and `explain(payload)` returns its verdict tree. `FilterExpr.text(field, kind, pattern)` matches case-sensitively, and chaining `.case_insensitive()` ignores case. `with_fault_policy`, `with_foreign_policy` and `with_mismatch_policy` control invalid records. Passed invalid records and unfiltered records have `evaluated` false. Failures raise `FilterError` with a `reason`, and every `LaserError` carries `filter_reason`. A fault or oversized stop also sets `partition_id` and `offset`. Unknown header value kinds remain raw bytes. Malformed entries set `headers_malformed` while valid headers and the payload remain readable. A structurally truncated block has empty headers. A `next_record` call cancelled after it read a record yields that record again on the next call.
380
384
 
@@ -434,6 +438,8 @@ print(bytes(reply.payload).decode())
434
438
  await handle_agent.shutdown()
435
439
  ```
436
440
 
441
+ The agent's reads are held on the server: `max_wait_ms` (default 5000) is how long a read that finds nothing new waits before it answers, and a record ends the wait at once.
442
+
437
443
  Keep the handle until `shutdown()` or `join()`. Dropping it signals a graceful stop and cancels periodic consolidation, and `abort()` stops the agent immediately. `async with laser.spawn_agent(...) as handle:` waits for readiness and stops the agent on exit.
438
444
 
439
445
  Each agent id reads through its own consumer group, named after the agent id unless `consumer_group=` names another, so every instance of one agent shares its work. The handler only sees work for this agent: commands addressed to it or to every agent. Replies, status records, and records for other agents are committed without calling it. On `agent.sessions` and `agent.control`, when the server resolves group policies and serves filtered reads and the filter catalog, the group is bound to the addressee filter `agdx.to In [<agent id>, "*"]` before the first read, so the server sends only those records. Otherwise the agent reads every record and sorts them itself. [Agents, groups, and layouts](../../docs/building-agents.md#agents-groups-and-layouts) explains how to pick a layout.
@@ -779,7 +785,7 @@ later = await session.turns_since(ls.Checkpoint.from_json(saved))
779
785
 
780
786
  `laser.context(conversation)` returns a `ContextScope`. Its `fetch(n=50, token_budget=)` and `block` read `agent.sessions` unless `topics=` names others, and return `ContextMessage` records (`id`, `provenance`, `payload`, `envelope`, `topic`). `fetch_with(topics, Chain([LastN(20), TokenBudget(4_000)]))` takes the policy objects `LastN`, `TokenBudget(max_tokens, estimator=None)`, `RoleFilter(agents)`, and `Chain`. `state(topics, init, fold, last_n=|from_offsets=|from_checkpoint=|at=|full=True)`, `state_with(store, topics, init, fold)`, and `checkpoint(topics)` fold the conversation log like Rust. `context_checkpoint(laser, topics)` captures a checkpoint without a conversation, and `ConversationState.load(laser, conversation, topics, init, fold)` folds one directly with the same bounds. Each read covers at most the newest `CONTEXT_READ_WINDOW` (10,000) messages per partition.
781
787
 
782
- `ContextMessage` also carries `timestamp_micros`, the broker append time, and the numeric `stream_id` and `topic_id`. `LastN`, `TokenBudget`, `RoleFilter`, and `Chain` report `name`, `version`, and `selection(history)`, which a context manifest records. A custom policy can set `name` and `version` attributes. Every SDK estimates tokens the same way: the byte count divided by four, rounded up.
788
+ `ContextMessage` also carries `timestamp_micros`, the server append time, and the numeric `stream_id` and `topic_id`. `LastN`, `TokenBudget`, `RoleFilter`, and `Chain` report `name`, `version`, and `selection(history)`, which a context manifest records. A custom policy can set `name` and `version` attributes. Every SDK estimates tokens the same way: the byte count divided by four, rounded up.
783
789
 
784
790
  ## Memory and state
785
791
 
@@ -4,7 +4,7 @@ This package provides the Python Laser SDK for Apache Iggy. [LaserData, Inc.](ht
4
4
 
5
5
  Rust and Python share the data contract and Rust implementation. The bindings expose Python forms of the SDK operations, configuration, and errors. Shared examples and behavior scenarios cover language-neutral behavior.
6
6
 
7
- > This source tree targets `0.8.0`. The wire contract and public API use semantic versioning. Before `1.0.0`, minor releases can contain breaking changes.
7
+ > This source tree targets `0.9.0-dev.3`. The wire contract and public API use semantic versioning. Before `1.0.0`, minor releases can contain breaking changes.
8
8
 
9
9
  `spawn_agent(agent_id, ..., consumer_group=None)` separates agent identity from its consumer group. The default group uses the agent ID spelling. Set `consumer_group` when the deployment needs a different group.
10
10
 
@@ -46,7 +46,7 @@ Python uses the Rust client reconnect policy. TCP connections retry a failed dia
46
46
 
47
47
  `Laser.connect` calls Rust `Laser::connect`. Hosts under `*.laserdata.cloud` and `*.laserdata.com` use TLS with the bundled LaserData root CA. `LASER_TLS_CERT=<path>` selects an explicit certificate. `LASER_NO_TLS=1` disables automatic TLS. Other hosts retain their connection-string configuration.
48
48
 
49
- LaserData Cloud and Laser Stack enable managed surfaces only when their backend announcement reports ready. `await laser.refresh_capabilities()` re-probes a long-lived connection after startup or a backend restart. The returned `Capabilities` groups each managed surface: `caps.query` is a `QueryCaps` (`available`, `consistency`), `caps.kv` a `KvCaps` (`available`, `cas`, `fenced_leases`), `caps.filters` a `FilterCaps`, and `caps.destinations` a `DestinationCaps`. It also carries `versions: OpVersions | None` and the advertised backends. Apache Iggy keeps every managed surface off and reports no operation versions.
49
+ LaserData Cloud and Laser Stack enable managed surfaces only when their backend announcement reports ready. `await laser.refresh_capabilities()` re-probes a long-lived connection after startup or a backend restart. The returned `Capabilities` groups each managed surface: `caps.query` is a `QueryCaps` (`available`, `consistency`), `caps.kv` a `KvCaps` (`available`, `cas`, `fenced_leases`), `caps.filters` a `FilterCaps` (`native`, `catalog`, `group_policy_reads`, `evaluation`, and `max_wait_ms`, the longest filtered wait the server holds, zero when it holds none), and `caps.destinations` a `DestinationCaps`. It also carries `versions: OpVersions | None` and the advertised backends. Apache Iggy keeps every managed surface off and reports no operation versions.
50
50
 
51
51
  ## Connect timeout
52
52
 
@@ -73,6 +73,8 @@ print(committed.confirmations)
73
73
 
74
74
  Producers and publish builders return `SendMessagesResponse`. Each `SendMessagesConfirmationResponse` identifies a committed batch by stream, topic, partition, and first offset. The list can be empty when the server does not report offsets. Completion follows the topic durability policy.
75
75
 
76
+ On a cluster, `replication_factor` sets how many nodes store each partition of a topic the call creates, as in `readings.ensure(4, replication_factor=2)` or `readings.producer(partitions=4, replication_factor=2)`. It must be 1 to `MAX_REPLICATION_FACTOR` (32) and at most the node count. Without it the server's default applies, and an existing topic keeps its own. A factor outside 1 to 32 raises `InvalidError` before anything is sent, and the server's refusal of a factor above its node count raises `TransportError`.
77
+
76
78
  ## Batch and any payload
77
79
 
78
80
  `publish_batch` groups records for sending. A `topic(..).replay()` cursor reads retained records and saves the next offset for each partition. Each poll reads at most 10,000 messages per partition. Later polls resume from the saved offsets. Failed or canceled polls leave those offsets unchanged.
@@ -107,7 +109,7 @@ batch_committed = await producer.send_batch(
107
109
 
108
110
  consumer = topic.consumer_group("workers").consumer(
109
111
  batch_length=1000,
110
- poll_interval_ms=5,
112
+ max_wait_ms=5000,
111
113
  auto_commit="disabled",
112
114
  )
113
115
  await consumer.init()
@@ -120,7 +122,9 @@ finally:
120
122
  await consumer.shutdown()
121
123
  ```
122
124
 
123
- Header values accept ordinary Python scalar values. For an exact Apache Iggy numeric type, pass `(kind, value)`. `ConsumerMessage.header_kinds` reports the received types. The default `auto_commit="polling"` with `commit_interval_ms=0` matches the Rust default `Polling` policy. The other modes are `"all"`, `"each"`, `"every"` with `commit_every=`, `"interval"`, and `"disabled"`. A `commit_interval_ms` above zero adds a timer to the chosen mode, so `auto_commit="each"` with `commit_interval_ms=1000` stores on each message or each second. `"interval"` requires `commit_interval_ms` above zero. `next_within(wait_secs)` waits a bounded time and raises `TimeoutError` when nothing arrives, like Rust `next_within`.
125
+ Header values accept ordinary Python scalar values. For an exact Apache Iggy numeric type, pass `(kind, value)`. `ConsumerMessage.header_kinds` reports the received types. The default `auto_commit="polling"` with `commit_interval_ms=0` matches the Rust default `Polling` policy. The other modes are `"all"`, `"each"`, `"every"` with `commit_every=`, `"interval"`, and `"disabled"`. A `commit_interval_ms` above zero adds a timer to the chosen mode, so `auto_commit="each"` with `commit_interval_ms=1000` stores on each message or each second. `"interval"` requires `commit_interval_ms` above zero. `next_within(wait_secs)` waits a bounded time and raises `TimeoutError` when nothing arrives, like Rust `next_within`. A group consumer always resumes after the group's stored offset. Its `polling`, `offset` or `timestamp_micros` start only seeds a partition the group never stored, before its first read, and the native consumer of a server without group policy reads seeds only the partitions it holds when it joins, as [client behavior](../../docs/client-behavior.md#consumers-and-polling) describes.
126
+
127
+ Polls are held on the server. `max_wait_ms` (default 5000, 0 to 600000) is how long the server holds a poll that finds fewer than `min_count` new records (default 1, at most `batch_length`), and `max_bytes` (default 1048576) caps the record bytes of one reply. A new record ends the wait at once, so a caught-up consumer sees it without client-side polling. A group consumer always joins its group.
124
128
 
125
129
  With automatic commits disabled, call `commit(message)` after successful handling. `shutdown()` does not advance the offset past that commit. `Consumer` waits for new records. A `replay()` cursor reads retained records in bounded polls and stops its iterator when caught up.
126
130
 
@@ -326,7 +330,7 @@ safe_mode = ls.ConsumerFilter.json(
326
330
  )
327
331
  topic = laser.stream("orbit").topic("fleet_changes")
328
332
  group = topic.consumer_group("anomaly-desk")
329
- info = await group.create(filter=safe_mode) # Run once during setup.
333
+ info = await group.create(filter=safe_mode, filter_name="safe-mode") # Run once during setup.
330
334
 
331
335
  # Every consumer instance needs only the group name or info.id.
332
336
  consumer = group.consumer(batch_length=100, auto_commit="disabled")
@@ -340,13 +344,13 @@ finally:
340
344
 
341
345
  `batch_length=100` examines at most 100 source records per partition request. It may deliver fewer matches, including none. An empty scan advances over rejected records and does not mean end of stream. The consumer continues bounded scans and waits only when caught up. Manual `commit(record)` stores safe contiguous progress after processing. Automatic policies commit the delivered prefix at their configured cadence and at shutdown. The native Apache Iggy path retains its own documented commit timing.
342
346
 
343
- For batch handling, build `await group.reader(count=100, max_examined=1000)`, then use `next_page()` and `ack_page()`. `start=` takes `"next"`, `"first"`, `"last"`, `{"offset": n}`, or `{"timestamp": micros}`. Here `count` limits returned records, while `max_examined` independently limits the scan. Each reader joins as a member, and Iggy distributes partitions across instances. Acknowledgments preserve pending earlier work and reject stale source or policy generations. A reader keeps at most 1024 unacknowledged record-bearing pages per partition by default, so a reader that never acknowledges stops at that bound instead of growing without limit. Set `max_unacked_pages=` to change it.
347
+ For batch handling, build `await group.reader(count=100, max_examined=1000)`, then use `next_page()` and `ack_page()`. `start=` takes `"next"`, `"first"`, `"last"`, `{"offset": n}`, or `{"timestamp": micros}`. Here `count` limits returned records, while `max_examined` independently limits the scan. Each reader joins as a member, and Iggy distributes partitions across instances. Acknowledgments preserve pending earlier work and reject stale source or policy generations. A reader keeps at most 1024 unacknowledged record-bearing pages per partition by default, so a reader that never acknowledges stops at that bound instead of growing without limit. Set `max_unacked_pages=` to change it. After a round that found nothing new, the reader waits in a filtered wait the server holds until one of its partitions has a new record, at most `max_wait_ms` (default 5000) and the server's `caps.filters.max_wait_ms`. On a server that holds no filtered wait it sleeps `idle_interval_ms` instead. `ack`, `close` and the other reader calls end that wait, so they never wait for the server.
344
348
 
345
349
  For an application checkpoint inside a filtered page, call `await reader.ack_through(record)` after persisting the checkpoint and processing all preceding records on that partition. Later records in the same page stay pending. Use `ack_page` when the whole page is complete.
346
350
 
347
351
  Use separate groups for A/B revisions so their offsets remain independent, and pause or resume a revision with `set_revision_enabled`. A fresh named consumer with the default `polling="next"` starts at the first retained record, and a stable name resumes durable progress. On the native Apache Iggy path the default `auto_commit="polling"` commits each polled batch before delivery, so a later consumer can resume after records the application did not process. Disable auto-commit and commit after successful processing when that matters.
348
352
 
349
- `group.filter()` provides `configure`, `get`, `revisions`, `revise`, `set_revision_enabled`, `release`, `delete`, `preview` and `test`. `delete()` removes the group's own filter with every revision and releases the group first. Pass `operation_id` to configuration when setup must resume with the same operation ID after a lost reply. `topic.consumer_group_id(id)` addresses the saved group by numeric ID. Catalog failures, denied reads and paused revisions never broaden into unfiltered delivery. Original Apache Iggy uses native group consumption, while an older managed server without group-aware reads returns an explicit upgrade error.
353
+ `filter_name` is required with `filter`. It names the group's own filter in the catalog, follows the registered filter name rule (1 to 128 bytes of ASCII letters, digits, `-`, `_` and `.`) and need not be unique. `group.filter()` provides `configure(name, filter)`, `configure_with` and `configure_as` (`filter=` with `filter_name=`, or `filter_id=` with `revision=`), `get`, `summary`, `revisions`, `revise`, `set_revision_enabled`, `release`, `delete`, `preview` and `test`. Configuring the same digest under another name keeps the binding and renames the filter. `summary()` returns the group's own filter as a catalog row dict with the caller's `name` and the owning group under `owner`, or `None`. `delete()` removes the group's own filter with every revision and releases the group first. Pass `operation_id` to configuration when setup must resume with the same operation ID after a lost reply. `topic.consumer_group_id(id)` addresses the saved group by numeric ID. Catalog failures, denied reads and paused revisions never broaden into unfiltered delivery. Original Apache Iggy uses native group consumption, while an older managed server without group-aware reads returns an explicit upgrade error.
350
354
 
351
355
  Filters support JSON, CBOR, Avro, Protobuf and typed headers. Avro and Protobuf filters use registered writer schemas, immutable schema IDs in the filter, and the `agdx.sid` header on each record. Headers-only filters work with any payload format and never decode the payload. `CompiledFilter.compile(filter).evaluate(payload)` runs the evaluator locally, and `explain(payload)` returns its verdict tree. `FilterExpr.text(field, kind, pattern)` matches case-sensitively, and chaining `.case_insensitive()` ignores case. `with_fault_policy`, `with_foreign_policy` and `with_mismatch_policy` control invalid records. Passed invalid records and unfiltered records have `evaluated` false. Failures raise `FilterError` with a `reason`, and every `LaserError` carries `filter_reason`. A fault or oversized stop also sets `partition_id` and `offset`. Unknown header value kinds remain raw bytes. Malformed entries set `headers_malformed` while valid headers and the payload remain readable. A structurally truncated block has empty headers. A `next_record` call cancelled after it read a record yields that record again on the next call.
352
356
 
@@ -406,6 +410,8 @@ print(bytes(reply.payload).decode())
406
410
  await handle_agent.shutdown()
407
411
  ```
408
412
 
413
+ The agent's reads are held on the server: `max_wait_ms` (default 5000) is how long a read that finds nothing new waits before it answers, and a record ends the wait at once.
414
+
409
415
  Keep the handle until `shutdown()` or `join()`. Dropping it signals a graceful stop and cancels periodic consolidation, and `abort()` stops the agent immediately. `async with laser.spawn_agent(...) as handle:` waits for readiness and stops the agent on exit.
410
416
 
411
417
  Each agent id reads through its own consumer group, named after the agent id unless `consumer_group=` names another, so every instance of one agent shares its work. The handler only sees work for this agent: commands addressed to it or to every agent. Replies, status records, and records for other agents are committed without calling it. On `agent.sessions` and `agent.control`, when the server resolves group policies and serves filtered reads and the filter catalog, the group is bound to the addressee filter `agdx.to In [<agent id>, "*"]` before the first read, so the server sends only those records. Otherwise the agent reads every record and sorts them itself. [Agents, groups, and layouts](../../docs/building-agents.md#agents-groups-and-layouts) explains how to pick a layout.
@@ -751,7 +757,7 @@ later = await session.turns_since(ls.Checkpoint.from_json(saved))
751
757
 
752
758
  `laser.context(conversation)` returns a `ContextScope`. Its `fetch(n=50, token_budget=)` and `block` read `agent.sessions` unless `topics=` names others, and return `ContextMessage` records (`id`, `provenance`, `payload`, `envelope`, `topic`). `fetch_with(topics, Chain([LastN(20), TokenBudget(4_000)]))` takes the policy objects `LastN`, `TokenBudget(max_tokens, estimator=None)`, `RoleFilter(agents)`, and `Chain`. `state(topics, init, fold, last_n=|from_offsets=|from_checkpoint=|at=|full=True)`, `state_with(store, topics, init, fold)`, and `checkpoint(topics)` fold the conversation log like Rust. `context_checkpoint(laser, topics)` captures a checkpoint without a conversation, and `ConversationState.load(laser, conversation, topics, init, fold)` folds one directly with the same bounds. Each read covers at most the newest `CONTEXT_READ_WINDOW` (10,000) messages per partition.
753
759
 
754
- `ContextMessage` also carries `timestamp_micros`, the broker append time, and the numeric `stream_id` and `topic_id`. `LastN`, `TokenBudget`, `RoleFilter`, and `Chain` report `name`, `version`, and `selection(history)`, which a context manifest records. A custom policy can set `name` and `version` attributes. Every SDK estimates tokens the same way: the byte count divided by four, rounded up.
760
+ `ContextMessage` also carries `timestamp_micros`, the server append time, and the numeric `stream_id` and `topic_id`. `LastN`, `TokenBudget`, `RoleFilter`, and `Chain` report `name`, `version`, and `selection(history)`, which a context manifest records. A custom policy can set `name` and `version` attributes. Every SDK estimates tokens the same way: the byte count divided by four, rounded up.
755
761
 
756
762
  ## Memory and state
757
763
 
@@ -1655,9 +1655,9 @@ dependencies = [
1655
1655
 
1656
1656
  [[package]]
1657
1657
  name = "iggy"
1658
- version = "0.11.1-edge.4"
1658
+ version = "0.11.1-edge.9"
1659
1659
  source = "registry+https://github.com/rust-lang/crates.io-index"
1660
- checksum = "a9fc5e5f9e7fabb5285059b2f9be2171b35fa2f86f34b0a6aa2c2f72512a210f"
1660
+ checksum = "2c9b83c24f73c6cd17f0b2a364dbfe0cad895eba5bb32b32fc2c5e1df2d84aee"
1661
1661
  dependencies = [
1662
1662
  "async-broadcast",
1663
1663
  "async-dropper",
@@ -1693,9 +1693,9 @@ dependencies = [
1693
1693
 
1694
1694
  [[package]]
1695
1695
  name = "iggy_binary_protocol"
1696
- version = "0.11.1-edge.3"
1696
+ version = "0.11.1-edge.8"
1697
1697
  source = "registry+https://github.com/rust-lang/crates.io-index"
1698
- checksum = "5d321043322fc82fa261abc37431cb9a7ebd0c1c510a7ae1ab42106e626baea8"
1698
+ checksum = "100cfadd4d45558876544a8eed23a86d730c66d550deef18a42d239d3c7e03bb"
1699
1699
  dependencies = [
1700
1700
  "bytemuck",
1701
1701
  "bytes",
@@ -1709,9 +1709,9 @@ dependencies = [
1709
1709
 
1710
1710
  [[package]]
1711
1711
  name = "iggy_common"
1712
- version = "0.11.1-edge.4"
1712
+ version = "0.11.1-edge.10"
1713
1713
  source = "registry+https://github.com/rust-lang/crates.io-index"
1714
- checksum = "6d7d4fa0be64597fa9b2f4c79e36cccab20f28b85fa867e83103ca269e5ae377"
1714
+ checksum = "788e55b79b0a750f0a1326937ce34b51828dda3cc7fbf09f81a9b99cce1e24a1"
1715
1715
  dependencies = [
1716
1716
  "aes-gcm",
1717
1717
  "aes-gcm-siv",
@@ -1729,6 +1729,7 @@ dependencies = [
1729
1729
  "humantime",
1730
1730
  "iggy_binary_protocol",
1731
1731
  "papaya",
1732
+ "pin-project-lite",
1732
1733
  "ring",
1733
1734
  "secrecy",
1734
1735
  "serde",
@@ -2042,7 +2043,7 @@ checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553"
2042
2043
 
2043
2044
  [[package]]
2044
2045
  name = "laser-sdk"
2045
- version = "0.9.0-dev.1"
2046
+ version = "0.9.0-dev.3"
2046
2047
  dependencies = [
2047
2048
  "apache-avro",
2048
2049
  "async-trait",
@@ -2071,7 +2072,7 @@ dependencies = [
2071
2072
 
2072
2073
  [[package]]
2073
2074
  name = "laser-sdk-python"
2074
- version = "0.9.0-dev.1"
2075
+ version = "0.9.0-dev.3"
2075
2076
  dependencies = [
2076
2077
  "async-trait",
2077
2078
  "bytes",
@@ -2090,7 +2091,7 @@ dependencies = [
2090
2091
 
2091
2092
  [[package]]
2092
2093
  name = "laser-wire"
2093
- version = "0.9.0-dev.1"
2094
+ version = "0.9.0-dev.3"
2094
2095
  dependencies = [
2095
2096
  "apache-avro",
2096
2097
  "bon",
@@ -6,7 +6,7 @@ name = "laser-sdk-python"
6
6
  # The Python package version tracks the Rust workspace release train (one
7
7
  # version across laser-wire, laser-sdk, and the Python SDK), and the dependency
8
8
  # below tracks the Rust laser-sdk it wraps.
9
- version = "0.9.0-dev.1"
9
+ version = "0.9.0-dev.3"
10
10
  edition = "2024"
11
11
  license = "Apache-2.0"
12
12
  repository = "https://github.com/laserdata/laser-sdk"
@@ -34,11 +34,11 @@ extension-module = ["pyo3/extension-module"]
34
34
  [dependencies]
35
35
  async-trait = "0.1.92"
36
36
  bytes = "1.12.1"
37
- iggy = { version = "0.11.1-edge.4" }
37
+ iggy = { version = "0.11.1-edge.9" }
38
38
  # Path wins for the in-monorepo wheel build. The version lets a source build (an
39
39
  # sdist on a platform with no prebuilt wheel) fetch laser-sdk from crates.io once
40
40
  # it is published. Wheels carry it compiled in and pull nothing at install.
41
- laser-sdk = { path = "../../sdk", version = "0.9.0-dev.1", features = ["a2a-bridge", "agent", "agui", "managed", "mcp-bridge", "provenance", "schema-codecs", "sign", "streaming"] }
41
+ laser-sdk = { path = "../../sdk", version = "0.9.0-dev.3", features = ["a2a-bridge", "agent", "agui", "managed", "mcp-bridge", "provenance", "schema-codecs", "sign", "streaming"] }
42
42
  log = "0.4"
43
43
  pyo3 = { version = "0.29.3", features = ["abi3-py310", "experimental-async", "multiple-pymethods"] }
44
44
  pyo3-async-runtimes = { version = "0.29.0", features = ["attributes", "tokio-runtime"] }
@@ -4,7 +4,7 @@ This package provides the Python Laser SDK for Apache Iggy. [LaserData, Inc.](ht
4
4
 
5
5
  Rust and Python share the data contract and Rust implementation. The bindings expose Python forms of the SDK operations, configuration, and errors. Shared examples and behavior scenarios cover language-neutral behavior.
6
6
 
7
- > This source tree targets `0.8.0`. The wire contract and public API use semantic versioning. Before `1.0.0`, minor releases can contain breaking changes.
7
+ > This source tree targets `0.9.0-dev.3`. The wire contract and public API use semantic versioning. Before `1.0.0`, minor releases can contain breaking changes.
8
8
 
9
9
  `spawn_agent(agent_id, ..., consumer_group=None)` separates agent identity from its consumer group. The default group uses the agent ID spelling. Set `consumer_group` when the deployment needs a different group.
10
10
 
@@ -46,7 +46,7 @@ Python uses the Rust client reconnect policy. TCP connections retry a failed dia
46
46
 
47
47
  `Laser.connect` calls Rust `Laser::connect`. Hosts under `*.laserdata.cloud` and `*.laserdata.com` use TLS with the bundled LaserData root CA. `LASER_TLS_CERT=<path>` selects an explicit certificate. `LASER_NO_TLS=1` disables automatic TLS. Other hosts retain their connection-string configuration.
48
48
 
49
- LaserData Cloud and Laser Stack enable managed surfaces only when their backend announcement reports ready. `await laser.refresh_capabilities()` re-probes a long-lived connection after startup or a backend restart. The returned `Capabilities` groups each managed surface: `caps.query` is a `QueryCaps` (`available`, `consistency`), `caps.kv` a `KvCaps` (`available`, `cas`, `fenced_leases`), `caps.filters` a `FilterCaps`, and `caps.destinations` a `DestinationCaps`. It also carries `versions: OpVersions | None` and the advertised backends. Apache Iggy keeps every managed surface off and reports no operation versions.
49
+ LaserData Cloud and Laser Stack enable managed surfaces only when their backend announcement reports ready. `await laser.refresh_capabilities()` re-probes a long-lived connection after startup or a backend restart. The returned `Capabilities` groups each managed surface: `caps.query` is a `QueryCaps` (`available`, `consistency`), `caps.kv` a `KvCaps` (`available`, `cas`, `fenced_leases`), `caps.filters` a `FilterCaps` (`native`, `catalog`, `group_policy_reads`, `evaluation`, and `max_wait_ms`, the longest filtered wait the server holds, zero when it holds none), and `caps.destinations` a `DestinationCaps`. It also carries `versions: OpVersions | None` and the advertised backends. Apache Iggy keeps every managed surface off and reports no operation versions.
50
50
 
51
51
  ## Connect timeout
52
52
 
@@ -73,6 +73,8 @@ print(committed.confirmations)
73
73
 
74
74
  Producers and publish builders return `SendMessagesResponse`. Each `SendMessagesConfirmationResponse` identifies a committed batch by stream, topic, partition, and first offset. The list can be empty when the server does not report offsets. Completion follows the topic durability policy.
75
75
 
76
+ On a cluster, `replication_factor` sets how many nodes store each partition of a topic the call creates, as in `readings.ensure(4, replication_factor=2)` or `readings.producer(partitions=4, replication_factor=2)`. It must be 1 to `MAX_REPLICATION_FACTOR` (32) and at most the node count. Without it the server's default applies, and an existing topic keeps its own. A factor outside 1 to 32 raises `InvalidError` before anything is sent, and the server's refusal of a factor above its node count raises `TransportError`.
77
+
76
78
  ## Batch and any payload
77
79
 
78
80
  `publish_batch` groups records for sending. A `topic(..).replay()` cursor reads retained records and saves the next offset for each partition. Each poll reads at most 10,000 messages per partition. Later polls resume from the saved offsets. Failed or canceled polls leave those offsets unchanged.
@@ -107,7 +109,7 @@ batch_committed = await producer.send_batch(
107
109
 
108
110
  consumer = topic.consumer_group("workers").consumer(
109
111
  batch_length=1000,
110
- poll_interval_ms=5,
112
+ max_wait_ms=5000,
111
113
  auto_commit="disabled",
112
114
  )
113
115
  await consumer.init()
@@ -120,7 +122,9 @@ finally:
120
122
  await consumer.shutdown()
121
123
  ```
122
124
 
123
- Header values accept ordinary Python scalar values. For an exact Apache Iggy numeric type, pass `(kind, value)`. `ConsumerMessage.header_kinds` reports the received types. The default `auto_commit="polling"` with `commit_interval_ms=0` matches the Rust default `Polling` policy. The other modes are `"all"`, `"each"`, `"every"` with `commit_every=`, `"interval"`, and `"disabled"`. A `commit_interval_ms` above zero adds a timer to the chosen mode, so `auto_commit="each"` with `commit_interval_ms=1000` stores on each message or each second. `"interval"` requires `commit_interval_ms` above zero. `next_within(wait_secs)` waits a bounded time and raises `TimeoutError` when nothing arrives, like Rust `next_within`.
125
+ Header values accept ordinary Python scalar values. For an exact Apache Iggy numeric type, pass `(kind, value)`. `ConsumerMessage.header_kinds` reports the received types. The default `auto_commit="polling"` with `commit_interval_ms=0` matches the Rust default `Polling` policy. The other modes are `"all"`, `"each"`, `"every"` with `commit_every=`, `"interval"`, and `"disabled"`. A `commit_interval_ms` above zero adds a timer to the chosen mode, so `auto_commit="each"` with `commit_interval_ms=1000` stores on each message or each second. `"interval"` requires `commit_interval_ms` above zero. `next_within(wait_secs)` waits a bounded time and raises `TimeoutError` when nothing arrives, like Rust `next_within`. A group consumer always resumes after the group's stored offset. Its `polling`, `offset` or `timestamp_micros` start only seeds a partition the group never stored, before its first read, and the native consumer of a server without group policy reads seeds only the partitions it holds when it joins, as [client behavior](../../docs/client-behavior.md#consumers-and-polling) describes.
126
+
127
+ Polls are held on the server. `max_wait_ms` (default 5000, 0 to 600000) is how long the server holds a poll that finds fewer than `min_count` new records (default 1, at most `batch_length`), and `max_bytes` (default 1048576) caps the record bytes of one reply. A new record ends the wait at once, so a caught-up consumer sees it without client-side polling. A group consumer always joins its group.
124
128
 
125
129
  With automatic commits disabled, call `commit(message)` after successful handling. `shutdown()` does not advance the offset past that commit. `Consumer` waits for new records. A `replay()` cursor reads retained records in bounded polls and stops its iterator when caught up.
126
130
 
@@ -326,7 +330,7 @@ safe_mode = ls.ConsumerFilter.json(
326
330
  )
327
331
  topic = laser.stream("orbit").topic("fleet_changes")
328
332
  group = topic.consumer_group("anomaly-desk")
329
- info = await group.create(filter=safe_mode) # Run once during setup.
333
+ info = await group.create(filter=safe_mode, filter_name="safe-mode") # Run once during setup.
330
334
 
331
335
  # Every consumer instance needs only the group name or info.id.
332
336
  consumer = group.consumer(batch_length=100, auto_commit="disabled")
@@ -340,13 +344,13 @@ finally:
340
344
 
341
345
  `batch_length=100` examines at most 100 source records per partition request. It may deliver fewer matches, including none. An empty scan advances over rejected records and does not mean end of stream. The consumer continues bounded scans and waits only when caught up. Manual `commit(record)` stores safe contiguous progress after processing. Automatic policies commit the delivered prefix at their configured cadence and at shutdown. The native Apache Iggy path retains its own documented commit timing.
342
346
 
343
- For batch handling, build `await group.reader(count=100, max_examined=1000)`, then use `next_page()` and `ack_page()`. `start=` takes `"next"`, `"first"`, `"last"`, `{"offset": n}`, or `{"timestamp": micros}`. Here `count` limits returned records, while `max_examined` independently limits the scan. Each reader joins as a member, and Iggy distributes partitions across instances. Acknowledgments preserve pending earlier work and reject stale source or policy generations. A reader keeps at most 1024 unacknowledged record-bearing pages per partition by default, so a reader that never acknowledges stops at that bound instead of growing without limit. Set `max_unacked_pages=` to change it.
347
+ For batch handling, build `await group.reader(count=100, max_examined=1000)`, then use `next_page()` and `ack_page()`. `start=` takes `"next"`, `"first"`, `"last"`, `{"offset": n}`, or `{"timestamp": micros}`. Here `count` limits returned records, while `max_examined` independently limits the scan. Each reader joins as a member, and Iggy distributes partitions across instances. Acknowledgments preserve pending earlier work and reject stale source or policy generations. A reader keeps at most 1024 unacknowledged record-bearing pages per partition by default, so a reader that never acknowledges stops at that bound instead of growing without limit. Set `max_unacked_pages=` to change it. After a round that found nothing new, the reader waits in a filtered wait the server holds until one of its partitions has a new record, at most `max_wait_ms` (default 5000) and the server's `caps.filters.max_wait_ms`. On a server that holds no filtered wait it sleeps `idle_interval_ms` instead. `ack`, `close` and the other reader calls end that wait, so they never wait for the server.
344
348
 
345
349
  For an application checkpoint inside a filtered page, call `await reader.ack_through(record)` after persisting the checkpoint and processing all preceding records on that partition. Later records in the same page stay pending. Use `ack_page` when the whole page is complete.
346
350
 
347
351
  Use separate groups for A/B revisions so their offsets remain independent, and pause or resume a revision with `set_revision_enabled`. A fresh named consumer with the default `polling="next"` starts at the first retained record, and a stable name resumes durable progress. On the native Apache Iggy path the default `auto_commit="polling"` commits each polled batch before delivery, so a later consumer can resume after records the application did not process. Disable auto-commit and commit after successful processing when that matters.
348
352
 
349
- `group.filter()` provides `configure`, `get`, `revisions`, `revise`, `set_revision_enabled`, `release`, `delete`, `preview` and `test`. `delete()` removes the group's own filter with every revision and releases the group first. Pass `operation_id` to configuration when setup must resume with the same operation ID after a lost reply. `topic.consumer_group_id(id)` addresses the saved group by numeric ID. Catalog failures, denied reads and paused revisions never broaden into unfiltered delivery. Original Apache Iggy uses native group consumption, while an older managed server without group-aware reads returns an explicit upgrade error.
353
+ `filter_name` is required with `filter`. It names the group's own filter in the catalog, follows the registered filter name rule (1 to 128 bytes of ASCII letters, digits, `-`, `_` and `.`) and need not be unique. `group.filter()` provides `configure(name, filter)`, `configure_with` and `configure_as` (`filter=` with `filter_name=`, or `filter_id=` with `revision=`), `get`, `summary`, `revisions`, `revise`, `set_revision_enabled`, `release`, `delete`, `preview` and `test`. Configuring the same digest under another name keeps the binding and renames the filter. `summary()` returns the group's own filter as a catalog row dict with the caller's `name` and the owning group under `owner`, or `None`. `delete()` removes the group's own filter with every revision and releases the group first. Pass `operation_id` to configuration when setup must resume with the same operation ID after a lost reply. `topic.consumer_group_id(id)` addresses the saved group by numeric ID. Catalog failures, denied reads and paused revisions never broaden into unfiltered delivery. Original Apache Iggy uses native group consumption, while an older managed server without group-aware reads returns an explicit upgrade error.
350
354
 
351
355
  Filters support JSON, CBOR, Avro, Protobuf and typed headers. Avro and Protobuf filters use registered writer schemas, immutable schema IDs in the filter, and the `agdx.sid` header on each record. Headers-only filters work with any payload format and never decode the payload. `CompiledFilter.compile(filter).evaluate(payload)` runs the evaluator locally, and `explain(payload)` returns its verdict tree. `FilterExpr.text(field, kind, pattern)` matches case-sensitively, and chaining `.case_insensitive()` ignores case. `with_fault_policy`, `with_foreign_policy` and `with_mismatch_policy` control invalid records. Passed invalid records and unfiltered records have `evaluated` false. Failures raise `FilterError` with a `reason`, and every `LaserError` carries `filter_reason`. A fault or oversized stop also sets `partition_id` and `offset`. Unknown header value kinds remain raw bytes. Malformed entries set `headers_malformed` while valid headers and the payload remain readable. A structurally truncated block has empty headers. A `next_record` call cancelled after it read a record yields that record again on the next call.
352
356
 
@@ -406,6 +410,8 @@ print(bytes(reply.payload).decode())
406
410
  await handle_agent.shutdown()
407
411
  ```
408
412
 
413
+ The agent's reads are held on the server: `max_wait_ms` (default 5000) is how long a read that finds nothing new waits before it answers, and a record ends the wait at once.
414
+
409
415
  Keep the handle until `shutdown()` or `join()`. Dropping it signals a graceful stop and cancels periodic consolidation, and `abort()` stops the agent immediately. `async with laser.spawn_agent(...) as handle:` waits for readiness and stops the agent on exit.
410
416
 
411
417
  Each agent id reads through its own consumer group, named after the agent id unless `consumer_group=` names another, so every instance of one agent shares its work. The handler only sees work for this agent: commands addressed to it or to every agent. Replies, status records, and records for other agents are committed without calling it. On `agent.sessions` and `agent.control`, when the server resolves group policies and serves filtered reads and the filter catalog, the group is bound to the addressee filter `agdx.to In [<agent id>, "*"]` before the first read, so the server sends only those records. Otherwise the agent reads every record and sorts them itself. [Agents, groups, and layouts](../../docs/building-agents.md#agents-groups-and-layouts) explains how to pick a layout.
@@ -751,7 +757,7 @@ later = await session.turns_since(ls.Checkpoint.from_json(saved))
751
757
 
752
758
  `laser.context(conversation)` returns a `ContextScope`. Its `fetch(n=50, token_budget=)` and `block` read `agent.sessions` unless `topics=` names others, and return `ContextMessage` records (`id`, `provenance`, `payload`, `envelope`, `topic`). `fetch_with(topics, Chain([LastN(20), TokenBudget(4_000)]))` takes the policy objects `LastN`, `TokenBudget(max_tokens, estimator=None)`, `RoleFilter(agents)`, and `Chain`. `state(topics, init, fold, last_n=|from_offsets=|from_checkpoint=|at=|full=True)`, `state_with(store, topics, init, fold)`, and `checkpoint(topics)` fold the conversation log like Rust. `context_checkpoint(laser, topics)` captures a checkpoint without a conversation, and `ConversationState.load(laser, conversation, topics, init, fold)` folds one directly with the same bounds. Each read covers at most the newest `CONTEXT_READ_WINDOW` (10,000) messages per partition.
753
759
 
754
- `ContextMessage` also carries `timestamp_micros`, the broker append time, and the numeric `stream_id` and `topic_id`. `LastN`, `TokenBudget`, `RoleFilter`, and `Chain` report `name`, `version`, and `selection(history)`, which a context manifest records. A custom policy can set `name` and `version` attributes. Every SDK estimates tokens the same way: the byte count divided by four, rounded up.
760
+ `ContextMessage` also carries `timestamp_micros`, the server append time, and the numeric `stream_id` and `topic_id`. `LastN`, `TokenBudget`, `RoleFilter`, and `Chain` report `name`, `version`, and `selection(history)`, which a context manifest records. A custom policy can set `name` and `version` attributes. Every SDK estimates tokens the same way: the byte count divided by four, rounded up.
755
761
 
756
762
  ## Memory and state
757
763