3 Commits

Author SHA1 Message Date
Reuven 6e048a5117 docs(adr-033): consolidate mid-iteration changes + follow-up matrix
- Mark the homepage 500 issue as RESOLVED (.gcloudignore root cause)
- New "Mid-Iteration Updates" section: provider switch to Claude Sonnet
  4.6 / OpenRouter, mcp-bridge service deploy + 120s init timeout +
  pinned warm instance, Web Worker (opt-in), custom domains, help icon
  + RuFlo example prompts, search-empty-query guard, cloudbuild env
  preservation, DOCKER_BUILDKIT
- New Follow-Up Work table (P1/P2/P3) tracked in issue #1689:
  worker mode as default, persistent MongoDB, Google OAuth, parallel
  tool-call visualization parity, real rvagent_wasm in worker,
  help-modal copy fix, LLM router (Omni mode)
- References section updated with follow-up issue, .gcloudignore,
  worker files, help modal, live URLs

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-05-01 13:22:53 -04:00
rUv 6e68c93ac6 feat(ruvocal): integrate WASM-MCP layer from RuVector upstream (ADR-033) (#1687)
* feat(ruvocal): add WASM-MCP layer from RuVector upstream (ADR-033)

Adds in-browser WASM MCP server (rvagent-wasm) to local ruvocal:
- src/lib/wasm/ — loader, IndexedDB persistence, capability tests
- src/lib/components/wasm/GalleryPanel.svelte — template gallery UI
- src/lib/components/FoundationBackground.svelte
- src/lib/stores/wasmMcp.ts — Svelte store for WASM MCP lifecycle
- src/lib/constants/rvagentPresets.ts
- src/lib/server/textGeneration/mcp/wasmTools.test.ts
- static/wasm/ — compiled rvagent_wasm.{js,wasm} (~588 KB)
- config/branding.env.example

Pure additions; no existing files modified in this commit. Source:
ruvnet/RuVector/ui/ruvocal main as of 2026-05-01.

See ruflo/docs/adr/ADR-033-RUVOCAL-WASM-MCP-INTEGRATION.md for the
overlay strategy and integration plan.

Co-Authored-By: RuFlo <ruv@ruv.net>

* feat(ruvocal): wire WASM-MCP types into stores and Settings/Tool

Overlays from RuVector upstream needed for GalleryPanel.svelte:
- src/lib/stores/mcpServers.ts — adds WASM_SERVER_ID, loadWasmTemplate,
  getWasmGalleryTemplates exports
- src/lib/types/Settings.ts — adds wasm-related settings fields
- src/lib/types/Tool.ts — adds wasm tool types

svelte-check: 0 new errors introduced. 104 pre-existing errors in
untouched files (RuFloUniverse, migrations, server tests) are
unchanged and out of scope for this ADR.

ADR-033

Co-Authored-By: RuFlo <ruv@ruv.net>

* feat(ruvocal): add Cloud Run deploy stub + document infra prereqs (ADR-033)

- cloudbuild.yaml builds ruvocal Dockerfile and deploys to Cloud Run.
  Wired to existing ruv-dev secrets (ANTHROPIC_API_KEY, GOOGLE_AI_API_KEY,
  OPENROUTER_API_KEY) per ADR-029 pattern.
- ADR-033 updated with deployment plan and explicit MongoDB blocker:
  Cloud Run can't run Mongo natively. Operator must provision either
  Atlas free tier (M0) or a Cloud Run sidecar before first deploy.
- Notes that the thin src/chat-ui/Dockerfile wrapper is unsuitable for
  this integration — it can only patch the upstream HF base image with
  static files, not include compiled WASM source.

Deploy is staged but blocked on mongo. Local validation already passed:
WASM MCP server initializes with 18 tools, IDB persistence works.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ruvocal): use INCLUDE_DB=true for embedded mongo on Cloud Run

The local Dockerfile already supports INCLUDE_DB=true via the
multi-stage 'local_db_true' path that copies mongod from the
official mongo:7 image. Setting --build-arg INCLUDE_DB=true and
MONGODB_URL=mongodb://localhost:27017 makes Cloud Run deploys
self-contained — no external Atlas, no sidecar, no service-YAML
rewrite.

