tigrbl 0.4.3.dev4__tar.gz → 0.4.4.dev7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/PKG-INFO +48 -34
  2. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/README.md +45 -31
  3. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/pyproject.toml +7 -2
  4. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/__init__.py +19 -1
  5. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/cli.py +3 -0
  6. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/LICENSE +0 -0
  7. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/NOTICE +0 -0
  8. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/__main__.py +0 -0
  9. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/canonical_json.py +0 -0
  10. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/config/__init__.py +0 -0
  11. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/config/constants.py +0 -0
  12. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/config/defaults.py +0 -0
  13. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/ddl/__init__.py +0 -0
  14. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/__init__.py +0 -0
  15. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/allow_anon.py +0 -0
  16. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/engine.py +0 -0
  17. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/hook.py +0 -0
  18. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/middlewares.py +0 -0
  19. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/op.py +0 -0
  20. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/response.py +0 -0
  21. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/rest.py +0 -0
  22. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/schema.py +0 -0
  23. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/decorators/session.py +0 -0
  24. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/__init__.py +0 -0
  25. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/bind.py +0 -0
  26. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/builders.py +0 -0
  27. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/capabilities.py +0 -0
  28. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/collect.py +0 -0
  29. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/plugins.py +0 -0
  30. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/registry.py +0 -0
  31. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/engine/resolver.py +0 -0
  32. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/__init__.py +0 -0
  33. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/app.py +0 -0
  34. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/column.py +0 -0
  35. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/engine.py +0 -0
  36. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/hook.py +0 -0
  37. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/op.py +0 -0
  38. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/responses.py +0 -0
  39. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/router.py +0 -0
  40. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/schema.py +0 -0
  41. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/factories/table.py +0 -0
  42. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/hook/exceptions.py +0 -0
  43. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/hook/types.py +0 -0
  44. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/middlewares/__init__.py +0 -0
  45. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/middlewares/compose.py +0 -0
  46. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/__init__.py +0 -0
  47. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/canonical.py +0 -0
  48. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/collect.py +0 -0
  49. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/op/types.py +0 -0
  50. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/orm/__init__.py +0 -0
  51. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/requests.py +0 -0
  52. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/rest/__init__.py +0 -0
  53. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/__init__.py +0 -0
  54. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/__init__.py +0 -0
  55. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/build_schema.py +0 -0
  56. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/cache.py +0 -0
  57. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/extras.py +0 -0
  58. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/helpers.py +0 -0
  59. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/list_params.py +0 -0
  60. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/builder/strip_parent_fields.py +0 -0
  61. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/jsonrpc.py +0 -0
  62. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/schema/utils.py +0 -0
  63. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/security/__init__.py +0 -0
  64. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/security/dependencies.py +0 -0
  65. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/session/__init__.py +0 -0
  66. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/session/base.py +0 -0
  67. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/session/spec.py +0 -0
  68. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/__init__.py +0 -0
  69. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/app.py +0 -0
  70. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/column.py +0 -0
  71. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/engine.py +0 -0
  72. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/hook.py +0 -0
  73. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/op.py +0 -0
  74. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/responses.py +0 -0
  75. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/rest.py +0 -0
  76. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/router.py +0 -0
  77. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/schema.py +0 -0
  78. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/shortcuts/table.py +0 -0
  79. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/specs.py +0 -0
  80. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/__init__.py +0 -0
  81. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/__init__.py +0 -0
  82. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/healthz.py +0 -0
  83. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/hookz.py +0 -0
  84. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/kernelz.py +0 -0
  85. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/methodz.py +0 -0
  86. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/router.py +0 -0
  87. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/diagnostics/utils.py +0 -0
  88. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/__init__.py +0 -0
  89. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/lens.py +0 -0
  90. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/__init__.py +0 -0
  91. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/helpers.py +0 -0
  92. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/metadata.py +0 -0
  93. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/mount.py +0 -0
  94. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openapi/schema.py +0 -0
  95. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/openrpc.py +0 -0
  96. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/docs/swagger.py +0 -0
  97. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/favicon/__init__.py +0 -0
  98. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/favicon/assets/favicon.svg +0 -0
  99. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/system/uvicorn.py +0 -0
  100. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/__init__.py +0 -0
  101. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/jsonrpc/__init__.py +0 -0
  102. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/jsonrpc/helpers.py +0 -0
  103. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/jsonrpc/models.py +0 -0
  104. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/rest/__init__.py +0 -0
  105. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/transport/rest/aggregator.py +0 -0
  106. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/types/__init__.py +0 -0
  107. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/utils/__init__.py +0 -0
  108. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/utils/schema.py +0 -0
  109. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/__init__.py +0 -0
  110. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/jinja.py +0 -0
  111. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/pydantic.py +0 -0
  112. {tigrbl-0.4.3.dev4 → tigrbl-0.4.4.dev7}/tigrbl/vendor/sqlalchemy.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl
