tina4-python 3.13.33__tar.gz → 3.13.35__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.
- {tina4_python-3.13.33 → tina4_python-3.13.35}/PKG-INFO +7 -5
- {tina4_python-3.13.33 → tina4_python-3.13.35}/README.md +6 -4
- {tina4_python-3.13.33 → tina4_python-3.13.35}/pyproject.toml +1 -1
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/__init__.py +1 -1
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/__init__.py +46 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/mcp/tools.py +1 -1
- {tina4_python-3.13.33 → tina4_python-3.13.35}/.gitignore +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/CLAUDE.md +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/HtmlElement.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/Testing.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/ai/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/api/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/auth/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/cache/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/cli/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/container/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/cache.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/constants.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/events.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/middleware.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/rate_limiter.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/request.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/response.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/router.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/server.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/crud/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/adapter.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/connection.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/firebird.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/mongodb.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/mssql.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/mysql.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/odbc.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/postgres.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/sqlite.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/debug/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/debug/error_overlay.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/metrics.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/plan.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/project_index.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/docs.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dotenv/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/env.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/frond/FROND.md +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/frond/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/frond/engine.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/auth/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/database/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/error-overlay/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/orm/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/queue/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/rest-api/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/templates/meta.json +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/graphql/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/i18n/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/mcp/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/mcp/protocol.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/messenger/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/migration/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/migration/runner.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/orm/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/orm/fields.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/orm/model.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/__feedback/widget.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/css/tina4.css +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/css/tina4.min.css +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/favicon.ico +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/images/logo.svg +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/frond.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/frond.min.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4-dev-admin.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4.min.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4js.min.js +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/swagger/index.html +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/query_builder/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/job.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/kafka_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/lite_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/mongo_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/rabbitmq_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/kafka_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/mongo_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_alerts.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_badges.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_buttons.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_cards.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_forms.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_grid.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_modals.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_nav.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_reset.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_tables.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_typography.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_utilities.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_variables.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/base.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/colors.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/tina4.scss +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/seeder/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/service/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/mongodb_handler.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/redis_handler.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/valkey_handler.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/swagger/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/components/crud.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/python/Dockerfile +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/uv/Dockerfile +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/302.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/401.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/403.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/404.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/500.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/502.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/503.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/base.twig +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/frontend/README.md +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/readme.md +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/test/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/test_client/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/validator/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/websocket/__init__.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/websocket/backplane.py +0 -0
- {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/wsdl/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tina4-python
|
|
3
|
-
Version: 3.13.
|
|
3
|
+
Version: 3.13.35
|
|
4
4
|
Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
|
|
5
5
|
Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -74,6 +74,8 @@ cd my-app && tina4 serve
|
|
|
74
74
|
|
|
75
75
|
Open http://localhost:7146 — your app is running.
|
|
76
76
|
|
|
77
|
+
> **Two CLIs:** `tina4` is the cross-language Rust CLI — it scaffolds projects, runs the dev server, and watches files. `tina4python` is the Python package's own CLI for project tasks (`migrate`, `seed`, `generate`, `test`). This guide uses `tina4` to scaffold and run, and `tina4python` for those tasks.
|
|
78
|
+
|
|
77
79
|
<details>
|
|
78
80
|
<summary><strong>Without the Tina4 CLI (Docker / CI only)</strong></summary>
|
|
79
81
|
|
|
@@ -162,7 +164,7 @@ pip install tina4-python[dev-reload] # Hot-patching via jurigged
|
|
|
162
164
|
### 1. Create a project
|
|
163
165
|
|
|
164
166
|
```bash
|
|
165
|
-
|
|
167
|
+
tina4 init python my-app
|
|
166
168
|
cd my-app
|
|
167
169
|
```
|
|
168
170
|
|
|
@@ -694,13 +696,13 @@ Frond.clear_cache()
|
|
|
694
696
|
## Environment
|
|
695
697
|
|
|
696
698
|
```bash
|
|
697
|
-
|
|
699
|
+
TINA4_SECRET=your-jwt-secret
|
|
698
700
|
TINA4_DATABASE_URL=sqlite:///data/app.db
|
|
699
701
|
TINA4_DEBUG=true # Enable dev toolbar, error overlay
|
|
700
702
|
TINA4_LOG_LEVEL=ALL # ALL, DEBUG, INFO, WARNING, ERROR
|
|
701
703
|
TINA4_LOCALE=en # en, fr, af, zh, ja, es
|
|
702
|
-
TINA4_SESSION_BACKEND=
|
|
703
|
-
|
|
704
|
+
TINA4_SESSION_BACKEND=file # file (default), redis, valkey, mongodb, database
|
|
705
|
+
TINA4_SWAGGER_TITLE=My API
|
|
704
706
|
```
|
|
705
707
|
|
|
706
708
|
## AI Tool Integration
|
|
@@ -42,6 +42,8 @@ cd my-app && tina4 serve
|
|
|
42
42
|
|
|
43
43
|
Open http://localhost:7146 — your app is running.
|
|
44
44
|
|
|
45
|
+
> **Two CLIs:** `tina4` is the cross-language Rust CLI — it scaffolds projects, runs the dev server, and watches files. `tina4python` is the Python package's own CLI for project tasks (`migrate`, `seed`, `generate`, `test`). This guide uses `tina4` to scaffold and run, and `tina4python` for those tasks.
|
|
46
|
+
|
|
45
47
|
<details>
|
|
46
48
|
<summary><strong>Without the Tina4 CLI (Docker / CI only)</strong></summary>
|
|
47
49
|
|
|
@@ -130,7 +132,7 @@ pip install tina4-python[dev-reload] # Hot-patching via jurigged
|
|
|
130
132
|
### 1. Create a project
|
|
131
133
|
|
|
132
134
|
```bash
|
|
133
|
-
|
|
135
|
+
tina4 init python my-app
|
|
134
136
|
cd my-app
|
|
135
137
|
```
|
|
136
138
|
|
|
@@ -662,13 +664,13 @@ Frond.clear_cache()
|
|
|
662
664
|
## Environment
|
|
663
665
|
|
|
664
666
|
```bash
|
|
665
|
-
|
|
667
|
+
TINA4_SECRET=your-jwt-secret
|
|
666
668
|
TINA4_DATABASE_URL=sqlite:///data/app.db
|
|
667
669
|
TINA4_DEBUG=true # Enable dev toolbar, error overlay
|
|
668
670
|
TINA4_LOG_LEVEL=ALL # ALL, DEBUG, INFO, WARNING, ERROR
|
|
669
671
|
TINA4_LOCALE=en # en, fr, af, zh, ja, es
|
|
670
|
-
TINA4_SESSION_BACKEND=
|
|
671
|
-
|
|
672
|
+
TINA4_SESSION_BACKEND=file # file (default), redis, valkey, mongodb, database
|
|
673
|
+
TINA4_SWAGGER_TITLE=My API
|
|
672
674
|
```
|
|
673
675
|
|
|
674
676
|
## AI Tool Integration
|
|
@@ -485,6 +485,12 @@ def get_api_handlers() -> dict:
|
|
|
485
485
|
# @mcp_tool decorator appear in both immediately.
|
|
486
486
|
"/__dev/api/mcp/tools": ("GET", _api_mcp_tools),
|
|
487
487
|
"/__dev/api/mcp/call": ("POST", _api_mcp_call),
|
|
488
|
+
# JSON-RPC + SSE surface for real MCP clients (Claude Desktop/Code).
|
|
489
|
+
# Same registry as the REST shim above; this is what makes /__dev/mcp
|
|
490
|
+
# actually reachable as an MCP server (previously defined but unmounted).
|
|
491
|
+
"/__dev/mcp": ("POST", _api_mcp_rpc),
|
|
492
|
+
"/__dev/mcp/message": ("POST", _api_mcp_rpc),
|
|
493
|
+
"/__dev/mcp/sse": ("GET", _api_mcp_sse),
|
|
488
494
|
# ── Scaffold REST shim ──
|
|
489
495
|
# Wraps the tina4python CLI's `generate <kind> <name>` so the
|
|
490
496
|
# + Route / + Model / + Migration / + Middleware buttons work
|
|
@@ -2861,6 +2867,46 @@ async def _api_mcp_call(request, response):
|
|
|
2861
2867
|
return response({"ok": False, "name": name, "error": str(exc)}, 500)
|
|
2862
2868
|
|
|
2863
2869
|
|
|
2870
|
+
# ─── MCP JSON-RPC + SSE endpoint ───────────────────────────────────
|
|
2871
|
+
#
|
|
2872
|
+
# The protocol surface real MCP clients (Claude Desktop/Code) speak —
|
|
2873
|
+
# JSON-RPC 2.0 over the HTTP+SSE transport. Mounted on the running dev
|
|
2874
|
+
# server so each `tina4 serve`d project exposes its OWN endpoint, giving
|
|
2875
|
+
# an AI agent live access scoped to that project. Shares the same
|
|
2876
|
+
# `_default_server` tool registry as the REST shim above, so every
|
|
2877
|
+
# @mcp_tool shows up on both surfaces.
|
|
2878
|
+
|
|
2879
|
+
async def _api_mcp_rpc(request, response):
|
|
2880
|
+
"""POST — the JSON-RPC endpoint. Mounted at /__dev/mcp and
|
|
2881
|
+
/__dev/mcp/message. Forwards to the default MCP server's
|
|
2882
|
+
handle_message() and returns the JSON-RPC response; notifications
|
|
2883
|
+
(no id) yield an empty 204.
|
|
2884
|
+
"""
|
|
2885
|
+
import json as _json
|
|
2886
|
+
from tina4_python.mcp import _get_default_server, is_enabled
|
|
2887
|
+
if not is_enabled():
|
|
2888
|
+
return response({"error": "MCP disabled"}, 404)
|
|
2889
|
+
server = _get_default_server()
|
|
2890
|
+
body = request.body
|
|
2891
|
+
raw = body if isinstance(body, (dict, str)) else str(body)
|
|
2892
|
+
result = server.handle_message(raw)
|
|
2893
|
+
if not result:
|
|
2894
|
+
return response("", 204)
|
|
2895
|
+
return response(_json.loads(result))
|
|
2896
|
+
|
|
2897
|
+
|
|
2898
|
+
async def _api_mcp_sse(request, response):
|
|
2899
|
+
"""GET — SSE handshake. Emits the `endpoint` event telling the client
|
|
2900
|
+
where to POST JSON-RPC messages, per the MCP HTTP+SSE transport.
|
|
2901
|
+
"""
|
|
2902
|
+
from tina4_python.mcp import is_enabled
|
|
2903
|
+
if not is_enabled():
|
|
2904
|
+
return response({"error": "MCP disabled"}, 404)
|
|
2905
|
+
base = request.path.rsplit("/sse", 1)[0]
|
|
2906
|
+
sse = f"event: endpoint\ndata: {base}/message\n\n"
|
|
2907
|
+
return response(sse, 200, "text/event-stream")
|
|
2908
|
+
|
|
2909
|
+
|
|
2864
2910
|
# ─── Scaffold REST shim ────────────────────────────────────────────
|
|
2865
2911
|
#
|
|
2866
2912
|
# Wraps the tina4python `generate <kind> <name>` CLI commands so the
|
|
@@ -259,7 +259,7 @@ def register_dev_tools(server):
|
|
|
259
259
|
"""List all registered routes with methods and paths."""
|
|
260
260
|
from tina4_python.core.router import Router
|
|
261
261
|
routes = []
|
|
262
|
-
for route in Router.
|
|
262
|
+
for route in Router.get_routes():
|
|
263
263
|
routes.append({
|
|
264
264
|
"method": route.get("method", ""),
|
|
265
265
|
"path": route.get("path", ""),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/images/tina4-logo-icon.webp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/swagger/oauth2-redirect.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/rabbitmq_backend.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/mongodb_handler.py
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/redis_handler.py
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/valkey_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/distroless/Dockerfile
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/poetry/Dockerfile
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/python/Dockerfile
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/af/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/af/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/en/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/en/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/es/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/es/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/fr/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/fr/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/ja/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/ja/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/zh/LC_MESSAGES/messages.mo
RENAMED
|
File without changes
|
{tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/zh/LC_MESSAGES/messages.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|