Tradeoff: Cloud Run filesystem is ephemeral, so chat history is
lost on cold starts. Acceptable for validating the WASM-MCP
integration; production deploys should follow up with Atlas
or persistent storage (tracked separately).

ADR-033

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ruvocal): enable DOCKER_BUILDKIT for Cloud Build

Dockerfile uses COPY --link and RUN --mount=type=cache (BuildKit
syntax). Without DOCKER_BUILDKIT=1 in the build env, Cloud Build's
docker daemon parses the file in legacy mode and fails with
"Unknown flag: link" before any build step runs (build baf645f5
died at 17 seconds).

Co-Authored-By: RuFlo <ruv@ruv.net>

* docs(adr-033): document Cloud Run deployment outcome

Records what's confirmed working on the deployed instance at
https://ruvocal-875130704813.us-central1.run.app and surfaces the
known /api/v2/models 500 (HF chat-ui SSR edge case unrelated to
WASM integration). WASM bundle reachable at /wasm/* with 200 OK.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ruvocal): anchor .dockerignore models/** so route dirs survive

The unanchored `models/**` pattern was matching ANY path containing
'models/' — including src/routes/api/v2/models/, src/routes/models/,
and src/lib/server/models/__tests__/. SvelteKit's production build
inside Docker was therefore missing those routes entirely, while
local `npm run build` outside Docker built them correctly. Result:
Cloud Run revisions returned 404 for /api/v2/models which the layout
load function turned into a 500 on the homepage.

Anchoring with a leading slash limits the pattern to the top-level
models/ directory only. This unblocks the deployed homepage and
fully validates the WASM-MCP integration in production.

ADR-033

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ruvocal): remove models/** from .dockerignore entirely

Earlier anchor fix `/models/**` still produced images missing the
/api/v2/models route. Confirmed by `docker run --entrypoint=ls` against
gcr.io/ruv-dev/ruvocal:v2 — /app/build/server/entries/endpoints/api/v2/
did not exist, manifest contained 0 references to /api/v2/models, while
/api/v2/conversations and /api/v2/user were present.

Removing the line entirely. The placeholder models/ dir at the repo root
contains only a single 'add-your-models-here.txt' file — letting it into
the build context costs nothing.

ADR-033

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ruvocal): cloudbuild deploy preserves env vars across rebuilds

Each rebuild was nuking DOTENV_LOCAL, OPENAI_API_KEY (mapped from
OPENROUTER_API_KEY secret), and other manual config because
`gcloud run deploy --set-env-vars` REPLACES rather than merges.

Drop the env/secret args from the deploy step entirely so subsequent
deploys keep whatever was set via `gcloud run services update`.
Initial env config is set out-of-band per ADR-033.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ruvocal): add .gcloudignore so model routes survive Cloud Build upload

ROOT CAUSE of the production 500 errors: gcloud builds submit
falls back to .gitignore when no .gcloudignore is present.
.gitignore line 16 is `models/*` (unanchored), which matches
EVERY models/ directory in the tree:
  - src/routes/api/v2/models/* (REAL ROUTES)
  - src/routes/models/* (REAL ROUTES)
  - src/lib/server/models/__tests__/ (tests)

Result: source tarballs uploaded to Cloud Build had EMPTY models/
directories. Production builds shipped without /api/v2/models,
/api/v2/models/refresh, /api/v2/models/[namespace], etc. The
homepage Layout.load called /api/v2/models which 404'd, the layout
chain converted that to a 500, and /favicon.ico (also unmatched at
root, since the assets/ exclusion is unrelated) returned 500 too.

Verified by `gsutil cp` of build c07ba163 source tarball:
  $ tar tzf build-source.tgz | grep models
  src/routes/models/        (empty dir)
  src/routes/api/v2/models/ (empty dir)

After adding .gcloudignore, the v4 source tarball includes all
+server.ts files for those routes.

ADR-033

Co-Authored-By: RuFlo <ruv@ruv.net>

* docs(adr-033): record provider config + ruvocal.ruv.io custom domain

- Gemini 2.5 Flash via Google's OpenAI-compatible endpoint with
  GOOGLE_AI_API_KEY (HF router 401 was due to user-token vs router
  auth mismatch; OpenRouter base URL × HF token combo also failed)
- ruvocal.ruv.io mapped to Cloud Run, Cloudflare CNAME unproxied so
  Google manages the cert; 15-30 min provisioning window

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(mcp-bridge): 120s initialize timeout for Cloud Run cold starts

Bridge was hitting a hardcoded 30s RPC timeout on `initialize` while
ruflo and ruvector backends took 45-60s to boot on Cloud Run cold
start (full claude-flow / ruvector kernel + npx fetch). Backends
were marked "failed to start" but actually came up after the
timeout fired and ran as zombies — bridge served 0 backend tools.

Init gets 120s; other RPC methods stay at 30s (post-init they're
snappy).

Co-Authored-By: RuFlo <ruv@ruv.net>

* feat(ruvocal): replace HF default examples with RuFlo capabilities

Welcome screen now shows 8 prompts that exercise actual ruflo / ruvector
MCP tools (swarm spawn, memory save/recall, task routing, diff analysis,
system status, WASM gallery, GOAP planning, neural training) instead of
HuggingChat defaults like "Generate an image" or "Latest world news".

Co-Authored-By: RuFlo <ruv@ruv.net>

* feat(ruvocal): add help icon + RuFlo capabilities modal

Question-mark icon next to the theme toggle in the sidebar opens a
modal with:
- Quick-start instructions (4 steps)
- All 6 tool groups (Memory, Agents, Intelligence, DevTools, Core,
  WASM) as expandable sections with per-tool descriptions
- 5 tips (MCP pill, AUTO toggle, trajectories, memory, prefixes)
- Resource links to ruflo, ADR-033, ruvector

Closes the user-visible "system doesn't seem to know its tools" gap
by surfacing what's available without forcing the user to open
Settings → Application.

Co-Authored-By: RuFlo <ruv@ruv.net>

* feat(ruvocal): replace router-mode default examples with RuFlo themes

The welcome screen has TWO example sources: mcpExamples (when all
base MCP servers are enabled) and routerExamples (otherwise). Earlier
commit only rewrote mcpExamples, leaving HF defaults like "HTML game"
visible whenever users hadn't toggled all servers on.

Router examples now cover: coding swarms, memory/recall, migration
planning, diff review, HNSW, topology choice, horizon tracking, WASM
vs bridge tools — all answerable without tool calls if needed.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(mcp-bridge): return structured error on empty search query

When Gemini emits a `search` tool_call with no `query` field, the
bridge was sending an empty prompt to Gemini's generateContent
endpoint and returning the resulting 400 verbatim. The model then
treated it as opaque and gave up.

Validate query upfront and return a hint object the model can use
to retry with a real query.

Co-Authored-By: RuFlo <ruv@ruv.net>

* docs(readme): link banner to flo.ruv.io and add UI Beta button

The Ruflo banner image now links to the live UI at flo.ruv.io. A new
"Try the UI Beta" badge sits below it for explicit click-through.
The Cloud Run cert is still propagating but DNS resolves; CNAME is
unproxied through Cloudflare so Google can issue the managed cert.

Co-Authored-By: RuFlo <ruv@ruv.net>

---------

Co-authored-by: Reuven <cohen@ruv-mac-mini.local>
2026-05-01 11:40:45 -04:00
rUv 29d52dfc22 feat(ruflo): add RuFlo Chat UI with ruvocal fork, MCP bridge, and Docker setup
Adds the complete RuFlo Chat UI system based on a SvelteKit fork (ruvocal)
of HuggingFace Chat UI with custom branding, RVF document store replacing
MongoDB, MCP bridge with 200+ tools, animated RuFloUniverse welcome screen,
and Docker Compose orchestration.

Key changes:
- RVF JSON document store with ObjectId cross-package compatibility fix
- MCP bridge proxy (Express) supporting Gemini, OpenAI, and tool execution
- RuFlo branding: Logo, favicons, welcome animation, centered dot cluster
- URL safety patch for Docker-internal HTTP service names
- CORS fix via relative PUBLIC_ORIGIN asset paths

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 18:01:09 +00:00