chore: rename repository to NODEDC MISSION CORE

This commit is contained in:
DCCONSTRUCTIONS 2026-07-16 12:10:05 +03:00
parent 8459bb03fb
commit 9225227421
50 changed files with 220 additions and 61 deletions

View File

@ -1,8 +1,9 @@
# Repository operating rules
This repository investigates an owner-controlled XGRIDS/LixelKity K1 as a
black-box sensor. Preserve the device, the Mac, the working LAN, and raw
evidence.
NODEDC MISSION CORE is a vendor-neutral mission-control monorepo. Its first
real device plugin investigates an owner-controlled XGRIDS/LixelKity K1 as a
black-box sensor. Preserve the device, the host, the working LAN, raw evidence,
and the boundary between Mission Core and vendor-specific integration code.
## Non-negotiable safety boundaries

View File

@ -1,16 +1,22 @@
# NDC XGRIDS K1 Connector
# NODEDC MISSION CORE
Pre-production research project for connecting an owner-controlled
XGRIDS/LixelKity K1 to a Mac without LixelGO, firmware changes, device opening,
or speculative writes.
NODEDC MISSION CORE is the vendor-neutral control, observation, mission-planning,
recording, and integration platform for NODEDC autonomous systems. This
repository is the canonical early-stage monorepo: it contains the Mission Core
Control Station, the current local control plane, shared contracts as they are
extracted, and device plugins.
Current status: live proof completed on firmware 3.0.2. The Mac provisioned the
K1 onto an existing LAN without LixelGO, connected to its MQTT broker, captured
the scan-correlated point-cloud and pose streams, and decoded both successfully.
The repository also contains a local React control console, an automatic Rerun
gRPC bridge for the verified point-cloud and trajectory streams, and a
self-hosted Rerun Web Viewer embedded in that console. The former Foxglove
bridge remains only as a legacy regression module.
The first proven hardware vertical is the XGRIDS/LixelKity K1 plugin. On firmware
3.0.2 the host provisions the scanner onto an existing LAN without LixelGO,
connects to its MQTT broker, durably captures the raw stream, decodes point cloud
and pose, and renders the real cloud plus trajectory through an embedded
self-hosted Rerun Web Viewer. The former Foxglove bridge remains only as a
legacy regression module.
The repository is intentionally migrating in stages. The current `src/k1link`
package is the compatibility implementation of the first plugin path; vendor
transport and codecs will move behind `plugins/xgrids-k1` and the Mission Core
Plugin SDK without changing the verified wire protocol or raw evidence format.
The repository now contains one narrowly gated state-changing command:
`ble wifi-configure`. It accepts only the reviewed firmware-3 provisioning
@ -18,7 +24,7 @@ profile and requires explicit `--confirm-write`; the Wi-Fi password is collected
through a hidden local macOS dialog. MQTT capture and decoding are read-only.
Nothing changes router settings, firmware or global Python packages.
## Available stand
## Verified XGRIDS K1 stand
- one XGRIDS/LixelKity K1;
- one Apple Silicon MacBook running macOS;
@ -51,15 +57,15 @@ This does not install Python packages globally and does not modify neighboring
repositories.
```bash
cd /Users/dcconstructions/Downloads/mnt/NODEDC/NDC_xgrids-k1-connector
cd /Users/dcconstructions/Downloads/mnt/NODEDC/NODEDC_MISSION_CORE
uv sync --group dev
uv run k1link doctor
uv run pytest
```
## NODE.DC Control Station and visualization adapters
## Mission Core Control Station and visualization adapters
The browser application is now a universal NODE.DC Control Station rather than
The browser application is the universal Mission Core Control Station rather than
a K1-specific Foxglove launcher. Its fixed shell contains six architectural
sections — Center, Fleet, Observation, Missions, Data and System — while the K1
BLE/Wi-Fi/live workflow remains isolated as the first real device adapter.
@ -69,7 +75,7 @@ repository root:
```bash
uv sync --group dev
cd apps/k1-viewer
cd apps/control-station
npm install
npm run typecheck
npm run build
@ -86,7 +92,7 @@ Physical K1 scanning is still started and stopped by the verified double-click;
the connector publishes no modeling command.
The Observation spatial workspace embeds the open-source Rerun Web Viewer
inside the NODE.DC shell. It can open a compatible RRD file over HTTP(S) or a
inside the Mission Core shell. It can open a compatible RRD file over HTTP(S) or a
Rerun gRPC/proxy source such as `rerun+http://127.0.0.1:9876/proxy`. It does not
use an external hosted viewer UI.
@ -118,7 +124,7 @@ The old Foxglove implementation is retained only in
live/replay runtime does not start it or use TCP 8765. The
[live viewer runbook](docs/06_K1_LIVE_VIEWER.md) records the active Rerun path and
its timing/security boundaries; the frontend contract is documented in
[`apps/k1-viewer/README.md`](apps/k1-viewer/README.md).
[`apps/control-station/README.md`](apps/control-station/README.md).
The FastAPI application and credential endpoint bind to loopback, but the Rerun
gRPC server currently binds TCP 9876 on all network interfaces even though its
@ -170,6 +176,8 @@ present.
- [Reviewed BLE Wi-Fi profile](docs/04_K1_WIFI_PROVISIONING_PROFILE.md)
- [Verified MQTT stream profile](docs/05_K1_MQTT_STREAM_PROFILE.md)
- [Live console and embedded Rerun runbook](docs/06_K1_LIVE_VIEWER.md)
- [Mission Core monorepo and plugin boundary](docs/07_MISSION_CORE_MONOREPO.md)
- [Monorepo architecture decision](docs/adr/0002-mission-core-monorepo.md)
- [Redacted live lab report](docs/lab/001_K1_LIVE_MQTT_20260715.redacted.md)
- [Session manifest schema](schemas/session-manifest.schema.json)
- [Reference input provenance](docs/reference/README.md)

