laser-sdk 0.9.0.dev1__tar.gz → 0.9.0.dev2__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.
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/Cargo.toml +7 -6
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/PKG-INFO +15 -9
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/README.md +14 -8
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/Cargo.lock +10 -9
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/Cargo.toml +3 -3
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/README.md +14 -8
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/iggy_test_server.py +195 -17
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/laser_sdk.pyi +109 -33
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/agent_runtime.rs +8 -5
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/client.rs +21 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/consumer_group.rs +97 -34
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/context.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/errors.rs +39 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/filters.rs +112 -55
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/session_reads.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/stream.rs +31 -9
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/transport.rs +47 -12
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_addressed_calls.py +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_agdx_envelope.py +7 -0
- laser_sdk-0.9.0.dev2/foreign/python/tests/test_cluster.py +467 -0
- laser_sdk-0.9.0.dev2/foreign/python/tests/test_cluster_filters.py +348 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_coordination_client.py +7 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_filter_surface.py +4 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_filters.py +198 -13
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_integration.py +221 -24
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_parity.py +68 -3
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_pause.py +0 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_smoke.py +31 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_workflow_callbacks.py +0 -3
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/laser_sdk.pyi +109 -33
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/Cargo.toml +2 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/README.md +15 -9
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/agdx.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/builder.rs +53 -42
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/consumer.rs +336 -68
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/laser.rs +17 -9
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/mod.rs +1 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/pause.rs +96 -79
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/replies.rs +199 -120
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/session.rs +1 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/session_reads.rs +42 -5
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/capabilities.rs +5 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/context.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/control.rs +2 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/cursor.rs +34 -8
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/filters/client.rs +28 -20
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/filters/group.rs +90 -23
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/filters/mod.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/filters/progress.rs +57 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/filters/reader.rs +1004 -91
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/graph.rs +2 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/kv/client.rs +4 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/laser.rs +144 -70
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/memory.rs +29 -5
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/nodes.rs +60 -10
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/poll.rs +104 -12
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/projections.rs +65 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/publish_options.rs +16 -8
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/snapshot.rs +31 -33
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/stream/consumer_group.rs +44 -67
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/stream/transport.rs +1070 -233
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/stream.rs +20 -3
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/types/ids.rs +57 -24
- laser_sdk-0.9.0.dev2/sdk/tests/future_depth.rs +121 -0
- laser_sdk-0.9.0.dev2/sdk/tests/integration/filtered_wait.rs +317 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/filters.rs +2 -3
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/filters_group.rs +865 -749
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/governance.rs +1 -1
- laser_sdk-0.9.0.dev2/sdk/tests/integration/harness.rs +379 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/main.rs +1 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/memory.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/pause.rs +151 -4
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/reconnect.rs +10 -70
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/reliable.rs +2 -2
- laser_sdk-0.9.0.dev2/sdk/tests/integration/request.rs +380 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/session.rs +10 -6
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/signing.rs +5 -5
- laser_sdk-0.9.0.dev2/sdk/tests/integration/streaming.rs +1900 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/typed_topics.rs +6 -2
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/workflow.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/support/test_iggy.rs +133 -21
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/README.md +6 -6
- laser_sdk-0.9.0.dev2/wire/fixtures/filter_mutation_configure_group.bin +0 -0
- laser_sdk-0.9.0.dev2/wire/fixtures/filter_mutation_configure_group.json +120 -0
- laser_sdk-0.9.0.dev2/wire/fixtures/filter_reply_cancelled.bin +1 -0
- laser_sdk-0.9.0.dev2/wire/fixtures/filter_reply_ready.bin +1 -0
- laser_sdk-0.9.0.dev2/wire/fixtures/filter_wait_cancel.bin +1 -0
- laser_sdk-0.9.0.dev2/wire/fixtures/filter_wait_request.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/agent.rs +15 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/codes.rs +7 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/control.rs +286 -4
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/destination.rs +1 -3
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/dispatch.rs +4 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/catalog.rs +201 -13
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/mod.rs +8 -7
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/read.rs +215 -2
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/fixtures.rs +4 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/hello.rs +8 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/http.rs +77 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/kv.rs +1 -1
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/limits.rs +22 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/session.rs +97 -6
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/validate.rs +193 -5
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/constants.rs +15 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/wire_fixtures.rs +120 -4
- laser_sdk-0.9.0.dev1/sdk/tests/integration/harness.rs +0 -116
- laser_sdk-0.9.0.dev1/sdk/tests/integration/request.rs +0 -165
- laser_sdk-0.9.0.dev1/sdk/tests/integration/streaming.rs +0 -651
- laser_sdk-0.9.0.dev1/wire/fixtures/filter_mutation_configure_group.bin +0 -0
- laser_sdk-0.9.0.dev1/wire/fixtures/filter_mutation_configure_group.json +0 -117
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/.gitignore +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/agdx.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/agent.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/async_bridge.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/batching.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/bin/stub_gen.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/blob.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/chunks.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/codecs.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/control.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/convert.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/coordination.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/crash_context.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/destinations.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/fork.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/govern.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/graph.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/ids.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/intent.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/interop.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/kv.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/lib.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/memory.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/memory_handler.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/parity_helpers.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/projections.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/publish.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/query.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/rbac.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/reader.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/registry.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/schema.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/session.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/session_ops.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/sign.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/snapshot.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/state_store.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/swarm.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/typed.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/watch.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/src/workflow.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/conftest.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_agent_surface.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_callback_bridge.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_close_logging.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_connect_timeout.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_control_builders.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_data_surface.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_errors.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_parity_helpers.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_publish_failures.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_query_wire.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_rbac.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_readme_snippets.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_reconnect.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_record_helpers.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_resource_naming.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_resume_parity.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_snapshot_callbacks.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/tests/test_trait_hooks.py +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/foreign/python/uv.lock +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/pyproject.toml +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/LICENSE +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/NOTICE +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/certs/laserdata.crt +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/a2a.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/assembler.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/budget.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/clock.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/contract.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/control.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/ctx.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/lease.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/memory_handler.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/partitioning.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/registry.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/router.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/scope.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/session_ops.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/state.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agent/workflow.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/agui.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/batching.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/blob.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/bridge_hops.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/connect_options.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/context_scope.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/crash_context.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/destinations.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/edge_auth.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/error.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/filters/guard.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/fork/client.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/fork/mod.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/govern.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/intent.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/kv/coordination.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/kv/mod.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/lib.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/managed.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/mcp.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/message.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/prelude.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/provenance/keys.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/provenance/mod.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/provenance/runtime.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/provenance/topic.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/query/client.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/query/mod.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/rbac/mod.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/retry.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/schema_codecs.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/sign.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/state_store.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/stream/producer_statistics.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/stream/publish.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/stream/record.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/swarm.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/testing.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/typed.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/types/mod.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/src/watch.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/alloc.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/fixtures/retry-table.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/fixtures/typescript_signature.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/a2a.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/agdx_consume.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/agdx_stream.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/agui.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/budget.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/context.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/contract.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/deadletter.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/decomposition.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/fanout.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/handoff.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/human_input.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/managed_unsupported.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/mcp.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/provenance.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/queue_pressure.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/replay.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/runtime.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/shutdown.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/state.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/integration/warm_dedup.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/signature_interop.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/sdk/tests/support/owned_server.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/Cargo.toml +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/LICENSE +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/NOTICE +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/accepted_operation.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_body_ref.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_card.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_chunk.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_chunk_open.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_chunk_terminal.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_command.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_command_signed.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_dead_letter.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_error.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_error_body.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_event.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_chunk_late_deadline.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_chunk_no_sequence.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_chunk_open_no_operation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_command_no_correlation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_error_last.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_event_task_state.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_response_channel.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_status_bad_operation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_invalid_status_no_operation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_must_understand.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_presence.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_record.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_response.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_session_end.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_session_parking.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_session_start.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_session_status.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_session_transition.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_signature.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_status_card.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_status_session.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_status_task.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/agent_usage_cost.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/arrow_ipc_metadata.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/arrow_ipc_policy.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/authz_bind_roles.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/authz_get_role_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/authz_history_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/authz_history_request.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/authz_role.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/authz_whoami_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/backend_announce.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/backend_announce_topology.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/backend_announce_unavailable.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/batch_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/batch_request.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/browse_projections.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/browse_reply_decoded.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/browse_reply_projections.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/browse_reply_schema_registered.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/browse_reply_schemas.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/browse_schemas.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/capabilities.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/change_record.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/checkpoint_mutation_replicated.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/checkpoint_public_mutation_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/checkpoint_reply_destination.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/checkpoint_reply_query_route.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/checkpoint_request_public.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/client_metadata_list.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/client_metadata_query.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/context_compaction.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/context_manifest.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/context_retrieval.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_accept_gap.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_apply_binding.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_drop_schema.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_filter_catalog.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_register_projection.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_register_schema_avro.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_register_schema_json.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_register_schema_protobuf.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_register_session_source_all.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_register_session_source_named.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_remove_binding.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_remove_session_source.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_skip_record.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/control_stamped_remove_binding.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/data_stack_string_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/decode_record.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/destination_checkpoint_status.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/destination_issue.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/destination_page.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/dispatch_cases.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/error_body.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_ack.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_ack_unfiltered.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_catalog_reply_bound.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_catalog_reply_configured.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_catalog_reply_registered.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_catalog_reply_revision_state.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_catalog_reply_revisions.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_catalog_reply_unbound.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_codec_cases.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_consumer_filter.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_consumer_filter.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_eval_cases.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_mutation_register.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_mutation_register.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_mutation_revision_state.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_mutation_revision_state.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_mutation_unbind_exact.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_mutation_unbind_exact.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_poll_request.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_poll_request_group_auto.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_poll_request_group_id.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_reply_acknowledged.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_reply_error.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_reply_page.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_reply_page_unfiltered.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_reply_revision_disabled.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/filter_validation.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/fold_snapshot.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/fork_create.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/fork_info.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/fork_put.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/fork_reply_created.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/forwarded_command.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/forwarded_command_positioned.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/forwarded_command_scoped.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/forwarded_query.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/forwarded_query_scoped.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_edge.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_edge_conversation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_edge_producer.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_edge_sourced.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_neighbors.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_neighbors_conversation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_node.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_node_conversation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_node_producer.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_node_sourced.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_query.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_query_conversation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_upsert.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/graph_upsert_session.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/header_block_envelope.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/header_block_generic.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/hello_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/hello_reply_agent.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/hello_reply_features.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/json_patch/cases.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/key_record.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_cas.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_cas_fenced.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_cas_session.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_copy.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_delete_session.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_entry_memory_scope.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_get_barriered.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_lease.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_lease_renew.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_move.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_namespaces.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_page_view.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_patch_session.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_release.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_committed.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_leased.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_namespaces.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_page.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_renewed.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_stale.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_reply_version_conflict.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_scan.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_set.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/kv_set_session.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/logical_schema.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/logical_type_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/managed_read.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/managed_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/managed_request.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/materialization_destination.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/memory_feedback_scoped.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/memory_forget_scoped.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/memory_item_origin.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/mutation_command.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/mutation_command_scoped.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/producer_presence.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_cancel.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_envelope.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_envelope_aggregate.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_envelope_raw_sql.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_envelope_read_your_writes.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_envelope_text.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_error_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_execution.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_page.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_reply_err_stale.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_reply_err_too_large.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_reply_ok.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_result.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_route.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_route_page.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_status.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_status_reply.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/query_target_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/register_schema_managed.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/schema_def.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_changes.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_events.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_get.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_heartbeat.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_empty.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_gap.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_legacy.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_no_retained_rows.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_origins.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_page.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_start.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_start_new.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_changes_truncated.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_error.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_events.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_info.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_links.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_page.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_page_rebuilding.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_sources.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_http_state.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_link_relation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_link_surface.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_links.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_list.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_ref.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_changes.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_error.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_events.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_info.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_links.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_page.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_page_rebuilding.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_sources.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_reply_state.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_sources.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_sources_lane_only.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/session_state.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/snapshot_page.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/source_ref_generation.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/start_policy_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/state_delta.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/state_snapshot.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/table_file_page.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/table_metrics.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/table_schema_view.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/table_view.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/token_estimates.json +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/fixtures/typed_value_discriminants.bin +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/arrow.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/authz.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/batch.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/browse.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/change.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/checkpoint.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/clients.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/codecs.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/commands.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/content.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/encoding.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/error.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/cbor.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/codecs.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/coerce.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/eval.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/expr.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/headers.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/path.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/filter/text.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/fork.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/forward.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/framing.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/graph.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/hashing.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/headers.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/http_client.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/keys.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/lib.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/memory.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/mutation.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/query.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/result.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/schema.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/snapshot.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/source.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/topics.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/src/topology.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/dispatch.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/filter_eval_corpus.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/headers.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/json_patch.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/wire/tests/producer_presence.rs +0 -0
- {laser_sdk-0.9.0.dev1 → laser_sdk-0.9.0.dev2}/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.
|
|
11
|
+
version = "0.9.0-dev.2"
|
|
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.
|
|
27
|
-
iggy_binary_protocol = { version = "0.11.1-edge.
|
|
28
|
-
iggy_common = { version = "0.11.1-edge.
|
|
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-
|
|
32
|
+
laser-test-support = { path = "test-support" }
|
|
33
|
+
laser-wire = { path = "wire", version = "0.9.0-dev.2" }
|
|
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.
|
|
3
|
+
Version: 0.9.0.dev2
|
|
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.
|
|
35
|
+
> This source tree targets `0.9.0-dev.2`. 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
|
-
|
|
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
|
|
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.
|
|
7
|
+
> This source tree targets `0.9.0-dev.2`. 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
|
-
|
|
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
|
|
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.
|
|
1658
|
+
version = "0.11.1-edge.9"
|
|
1659
1659
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1660
|
-
checksum = "
|
|
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.
|
|
1696
|
+
version = "0.11.1-edge.8"
|
|
1697
1697
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1698
|
-
checksum = "
|
|
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.
|
|
1712
|
+
version = "0.11.1-edge.10"
|
|
1713
1713
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1714
|
-
checksum = "
|
|
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.
|
|
2046
|
+
version = "0.9.0-dev.2"
|
|
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.
|
|
2075
|
+
version = "0.9.0-dev.2"
|
|
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.
|
|
2094
|
+
version = "0.9.0-dev.2"
|
|
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.
|
|
9
|
+
version = "0.9.0-dev.2"
|
|
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.
|
|
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.
|
|
41
|
+
laser-sdk = { path = "../../sdk", version = "0.9.0-dev.2", 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.
|
|
7
|
+
> This source tree targets `0.9.0-dev.2`. 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
|
-
|
|
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
|
|
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
|
|