3
- Version: 0.4.3.dev4
4
- Summary: Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins.
3
+ Version: 0.4.4.dev7
4
+ Summary: Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
7
7
  http://www.apache.org/licenses/
@@ -205,7 +205,7 @@ License: Apache License
205
205
  limitations under the License.
206
206
  License-File: LICENSE
207
207
  License-File: NOTICE
208
- Keywords: tigrbl,asgi,api,api framework,asgi framework,dependency injection,fastapi alternative,json-rpc,framework,openapi,openrpc,pydantic,rest,schema-first,sqlalchemy,typed validation
208
+ Keywords: tigrbl,asgi,api,api framework,asgi framework,dependency injection,fastapi alternative,json-rpc,framework,openapi,openrpc,pydantic,rest,runtime plans,schema-first,sqlalchemy,sse,streaming,typed validation,websocket,webtransport
209
209
  Author: Jacob Stewart
210
210
  Author-email: jacob@swarmauri.com
211
211
  Requires-Python: >=3.10,<3.15
@@ -265,7 +265,7 @@ Description-Content-Type: text/markdown
265
265
  <div align="center">
266
266
  <h1>tigrbl</h1>
267
267
  <img src="https://raw.githubusercontent.com/swarmauri/swarmauri-sdk/master/assets/tigrbl_full_logo.png" alt="Tigrbl logo" width="140"/>
268
- <p><strong>Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins.</strong></p>
268
+ <p><strong>Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.</strong></p>
269
269
  <a href="https://pypi.org/project/tigrbl/"><img src="https://img.shields.io/pypi/v/tigrbl?label=PyPI" alt="PyPI version for tigrbl"/></a>
270
270
  <a href="https://pypi.org/project/tigrbl/"><img src="https://static.pepy.tech/badge/tigrbl" alt="Downloads for tigrbl"/></a>
271
271
  <a href="https://discord.gg/K4YTAPapjR"><img src="https://img.shields.io/badge/Discord-Join%20chat-5865F2?logo=discord&logoColor=white" alt="Discord community for tigrbl"/></a>
@@ -277,7 +277,7 @@ Description-Content-Type: text/markdown
277
277
 
278
278
  ## What is tigrbl?
279
279
 
280
- Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins.
280
+ Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.
281
281
 
282
282
  ## Why use tigrbl?
283
283
 
@@ -285,7 +285,7 @@ Use it when you want the public Tigrbl authoring surface in one install target i
285
285
 
286
286
  ## When should I install tigrbl?
287
287
 
288
- Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, docs, schemas, engines, and CLI support from one facade.
288
+ Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, streaming, SSE, WebSocket, docs, schemas, engines, and CLI support from one facade.
289
289
 
290
290
  ## Who is tigrbl for?
291
291
 
@@ -293,7 +293,7 @@ Application developers, platform teams, and service owners building schema-first
293
293
 
294
294
  ## Where does tigrbl fit?
295
295
 
296
- `tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST and JSON-RPC projection, docs, engines, and CLI workflows.
296
+ `tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
297
297
 
298
298
  ## How does tigrbl work?
299
299
 
@@ -346,7 +346,7 @@ Implementation orientation:
346
346
  Facade orientation:
347
347
  - Authoring API: app/router factories, table helpers, column helpers, schema helpers, operation decorators, hook decorators, response decorators, and engine decorators.
348
348
  - Compatibility imports: facade modules such as `tigrbl.op`, `tigrbl.config`, `tigrbl.schema`, `tigrbl.ddl`, `tigrbl.security`, and `tigrbl.system` forward into the split packages that now own the implementation.
349
- - Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
349
+ - Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, HTTP streams, SSE responses, WebSocket channels, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
350
350
  - Operational boundary: this package is the application-facing install target; lower-level packages own specs, atoms, kernel planning, runtime execution, base abstractions, concrete adapters, ORM helpers, and engine plugins.
351
351
 
352
352
  ## Public API and Import Surface
@@ -412,7 +412,7 @@ Tigrbl is organized as a split framework behind this facade:
412
412
  | Atoms | `tigrbl-atoms` | Phase names, stage transitions, typed contexts, ingress/dispatch/wire/storage/handler/egress/error atoms, transaction atoms, batch atoms, and transport atoms. |
413
413
  | Kernel | `tigrbl-kernel` | Operation-view compilation, hook ordering, labels, packed plans, protocol chains, lifecycle rows, event keys, capability masks, and dispatch plans. |
414
414
  | Runtime | `tigrbl-runtime` | Runtime-owned routing, request execution, framing atoms, transport channels, and default kernel integration. |
415
- | Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime` | Canonical operation definitions for CRUD, analytics, and realtime/streaming workloads. |
415
+ | Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime`, `tigrbl-ops-webtransport` | Canonical operation definitions for CRUD, analytics, realtime/streaming, and WebTransport control-plane workloads. |
416
416
  | ORM | `tigrbl-orm` | SQLAlchemy-facing table and mixin helpers used by application models. |