7
apps/README.md Normal file
View File

@ -0,0 +1,7 @@
# Mission Core applications
- `control-station/` — the current browser operator application.
Applications consume Mission Core contracts and capabilities. Device-specific
transport and codecs belong under `plugins/`, not inside application routing
or navigation.

View File

@ -1,6 +1,6 @@
# Пункт управления NODE.DC
# NODEDC MISSION CORE · Control Station
Универсальный браузерный пункт управления NODE.DC на React 19, TypeScript и
Универсальный браузерный пункт управления Mission Core на React 19, TypeScript и
Vite. Приложение задаёт общую операторскую оболочку для аппаратов, сенсоров,
наблюдения, миссий и записей. XGRIDS/LixelKity K1 является первым реальным
device adapter, но структура интерфейса от него не зависит.
@ -15,7 +15,7 @@ device adapter, но структура интерфейса от него не
| Контур | Состояние | Что это означает |
| --- | --- | --- |
| NODE.DC fixed shell | Реализован | Header, навигация по разделам, рабочая поверхность, окна и инспекторы работают в одном приложении. |
| Mission Core fixed shell | Реализован | Header, навигация по разделам, рабочая поверхность, окна и инспекторы работают в одном приложении. |
| Локальный control plane | Реализован | React получает состояние и выполняет операции через FastAPI REST и WebSocket на loopback. |
| K1 BLE → Wi-Fi | Реализован | Реальный BLE-поиск всех видимых устройств и одна подтверждённая provisioning-запись выбранному устройству. |
| K1 live/replay MQTT | Реализован | Read-only приём, raw-first сохранение, декодирование облака точек и позы, реальные метрики. |
@ -40,9 +40,9 @@ K1 MQTT :1883, read-only
└── gRPC/proxy TCP 9876
└── rerun_grpc_url в REST/WebSocket state
└── встроенный @rerun-io/web-viewer
└── пространственная сцена NODE.DC
└── пространственная сцена Mission Core
React Control Station ←→ REST /api/* + WebSocket /api/events
Mission Core Control Station ←→ REST /api/* + WebSocket /api/events
FastAPI на 127.0.0.1:8000
CoreBluetooth + live/replay runtime
```
@ -62,7 +62,7 @@ viewer остаются активны, а следующая сессия сб
Shell собран из локальных NODE.DC UI packages и сохраняет одну структуру для
всех функциональных модулей:
1. `AppHeader` — марка NODE.DC, выбор архитектурного раздела и состояние
1. `AppHeader` — марка NODEDC MISSION CORE, выбор архитектурного раздела и состояние
локального backend.
2. `AdminNavigationPanel` — контекст аппарата и список рабочих поверхностей
выбранного раздела.
@ -105,10 +105,10 @@ layout пока остаются интерфейсным контрактом.
Канонический путь от корня репозитория:
```bash
cd /Users/dcconstructions/Downloads/mnt/NODEDC/NDC_xgrids-k1-connector
cd /Users/dcconstructions/Downloads/mnt/NODEDC/NODEDC_MISSION_CORE
uv sync --group dev
cd apps/k1-viewer
cd apps/control-station
npm install
npm run typecheck
npm run build
@ -125,7 +125,7 @@ Wi-Fi.
Для разработки интерфейса после запуска backend:
```bash
cd apps/k1-viewer
cd apps/control-station
npm run dev
```
@ -136,7 +136,7 @@ Vite слушает `http://127.0.0.1:5173` и проксирует `/api` и `/
## Операторский путь для текущего K1 adapter
1. Запустить `uv run k1link serve` и открыть Control Station.
1. Запустить `uv run k1link serve` и открыть Mission Core Control Station.
2. Выбрать **Парк → Локальное устройство**.
3. Включить K1, дождаться стабильного индикатора и подтвердить это в форме.
4. Нажать **Показать все BLE-устройства**. Интерфейс показывает полный результат
@ -230,7 +230,7 @@ Custom timeline, переключатель 2D/3D/карты, семантиче
## Safety и чувствительные данные
- Control Station и credential endpoint доступны только на loopback.
- Mission Core Control Station и credential endpoint доступны только на loopback.
- Исключение: Rerun gRPC/proxy на TCP 9876 сейчас слушает все сетевые интерфейсы,
хотя автоматически возвращаемый URL содержит `127.0.0.1`. На нём нет
connector-level authentication или TLS. Этот порт допустим только в доверенной
@ -250,7 +250,7 @@ Custom timeline, переключатель 2D/3D/карты, семантиче
доказанный timestamp сенсора K1 и не photon-to-screen latency.
- Панорамный камерный поток в наблюдавшихся MQTT report topics отсутствует;
текущая Rerun-сцена содержит только облако точек и позу/траекторию, а
операционные метрики отображаются внешней оболочкой Control Station.
операционные метрики отображаются внешней оболочкой Mission Core.
- `sessions/` игнорируется Git и может содержать адреса, идентификаторы,
траекторию и карту помещения. В репозиторий попадают только redacted manifests
и безопасная документация.

View File

@ -5,10 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="description"
content="Пункт управления NODE.DC — наблюдение, данные и планирование миссий беспилотных аппаратов."
content="NODEDC MISSION CORE — наблюдение, данные и планирование миссий беспилотных аппаратов."
/>
<meta name="theme-color" content="#08090b" />
<title>NODE.DC · Пункт управления</title>
<title>NODEDC MISSION CORE</title>
</head>
<body>
<div id="root"></div>

View File

@ -1,11 +1,11 @@
{
"name": "@nodedc/k1-viewer",
"name": "@nodedc/mission-core-control-station",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@nodedc/k1-viewer",
"name": "@nodedc/mission-core-control-station",
"version": "0.1.0",
"dependencies": {
"@nodedc/tokens": "file:../../../NODEDC_DESIGN_GUIDELINE/packages/tokens",

View File

@ -1,5 +1,5 @@
{
"name": "@nodedc/k1-viewer",
"name": "@nodedc/mission-core-control-station",
"version": "0.1.0",
"private": true,
"type": "module",

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 322 B

After

Width:  |  Height:  |  Size: 322 B

View File

@ -254,11 +254,11 @@ export default function App() {
const header = (
<AppHeader
brand={<img src="/nodedc-logo.svg" alt="NODE.DC" />}
brandLabel="NODE.DC"
left={<span className="station-label">ПУНКТ УПРАВЛЕНИЯ</span>}
brandLabel="NODEDC MISSION CORE"
left={<span className="station-label">MISSION CORE</span>}
center={
<>
<HeaderWorkspace kind="mark" label="NODE.DC Пункт управления" imageUrl="/nodedc-mark.svg" />
<HeaderWorkspace kind="mark" label="Mission Core" imageUrl="/nodedc-mark.svg" />
<HeaderNavigation
label="Архитектурные блоки пункта управления"
value={activeRoot ?? undefined}
@ -300,7 +300,7 @@ export default function App() {
}
navigation={currentRoot ? (
<AdminNavigationPanel
eyebrow="NODE.DC"
eyebrow="MISSION CORE"
title={currentRoot.title}
closeLabel={`Закрыть раздел «${currentRoot.label}»`}
navigationLabel={`Рабочие поверхности раздела «${currentRoot.label}»`}

View File

@ -24,8 +24,8 @@ export function LandingStage({
return (
<section className="landing-stage" data-root={root?.id ?? "home"}>
<div className="landing-stage__copy">
<span className="section-eyebrow">{root?.eyebrow ?? "NODE.DC / ПУНКТ УПРАВЛЕНИЯ"}</span>
<h1>{root?.title ?? "Пункт управления"}</h1>
<span className="section-eyebrow">{root?.eyebrow ?? "NODEDC / MISSION CORE"}</span>
<h1>{root?.title ?? "Mission Core"}</h1>
<p>
{root?.statement ??
"Наблюдение, планирование и корректировка миссий в одной модульной рабочей области."}

View File

@ -30,7 +30,7 @@ Rerun gRPC/proxy on TCP 9876
+--> rerun_grpc_url in REST/WebSocket state
|
v
self-hosted @rerun-io/web-viewer inside NODE.DC Control Station
self-hosted @rerun-io/web-viewer inside Mission Core Control Station
React console <-- REST + WebSocket state --> FastAPI on 127.0.0.1:8000
```
@ -52,7 +52,7 @@ Prerequisites are the repository-local Python environment and Node.js 20.19+ or
```bash
uv sync --group dev
cd apps/k1-viewer
cd apps/control-station
npm install
npm run typecheck
npm run build
@ -121,7 +121,7 @@ does not publish an application request or modeling command.
On the first live or replay session, `RerunBridge`:
- creates an explicit `RecordingStream("nodedc_device_spatial")`;
- creates an explicit `RecordingStream("nodedc_mission_core_spatial")`;
- installs the default spatial blueprint;
- starts the gRPC/proxy server on TCP 9876 with a 512 MiB late-client buffer;
- reports `rerun+http://127.0.0.1:9876/proxy` only after the server is ready;

View File

@ -0,0 +1,39 @@
# NODEDC MISSION CORE monorepo
This document maps the renamed repository to the target Mission Core
architecture without claiming that unfinished package boundaries already
exist.
## Current layout
| Path | Current responsibility | Target responsibility |
| --- | --- | --- |
| `apps/control-station/` | React shell, device workflow, spatial scene | Vendor-neutral operator application |
| `src/k1link/web/` | Local FastAPI control plane and K1 session orchestration | Generic host APIs plus plugin supervisor |
| `src/k1link/viewer/` | Replay runtime and Rerun adapter | Canonical scene sink and presentation adapter |
| `src/k1link/ble/` | K1 BLE discovery and reviewed provisioning | `plugins/xgrids-k1` |
| `src/k1link/mqtt/` | Raw-first K1 MQTT capture | `plugins/xgrids-k1` behind EvidenceStore |
| `src/k1link/protocol/` | Firmware-scoped K1 codecs | `plugins/xgrids-k1` |
| `packages/plugin-sdk/` | Contract placeholder | Versioned manifests, capabilities, lifecycle, schemas |
| `plugins/xgrids-k1/` | Extraction boundary and documentation | Independently versioned device plugin |
## Extraction order
1. Define canonical PointCloud, Pose, DeviceStatus, RawEnvelope, and metrics
contracts in the Plugin SDK.
2. Make Rerun consume canonical frames rather than K1 MQTT topics.
3. Extract codecs and replay parity fixtures.
4. Extract raw capture with fault isolation between evidence and preview.
5. Extract BLE/Wi-Fi provisioning and MQTT into a least-privilege edge worker.
6. Replace K1-specific host routes and state with plugin/device-session APIs.
7. Drive the connection wizard from plugin capabilities and schemas.
8. Re-run native replay and the physical BLE → Wi-Fi → MQTT → scene acceptance.
## Invariants
- Raw evidence is durable before preview work.
- Mission Core starts when the XGRIDS plugin is absent or disabled.
- The plugin cannot add global navigation or arbitrary CSS.
- Vendor writes and commands require declared capabilities and operator gates.
- The visualization engine can be replaced without changing device plugins.
- Real captures and credentials remain outside Git.

View File

@ -0,0 +1,59 @@
# ADR 0002: NODEDC MISSION CORE monorepo
- Status: accepted
- Date: 2026-07-16
## Context
The repository began as a focused XGRIDS/LixelKity K1 connector and then gained
a vendor-neutral control-station shell, local control plane, replay runtime, and
embedded spatial viewer. The K1 vertical is proven on real hardware, but its
names and implementation are still coupled to the host.
## Decision
The product, repository, and local root are named NODEDC MISSION CORE. The
canonical Git path is `SILVER/NODEDC_MISSION_CORE`, and the local checkout is
`NODEDC_MISSION_CORE`.
Mission Core remains one monorepo while the first plugin contract stabilizes:
```text
apps/control-station/ browser operator application
packages/plugin-sdk/ shared plugin contracts and host interfaces
plugins/xgrids-k1/ XGRIDS/LixelKity K1 device plugin
src/k1link/ transitional compatibility implementation
docs/ architecture, runbooks, ADRs, and redacted evidence
```
An independent plugin does not require an independent Git repository at this
stage. The XGRIDS plugin must have an explicit package/runtime boundary,
manifest, capabilities, tests, and no ownership of Mission Core navigation.
It can be split into another repository later without changing host contracts.
The Rerun integration is a replaceable presentation adapter. It is not the
Mission Core data bus, session database, or device protocol.
## Compatibility boundary
The rename does not alter these proven interfaces:
- Python import namespace and CLI `k1link`;
- native `.k1mqtt` framing and `K1MQTT` magic;
- provisioning profile `xgrids-k1-fw3-wifi-v1`;
- K1 MQTT topics and firmware-scoped protobuf/LZ4 codecs;
- current `k1_ip`, `K1Metrics`, and `useK1Console` compatibility fields;
- schema v1 `$id`, which remains an immutable legacy identifier.
Those names move or change only during the plugin-extraction milestone with
explicit migration and regression tests.
## Consequences
- Product branding, repository metadata, frontend application path, API title,
and Rerun recording identity use Mission Core naming now.
- The existing K1 implementation remains operational while contracts are
extracted incrementally.
- Core must eventually boot without the XGRIDS plugin.
- Plugin failure must not terminate the Mission Core host or raw evidence plane.
- A future repository split remains possible after Plugin SDK v1 is stable.

View File

@ -0,0 +1,18 @@
# Mission Core Plugin SDK
This directory reserves the versioned host/plugin contract. It is not yet a
published SDK and must not be treated as an implemented runtime.
The first contract will define:
- plugin manifest, version compatibility, firmware profiles, and permissions;
- discovery candidates and opaque device references;
- provisioning requests using secret references;
- device-session lifecycle and health;
- EvidenceStore handles and raw-artifact lineage;
- canonical PointCloud, Pose, DeviceStatus, and metrics envelopes;
- SceneSink and event interfaces;
- capability-driven UI contribution data without plugin-owned layout.
The XGRIDS K1 extraction is the first acceptance test. A synthetic reference
plugin will verify that no K1 names or protocol assumptions remain in core.

View File

@ -0,0 +1,26 @@
# XGRIDS / LixelKity K1 plugin
This directory is the target package boundary for the first Mission Core device
plugin. The verified implementation remains temporarily in `src/k1link` so the
real-device path stays operational during extraction.
The plugin owns:
- BLE discovery hints and K1 GATT metadata;
- the reviewed firmware-3 Wi-Fi provisioning profile;
- K1 LAN status and private-address validation;
- subscribe-only MQTT transport and report-topic allowlist;
- native `.k1mqtt` capture;
- firmware-scoped protobuf/LZ4 and legacy codecs;
- normalization of K1 point cloud, pose, status, health, and artifacts;
- K1-specific operator instructions and compatibility tests.
The plugin does not own:
- Mission Core navigation, fleet, missions, users, roles, or audit;
- the generic spatial scene or Rerun Web Viewer;
- platform storage, remote transport, or other devices.
Until extraction is complete, `src/k1link` is the compatibility source of
truth and every move into this package must preserve replay and real-device
acceptance.

View File

@ -3,9 +3,9 @@ requires = ["hatchling>=1.27,<2"]
build-backend = "hatchling.build"
[project]
name = "ndc-xgrids-k1-connector"
name = "nodedc-mission-core"
version = "0.1.0"
description = "macOS-first, evidence-led research tooling for an XGRIDS Lixel K1"
description = "NODEDC Mission Core monorepo for mission control, spatial observation, and device plugins"
readme = "README.md"
requires-python = ">=3.12,<3.13"
license = { text = "Proprietary" }

View File

@ -1,6 +1,7 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://git.dcserve.ru/SILVER/NDC_xgrids-k1-connector/schemas/session-manifest.schema.json",
"$comment": "The legacy v1 schema identifier is intentionally immutable after the repository rename to NODEDC_MISSION_CORE.",
"title": "K1 laboratory session manifest",
"type": "object",
"additionalProperties": false,

View File

@ -1,3 +1,3 @@
"""NDC XGRIDS K1 connector research tooling."""
"""Mission Core runtime with the transitional XGRIDS K1 compatibility adapter."""
__version__ = "0.1.0"

View File

@ -208,15 +208,15 @@ def serve_console(
typer.Option(min=1024, max=65535, help="Loopback HTTP port for the local console."),
] = 8000,
) -> None:
"""Serve the built K1 console and local-only control API on loopback."""
frontend = Path(__file__).resolve().parents[2] / "apps" / "k1-viewer" / "dist"
"""Serve the built Mission Core Control Station and loopback control API."""
frontend = Path(__file__).resolve().parents[2] / "apps" / "control-station" / "dist"
if not frontend.is_dir():
console.print(
"[red]Frontend build is missing.[/red] Run npm install && npm run build "
"inside apps/k1-viewer."
"inside apps/control-station."
)
raise typer.Exit(code=2)
console.print(f"K1 Live Console: http://127.0.0.1:{port}")
console.print(f"NODEDC MISSION CORE: http://127.0.0.1:{port}")
console.print("The credential endpoint is bound to this Mac only.")
uvicorn.run(
"k1link.web.app:app",

View File

@ -171,7 +171,7 @@ class FoxgloveBridge:
) -> None:
self.metrics = metrics or BridgeMetrics()
self._server = foxglove.start_server(
name="NODE.DC K1 live bridge",
name="Mission Core K1 legacy bridge",
host=host,
port=port,
message_backlog_size=32,

View File

@ -74,7 +74,7 @@ class RerunBridge:
self._settings_provider = settings_provider or RerunSceneSettings
self._settings = self._settings_provider()
self._recording = (recording_factory or rr.RecordingStream)(
"nodedc_device_spatial"
"nodedc_mission_core_spatial"
)
blueprint = _blueprint(self._settings)
self._url = self._recording.serve_grpc(

View File

@ -1 +1 @@
"""Local-only control API for the K1 live console."""
"""Local Mission Core control plane with the transitional XGRIDS adapter."""

View File

@ -261,7 +261,7 @@ async def app_lifespan(_: FastAPI) -> AsyncIterator[None]:
app = FastAPI(
title="NODE.DC Device Control API",
title="NODEDC Mission Core API",
version=__version__,
docs_url="/api/docs",
redoc_url=None,
@ -275,7 +275,7 @@ def health() -> dict[str, Any]:
return {
"ok": True,
"status": "ok",
"service": "k1-live-console",
"service": "mission-core-control-plane",
"version": __version__,
}
@ -341,7 +341,7 @@ async def events(websocket: WebSocket) -> None:
return
frontend_dist = REPOSITORY_ROOT / "apps" / "k1-viewer" / "dist"
frontend_dist = REPOSITORY_ROOT / "apps" / "control-station" / "dist"
if frontend_dist.is_dir():
app.mount("/", StaticFiles(directory=frontend_dist, html=True), name="frontend")

View File

@ -269,7 +269,7 @@ wheels = [
]
[[package]]
name = "ndc-xgrids-k1-connector"
name = "nodedc-mission-core"
version = "0.1.0"
source = { editable = "." }
dependencies = [