Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/i18n/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ merge — and it is now the ONLY localization guard in this repo.

The web clients' catalog lives at **`MeshWeaver.Plugins/clients/react/src/i18n/`**. `044a85618`
("The GUI leaves the platform", 2026-08-25) moved the web clients out; `clients/` in core now holds
only `python/` and `voice-gateway/`, and the six guards the old text and the `Clients` workflow
only `python/` (`voice-gateway/` followed to MeshWeaver.Plugins `clients/` in the core slimming), and the six guards the old text and the `Clients` workflow
named — `i18n/localize.test.ts`, `render/parity.test.ts`, `ciTrigger.test.ts`,
`grpc-web/src/{wire,rest}Contract.test.ts`, `portal-next/e2e` — no longer exist **in this repo**. Do
not recreate them here; the mirror belongs where the client lives.
Expand Down
4 changes: 2 additions & 2 deletions .github/scripts/control-image-acceptance.sh
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ fi
grep 'Database migration completed' "$MIGLOG" | tail -n 1

# boot_and_wait <leg> <image>: start the image, wait for /health then /ready inside the budget,
# then stop it. The environment is the chart's self-host minimum (MeshWeaver.Testcontainers'
# MemexBuilder): Postgres for nodes, the filesystem backend, single-node Localhost clustering, no
# then stop it. The environment is the chart's self-host minimum (MeshWeaver.Plugins'
# src/MeshWeaver.Testcontainers MemexBuilder): Postgres for nodes, the filesystem backend, single-node Localhost clustering, no
# dev login. Nothing control-specific is passed: the closed type set, the seeded module and the
# disabled sweep are properties of the IMAGE, which is exactly what is under test.
boot_and_wait() {
Expand Down
13 changes: 6 additions & 7 deletions .github/workflows/clients.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ name: Clients
#
# THIS LIST WAS MUCH LONGER, and most of it is now WRONG rather than merely unused. `044a85618`
# ("The GUI leaves the platform: the view packs and the web clients", 2026-08-25) moved the web
# clients to MeshWeaver.Plugins. `clients/` holds only `python/` and `voice-gateway/`, one job
# survives (`python-sdk`), and EVERY test the old inventory named is gone from this repo:
# clients to MeshWeaver.Plugins. `clients/` holds only `python/` (`voice-gateway/` followed in the
# core slimming), one job survives (`python-sdk`), and EVERY test the old inventory named is gone from this repo:
#
# clients/react/src/i18n/localize.test.ts clients/grpc-web/src/wireContract.test.ts
# clients/react/src/render/parity.test.ts clients/grpc-web/src/restContract.test.ts
Expand All @@ -44,11 +44,10 @@ name: Clients
# for the surviving clients, this list is maintained BY HAND and will rot again. If you add a
# cross-tree read to `clients/python`, add its path here yourself.
#
# 🚨 `clients/voice-gateway` HAS NO JOB HERE — this workflow runs `python-sdk` and nothing
# else, so a voice-gateway change triggers a run that does not test it. Adding a path for it would
# make that worse, not better: the run would go green having verified nothing about the thing that
# changed, which is precisely the "fires reliably, checks nothing" state this comment block exists
# to record. If voice-gateway needs CI, it needs a JOB first, and its inputs listed second.
# `clients/voice-gateway` used to sit here with NO job: a change to it triggered a run that tested
# nothing about it. It moved to MeshWeaver.Plugins `clients/voice-gateway` (core slimming), where
# its own `Voice gateway` workflow runs its suite. `clients/python` stays: core's own python-gate and
# pandas-gate images COPY it, and it generates from core's canonical proto.
#
# The original rationale, still correct and still the reason the protos path is listed:
# filtering on "clients/**" alone made every cross-tree guard blind to the side that actually
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dotnet-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -994,7 +994,7 @@ jobs:
# 🚨 This job used to pre-pull `pgvector/pgvector:pg17` from Docker Hub, anonymously, on every
# shard. Since the Postgres suites left core (the test-move tranches, #2847 and its successors)
# NO core suite starts a container: nothing references Testcontainers.PostgreSql, and the one
# project that named MeshWeaver.Testcontainers (Memex.Portal.Shared.Test, now in
# project that named MeshWeaver.Testcontainers (Memex.Portal.Shared.Test; both now live in
# MeshWeaver.Plugins) exercises readiness logic against an in-process host. So the pull fetched an image nothing used — and on 2026-10-09 it
# was the ONLY red of six shards × several PRs (#6381 among them), Docker Hub answering
# `toomanyrequests` to the runner pool's shared egress IP. Retrying a per-IP window is not a
Expand Down
4 changes: 0 additions & 4 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,6 @@
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.20.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.20.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.20.1" />
<!-- The memex test container package (src/MeshWeaver.Testcontainers): a real memex from the
platform build as a test substrate, the way Testcontainers.PostgreSql gives a test a real
Postgres. Same version as the test tree pins. -->
<PackageVersion Include="Testcontainers" Version="4.16.0" />
<PackageVersion Include="SSH.NET" Version="2026.0.0" /> <!-- High GHSA-q939-rpr3-3284; transitive via Testcontainers, direct-ref override in test/Directory.Build.props -->
<!-- 🚨 THESE TWO ARE ONE FAMILY AND MUST MOVE TOGETHER — they were SPLIT, and the split was
invisible because both halves were green.
Expand Down
1 change: 0 additions & 1 deletion MeshWeaver.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
<Project Path="test/MeshWeaver.Fixture/MeshWeaver.Fixture.csproj" />
<Project Path="src/MeshWeaver.Reactive.Assertions/MeshWeaver.Reactive.Assertions.csproj" />
<Project Path="src/MeshWeaver.Testing.InMesh/MeshWeaver.Testing.InMesh.csproj" />
<Project Path="src/MeshWeaver.Testcontainers/MeshWeaver.Testcontainers.csproj" />
<Project Path="src/MeshWeaver.Hosting.AspNetCore/MeshWeaver.Hosting.AspNetCore.csproj" />
<Project Path="src/MeshWeaver.Graph/MeshWeaver.Graph.csproj" />
<Project Path="src/MeshWeaver.Graph.Contract/MeshWeaver.Graph.Contract.csproj" />
Expand Down
38 changes: 15 additions & 23 deletions clients/README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# MeshWeaver clients

Foreign-language and cross-platform clients that **join the mesh** (transport) and **render mesh layout
areas** (UI) — the same `UiControl` tree the Blazor portal and MAUI app render, reached over gRPC instead
of SignalR.
Foreign-language clients that **join the mesh** over gRPC — the same participant role the portal plays
over SignalR.

Full architecture: `src/MeshWeaver.Documentation/Data/Architecture/ForeignLanguageIntegration.md`
(transport deep-dive: `ForeignLanguageBridge.md`).
Expand All @@ -11,26 +10,19 @@ Full architecture: `src/MeshWeaver.Documentation/Data/Architecture/ForeignLangua

| Path | Package | What it is |
|---|---|---|
| [`python/`](python/) | `meshweaver` | Python SDK — `grpc.aio` transport + mesh operations |
| [`typescript/`](typescript/) | `@meshweaver/client` | Node/Bun SDK — `@grpc/grpc-js`, bidi `Open`, `AsyncIterable` streams |
| [`grpc-web/`](grpc-web/) | `@meshweaver/client-web` | Browser + React Native client — gRPC-web `Connect`+`Deliver` split (Connect-ES) + `Mesh` ops |
| [`react/`](react/) | `@meshweaver/react` | Fluent UI renderer — swappable core + web pack + `GrpcAreaSource` |
| [`react-native/`](react-native/) | `meshweaver-mobile` | Expo app + native leaf pack — the MAUI peer (live via `client-web`) |
| [`portal/`](portal/) | `@meshweaver/portal-example` | a web portal built from the renderer |

## The two ideas

- **Transport-agnostic mesh.** A foreign process is a first-class participant over a gRPC bidi stream — the
same role MAUI/SignalR play. Protobuf frames the connection; the existing `IMessageDelivery` JSON carries
the message, so the whole serialization/identity stack is reused.
- **Platform-agnostic UI.** A layout area is a JSON `UiControl` tree. The React renderer's core
(`@meshweaver/react/core`) dispatches/binds/lays-out with **no concrete component**, pulling a "leaf pack"
from context. Web/Electron/Next.js use the Fluent DOM pack; React Native uses a `<View>` pack — the direct
analog of MAUI's `MauiViewPack` vs Blazor's web renderers.
| [`python/`](python/) | `meshweaver` | Python SDK — `grpc.aio` transport + mesh operations, and the Python worker |

**Why the Python SDK stays in the platform repository.** Two images this repository builds COPY it —
`deploy/python-gate` and `deploy/pandas-gate` — and it generates its stubs from the platform's one
canonical proto (`src/MeshWeaver.Mesh.Contract/Protos/mesh.proto`). Moving it would make a core image
depend on another repository.

**Everything else left.** The web, desktop and mobile clients (`typescript/`, `grpc-web/`, `react/`,
`react-native/`, `portal/`, `portal-next/`) and the voice gateway (`voice-gateway/`, an ESPHome voice
satellite wired to agent threads) live in MeshWeaver.Plugins `clients/`, beside the hosts and the Speech
module they talk to.

## CI

`.github/workflows/clients.yml` runs on any PR touching `clients/`: `meshweaver` (Python) pytest,
`@meshweaver/react` typecheck + vitest, `@meshweaver/client` (Node) typecheck, `@meshweaver/client-web`
typecheck + vitest (buf-generates from the canonical `mesh.proto`), the RN connector typecheck + headless
render tests, and the portal build. Both gRPC-codegen jobs generate from the one canonical `mesh.proto`.
`.github/workflows/clients.yml` runs the `meshweaver` (Python) pytest on any change under `clients/` or to
the canonical proto.
5 changes: 0 additions & 5 deletions clients/voice-gateway/.gitignore

This file was deleted.

19 changes: 0 additions & 19 deletions clients/voice-gateway/Dockerfile

This file was deleted.

116 changes: 0 additions & 116 deletions clients/voice-gateway/README.md

This file was deleted.

20 changes: 0 additions & 20 deletions clients/voice-gateway/docker-compose.yml

This file was deleted.

16 changes: 0 additions & 16 deletions clients/voice-gateway/entrypoint.sh

This file was deleted.

3 changes: 0 additions & 3 deletions clients/voice-gateway/memex_voice_gateway/__init__.py

This file was deleted.

Loading
Loading