417
417
  | Engines | `tigrbl-engine-*` | Persistence, cache, queue, rate, bloom, dedupe, dataframe, warehouse, and database engine integrations. |
418
418
 
@@ -422,35 +422,42 @@ Use the facade for application code unless you are maintaining a framework layer
422
422
 
423
423
  The facade is the normal application authoring surface. Use `docs/developer/AUTHORING_BCP.md` for the full policy; this package README keeps the public-package guidance explicit because it is the README most application developers see first.
424
424
 
425
+ If you are translating concepts from Starlette, FastAPI, Flask, ASGI 3,
426
+ WebSocket, WebTransport, SQLAlchemy, or backend-specific SQL engines, start with
427
+ [`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
428
+ Those guides describe analogous lower-layer concepts while keeping Tigrbl-owned
429
+ authoring surfaces as the application contract.
430
+
425
431
  Do:
426
432
 
427
- - Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package.
428
- - Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators.
429
- - Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs.
430
- - Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned.
431
- - Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs.
432
- - Do use `get_schema(...)` or schema helpers for operation request/response payloads.
433
- - Do bind engines declaratively at app, router, table, or operation scope.
434
- - Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work.
435
- - Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state.
433
+ - Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package. Why: the facade is the supported application contract and hides lower-layer package splits.
434
+ - Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators. Why: these entry points are visible to runtime planning, docs, diagnostics, schemas, and tests.
435
+ - Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs. Why: operations are the unit Tigrbl can project consistently across protocol surfaces.
436
+ - Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, HTTP streams, SSE, WebSocket, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned. Why: handler dispatch is where protocol projection and lifecycle guarantees meet.
437
+ - Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs. Why: specs are the shared source for storage lowering, wire schemas, docs, runtime planning, hooks, and diagnostics.
438
+ - Do use `get_schema(...)` or schema helpers for operation request/response payloads. Why: generated schemas keep payloads aligned with operation specs and docs.
439
+ - Do bind engines declaratively at app, router, table, or operation scope. Why: declarative binding lets the runtime own session selection, transaction scope, diagnostics, and backend-specific behavior.
440
+ - Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Why: hooks make policy visible to lifecycle ordering, diagnostics, tests, and transport-independent execution.
441
+ - Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state. Why: these surfaces show the compiled Tigrbl state instead of a lower-level framework's partial view.
436
442
 
437
443
  Do not:
438
444
 
439
- - Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks.
440
- - Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes.
441
- - Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior.
442
- - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers.
443
- - Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract.
444
- - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior.
445
- - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, stream, SSE, WebSocket, or WebTransport behavior.
445
+ - Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks. Why: that makes FastAPI the application contract instead of Tigrbl's operation, binding, hook, schema, docs, and diagnostics contract.
446
+ - Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes. Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
447
+ - Do not author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or lifecycle hooks. Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, or transport plan.
448
+ - Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior. Why: raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
449
+ - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers. Why: ad-hoc construction bypasses declarative engine binding, session policy, pooling, diagnostics, tests, and backend adapters.
450
+ - Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract. Why: direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
451
+ - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior. Why: route wrappers hide behavior from protocol projection, docs, hooks, diagnostics, and tests.
452
+ - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior. Why: bypasses skip legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
446
453
 
447
454
  Avoid:
448
455
 
449
- - Avoid treating ASGI, FastAPI, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks.
450
- - Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source.
451
- - Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
452
- - Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once.
453
- - Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface.
456
+ - Avoid treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks. Why: lower-level substrates are legal implementation tools, but not the supported application API.
457
+ - Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source. Why: duplicated rules create stale validation, stale docs, and protocol-specific behavior differences.
458
+ - Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation. Why: generated schemas keep request/response payloads aligned with operation specs and docs.
459
+ - Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once. Why: transport-layer policy can make REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport disagree about the same domain operation.
460
+ - Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface. Why: examples without a boundary marker become accidental guidance.
454
461
 
455
462
  ## Default CRUD and Operation Semantics
456
463
 
@@ -526,7 +533,7 @@ Bulk operations are not part of the minimal canonical default set. They are enab
526
533
 
527
534
  ## REST, JSON-RPC, and Transport Projection
528
535
 
529
- Tigrbl projects the same operation inventory across multiple protocol surfaces:
536
+ Tigrbl projects the same operation inventory across multiple protocol surfaces while keeping protocol, carrier, exchange, stream direction, and framing separate. The full public matrix is in [`docs/developer/TRANSPORTS_AND_FRAMING.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md).
530
537
 
531
538
  | Surface | Binding family | Framing | Primary use |
532
539
  |---|---|---|---|
@@ -535,9 +542,10 @@ Tigrbl projects the same operation inventory across multiple protocol surfaces:
535
542
  | HTTP stream | stream | stream or configured stream framing | Server-streaming outputs and progressive responses. |
536
543
  | SSE | stream | SSE | Browser-friendly event streams. |
