feat: implement GEWU service and local agent workflows
CI / quality (push) Canceled after 0s

This commit is contained in:
vasily committed 2026-10-14 19:21:35 +08:00
1 parent 4db3f45164
commit d25c04cdd2
175 files changed
+56243 -15

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
"""Export the composed HTTP API schema without touching the operator's data root."""
from __future__ import annotations
import json
import os
import tempfile
from pathlib import Path
from typing import Any
from gewu.bootstrap.app import create_local_app
ROOT = Path(__file__).resolve().parents[1]
DESTINATION = ROOT / "schema" / "v1" / "openapi.json"
def componentize_record_schema(
name: str, record_schema: dict[str, Any], components: dict[str, Any]
) -> None:
definitions = record_schema.pop("$defs", {})
def rewrite_local_refs(value: Any) -> Any:
if isinstance(value, list):
return [rewrite_local_refs(item) for item in value]
if not isinstance(value, dict):
return value
rewritten = {key: rewrite_local_refs(item) for key, item in value.items() if key != "$defs"}
reference = rewritten.get("$ref")
if isinstance(reference, str) and reference.startswith("#/$defs/"):
definition_name = reference.removeprefix("#/$defs/")
rewritten["$ref"] = f"#/components/schemas/{name}__{definition_name}"
return rewritten
for definition_name, definition in definitions.items():
component_name = f"{name}__{definition_name}"
components.setdefault(component_name, rewrite_local_refs(definition))
components.setdefault(name, rewrite_local_refs(record_schema))
def main() -> None:
previous_data_root = os.environ.get("GEWU_DATA_ROOT")
with tempfile.TemporaryDirectory(prefix="gewu-openapi-") as temporary:
os.environ["GEWU_DATA_ROOT"] = str(Path(temporary) / "data")
try:
schema: dict[str, Any] = create_local_app().openapi()
finally:
if previous_data_root is None:
os.environ.pop("GEWU_DATA_ROOT", None)
else:
os.environ["GEWU_DATA_ROOT"] = previous_data_root
schema_components = schema.setdefault("components", {}).setdefault("schemas", {})
for record_schema in sorted((ROOT / "schema" / "v1" / "records").glob("*.schema.json")):
component_name = record_schema.name.removesuffix(".schema.json")
schema_value = json.loads(record_schema.read_text(encoding="utf-8"))
componentize_record_schema(component_name, schema_value, schema_components)
DESTINATION.parent.mkdir(parents=True, exist_ok=True)
DESTINATION.write_text(
json.dumps(schema, ensure_ascii=False, indent=2, sort_keys=True) + "\n",
encoding="utf-8",
)
if __name__ == "__main__":
main()