Spaces:
Running
Running
openwind-ci commited on
Commit ·
f00a1fe
1
Parent(s): dd29257
sync: github ddd2219
Browse files- README.md +7 -5
- app.py +3 -0
- fetch_atlases.py +3 -0
- security.py +3 -0
- vendor/data-adapters/pyproject.toml +1 -1
- vendor/data-adapters/src/openwind_data/__init__.py +3 -0
- vendor/data-adapters/src/openwind_data/adapters/__init__.py +2 -0
- vendor/data-adapters/src/openwind_data/adapters/base.py +3 -0
- vendor/data-adapters/src/openwind_data/adapters/cache_backed.py +3 -0
- vendor/data-adapters/src/openwind_data/adapters/openmeteo.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/__init__.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/harmonic.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/marc_atlas.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/narrow_pass.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/router.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/shom_c2d.py +3 -0
- vendor/data-adapters/src/openwind_data/currents/shom_c2d_registry.py +3 -0
- vendor/data-adapters/src/openwind_data/routing/__init__.py +3 -0
- vendor/data-adapters/src/openwind_data/routing/archetypes.py +3 -0
- vendor/data-adapters/src/openwind_data/routing/complexity.py +3 -0
- vendor/data-adapters/src/openwind_data/routing/geometry.py +3 -0
- vendor/data-adapters/src/openwind_data/routing/passage.py +3 -0
- vendor/data-adapters/src/openwind_data/routing/polars/__init__.py +2 -0
- vendor/mcp-core/pyproject.toml +1 -1
- vendor/mcp-core/scripts/run_local.py +3 -0
- vendor/mcp-core/src/openwind_mcp_core/__init__.py +3 -0
- vendor/mcp-core/src/openwind_mcp_core/feedback.py +3 -0
- vendor/mcp-core/src/openwind_mcp_core/render.py +3 -0
- vendor/mcp-core/src/openwind_mcp_core/server.py +7 -2
- vendor/mcp-core/src/openwind_mcp_core/widget.py +3 -0
README.md
CHANGED
|
@@ -6,7 +6,7 @@ colorTo: yellow
|
|
| 6 |
sdk: docker
|
| 7 |
app_port: 7860
|
| 8 |
pinned: false
|
| 9 |
-
license:
|
| 10 |
short_description: (dev) Sailing passage planner for any coast, via MCP.
|
| 11 |
---
|
| 12 |
|
|
@@ -76,7 +76,7 @@ asks you for credentials is guessing rather than reading the server.
|
|
| 76 |
- **Boat-aware.** 7 archetypes from 20 to 50 ft, real polars, an `efficiency` parameter for trim and crew level.
|
| 77 |
- **Window-aware.** One call sweeps up to 14 days of hourly departures so the LLM can pick the calmest slot.
|
| 78 |
- **Client-agnostic.** One HTTP MCP endpoint, no vendor lock-in. Rich [MCP Apps](https://modelcontextprotocol.io/extensions/client-matrix) widget on supporting hosts; clean deep-link fallback on the rest.
|
| 79 |
-
- **Open source,
|
| 80 |
|
| 81 |
## Four tools
|
| 82 |
|
|
@@ -112,7 +112,9 @@ sleep takes ~5 s to wake. Acceptable for V1.
|
|
| 112 |
|
| 113 |
## License and trademark
|
| 114 |
|
| 115 |
-
Code:
|
| 116 |
-
|
| 117 |
-
|
|
|
|
|
|
|
| 118 |
[TRADEMARK.md](https://github.com/qdonnars/ohmywind/blob/main/TRADEMARK.md).
|
|
|
|
| 6 |
sdk: docker
|
| 7 |
app_port: 7860
|
| 8 |
pinned: false
|
| 9 |
+
license: agpl-3.0
|
| 10 |
short_description: (dev) Sailing passage planner for any coast, via MCP.
|
| 11 |
---
|
| 12 |
|
|
|
|
| 76 |
- **Boat-aware.** 7 archetypes from 20 to 50 ft, real polars, an `efficiency` parameter for trim and crew level.
|
| 77 |
- **Window-aware.** One call sweeps up to 14 days of hourly departures so the LLM can pick the calmest slot.
|
| 78 |
- **Client-agnostic.** One HTTP MCP endpoint, no vendor lock-in. Rich [MCP Apps](https://modelcontextprotocol.io/extensions/client-matrix) widget on supporting hosts; clean deep-link fallback on the rest.
|
| 79 |
+
- **Open source, AGPL.** Self-host on Fly, Modal, or your own VPS in minutes, under your own name and icons.
|
| 80 |
|
| 81 |
## Four tools
|
| 82 |
|
|
|
|
| 112 |
|
| 113 |
## License and trademark
|
| 114 |
|
| 115 |
+
Code: AGPL-3.0-or-later. Forking and self-hosting stay free; a modified
|
| 116 |
+
instance served over the network must publish its source. The name "OhMyWind"
|
| 117 |
+
is filed as a trademark at the INPI, and the visual identity (logo, icons)
|
| 118 |
+
stays under copyright. Neither is covered by the AGPL licence, so a fork ships
|
| 119 |
+
under its own name and icons. Full policy:
|
| 120 |
[TRADEMARK.md](https://github.com/qdonnars/ohmywind/blob/main/TRADEMARK.md).
|
app.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""HF Space entry point — serves the OhMyWind FastMCP server over HTTP.
|
| 2 |
|
| 3 |
This wrapper is intentionally thin. All tools live in ``openwind_mcp_core``
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""HF Space entry point — serves the OhMyWind FastMCP server over HTTP.
|
| 5 |
|
| 6 |
This wrapper is intentionally thin. All tools live in ``openwind_mcp_core``
|
fetch_atlases.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Pull tidal atlases from the HF Dataset at Docker build time.
|
| 2 |
|
| 3 |
Reads ``HF_TOKEN`` (mounted as a build secret) and ``HF_DATASET_ID`` from
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Pull tidal atlases from the HF Dataset at Docker build time.
|
| 5 |
|
| 6 |
Reads ``HF_TOKEN`` (mounted as a build secret) and ``HF_DATASET_ID`` from
|
security.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Deployment-side hardening for the public Space: CORS allowlist, per-IP
|
| 2 |
rate limiting, security headers.
|
| 3 |
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Deployment-side hardening for the public Space: CORS allowlist, per-IP
|
| 5 |
rate limiting, security headers.
|
| 6 |
|
vendor/data-adapters/pyproject.toml
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
name = "openwind-data"
|
| 3 |
version = "0.1.0"
|
| 4 |
description = "Marine data adapters, polars, routing, and complexity scoring for OhMyWind"
|
| 5 |
-
license = "
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
"httpx>=0.27",
|
|
|
|
| 2 |
name = "openwind-data"
|
| 3 |
version = "0.1.0"
|
| 4 |
description = "Marine data adapters, polars, routing, and complexity scoring for OhMyWind"
|
| 5 |
+
license = "AGPL-3.0-or-later"
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
"httpx>=0.27",
|
vendor/data-adapters/src/openwind_data/__init__.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""OhMyWind domain logic — marine adapters, polars, routing, complexity."""
|
| 2 |
|
| 3 |
from openwind_data.adapters.base import (
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""OhMyWind domain logic — marine adapters, polars, routing, complexity."""
|
| 5 |
|
| 6 |
from openwind_data.adapters.base import (
|
vendor/data-adapters/src/openwind_data/adapters/__init__.py
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
vendor/data-adapters/src/openwind_data/adapters/base.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Marine forecast types and adapter Protocol.
|
| 2 |
|
| 3 |
Direction conventions (mixed by physical phenomenon — mirrors meteorological and
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Marine forecast types and adapter Protocol.
|
| 5 |
|
| 6 |
Direction conventions (mixed by physical phenomenon — mirrors meteorological and
|
vendor/data-adapters/src/openwind_data/adapters/cache_backed.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Adapter backed by a client-supplied forecast cache.
|
| 2 |
|
| 3 |
Instead of calling Open-Meteo, this adapter reads wind (multi-model) and sea
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Adapter backed by a client-supplied forecast cache.
|
| 5 |
|
| 6 |
Instead of calling Open-Meteo, this adapter reads wind (multi-model) and sea
|
vendor/data-adapters/src/openwind_data/adapters/openmeteo.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
from __future__ import annotations
|
| 2 |
|
| 3 |
import asyncio
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
from __future__ import annotations
|
| 5 |
|
| 6 |
import asyncio
|
vendor/data-adapters/src/openwind_data/currents/__init__.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Tidal currents and heights subpackage.
|
| 2 |
|
| 3 |
Provides:
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Tidal currents and heights subpackage.
|
| 5 |
|
| 6 |
Provides:
|
vendor/data-adapters/src/openwind_data/currents/harmonic.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Tidal harmonic predictor.
|
| 2 |
|
| 3 |
Schureman + Cartwright 1985 astronomical longitudes. Standard convention used
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Tidal harmonic predictor.
|
| 5 |
|
| 6 |
Schureman + Cartwright 1985 astronomical longitudes. Standard convention used
|
vendor/data-adapters/src/openwind_data/currents/marc_atlas.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""MARC PREVIMER atlas runtime loader and predictor.
|
| 2 |
|
| 3 |
Reads tiled Parquet datasets produced by ``scripts/build_marc_atlas.py`` (one
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""MARC PREVIMER atlas runtime loader and predictor.
|
| 5 |
|
| 6 |
Reads tiled Parquet datasets produced by ``scripts/build_marc_atlas.py`` (one
|
vendor/data-adapters/src/openwind_data/currents/narrow_pass.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Per-point confidence labelling for current values.
|
| 2 |
|
| 3 |
The qualitative tag (``"high"`` / ``"medium"`` / ``"low"`` / ``None``) sits
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Per-point confidence labelling for current values.
|
| 5 |
|
| 6 |
The qualitative tag (``"high"`` / ``"medium"`` / ``"low"`` / ``None``) sits
|
vendor/data-adapters/src/openwind_data/currents/router.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Composite marine adapter — SHOM > MARC > Open-Meteo cascade.
|
| 2 |
|
| 3 |
Wraps an upstream ``MarineDataAdapter`` (typically ``OpenMeteoAdapter``)
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Composite marine adapter — SHOM > MARC > Open-Meteo cascade.
|
| 5 |
|
| 6 |
Wraps an upstream ``MarineDataAdapter`` (typically ``OpenMeteoAdapter``)
|
vendor/data-adapters/src/openwind_data/currents/shom_c2d.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Parser for the SHOM "Courants de marée 2D" ASCII atlas (Édition 2005).
|
| 2 |
|
| 3 |
This module loads the public-domain dataset distributed by SHOM under
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Parser for the SHOM "Courants de marée 2D" ASCII atlas (Édition 2005).
|
| 5 |
|
| 6 |
This module loads the public-domain dataset distributed by SHOM under
|
vendor/data-adapters/src/openwind_data/currents/shom_c2d_registry.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Runtime SHOM Atlas C2D registry: spatial index + tide-relative predictor.
|
| 2 |
|
| 3 |
Loads the Parquet + JSON artefacts produced by ``scripts/build_shom_c2d.py``
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Runtime SHOM Atlas C2D registry: spatial index + tide-relative predictor.
|
| 5 |
|
| 6 |
Loads the Parquet + JSON artefacts produced by ``scripts/build_shom_c2d.py``
|
vendor/data-adapters/src/openwind_data/routing/__init__.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Routing — geometry, polars, and passage time estimation."""
|
| 2 |
|
| 3 |
from openwind_data.routing.archetypes import (
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Routing — geometry, polars, and passage time estimation."""
|
| 5 |
|
| 6 |
from openwind_data.routing.archetypes import (
|
vendor/data-adapters/src/openwind_data/routing/archetypes.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Boat archetype registry — loads ORC-style polars from `polars/*.json`.
|
| 2 |
|
| 3 |
V1 ships 7 archetypes (5 monohull cruisers from 20 to 50 ft, 1 catamaran, 1
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Boat archetype registry — loads ORC-style polars from `polars/*.json`.
|
| 5 |
|
| 6 |
V1 ships 7 archetypes (5 monohull cruisers from 20 to 50 ft, 1 catamaran, 1
|
vendor/data-adapters/src/openwind_data/routing/complexity.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Complexity scoring for a passage.
|
| 2 |
|
| 3 |
V1 design choices:
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Complexity scoring for a passage.
|
| 5 |
|
| 6 |
V1 design choices:
|
vendor/data-adapters/src/openwind_data/routing/geometry.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Spherical geometry helpers — all distances in nautical miles, angles in degrees.
|
| 2 |
|
| 3 |
Earth radius is taken as 3440.065 NM (mean radius 6371.0088 km / 1.852).
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Spherical geometry helpers — all distances in nautical miles, angles in degrees.
|
| 5 |
|
| 6 |
Earth radius is taken as 3440.065 NM (mean radius 6371.0088 km / 1.852).
|
vendor/data-adapters/src/openwind_data/routing/passage.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Passage time + complexity estimation along a polyline of waypoints.
|
| 2 |
|
| 3 |
V1 design choices:
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Passage time + complexity estimation along a polyline of waypoints.
|
| 5 |
|
| 6 |
V1 design choices:
|
vendor/data-adapters/src/openwind_data/routing/polars/__init__.py
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
vendor/mcp-core/pyproject.toml
CHANGED
|
@@ -2,7 +2,7 @@
|
|
| 2 |
name = "openwind-mcp-core"
|
| 3 |
version = "0.1.0"
|
| 4 |
description = "Cloud-agnostic FastMCP server for OhMyWind: sailing planner tools."
|
| 5 |
-
license = "
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
# MCP Apps support requires:
|
|
|
|
| 2 |
name = "openwind-mcp-core"
|
| 3 |
version = "0.1.0"
|
| 4 |
description = "Cloud-agnostic FastMCP server for OhMyWind: sailing planner tools."
|
| 5 |
+
license = "AGPL-3.0-or-later"
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
# MCP Apps support requires:
|
vendor/mcp-core/scripts/run_local.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Run the OhMyWind MCP server over stdio for local Claude Desktop integration.
|
| 2 |
|
| 3 |
Usage (in claude_desktop_config.json):
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Run the OhMyWind MCP server over stdio for local Claude Desktop integration.
|
| 5 |
|
| 6 |
Usage (in claude_desktop_config.json):
|
vendor/mcp-core/src/openwind_mcp_core/__init__.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""OhMyWind MCP server — cloud-agnostic FastMCP definition."""
|
| 2 |
|
| 3 |
from openwind_mcp_core.server import build_server
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""OhMyWind MCP server — cloud-agnostic FastMCP definition."""
|
| 5 |
|
| 6 |
from openwind_mcp_core.server import build_server
|
vendor/mcp-core/src/openwind_mcp_core/feedback.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Feedback tool: lets a calling LLM log a structured note about a tool
|
| 2 |
interaction (an unclear parameter, missing data, a wrong-feeling result,
|
| 3 |
a feature request).
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Feedback tool: lets a calling LLM log a structured note about a tool
|
| 5 |
interaction (an unclear parameter, missing data, a wrong-feeling result,
|
| 6 |
a feature request).
|
vendor/mcp-core/src/openwind_mcp_core/render.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Deep-link helper used by ``plan_passage``.
|
| 2 |
|
| 3 |
Historically this module also generated a ~5 KB self-contained HTML widget
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Deep-link helper used by ``plan_passage``.
|
| 5 |
|
| 6 |
Historically this module also generated a ~5 KB self-contained HTML widget
|
vendor/mcp-core/src/openwind_mcp_core/server.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""FastMCP server factory.
|
| 2 |
|
| 3 |
`build_server()` returns a `FastMCP` instance with all tools registered. It is
|
|
@@ -507,8 +510,10 @@ but the underlying complexity is unchanged.
|
|
| 507 |
|
| 508 |
## Licence and trademark
|
| 509 |
|
| 510 |
-
The OhMyWind source code is
|
| 511 |
-
|
|
|
|
|
|
|
| 512 |
French industrial property office), and the visual identity (logo,
|
| 513 |
icons), which stays under copyright. Forks are welcome under their own
|
| 514 |
name and icons. Policy:
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""FastMCP server factory.
|
| 5 |
|
| 6 |
`build_server()` returns a `FastMCP` instance with all tools registered. It is
|
|
|
|
| 510 |
|
| 511 |
## Licence and trademark
|
| 512 |
|
| 513 |
+
The OhMyWind source code is licensed under the AGPL-3.0-or-later. Forks
|
| 514 |
+
and redistribution stay free; a modified instance served over the
|
| 515 |
+
network must publish its source. Two things the AGPL grant does not
|
| 516 |
+
cover: the name "OhMyWind", filed as a trademark at the INPI (the
|
| 517 |
French industrial property office), and the visual identity (logo,
|
| 518 |
icons), which stays under copyright. Forks are welcome under their own
|
| 519 |
name and icons. Policy:
|
vendor/mcp-core/src/openwind_mcp_core/widget.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
"""Static HTML template consumed by ``render.py`` to produce the passage widget.
|
| 2 |
|
| 3 |
Kept in its own module so the visual contract is trivial to inspect / iterate
|
|
|
|
| 1 |
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
| 2 |
+
# SPDX-FileCopyrightText: 2026 Quentin Donnars
|
| 3 |
+
|
| 4 |
"""Static HTML template consumed by ``render.py`` to produce the passage widget.
|
| 5 |
|
| 6 |
Kept in its own module so the visual contract is trivial to inspect / iterate
|