537
544
  | WebSocket/WSS | message | text or JSON-RPC when negotiated | Bidirectional message workflows. |
538
- | WebTransport | session, stream, or datagram | WebTransport outer framing plus lane-specific inner framing | Session, stream, and datagram transports with fail-closed lane validation. |
545
+ | WebTransport | session, stream, or datagram | no top-level app framing; lane-local framing only | Session, stream, and datagram transports with fail-closed lane validation. |
546
+ | h11 / h2 / h3 / QUIC carrier metadata | delegated server/runtime boundary | binding-dependent | Serving-stack protocol mechanics, runtime capability metadata, and deployment controls. |
539
547
 
540
- The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed.
548
+ The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed. Tigrbl owns binding declarations, runtime planning, channel metadata, and frame codecs; the serving/runtime stack owns wire-level HTTP/1.1, HTTP/2, HTTP/3, QUIC, TLS termination, HPACK, QPACK, ALPN, and flow control.
541
549
 
542
550
  ## Request Lifecycle and Hook Phases
543
551
 
@@ -665,7 +673,7 @@ Common table-level declarations include:
665
673
 
666
674
  ## How To Choose This Package
667
675
 
668
- Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST and JSON-RPC projection, docs generation, engine integration, and CLI workflow. Choose a lower-level package such as [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-base`](https://pypi.org/project/tigrbl-base/), or [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/) only when you are building framework extensions or testing a specific internal boundary.
676
+ Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs generation, engine integration, and CLI workflow. Choose a lower-level package such as [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-base`](https://pypi.org/project/tigrbl-base/), or [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/) only when you are building framework extensions or testing a specific internal boundary.
669
677
 
670
678
  ## Related Packages
671
679
 
@@ -682,6 +690,12 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
682
690
  ## Documentation Links
683
691
 
684
692
  - [Workspace docs](https://github.com/tigrbl/tigrbl/blob/master/docs/README.md)
693
+ - [Equivalence guide index](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md)
694
+ - [Application authoring equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_EQUIVALENCE.md)
695
+ - [Router and table equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ROUTER_TABLE_EQUIVALENCE.md)
696
+ - [Transport equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORT_EQUIVALENCE.md)
697
+ - [Engine and SQL equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ENGINE_SQL_EQUIVALENCE.md)
698
+ - [Transports and framing](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md)
685
699
  - [Package catalog](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_CATALOG.md)
686
700
  - [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
687
701
  - [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
@@ -1,7 +1,7 @@
1
1
  <div align="center">
2
2
  <h1>tigrbl</h1>
3
3
  <img src="https://raw.githubusercontent.com/swarmauri/swarmauri-sdk/master/assets/tigrbl_full_logo.png" alt="Tigrbl logo" width="140"/>
4
- <p><strong>Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins.</strong></p>
4
+ <p><strong>Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.</strong></p>
5
5
  <a href="https://pypi.org/project/tigrbl/"><img src="https://img.shields.io/pypi/v/tigrbl?label=PyPI" alt="PyPI version for tigrbl"/></a>
6
6
  <a href="https://pypi.org/project/tigrbl/"><img src="https://static.pepy.tech/badge/tigrbl" alt="Downloads for tigrbl"/></a>
7
7
  <a href="https://discord.gg/K4YTAPapjR"><img src="https://img.shields.io/badge/Discord-Join%20chat-5865F2?logo=discord&logoColor=white" alt="Discord community for tigrbl"/></a>
@@ -13,7 +13,7 @@
13
13
 
14
14
  ## What is tigrbl?
15
15
 
16
- Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins.
16
+ Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, OpenAPI, OpenRPC, typed validation, hooks, diagnostics, and engine plugins.
17
17
 
18
18
  ## Why use tigrbl?
19
19
 
@@ -21,7 +21,7 @@ Use it when you want the public Tigrbl authoring surface in one install target i
21
21
 
22
22
  ## When should I install tigrbl?
23
23
 
24
- Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, docs, schemas, engines, and CLI support from one facade.
24
+ Install it for application projects, examples, service skeletons, and teams that want REST, JSON-RPC, streaming, SSE, WebSocket, docs, schemas, engines, and CLI support from one facade.
25
25
 
26
26
  ## Who is tigrbl for?
27
27
 
@@ -29,7 +29,7 @@ Application developers, platform teams, and service owners building schema-first
29
29
 
30
30
  ## Where does tigrbl fit?
31
31
 
32
- `tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST and JSON-RPC projection, docs, engines, and CLI workflows.
32
+ `tigrbl` lives at `pkgs/core/tigrbl` and serves schema-first service authoring, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs, engines, and CLI workflows.
33
33
 
34
34
  ## How does tigrbl work?
35
35
 
@@ -82,7 +82,7 @@ Implementation orientation:
82
82
  Facade orientation:
83
83
  - Authoring API: app/router factories, table helpers, column helpers, schema helpers, operation decorators, hook decorators, response decorators, and engine decorators.
84
84
  - Compatibility imports: facade modules such as `tigrbl.op`, `tigrbl.config`, `tigrbl.schema`, `tigrbl.ddl`, `tigrbl.security`, and `tigrbl.system` forward into the split packages that now own the implementation.
85
- - Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
85
+ - Runtime projection: model operations are compiled into REST bindings, JSON-RPC methods, HTTP streams, SSE responses, WebSocket channels, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, and engine-backed handlers.
86
86
  - Operational boundary: this package is the application-facing install target; lower-level packages own specs, atoms, kernel planning, runtime execution, base abstractions, concrete adapters, ORM helpers, and engine plugins.
87
87
 
88
88
  ## Public API and Import Surface
@@ -148,7 +148,7 @@ Tigrbl is organized as a split framework behind this facade:
148
148
  | Atoms | `tigrbl-atoms` | Phase names, stage transitions, typed contexts, ingress/dispatch/wire/storage/handler/egress/error atoms, transaction atoms, batch atoms, and transport atoms. |
149
149
  | Kernel | `tigrbl-kernel` | Operation-view compilation, hook ordering, labels, packed plans, protocol chains, lifecycle rows, event keys, capability masks, and dispatch plans. |
150
150
  | Runtime | `tigrbl-runtime` | Runtime-owned routing, request execution, framing atoms, transport channels, and default kernel integration. |
151
- | Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime` | Canonical operation definitions for CRUD, analytics, and realtime/streaming workloads. |
151
+ | Operation packs | `tigrbl-ops-oltp`, `tigrbl-ops-olap`, `tigrbl-ops-realtime`, `tigrbl-ops-webtransport` | Canonical operation definitions for CRUD, analytics, realtime/streaming, and WebTransport control-plane workloads. |
152
152
  | ORM | `tigrbl-orm` | SQLAlchemy-facing table and mixin helpers used by application models. |
153
153
  | Engines | `tigrbl-engine-*` | Persistence, cache, queue, rate, bloom, dedupe, dataframe, warehouse, and database engine integrations. |
154
154
 
@@ -158,35 +158,42 @@ Use the facade for application code unless you are maintaining a framework layer
158
158
 
159
159
  The facade is the normal application authoring surface. Use `docs/developer/AUTHORING_BCP.md` for the full policy; this package README keeps the public-package guidance explicit because it is the README most application developers see first.
160
160
 
161
+ If you are translating concepts from Starlette, FastAPI, Flask, ASGI 3,
162
+ WebSocket, WebTransport, SQLAlchemy, or backend-specific SQL engines, start with
163
+ [`docs/developer/EQUIVALENCE_INDEX.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md).
164
+ Those guides describe analogous lower-layer concepts while keeping Tigrbl-owned
165
+ authoring surfaces as the application contract.
166
+
161
167
  Do:
162
168
 
163
- - Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package.
164
- - Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators.
165
- - Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs.
166
- - Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned.
167
- - Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs.
168
- - Do use `get_schema(...)` or schema helpers for operation request/response payloads.
169
- - Do bind engines declaratively at app, router, table, or operation scope.
170
- - Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work.
171
- - Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state.
169
+ - Do import application-facing classes, decorators, helpers, and shortcuts from `tigrbl` unless you are intentionally maintaining a lower-level package. Why: the facade is the supported application contract and hides lower-layer package splits.
170
+ - Do create services with `TigrblApp`, `TigrblRouter`, facade route/operation decorators, table helpers, column helpers, hook decorators, response decorators, schema helpers, and engine decorators. Why: these entry points are visible to runtime planning, docs, diagnostics, schemas, and tests.
171
+ - Do model domain actions as Tigrbl operations, including canonical CRUD operations, operation-pack verbs, or explicit custom operation specs. Why: operations are the unit Tigrbl can project consistently across protocol surfaces.
172
+ - Do use operation handlers through Tigrbl specs and kernel/runtime dispatch so REST, JSON-RPC, HTTP streams, SSE, WebSocket, WebTransport-aware runtime units, OpenAPI, OpenRPC, diagnostics, schemas, hooks, and tests stay aligned. Why: handler dispatch is where protocol projection and lifecycle guarantees meet.
173
+ - Do express field behavior through Tigrbl table, column, datatype, storage, IO, request, response, and operation specs. Why: specs are the shared source for storage lowering, wire schemas, docs, runtime planning, hooks, and diagnostics.
174
+ - Do use `get_schema(...)` or schema helpers for operation request/response payloads. Why: generated schemas keep payloads aligned with operation specs and docs.
175
+ - Do bind engines declaratively at app, router, table, or operation scope. Why: declarative binding lets the runtime own session selection, transaction scope, diagnostics, and backend-specific behavior.
176
+ - Do use lifecycle hooks for policy, validation, enrichment, audit, response shaping, and post-response work. Why: hooks make policy visible to lifecycle ordering, diagnostics, tests, and transport-independent execution.
177
+ - Do use `/system/methodz`, `/system/hookz`, `/system/kernelz`, OpenAPI, and OpenRPC to inspect the registered framework state. Why: these surfaces show the compiled Tigrbl state instead of a lower-level framework's partial view.
172
178
 
173
179
  Do not:
174
180
 
175
- - Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks.
176
- - Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes.
177
- - Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior.
178
- - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers.
179
- - Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract.
180
- - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior.
181
- - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, stream, SSE, WebSocket, or WebTransport behavior.
181
+ - Do not author application endpoints with FastAPI `FastAPI`, `APIRouter`, dependency wiring, route decorators, middleware registration, docs generation, or lifecycle hooks. Why: that makes FastAPI the application contract instead of Tigrbl's operation, binding, hook, schema, docs, and diagnostics contract.
182
+ - Do not author application endpoints with Starlette route, request, response, middleware, background-task, or lifecycle classes. Why: Starlette is a lower-level runtime substrate here, not the application-facing authoring surface.
183
+ - Do not author application endpoints with Flask `Flask`, `Blueprint`, route decorators, request/response globals, `MethodView`, extension registration, or lifecycle hooks. Why: Flask route objects cannot preserve Tigrbl's shared operation inventory, schema generation, lifecycle phases, or transport plan.
184
+ - Do not use raw SQLAlchemy `mapped_column(...)` or `Column(...)` as the primary application authoring surface when Tigrbl column helpers or specs can represent the field behavior. Why: raw ORM declarations are only one lowering target and cannot carry the full storage, IO, validation, docs, hook, and runtime contract.
185
+ - Do not build ad-hoc SQLAlchemy engines, sessions, or sessionmakers inside request handlers. Why: ad-hoc construction bypasses declarative engine binding, session policy, pooling, diagnostics, tests, and backend adapters.
186
+ - Do not call direct database/session methods such as `flush()` or `commit()` from application hooks or handlers unless you are implementing a framework-level atom with the correct lifecycle guard contract. Why: direct calls bypass lifecycle guards and can commit partial state before hooks, errors, rollback handlers, or response shaping have run.
187
+ - Do not wrap model behavior in one-off route handlers when an operation spec can represent the behavior. Why: route wrappers hide behavior from protocol projection, docs, hooks, diagnostics, and tests.
188
+ - Do not bypass kernel/runtime plans when wiring REST, JSON-RPC, HTTP stream, SSE, WebSocket, or WebTransport behavior. Why: bypasses skip legality checks, lifecycle phases, transaction ownership, protocol framing policy, and fail-closed unsupported-combination handling.
182
189
 
183
190
  Avoid:
184
191
 
185
- - Avoid treating ASGI, FastAPI, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks.
186
- - Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source.
187
- - Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation.
188
- - Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once.
189
- - Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface.
192
+ - Avoid treating ASGI, FastAPI, Flask, Starlette, SQLAlchemy ORM materialization, or direct DB methods as the user-facing application contract. Tigrbl owns the authoring contract; lower-level libraries are implementation substrates behind Tigrbl-owned adapters, engines, tests, or benchmarks. Why: lower-level substrates are legal implementation tools, but not the supported application API.
193
+ - Avoid duplicating field behavior in SQLAlchemy, Pydantic, docs, and route handlers. Put reusable behavior in Tigrbl specs so storage, schema, docs, runtime, hooks, and diagnostics read the same source. Why: duplicated rules create stale validation, stale docs, and protocol-specific behavior differences.
194
+ - Avoid hand-written Pydantic envelopes for payloads that belong to a Tigrbl operation. Why: generated schemas keep request/response payloads aligned with operation specs and docs.
195
+ - Avoid transport-specific wrappers for authentication, authorization, validation, or dispatch when security dependencies, hooks, operation specs, or lifecycle phases can express the rule once. Why: transport-layer policy can make REST, JSON-RPC, streams, SSE, WebSocket, and WebTransport disagree about the same domain operation.
196
+ - Avoid teaching lower-level internals in application README examples unless the example is clearly marked as a test, benchmark, migration, engine adapter, or framework-internal compatibility surface. Why: examples without a boundary marker become accidental guidance.
190
197
 
191
198
  ## Default CRUD and Operation Semantics
192
199
 
@@ -262,7 +269,7 @@ Bulk operations are not part of the minimal canonical default set. They are enab
262
269
 
263
270
  ## REST, JSON-RPC, and Transport Projection
264
271
 
265
- Tigrbl projects the same operation inventory across multiple protocol surfaces:
272
+ Tigrbl projects the same operation inventory across multiple protocol surfaces while keeping protocol, carrier, exchange, stream direction, and framing separate. The full public matrix is in [`docs/developer/TRANSPORTS_AND_FRAMING.md`](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md).
266
273
 
267
274
  | Surface | Binding family | Framing | Primary use |
268
275
  |---|---|---|---|
@@ -271,9 +278,10 @@ Tigrbl projects the same operation inventory across multiple protocol surfaces:
271
278
  | HTTP stream | stream | stream or configured stream framing | Server-streaming outputs and progressive responses. |
272
279
  | SSE | stream | SSE | Browser-friendly event streams. |
273
280
  | WebSocket/WSS | message | text or JSON-RPC when negotiated | Bidirectional message workflows. |
274
- | WebTransport | session, stream, or datagram | WebTransport outer framing plus lane-specific inner framing | Session, stream, and datagram transports with fail-closed lane validation. |
281
+ | WebTransport | session, stream, or datagram | no top-level app framing; lane-local framing only | Session, stream, and datagram transports with fail-closed lane validation. |
282
+ | h11 / h2 / h3 / QUIC carrier metadata | delegated server/runtime boundary | binding-dependent | Serving-stack protocol mechanics, runtime capability metadata, and deployment controls. |
275
283
 
276
- The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed.
284
+ The framework keeps protocol, exchange, and framing separate. For example, strict JSON-RPC document framing is `jsonrpc`; newline-delimited JSON-RPC should be modeled distinctly rather than collapsed into plain `ndjson`. Unsupported combinations fail closed during binding or runtime planning instead of being guessed. Tigrbl owns binding declarations, runtime planning, channel metadata, and frame codecs; the serving/runtime stack owns wire-level HTTP/1.1, HTTP/2, HTTP/3, QUIC, TLS termination, HPACK, QPACK, ALPN, and flow control.
277
285
 
278
286
  ## Request Lifecycle and Hook Phases
279
287
 
@@ -401,7 +409,7 @@ Common table-level declarations include:
401
409
 
402
410
  ## How To Choose This Package
403
411
 
404
- Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST and JSON-RPC projection, docs generation, engine integration, and CLI workflow. Choose a lower-level package such as [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-base`](https://pypi.org/project/tigrbl-base/), or [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/) only when you are building framework extensions or testing a specific internal boundary.
412
+ Choose `tigrbl` when you want the full public facade: app composition, schema-first routing, REST, JSON-RPC, streaming, SSE, WebSocket, WebTransport-aware runtime planning, docs generation, engine integration, and CLI workflow. Choose a lower-level package such as [`tigrbl-core`](https://pypi.org/project/tigrbl-core/), [`tigrbl-base`](https://pypi.org/project/tigrbl-base/), or [`tigrbl-runtime`](https://pypi.org/project/tigrbl-runtime/) only when you are building framework extensions or testing a specific internal boundary.
405
413
 
406
414
  ## Related Packages
407
415
 
@@ -418,6 +426,12 @@ Choose `tigrbl` when you want the full public facade: app composition, schema-fi
418
426
  ## Documentation Links
419
427
 
420
428
  - [Workspace docs](https://github.com/tigrbl/tigrbl/blob/master/docs/README.md)
429
+ - [Equivalence guide index](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/EQUIVALENCE_INDEX.md)
430
+ - [Application authoring equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/AUTHORING_EQUIVALENCE.md)
431
+ - [Router and table equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ROUTER_TABLE_EQUIVALENCE.md)
432
+ - [Transport equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORT_EQUIVALENCE.md)
433
+ - [Engine and SQL equivalence](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/ENGINE_SQL_EQUIVALENCE.md)
434
+ - [Transports and framing](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/TRANSPORTS_AND_FRAMING.md)
421
435
  - [Package catalog](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_CATALOG.md)
422
436
  - [Package layout](https://github.com/tigrbl/tigrbl/blob/master/docs/developer/PACKAGE_LAYOUT.md)
423
437
  - [Current target](https://github.com/tigrbl/tigrbl/blob/master/docs/conformance/CURRENT_TARGET.md)
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "tigrbl"
3
- version = "0.4.3.dev4"
4
- description = "Schema-first ASGI framework for REST and JSON-RPC APIs with OpenAPI, OpenRPC, SQLAlchemy, typed validation, hooks, and engine plugins."
3
+ version = "0.4.4.dev7"
4
+ description = "Schema-first ASGI framework for REST, JSON-RPC, streaming, SSE, WebSocket, runtime plans, hooks, diagnostics, and engine plugins."
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
7
7
  keywords = [
@@ -18,9 +18,14 @@ keywords = [
18
18
  "openrpc",
19
19
  "pydantic",
20
20
  "rest",
21
+ "runtime plans",
21
22
  "schema-first",
22
23
  "sqlalchemy",
24
+ "sse",
25
+ "streaming",
23
26
  "typed validation",
27
+ "websocket",
28
+ "webtransport",
24
29
  ]
25
30
  classifiers = [
26
31
  "Development Status :: 3 - Alpha",
@@ -108,6 +108,7 @@ from tigrbl_concrete._concrete import ( # noqa: E402
108
108
  HTMLResponse,
109
109
  HTTPBasic,
110
110
  HTTPBearer,
111
+ JsonRpcBulkCrudTable,
111
112
  JsonRpcOlapTable,
112
113
  JsonRpcOltpTable,
113
114
  JsonRpcTable,
@@ -120,6 +121,7 @@ from tigrbl_concrete._concrete import ( # noqa: E402
120
121
  Op,
121
122
  PlainTextResponse,
122
123
  RealtimeTable,
124
+ RestBulkCrudTable,
123
125
  RestJsonRpcOlapTable,
124
126
  RestJsonRpcOltpTable,
125
127
  RestJsonRpcTable,
@@ -219,9 +221,12 @@ from tigrbl_core._spec import ( # noqa: E402
219
221
  FieldSpec,
220
222
  Framing,
221
223
  ForeignKeySpec,
224
+ HeadersSpec,
222
225
  HookPhase,
223
226
  HttpJsonRpcBindingSpec,
227
+ HttpJsonRpcProtocolBindingSpec,
224
228
  HttpRestBindingSpec,
229
+ HttpRestProtocolBindingSpec,
225
230
  HttpStreamBindingSpec,
226
231
  IOSpec,
227
232
  OpSpec,
@@ -249,6 +254,10 @@ from tigrbl_core._spec import ( # noqa: E402
249
254
  TxScope,
250
255
  WebSocketBindingSpec,
251
256
  WebTransportBindingSpec,
257
+ WebSocketProtocolBindingSpec,
258
+ WebTransportDatagramSpec,
259
+ WebTransportProtocolBindingSpec,
260
+ WebTransportStreamSpec,
252
261
  WellKnownResourceSpec,
253
262
  WsBindingSpec,
254
263
  canonical_binding_kind,
@@ -257,7 +266,7 @@ from tigrbl_core._spec import ( # noqa: E402
257
266
  validate_app_framing_for_binding,
258
267
  validate_binding_profile_exchange,
259
268
  )
260
- from tigrbl_runtime.executors.invoke import _invoke # noqa: E402
269
+ from tigrbl_runtime.executors.phase_runner import _invoke # noqa: E402
261
270
 
262
271
 
263
272
  def bind(*args, **kwargs):
@@ -394,7 +403,9 @@ __all__ = [
394
403
  "Framing",
395
404
  "HTTPBindingSpec",
396
405
  "HttpJsonRpcBindingSpec",
406
+ "HttpJsonRpcProtocolBindingSpec",
397
407
  "HttpRestBindingSpec",
408
+ "HttpRestProtocolBindingSpec",
398
409
  "PathKind",
399
410
  "PathSpec",
400
411
  "path_for_binding",
@@ -431,6 +442,10 @@ __all__ = [
431
442
  "SseBindingSpec",
432
443
  "WebSocketBindingSpec",
433
444
  "WebTransportBindingSpec",
445
+ "WebSocketProtocolBindingSpec",
446
+ "WebTransportDatagramSpec",
447
+ "WebTransportProtocolBindingSpec",
448
+ "WebTransportStreamSpec",
434
449
  "WsBindingSpec",
435
450
  "canonical_binding_kind",
436
451
  "normalize_binding_spec",
@@ -481,6 +496,7 @@ __all__ = [
481
496
  "StorageTransformSpec",
482
497
  "StorageTypeRef",
483
498
  "ForeignKeySpec",
499
+ "HeadersSpec",
484
500
  "RequestSpec",
485
501
  "SchemaSpec",
486
502
  "SessionSpec",
@@ -506,6 +522,8 @@ __all__ = [
506
522
  "RestJsonRpcTable",
507
523
  "JsonRpcTable",
508
524
  "BulkCrudTable",
525
+ "RestBulkCrudTable",
526
+ "JsonRpcBulkCrudTable",
509
527
  "RestOltpTable",
510
528
  "JsonRpcOltpTable",
511
529
  "RestJsonRpcOltpTable",
@@ -21,6 +21,7 @@ from . import TigrblApp, TigrblRouter
21
21
  from .engine import known_engine_kinds, load_engine_plugins
22
22
  from .system import mount_lens, mount_openapi, mount_openrpc, mount_swagger
23
23
  from tigrbl_core._spec.engine_spec import EngineSpec
24
+ from tigrbl_core._spec.serde import SerdeMixin
24
25
 
25
26
  SUPPORTED_SERVERS = ("tigrcorn", "uvicorn", "hypercorn", "gunicorn")
26
27
  DEFAULT_HOST = "127.0.0.1"
@@ -415,6 +416,8 @@ def _json_default(value: Any) -> Any:
415
416
  return [str(item) for item in value]
416
417
  if isinstance(value, Path):
417
418
  return str(value)
419
+ if isinstance(value, SerdeMixin):
420
+ return value.to_dict()
418
421
  raise TypeError(f"Object of type {value.__class__.__name__} is not JSON serializable")
419
422
 
420
423
 
File without changes
File without changes
File without changes