From 2e2e8c7728f796bfad6f4a45163a92c7e5a89746 Mon Sep 17 00:00:00 2001 From: ciregenz Date: Mon, 11 May 2026 18:40:27 -0700 Subject: [PATCH] [eric] webapp-template standardization (React + Vite + FastAPI new-app starter) + swarm-debug built-in skill + stale-session recovery --- backend/apps/outputs/app_builder_skill.md | 461 ++++++++++------- backend/apps/outputs/models.py | 12 +- backend/apps/outputs/outputs.py | 72 ++- backend/apps/outputs/runtime.py | 286 +++++++++-- backend/apps/outputs/swarm_debug_skill.md | 163 ++++++ .../apps/outputs/view_builder_templates.py | 101 ++++ .../apps/outputs/webapp_template/.env.example | 2 + .../apps/outputs/webapp_template/.gitignore | 8 + .../webapp_template/backend/.gitignore | 23 + .../webapp_template/backend/__init__.py | 0 .../webapp_template/backend/apps/__init__.py | 0 .../backend/apps/health/__init__.py | 0 .../backend/apps/health/health.py | 33 ++ .../webapp_template/backend/config/Apps.py | 44 ++ .../backend/config/__init__.py | 0 .../outputs/webapp_template/backend/main.py | 20 + .../webapp_template/backend/pyproject.toml | 12 + .../outputs/webapp_template/backend/run.sh | 66 +++ .../outputs/webapp_template/backend_init.sh | 81 +++ .../webapp_template/frontend/.gitignore | 104 ++++ .../webapp_template/frontend/DESIGN.md | 462 ++++++++++++++++++ .../webapp_template/frontend/index.html | 13 + .../webapp_template/frontend/package.json | 32 ++ .../webapp_template/frontend/public/logo.png | Bin 0 -> 327756 bytes .../outputs/webapp_template/frontend/run.sh | 27 + .../webapp_template/frontend/src/app/Main.tsx | 27 + .../src/app/components/Layout/AppShell.tsx | 37 ++ .../src/app/components/Layout/Sidebar.tsx | 190 +++++++ .../webapp_template/frontend/src/index.tsx | 12 + .../frontend/src/pages/health.tsx | 272 +++++++++++ .../frontend/src/pages/index.tsx | 60 +++ .../frontend/src/shared/hooks.ts | 5 + .../src/shared/state/API_ENDPOINTS.ts | 4 + .../frontend/src/shared/state/store.ts | 13 + .../src/shared/state/tempStateSlice.ts | 30 ++ .../src/shared/styles/ThemeContext.tsx | 185 +++++++ .../frontend/src/vite-env.d.ts | 2 + .../webapp_template/frontend/tsconfig.json | 21 + .../webapp_template/frontend/vite.config.ts | 38 ++ backend/apps/outputs/webapp_template/run.sh | 82 ++++ backend/apps/skills/skills.py | 18 +- backend/main.py | 28 +- debugger/setup.py | 6 +- debugger/swarm_debug.py | 21 + .../app/components/Onboarding/ac/ACPopup.tsx | 17 +- frontend/src/app/pages/Views/ViewEditor.tsx | 152 +++++- scripts/build-app.sh | 8 +- scripts/fetch-webapp-template.sh | 177 +++++++ 48 files changed, 3165 insertions(+), 262 deletions(-) create mode 100644 backend/apps/outputs/swarm_debug_skill.md create mode 100644 backend/apps/outputs/webapp_template/.env.example create mode 100644 backend/apps/outputs/webapp_template/.gitignore create mode 100644 backend/apps/outputs/webapp_template/backend/.gitignore create mode 100644 backend/apps/outputs/webapp_template/backend/__init__.py create mode 100644 backend/apps/outputs/webapp_template/backend/apps/__init__.py create mode 100644 backend/apps/outputs/webapp_template/backend/apps/health/__init__.py create mode 100644 backend/apps/outputs/webapp_template/backend/apps/health/health.py create mode 100644 backend/apps/outputs/webapp_template/backend/config/Apps.py create mode 100644 backend/apps/outputs/webapp_template/backend/config/__init__.py create mode 100644 backend/apps/outputs/webapp_template/backend/main.py create mode 100644 backend/apps/outputs/webapp_template/backend/pyproject.toml create mode 100755 backend/apps/outputs/webapp_template/backend/run.sh create mode 100755 backend/apps/outputs/webapp_template/backend_init.sh create mode 100644 backend/apps/outputs/webapp_template/frontend/.gitignore create mode 100644 backend/apps/outputs/webapp_template/frontend/DESIGN.md create mode 100644 backend/apps/outputs/webapp_template/frontend/index.html create mode 100644 backend/apps/outputs/webapp_template/frontend/package.json create mode 100644 backend/apps/outputs/webapp_template/frontend/public/logo.png create mode 100755 backend/apps/outputs/webapp_template/frontend/run.sh create mode 100644 backend/apps/outputs/webapp_template/frontend/src/app/Main.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/AppShell.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/Sidebar.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/index.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/pages/health.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/pages/index.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/shared/hooks.ts create mode 100644 backend/apps/outputs/webapp_template/frontend/src/shared/state/API_ENDPOINTS.ts create mode 100644 backend/apps/outputs/webapp_template/frontend/src/shared/state/store.ts create mode 100644 backend/apps/outputs/webapp_template/frontend/src/shared/state/tempStateSlice.ts create mode 100644 backend/apps/outputs/webapp_template/frontend/src/shared/styles/ThemeContext.tsx create mode 100644 backend/apps/outputs/webapp_template/frontend/src/vite-env.d.ts create mode 100644 backend/apps/outputs/webapp_template/frontend/tsconfig.json create mode 100644 backend/apps/outputs/webapp_template/frontend/vite.config.ts create mode 100755 backend/apps/outputs/webapp_template/run.sh create mode 100644 debugger/swarm_debug.py create mode 100755 scripts/fetch-webapp-template.sh diff --git a/backend/apps/outputs/app_builder_skill.md b/backend/apps/outputs/app_builder_skill.md index 531819d7..63edbcd6 100644 --- a/backend/apps/outputs/app_builder_skill.md +++ b/backend/apps/outputs/app_builder_skill.md @@ -1,221 +1,306 @@ # App Builder — Platform Reference -You are building an **App**: a self-contained web app rendered inside an -Electron `` (so it behaves like a real browser tab — cross-origin -`fetch`, popups, mic/camera, etc. all work). The workspace you're working -in is the source of truth — every file you write here is served directly -to the live preview. +You are building an **App** inside OpenSwarm. The workspace you're working +in is a **React 18 + TypeScript + Vite** project (with an optional FastAPI +backend you can opt into on demand). It's served live to a webview, so it +behaves like a real browser tab — cross-origin `fetch`, popups, mic/camera, +clipboard, anything a normal web page does. + +You are **NOT** writing a single HTML file or vanilla JS. Match the +codebase's patterns. --- -## File conventions - -| File | Required | Purpose | -|------|----------|---------| -| `index.html` | **Yes** | Entry point. Must be a complete HTML document. This is the ONLY file the preview loads — never rename it. | -| `meta.json` | **Yes** | `{"name":"…","description":"…"}` — displayed in the UI header. Always write this. | -| `backend.py` | Optional | Long-running HTTP server. See "Backend" below. | -| Everything else | Optional | JS, CSS, images, subdirectories — referenced from `index.html` via relative paths. | - -### ⚠️ Do NOT - -- Name the main HTML file anything other than `index.html` — the platform - will not find it and the preview will be blank. -- Use `document.write()` — it breaks the injected data globals. -- Treat `backend.py` like a one-shot helper. It's a real HTTP server (see below). - ---- - -## Injected globals - -Before `index.html` loads, the platform injects: - -```javascript -window.OUTPUT_INPUT // Object — optional structured input (may be {}) -window.OUTPUT_BACKEND_URL // string | null — base URL of the running backend.py, e.g. "http://127.0.0.1:54213" -``` - -`OUTPUT_BACKEND_URL` is `null` when the app has no `backend.py` (pure-frontend -app). When it's set, `fetch(window.OUTPUT_BACKEND_URL + '/your-route')` hits -the persistent backend. - ---- - -## backend.py — persistent HTTP server - -`backend.py` runs as a **long-lived subprocess** for the lifetime of the -app being open in the editor. It is **NOT a one-shot helper** that runs -once before render — it's a real backend server that responds to -frontend `fetch()` calls. - -The platform auto-allocates a free port and exposes it via the env var -`PORT`. Your `backend.py` MUST bind to that port. Any standard Python -HTTP framework works (FastAPI, Flask, raw `http.server`). - -Minimal FastAPI example: - -```python -# backend.py -import os -import uvicorn -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware - -app = FastAPI() -# The frontend is served from http://localhost:8324 (different origin -# than this backend on http://127.0.0.1:$PORT), so CORS must allow it. -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_methods=["*"], - allow_headers=["*"], -) - -@app.get("/items") -def list_items(): - return {"items": ["alpha", "beta", "gamma"]} - -if __name__ == "__main__": - uvicorn.run(app, host="127.0.0.1", port=int(os.environ["PORT"])) -``` - -Then in `index.html`: - -```javascript -const res = await fetch(window.OUTPUT_BACKEND_URL + '/items'); -const data = await res.json(); -``` - -Stdout/stderr from `backend.py` stream live into the App Builder's -**Terminal** tab (prefixed `[BACKEND]`), so `print()` is your debugger. - ---- - -## Multi-file projects - -Split code across files for organization. All files are served from the -workspace root, so relative imports work naturally: +## Workspace layout ``` workspace/ -├── index.html -├── meta.json -├── backend.py (optional) -├── styles/ -│ └── main.css -├── components/ -│ └── Chart.js -└── utils/ - └── helpers.js +├── .env # FRONTEND_PORT, BACKEND_PORT (NONE by default) +├── .env.example # Mirror of .env (LLM-consistency — edit both +│ # when you change either) +├── run.sh # OpenSwarm's runtime spawns this; you don't +├── backend_init.sh # Run this when you need a backend (see below) +├── SKILL.md # This document +└── frontend/ + ├── package.json # React 18, MUI v7, Redux Toolkit, Framer + │ # Motion, react-router v7 + ├── vite.config.ts # Vite config — DO NOT edit unless you know why + ├── tsconfig.json # `@/*` → `src/*` path alias + ├── index.html + └── src/ + ├── index.tsx # ReactDOM entry; mounts
+ ├── app/ + │ ├── Main.tsx # Redux + Theme + BrowserRouter + AppShell + │ └── components/ + │ └── Layout/ + │ ├── AppShell.tsx # Sidebar + scrollable content + │ └── Sidebar.tsx # Nav, theme toggle + ├── pages/ # FILE-BASED ROUTING — see below + │ ├── index.tsx # / + │ └── health.tsx # /health + └── shared/ + ├── hooks.ts # useAppDispatch, useAppSelector + ├── state/ + │ ├── store.ts # Redux store config + │ ├── tempStateSlice.ts # Sample slice — replace or extend + │ └── API_ENDPOINTS.ts # ALL backend URL constants + └── styles/ + └── ThemeContext.tsx # Design tokens — USE THESE ``` -Reference from `index.html`: +If a backend is enabled (after `bash backend_init.sh`), you'll also have: -```html - - ``` - -ES module imports between JS files: - -```javascript -// components/Chart.js -import { formatNumber } from '../utils/helpers.js'; +└── backend/ + ├── pyproject.toml # FastAPI + typeguard (+ swarm_debug) + ├── main.py # FastAPI app entry — registers SubApps + ├── apps/ # Each feature is a SubApp + │ └── health/ + │ └── health.py # GET /api/health/check + └── config/Apps.py # SubApp / MainApp plugin framework ``` --- -## Using React +## File-based routing -React 18 is available via esm.sh CDN — no build step needed: +`vite-plugin-pages` auto-registers every `.tsx` file under `frontend/src/pages/` +as a route. **You don't touch any router config.** Just create the file. -```html - -
- ``` -Other CDN libraries work too — use `https://esm.sh/` or `https://cdn.jsdelivr.net/npm/` for any npm package. +- **Use MUI components** (`Box`, `Typography`, `Button`, `IconButton`, `Tooltip`, `Stack`, etc.) — never write raw `
` for layout. +- **Use the `sx` prop** for styles, not separate CSS files. +- **Don't add Tailwind**, Bootstrap, or any other CSS framework. + +Check `frontend/DESIGN.md` for the complete design system spec. --- -## Design guidelines +## State management — Redux Toolkit -- **Dark theme by default** — use dark backgrounds (#0f1117, #1a1d27) with - light text (#e2e8f0) unless the user requests otherwise. -- **Modern aesthetics** — rounded corners (8-12px), subtle borders, box shadows, - smooth transitions (0.15-0.3s ease). -- **Responsive** — use flexbox/grid, test at different sizes. -- **Typography** — system font stack for UI, monospace for code/data. -- **Color accents** — use a single accent color with variations for hover/active states. -- **Spacing** — consistent padding (12-20px), adequate whitespace between sections. -- **Interactivity** — hover effects, focus states, loading indicators where appropriate. +Store is at `frontend/src/shared/state/store.ts`. Add new slices following +the `tempStateSlice.ts` pattern (createSlice, named action creators, register +the reducer in the store). + +```tsx +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; + +function MyComponent() { + const items = useAppSelector(s => s.myFeature.items); + const dispatch = useAppDispatch(); + // ... +} +``` + +For server data, use plain async thunks (`createAsyncThunk`) or fetch +directly inside `useEffect` — no react-query in the template (yet). --- -## Complete minimal example +## Backend — opt-in, never roll your own -```html - - - - - - My App - - - -
-

Loading…

-

-
- - - +The workspace **starts without a backend**. If your app needs server-side +code (API endpoints, secrets, server-managed state): + +```bash +bash backend_init.sh ``` + +This script COPIES the canonical backend scaffold (FastAPI + SubApp pattern ++ swarm-debug pre-installed) into your workspace, allocates a free port, +and flips `BACKEND_PORT` in both `.env` and `.env.example`. Then **hard- +reload the preview** (right-click the reload button) so the runtime +restarts and brings the backend up. + +**You MUST NOT roll your own backend.** Do not: +- Hand-write a `backend/main.py` from scratch. +- Use Flask, Django, or any framework other than the FastAPI scaffold + the script gives you. +- Install your own venv or `pip install` manually. +- Edit `backend/run.sh` or the SubApp framework. + +Adding a new endpoint is just adding a new SubApp: + +```python +# backend/apps/jobs/jobs.py +from contextlib import asynccontextmanager +from backend.config.Apps import SubApp +from swarm_debug import debug + +@asynccontextmanager +async def jobs_lifespan(): + debug("jobs SubApp lifespan starting") + yield + +jobs = SubApp("jobs", jobs_lifespan) + +@jobs.router.get("/list") +async def list_jobs(): + return {"jobs": [...]} +``` + +Then register it in `backend/main.py`: + +```python +from backend.apps.jobs.jobs import jobs +main_app = MainApp([health, jobs]) +``` + +Routes are auto-prefixed: `jobs.router.get("/list")` becomes +`GET /api/jobs/list` — accessible from the frontend at `fetch('/api/jobs/list')`. + +--- + +## Frontend ↔ Backend wiring + +Vite proxies `/api/*` calls from the frontend to the workspace's own +backend (on `BACKEND_PORT`). **Always call `/api/...` from frontend code** +— never hardcode `localhost:`. The proxy is configured in +`vite.config.ts` and reads `BACKEND_PORT` from `.env` automatically. + +```tsx +// frontend/src/pages/jobs.tsx +import { useEffect, useState } from 'react'; + +export default function Jobs() { + const [jobs, setJobs] = useState([]); + useEffect(() => { + fetch('/api/jobs/list') + .then(r => r.json()) + .then(data => setJobs(data.jobs)); + }, []); + return <>{/* render jobs */}; +} +``` + +Keep ALL backend URL paths in `frontend/src/shared/state/API_ENDPOINTS.ts` +so refactors are one-file edits: + +```ts +export const JOBS_LIST = '/api/jobs/list'; +``` + +--- + +## Debugging — use `swarm_debug`, not `print()` + +The backend has `swarm_debug` pre-installed. It's a colored frame-aware +logger that lands in the App Builder's **Terminal** tab under `[BACKEND]`. + +```python +from swarm_debug import debug + +debug(value) # [endpoint_name] : value = ... +debug(a, b, c) # logs all three with labels +debug(err) # red + ❌ if variable is an exception +``` + +See the **swarm-debug Logger** built-in skill (Skills page) for the full +reference. `print()` works too but lacks the variable-name inference and +colorization. + +Frontend `console.log/warn/error` calls land in the Terminal pane under +`[FRONTEND]` via the App Builder's webview-preload bridge. Same chronological +stream as `[BACKEND]` lines, so you can correlate cause and effect across +the two halves of your stack. + +--- + +## Adding npm packages + +Just `npm install ` in the workspace's `frontend/` directory. +Vite picks it up on the next HMR cycle. + +```bash +cd frontend && npm install lodash @types/lodash +``` + +Then import normally — Vite resolves it. + +Common deps already in the template: +- `@mui/material`, `@mui/icons-material` — use these for any UI primitive +- `@reduxjs/toolkit`, `react-redux` +- `framer-motion` — for animations +- `react-router-dom@7` +- `vite-plugin-pages` — file-based routing (already configured) + +--- + +## ⚠️ Don't + +- **Don't rename `index.html` or `run.sh`** — the runtime needs both at fixed paths. +- **Don't edit `vite.config.ts`** unless you know exactly why. The `/api` proxy and `vite-plugin-pages` config are load-bearing. +- **Don't write a standalone HTML file** at the workspace root. There's no longer a `serve/index.html` endpoint for new-mode workspaces — the webview points at Vite's dev server. +- **Don't hand-roll a backend**. Use `bash backend_init.sh`. +- **Don't bypass MUI** with raw `
` + custom CSS. Use `Box`, `Stack`, `sx`. +- **Don't hardcode `localhost:`**. Use relative `/api/...` paths so the Vite proxy handles routing. + +--- + +## Workflow tips + +- **Edits are auto-saved**. As soon as you write a file via the Edit/Write tool, it's on disk. Vite HMR re-renders the preview within ~100ms. +- **Hard Reload (right-click the reload button)** restarts the runtime — useful after you `bash backend_init.sh` or change `.env` values. +- **`meta.json`** at workspace root is shown in the OpenSwarm Apps page UI. Update its `name` and `description` when the app's purpose changes. + +--- + +## Quick start checklist + +When making a new app from scratch: + +1. Replace `frontend/src/pages/index.tsx` with your home page. +2. Add additional pages under `frontend/src/pages/`. +3. Add a sidebar nav entry in `frontend/src/app/components/Layout/Sidebar.tsx`. +4. Style with `useClaudeTokens()` and MUI's `sx`. +5. If you need a backend: `bash backend_init.sh`, then add a SubApp under `backend/apps//`. +6. Update `meta.json` with the app's name + description. diff --git a/backend/apps/outputs/models.py b/backend/apps/outputs/models.py index 540a3553..09878160 100644 --- a/backend/apps/outputs/models.py +++ b/backend/apps/outputs/models.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, Field, model_validator -from typing import Optional, Any +from typing import Literal, Optional, Any from uuid import uuid4 from datetime import datetime @@ -140,6 +140,16 @@ class WorkspaceSeedRequest(BaseModel): workspace_id: str files: Optional[dict[str, str]] = None meta: Optional[dict[str, Any]] = None + # "webapp_template" (default) → seed the vendored + # openswarm-ai/webapp-template snapshot (React + Vite + TS frontend + # with optional FastAPI backend), allocate a free FRONTEND_PORT, + # leave BACKEND_PORT=NONE. Runtime spawns `bash run.sh`; preview + # pane points at `http://localhost:{FRONTEND_PORT}/`. + # "flat" → legacy single-`index.html` workspace, kept for explicit + # opt-in (migration helper, regression tests). Workspaces predating + # this flip continue to work in old-mode automatically since the + # runtime detects mode via the presence of `run.sh`. + template_mode: Literal["flat", "webapp_template"] = "webapp_template" @model_validator(mode="before") @classmethod diff --git a/backend/apps/outputs/outputs.py b/backend/apps/outputs/outputs.py index 20c98c3a..01f34fff 100644 --- a/backend/apps/outputs/outputs.py +++ b/backend/apps/outputs/outputs.py @@ -16,7 +16,11 @@ from backend.apps.outputs.models import ( VibeCodeRequest, WorkspaceSeedRequest, ) from backend.apps.outputs.executor import execute_backend_code -from backend.apps.outputs.view_builder_templates import VIEW_TEMPLATE_FILES, load_app_builder_skill +from backend.apps.outputs.view_builder_templates import ( + VIEW_TEMPLATE_FILES, + load_app_builder_skill, + seed_webapp_template_workspace, +) from backend.apps.settings.settings import load_settings logger = logging.getLogger(__name__) @@ -311,10 +315,53 @@ async def read_workspace(workspace_id: str): @outputs.router.post("/workspace/seed") async def seed_workspace(body: WorkspaceSeedRequest): - """Create a workspace folder and optionally pre-seed it with files.""" + """Create a workspace folder and pre-seed it. + + Two seeding modes: + + - **`template_mode="flat"`** (current default): writes the legacy + VIEW_TEMPLATE_FILES (single index.html + meta.json + schema.json). + Used by every workspace created so far. Runtime spawns + `python -u backend.py` (if present) and the preview pane fetches + from `/api/outputs/workspace/{ws}/serve/...`. + + - **`template_mode="webapp_template"`**: copies the vendored + openswarm-ai/webapp-template snapshot (React + Vite + TS frontend + with an optional FastAPI backend) into the workspace, allocates a + free FRONTEND_PORT and writes it into both `.env` and + `.env.example`. BACKEND_PORT stays NONE — the agent opts in with + `bash backend_init.sh`. Runtime spawn flips to `bash run.sh` and + the preview pane points at `http://localhost:{FRONTEND_PORT}/`. + `body.files` is ignored in this mode; the snapshot is the source + of truth. + """ folder = os.path.join(WORKSPACE_DIR, body.workspace_id) os.makedirs(folder, exist_ok=True) + # An explicit non-empty `files` payload means the caller has flat-mode + # content to write (a saved legacy Output being reseeded). Don't + # clobber that with the React template even if template_mode is the + # new default — the migration helper has its own path for that. + effective_mode = body.template_mode + if body.files: + effective_mode = "flat" + + if effective_mode == "webapp_template": + # Defer to the helper — copytree, env scaffolding, install paths. + from backend.apps.outputs.runtime import _find_free_port + frontend_port = _find_free_port() + seed_webapp_template_workspace(folder, frontend_port) + # SKILL.md still goes in workspace root — agent reads it for + # context. Live content (user-editable via Skills page) is + # injected into the system prompt regardless. + with open(os.path.join(folder, "SKILL.md"), "w") as f: + f.write(load_app_builder_skill()) + if body.meta: + with open(os.path.join(folder, "meta.json"), "w") as f: + json.dump(body.meta, f, indent=2) + return {"path": os.path.abspath(folder), "template_mode": "webapp_template", "frontend_port": frontend_port} + + # Legacy flat path — unchanged. if body.files: for rel_path, content in body.files.items(): full_path = os.path.normpath(os.path.join(folder, rel_path)) @@ -342,7 +389,7 @@ async def seed_workspace(body: WorkspaceSeedRequest): with open(os.path.join(folder, "meta.json"), "w") as f: json.dump(body.meta, f, indent=2) - return {"path": os.path.abspath(folder)} + return {"path": os.path.abspath(folder), "template_mode": "flat"} # --------------------------------------------------------------------------- @@ -356,12 +403,29 @@ def _runtime_status_payload(workspace_id: str) -> dict: from backend.apps.outputs.runtime import manager as runtime_manager rt = runtime_manager.get(workspace_id) if not rt: - return {"running": False, "port": None, "has_backend_file": False, "backend_url": None} + return { + "running": False, + "port": None, + "has_backend_file": False, + "backend_url": None, + "frontend_port": None, + "frontend_url": None, + "is_new_mode": False, + } return { "running": rt.running, "port": rt.port, "has_backend_file": rt.has_backend_file, + # For old-mode: backend.py serves; backend_url is its port. For + # new-mode: backend.py is optional (gated by BACKEND_PORT!=NONE); + # only populated if the agent ran bash backend_init.sh. "backend_url": f"http://127.0.0.1:{rt.port}" if rt.running and rt.port else None, + # New-mode only: where the Vite dev server is reachable. + # Old-mode workspaces report null and the editor falls back to + # the legacy /api/outputs/workspace/{ws}/serve/... path. + "frontend_port": rt.frontend_port, + "frontend_url": rt.frontend_url if rt.running else None, + "is_new_mode": rt.is_new_mode, } diff --git a/backend/apps/outputs/runtime.py b/backend/apps/outputs/runtime.py index 88954138..17adb6d6 100644 --- a/backend/apps/outputs/runtime.py +++ b/backend/apps/outputs/runtime.py @@ -35,6 +35,16 @@ _LOG_BUFFER_LINES = 2000 # workspace tear-down forever. _TERMINATE_GRACE_SECONDS = 3 +# How long we'll wait for Vite (or whatever frontend server bash run.sh +# spawns) to bind on FRONTEND_PORT before giving up and reporting the +# frontend as "not ready." Covers cold-start `npm install` (~60-90s on +# typical hardware for the template's dependency set) plus the Vite +# bind itself. After this we keep the runtime running — the user can +# check the Terminal pane to see what went wrong — but stop blocking +# the preview pane on a port that may never come up. +_FRONTEND_BIND_TIMEOUT_SECONDS = 180 +_FRONTEND_BIND_POLL_INTERVAL = 0.5 + def _find_free_port() -> int: """Ask the kernel for an unused localhost port. There's a tiny race @@ -46,6 +56,48 @@ def _find_free_port() -> int: return s.getsockname()[1] +def _is_new_mode(workspace_path: str) -> bool: + """A workspace is "new-mode" (webapp-template scaffold) if it has a + `run.sh` at its root. Old-mode workspaces are flat `index.html`-only + apps that pre-date the template swap — they're served by OpenSwarm's + own `/api/outputs/workspace/{ws}/serve/...` FastAPI route and have an + optional `backend.py` we spawn directly. + + Single-file probe so the check is cheap to call on every runtime + start, status query, and serve request.""" + return os.path.isfile(os.path.join(workspace_path, "run.sh")) + + +def _read_env_value(env_path: str, key: str) -> Optional[str]: + """Parse one value out of a workspace's `.env` without the cost of a + full subprocess-source. Strips quotes + trailing comments. Returns + None if the file or key is missing.""" + if not os.path.exists(env_path): + return None + try: + with open(env_path, encoding="utf-8") as f: + for raw in f: + line = raw.strip() + if not line or line.startswith("#"): + continue + if "=" not in line: + continue + k, _, v = line.partition("=") + if k.strip() != key: + continue + v = v.strip() + # Strip an inline `# comment`. Naive — bash semantics are + # more permissive, but values we write don't contain `#`. + if "#" in v: + v = v.split("#", 1)[0].rstrip() + if (v.startswith('"') and v.endswith('"')) or (v.startswith("'") and v.endswith("'")): + v = v[1:-1] + return v + except Exception: + logger.exception("failed reading %s from %s", key, env_path) + return None + + @dataclass class LogLine: stream: str # "stdout" | "stderr" | "runtime" (internal status lines) @@ -70,13 +122,25 @@ class AppRuntime: def __init__(self, workspace_id: str, workspace_path: str): self.workspace_id = workspace_id self.workspace_path = workspace_path + # Old-mode: `port` is the backend.py port. New-mode: `port` is + # the workspace's optional FastAPI backend (only set if + # BACKEND_PORT!=NONE) and `frontend_port` is the Vite dev + # server port. Both Nones until start() decides what's there. self.port: Optional[int] = None + self.frontend_port: Optional[int] = None + # New-mode only: flips True once something is actually listening + # on frontend_port (we kick off a background poll task in + # _start_new_mode). frontend_url returns null until this flips, + # so the preview pane doesn't try to navigate to an unbound port + # and show a "Site can't be reached" error mid-npm-install. + self._frontend_ready: bool = False self.process: Optional[asyncio.subprocess.Process] = None self.log_buffer: deque[LogLine] = deque(maxlen=_LOG_BUFFER_LINES) self._subscribers: set[LogSubscriber] = set() self._stdout_task: Optional[asyncio.Task] = None self._stderr_task: Optional[asyncio.Task] = None self._wait_task: Optional[asyncio.Task] = None + self._frontend_ready_task: Optional[asyncio.Task] = None self._lock = asyncio.Lock() @property @@ -87,51 +151,198 @@ class AppRuntime: def has_backend_file(self) -> bool: return os.path.exists(os.path.join(self.workspace_path, "backend.py")) + @property + def is_new_mode(self) -> bool: + return _is_new_mode(self.workspace_path) + + @property + def frontend_url(self) -> Optional[str]: + # Gated on `_frontend_ready` (set by the background bind-poll + # task in _start_new_mode) so the preview pane only switches + # over once Vite is actually accepting connections. Without + # this, the editor flashes a "Site can't be reached" error + # while `npm install` is running. + if self.frontend_port and self._frontend_ready: + return f"http://127.0.0.1:{self.frontend_port}/" + return None + async def start(self) -> bool: - """Spawn backend.py if it exists. Returns True if a process is - running after this call. False means the workspace has no - backend.py (legitimate — pure-frontend apps) or the spawn failed - (an error line is emitted to the log buffer in that case).""" + """Spawn the workspace's runtime. Branches on mode: + + - **New-mode** (`run.sh` at workspace root): spawn `bash run.sh`, + which reads `.env` for FRONTEND_PORT / BACKEND_PORT and boots + Vite (+ optional FastAPI). We just pre-read the env so the + status payload + preview-URL branching has them available + without waiting for the subprocess to print anything. + + - **Old-mode** (no `run.sh`): spawn `python -u backend.py` if + present, with `PORT` env var. This is the legacy path — + unchanged so flat-index.html apps keep working. + + Returns True if a process is running after this call. False is + legitimate for old-mode workspaces with no backend.py (pure + frontend served by `/api/outputs/.../serve/`); the runtime still + exists so the Terminal pane can host `[FRONTEND]` lines. + """ async with self._lock: if self.running: return True - if not self.has_backend_file: - self.port = None - return False - self.port = _find_free_port() - # Strip the install token before handing env to user code. - # Backend.py can hit our REST API back via its own creds if - # it really needs to, but it shouldn't inherit the host - # process's token by default. - env = {k: v for k, v in os.environ.items() if k != "OPENSWARM_AUTH_TOKEN"} - env["PORT"] = str(self.port) - env["BACKEND_PORT"] = str(self.port) # alias — both common names work + + if self.is_new_mode: + return await self._start_new_mode() + return await self._start_old_mode() + + async def _start_new_mode(self) -> bool: + env_path = os.path.join(self.workspace_path, ".env") + fp_raw = _read_env_value(env_path, "FRONTEND_PORT") + bp_raw = _read_env_value(env_path, "BACKEND_PORT") + # FRONTEND_PORT is allocated by seed_workspace; should always be + # a number. If missing, log + fall back to a fresh allocation — + # rare edge case (workspace seeded by an older OpenSwarm). + try: + self.frontend_port = int(fp_raw) if fp_raw else _find_free_port() + except ValueError: + self.frontend_port = _find_free_port() + # BACKEND_PORT may be the literal string "NONE" (frontend-only + # app — the common case) or a number once `backend_init.sh` has + # run. Only populate self.port when there's a real backend. + if bp_raw and bp_raw != "NONE": try: - # -u forces unbuffered stdout/stderr so the Terminal pane - # sees lines in real time, not whenever Python decides to - # flush its block buffer. - self.process = await asyncio.create_subprocess_exec( - sys.executable, "-u", "backend.py", - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - cwd=self.workspace_path, - env=env, - ) - except Exception as e: - logger.exception("failed to start backend for %s", self.workspace_id) - self._broadcast(LogLine("runtime", f"[runtime] failed to start: {e}")) + self.port = int(bp_raw) + except ValueError: self.port = None - self.process = None - return False - self._broadcast(LogLine("runtime", f"[runtime] backend started on port {self.port} (pid {self.process.pid})")) - self._stdout_task = asyncio.create_task(self._pipe_stream(self.process.stdout, "stdout")) - self._stderr_task = asyncio.create_task(self._pipe_stream(self.process.stderr, "stderr")) - self._wait_task = asyncio.create_task(self._await_exit()) - return True + else: + self.port = None + + env = self._spawn_env_base() + # bash run.sh reads .env itself; we don't need to set + # FRONTEND_PORT / BACKEND_PORT here. We DO export the install + # paths so the template's `backend/run.sh` can find our + # debugger to satisfy its `from swarm_debug import debug`. + # (Also written into .env at seed time, but env-var path is + # the more reliable read site for subshells.) + # NOTE: keep these in sync with seed_webapp_template_workspace. + from backend.apps.outputs.view_builder_templates import ( + _DEBUGGER_PATH, + _TEMPLATE_BACKEND_PATH, + ) + env["OPENSWARM_DEBUGGER_PATH"] = _DEBUGGER_PATH + env["OPENSWARM_TEMPLATE_BACKEND_PATH"] = _TEMPLATE_BACKEND_PATH + + try: + self.process = await asyncio.create_subprocess_exec( + "bash", "run.sh", + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + cwd=self.workspace_path, + env=env, + ) + except Exception as e: + logger.exception("failed to start new-mode runtime for %s", self.workspace_id) + self._broadcast(LogLine("runtime", f"[runtime] failed to start: {e}")) + self.frontend_port = None + self.port = None + self.process = None + return False + backend_note = f" + backend on {self.port}" if self.port else "" + self._broadcast(LogLine("runtime", f"[runtime] bash run.sh started — frontend on {self.frontend_port}{backend_note} (pid {self.process.pid})")) + self._stdout_task = asyncio.create_task(self._pipe_stream(self.process.stdout, "stdout")) + self._stderr_task = asyncio.create_task(self._pipe_stream(self.process.stderr, "stderr")) + self._wait_task = asyncio.create_task(self._await_exit()) + # Kick off the port-bind poller so frontend_url flips on once + # Vite is actually accepting connections. + self._frontend_ready = False + self._frontend_ready_task = asyncio.create_task(self._await_frontend_bind()) + return True + + async def _await_frontend_bind(self) -> None: + """Poll `frontend_port` every _FRONTEND_BIND_POLL_INTERVAL until + something binds (Vite dev server) or we hit the timeout. Emits a + `[runtime]` log line on success/failure so the Terminal pane + shows the transition; flips `_frontend_ready` which the + `frontend_url` property reads.""" + if not self.frontend_port: + return + port = self.frontend_port + deadline = asyncio.get_event_loop().time() + _FRONTEND_BIND_TIMEOUT_SECONDS + while asyncio.get_event_loop().time() < deadline: + # Stop polling if the process died — pointless to keep + # checking a port nothing will bind. + if self.process is None or self.process.returncode is not None: + return + try: + # asyncio.open_connection is the non-blocking equivalent + # of socket.create_connection. 0.5s connect timeout to + # avoid hanging if the host's TCP stack is under load. + fut = asyncio.open_connection("127.0.0.1", port) + reader, writer = await asyncio.wait_for(fut, timeout=0.5) + writer.close() + try: + await writer.wait_closed() + except Exception: + pass + self._frontend_ready = True + self._broadcast(LogLine( + "runtime", + f"[runtime] frontend ready at http://127.0.0.1:{port}/", + )) + return + except (OSError, asyncio.TimeoutError): + pass + await asyncio.sleep(_FRONTEND_BIND_POLL_INTERVAL) + # Timed out — keep the runtime up (Terminal might show useful + # errors) but surface why the preview never appeared. + self._broadcast(LogLine( + "runtime", + f"[runtime] frontend did NOT bind on port {port} after " + f"{_FRONTEND_BIND_TIMEOUT_SECONDS}s — check the Terminal " + f"for npm/vite errors.", + )) + + async def _start_old_mode(self) -> bool: + if not self.has_backend_file: + self.port = None + return False + self.port = _find_free_port() + env = self._spawn_env_base() + env["PORT"] = str(self.port) + env["BACKEND_PORT"] = str(self.port) # alias — both common names work + try: + # -u forces unbuffered stdout/stderr so the Terminal pane + # sees lines in real time, not whenever Python decides to + # flush its block buffer. + self.process = await asyncio.create_subprocess_exec( + sys.executable, "-u", "backend.py", + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + cwd=self.workspace_path, + env=env, + ) + except Exception as e: + logger.exception("failed to start backend for %s", self.workspace_id) + self._broadcast(LogLine("runtime", f"[runtime] failed to start: {e}")) + self.port = None + self.process = None + return False + self._broadcast(LogLine("runtime", f"[runtime] backend started on port {self.port} (pid {self.process.pid})")) + self._stdout_task = asyncio.create_task(self._pipe_stream(self.process.stdout, "stdout")) + self._stderr_task = asyncio.create_task(self._pipe_stream(self.process.stderr, "stderr")) + self._wait_task = asyncio.create_task(self._await_exit()) + return True + + def _spawn_env_base(self) -> dict[str, str]: + """Inherited env minus the install token. Backend.py can hit our + REST API back via its own creds if it really needs to, but it + shouldn't inherit the host process's token by default.""" + return {k: v for k, v in os.environ.items() if k != "OPENSWARM_AUTH_TOKEN"} async def stop(self) -> None: async with self._lock: if not self.process or self.process.returncode is not None: + # Still cancel the bind poller in case stop() races a + # never-launched runtime — defensive no-op otherwise. + if self._frontend_ready_task and not self._frontend_ready_task.done(): + self._frontend_ready_task.cancel() return try: self.process.terminate() @@ -142,6 +353,11 @@ class AppRuntime: await self.process.wait() except ProcessLookupError: pass + # Cancel the bind poller so it stops scanning a port that's + # gone away, and reset the readiness flag. + if self._frontend_ready_task and not self._frontend_ready_task.done(): + self._frontend_ready_task.cancel() + self._frontend_ready = False async def restart(self) -> bool: await self.stop() diff --git a/backend/apps/outputs/swarm_debug_skill.md b/backend/apps/outputs/swarm_debug_skill.md new file mode 100644 index 00000000..9237653b --- /dev/null +++ b/backend/apps/outputs/swarm_debug_skill.md @@ -0,0 +1,163 @@ +# swarm-debug — OpenSwarm's logger for App backends + +`swarm_debug` (also importable as `debug` for legacy reasons) is OpenSwarm's +opinionated `print()` replacement for the App Builder's backend code. It +prints colored, indented, frame-aware log lines that read at a glance and +land in the App Builder's **Terminal** tab under the `[BACKEND]` prefix. + +It's pre-installed in every App Builder workspace that has a backend (i.e. +after `bash backend_init.sh`). Use it instead of `print()`. + +--- + +## Basic usage + +```python +from swarm_debug import debug + +debug("hello") # [endpoint_name] : hello +debug({"user_id": 42, "ok": True}) # [endpoint_name] : {'user_id': 42, 'ok': True} +debug(some_dataframe) # auto-truncated to 3000 chars +``` + +The function reads the **calling line of source code** to extract the +variable name(s), so: + +```python +result = compute_thing(input_data) +debug(result) +# prints: [my_endpoint] : result = {'sum': 42, 'rows': [...]} +``` + +Variable name is inferred from the AST of the line that called `debug()`. If +you pass a literal (string, number, raw dict), it just prints the value. + +--- + +## Multiple args + +Pass several values in one call — each is labeled separately: + +```python +debug(user_id, request.body, response.status_code) +# [endpoint_name] : user_id = 42 +# [endpoint_name] : request.body = {...} +# [endpoint_name] : response.status_code = 200 +``` + +--- + +## Calling from inside a class + +`swarm_debug` introspects the caller's frame, so methods on a class print +under `ClassName.method` instead of just `method`: + +```python +class JobService: + def fetch(self, query): + debug(query) +# [JobService.fetch] : query = "machine learning engineer" +``` + +Indentation also scales with the call's lexical depth so nested-loop +debugging stays readable: + +```python +for batch in batches: + debug(batch.id) # |\t[fn] : batch.id = 1 + for item in batch.items: + debug(item) # |\t |-- [fn] : item = {...} +``` + +--- + +## Error highlighting + +Pass an `Exception` (or a name containing `err`/`error`) and `swarm_debug` +flips the color to red + prefixes a ❌ emoji so the error stands out in the +Terminal pane: + +```python +try: + risky_thing() +except Exception as err: + debug(err) + # ❌ [endpoint_name] : err = ValueError("bad input") +``` + +--- + +## Long values are truncated + +By default `swarm_debug` cuts values longer than 3000 characters with a +`…\n…` separator in the middle. Override per-call: + +```python +debug(huge_payload, override_max_chars=True) +``` + +--- + +## Modes (custom log levels) + +`debug` accepts a `mode` kwarg that maps to a configurable log channel. +Default is `'debug'`. The Terminal pane shows all modes; if you want to +hide a category, configure it in `Debugleton` (see `debugger_backend/`). + +```python +debug(payload, mode='info') +debug(suspicious_input, mode='warning') +``` + +--- + +## When to use `print()` instead + +Don't. `swarm_debug.debug()` IS the answer for backend logging. Reasons: + +- `print()` doesn't show the variable name or class/function context. +- `print()` doesn't truncate huge payloads. +- `print()` doesn't color-code errors. +- `print()` writes raw stdout, which is harder to scan in the Terminal + pane when the agent is also running and producing output. + +`print()` is fine for human-only one-off scripts the agent runs via Bash — +not for endpoint code. + +--- + +## What NOT to do + +- **Don't call `debug()` inside a hot loop** without a guard — every call + reads the source file to extract variable names, which gets expensive + at 10k+ iterations. +- **Don't pass functions / class objects** expecting useful output — + you'll get something like ``. Call the + function or stringify intentionally. +- **Don't rely on `debug()` for production logging.** It's a development + aid. For structured server logs that survive past the App Builder + session, use `logging` from the standard library. + +--- + +## How it lands in the Terminal tab + +Every line `debug()` prints goes to stdout/stderr of your backend +subprocess. The App Builder's runtime captures both streams, prefixes each +line with `[BACKEND]`, and streams them via WebSocket into the Terminal +pane in real time. Frontend `console.log` calls in the running app land in +the same Terminal pane prefixed `[FRONTEND]`. Use this to correlate cause +and effect across the two halves of your stack. + +--- + +## Quick reference + +| Want to… | Do this | +|---|---| +| Log a value with auto-inferred name | `debug(value)` | +| Log several values in one call | `debug(a, b, c)` | +| Log an exception with red coloring | `debug(err)` (variable name must contain "err" or "error", or pass an `Exception` instance) | +| Avoid truncation | `debug(value, override_max_chars=True)` | +| Use a different log channel | `debug(value, mode='info')` | +| Same thing, legacy import | `import debug; debug(value)` (function and module share the name — see swarm_debug.py shim) | diff --git a/backend/apps/outputs/view_builder_templates.py b/backend/apps/outputs/view_builder_templates.py index b7c6b8e5..744c6c3d 100644 --- a/backend/apps/outputs/view_builder_templates.py +++ b/backend/apps/outputs/view_builder_templates.py @@ -1,12 +1,25 @@ """Default template files seeded into new App Builder workspaces.""" import os +import re +import shutil # Absolute path to the bundled skill source. Surfaced as a constant so the # skills subsystem can register it as a built-in skill (copy into # ~/.claude/skills/ on first boot) without re-deriving the path. APP_BUILDER_SKILL_SOURCE_PATH = os.path.join(os.path.dirname(__file__), "app_builder_skill.md") +# Second built-in skill: documentation for `swarm-debug`, the colored +# frame-aware logger pre-installed in every webapp-template workspace's +# backend. Registered the same way as the App Builder skill. +SWARM_DEBUG_SKILL_SOURCE_PATH = os.path.join(os.path.dirname(__file__), "swarm_debug_skill.md") + +# Root of the vendored openswarm-ai/webapp-template snapshot. seed_workspace +# copytrees this into new-mode workspaces (excluding backend/, which gets +# brought in on-demand by the workspace's own backend_init.sh). See +# scripts/fetch-webapp-template.sh for the snapshot fetch + patches. +WEBAPP_TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), "webapp_template") + # Bundled default — used as the read-once fallback if the user-editable # copy at ~/.claude/skills/app_builder_skill.md has been removed despite # the built-in flag (defensive; shouldn't happen in normal use). @@ -100,3 +113,91 @@ VIEW_TEMPLATE_FILES = { "schema.json": VIEW_TEMPLATE_SCHEMA, "meta.json": VIEW_TEMPLATE_META, } + + +# --------------------------------------------------------------------------- +# webapp_template (new-mode) seed helpers +# --------------------------------------------------------------------------- + +def _ignore_backend(src: str, names: list[str]) -> list[str]: + """copytree filter — when copying the template root, drop only the + top-level `backend/` directory. Subdirectories named `backend` deeper + in the tree (none today, but defensively scoped) are unaffected.""" + if os.path.abspath(src) == os.path.abspath(WEBAPP_TEMPLATE_DIR): + return [n for n in names if n == "backend"] + return [] + + +_DEBUGGER_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "..", "..", "debugger") +) +_TEMPLATE_BACKEND_PATH = os.path.abspath(os.path.join(WEBAPP_TEMPLATE_DIR, "backend")) + + +def _patch_env_port(env_path: str, key: str, value: str) -> None: + """Idempotent in-place rewrite: `KEY=...` → `KEY=value`. Appends if + the key isn't present. Preserves surrounding lines untouched.""" + if not os.path.exists(env_path): + return + with open(env_path, encoding="utf-8") as f: + text = f.read() + pat = re.compile(rf"^{re.escape(key)}=.*$", re.MULTILINE) + new_line = f"{key}={value}" + if pat.search(text): + text = pat.sub(new_line, text) + else: + if text and not text.endswith("\n"): + text += "\n" + text += new_line + "\n" + with open(env_path, "w", encoding="utf-8") as f: + f.write(text) + + +def seed_webapp_template_workspace(workspace_dir: str, frontend_port: int) -> None: + """Copy the vendored webapp-template snapshot into `workspace_dir`, + excluding the master template's `backend/` (brought in on-demand by + the workspace's own `backend_init.sh`). Then: + + 1. Copy `.env.example` → `.env` verbatim (preserves the upstream + defaults `FRONTEND_PORT=4949` and `BACKEND_PORT=NONE`). + 2. Sed both `.env` and `.env.example` to set `FRONTEND_PORT=`. + BACKEND_PORT stays NONE in both (per spec — the agent flips it + via backend_init.sh when it needs a backend). + 3. Append two install-specific paths to `.env` ONLY (NOT + `.env.example` — these are absolute paths on the current + machine, not template defaults): + OPENSWARM_TEMPLATE_BACKEND_PATH= + OPENSWARM_DEBUGGER_PATH= + The first is read by `backend_init.sh`; the second is read by + the template's `backend/run.sh` to install our local debugger + before `pip install -e .`. + + Idempotent within reason — re-running over an existing workspace + overwrites template files and re-asserts the env values. + """ + os.makedirs(workspace_dir, exist_ok=True) + shutil.copytree( + WEBAPP_TEMPLATE_DIR, + workspace_dir, + ignore=_ignore_backend, + dirs_exist_ok=True, + ) + env_path = os.path.join(workspace_dir, ".env") + env_example_path = os.path.join(workspace_dir, ".env.example") + src_example = os.path.join(WEBAPP_TEMPLATE_DIR, ".env.example") + if os.path.exists(src_example): + shutil.copyfile(src_example, env_path) + + _patch_env_port(env_path, "FRONTEND_PORT", str(frontend_port)) + _patch_env_port(env_example_path, "FRONTEND_PORT", str(frontend_port)) + + # Install-specific paths — .env only. + _patch_env_port(env_path, "OPENSWARM_TEMPLATE_BACKEND_PATH", _TEMPLATE_BACKEND_PATH) + _patch_env_port(env_path, "OPENSWARM_DEBUGGER_PATH", _DEBUGGER_PATH) + + # Make the shipped scripts executable. tarball/git extracts may strip + # the +x bit depending on how the snapshot was vendored. + for script in ("run.sh", "backend_init.sh", "frontend/run.sh"): + p = os.path.join(workspace_dir, script) + if os.path.exists(p): + os.chmod(p, 0o755) diff --git a/backend/apps/outputs/webapp_template/.env.example b/backend/apps/outputs/webapp_template/.env.example new file mode 100644 index 00000000..86967fd7 --- /dev/null +++ b/backend/apps/outputs/webapp_template/.env.example @@ -0,0 +1,2 @@ +BACKEND_PORT=NONE # backend port (if set to NONE, the backend will not be run by the run.sh or referenced in the frontend) +FRONTEND_PORT=4949 diff --git a/backend/apps/outputs/webapp_template/.gitignore b/backend/apps/outputs/webapp_template/.gitignore new file mode 100644 index 00000000..637a3dbc --- /dev/null +++ b/backend/apps/outputs/webapp_template/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +.env +node_modules/ +.venv/ +__pycache__/ +*.pyc +dist/ +build/ diff --git a/backend/apps/outputs/webapp_template/backend/.gitignore b/backend/apps/outputs/webapp_template/backend/.gitignore new file mode 100644 index 00000000..7c2d1a86 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend/.gitignore @@ -0,0 +1,23 @@ +# ignore all py cache files +__pycache__/ +*.pyc +*.pyo +*.pyd +*.pyw +*.pyz +*.pywz +*.pyzw +*.pyzwz +*.pyzwzw + +# ignore everything in apps/db/snips (except .gitignore) +apps/db/snips/* +!apps/db/snips/.gitkeep + +# ignore .venv +.venv/ + +# ignore build artifacts +*.egg-info/ +build/ +openswarm_backend.egg-info/ \ No newline at end of file diff --git a/backend/apps/outputs/webapp_template/backend/__init__.py b/backend/apps/outputs/webapp_template/backend/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/outputs/webapp_template/backend/apps/__init__.py b/backend/apps/outputs/webapp_template/backend/apps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/outputs/webapp_template/backend/apps/health/__init__.py b/backend/apps/outputs/webapp_template/backend/apps/health/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/outputs/webapp_template/backend/apps/health/health.py b/backend/apps/outputs/webapp_template/backend/apps/health/health.py new file mode 100644 index 00000000..59812983 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend/apps/health/health.py @@ -0,0 +1,33 @@ +from backend.config.Apps import SubApp +from contextlib import asynccontextmanager +from fastapi.responses import PlainTextResponse +from typeguard import typechecked +from fastapi import status +from swarm_debug import debug + +@asynccontextmanager +async def health_lifespan(): + debug("health_lifespan START") + yield + debug("health_lifespan END") + +health = SubApp("health", health_lifespan) + +###################################### +# Health Check Endpoints # +###################################### + +@health.router.get("/check") +@typechecked +async def check() -> PlainTextResponse: + debug("Health check successful") + # Use PlainTextResponse instead of JSONResponse for AWS ALB compatibility + # ALB health checks can be sensitive to JSON responses and Content-Length headers + return PlainTextResponse( + content="OK", + status_code=status.HTTP_200_OK, + headers={ + "Content-Type": "text/plain", + "Content-Length": "2" + } + ) \ No newline at end of file diff --git a/backend/apps/outputs/webapp_template/backend/config/Apps.py b/backend/apps/outputs/webapp_template/backend/config/Apps.py new file mode 100644 index 00000000..d0477e93 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend/config/Apps.py @@ -0,0 +1,44 @@ +from fastapi import FastAPI, APIRouter +from uuid import uuid4 +from typing import List +from contextlib import asynccontextmanager +from contextlib import AsyncExitStack +from typing import Callable +from swarm_debug import debug +import os + +class SubApp: + def __init__(self, name:str, lifespan:Callable): + debug("SubApp.__init__ START: %s", name) + self.id = uuid4() + self.name = name + self.prefix = f"/api/{name}" + self.lifespan = lifespan + self.router = APIRouter() + debug("SubApp.__init__ END") + + def __str__(self): + return f"SubApp(name={self.name}, prefix={self.prefix}, id={self.id})" + +class MainApp: + def __init__(self, sub_apps: List[SubApp]): + debug(" START") + + @asynccontextmanager + async def lifespan(app: FastAPI): + async with AsyncExitStack() as stack: + for sub_app in sub_apps: + debug("Starting lifespan for sub_app: %s", sub_app.name) + await stack.enter_async_context(sub_app.lifespan()) + debug(f"Check out the API docs at: http://127.0.0.1:{os.environ.get('BACKEND_PORT', 8324)}/docs") + yield + + self.app = FastAPI(lifespan=lifespan) + + for sub_app in sub_apps: + self.app.include_router( + sub_app.router, + prefix=sub_app.prefix, + tags=[sub_app.name] + ) + debug("END") \ No newline at end of file diff --git a/backend/apps/outputs/webapp_template/backend/config/__init__.py b/backend/apps/outputs/webapp_template/backend/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/outputs/webapp_template/backend/main.py b/backend/apps/outputs/webapp_template/backend/main.py new file mode 100644 index 00000000..269aa219 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend/main.py @@ -0,0 +1,20 @@ +from backend.config.Apps import MainApp +from backend.apps.health.health import health +from fastapi.middleware.cors import CORSMiddleware + +main_app = MainApp([health]) +app = main_app.app + +# Add CORS middleware - allow all origins for development +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +if __name__ == "__main__": + import os + import uvicorn + uvicorn.run("backend.main:app", host="0.0.0.0", port=int(os.environ.get("BACKEND_PORT", 8324)), reload=True) diff --git a/backend/apps/outputs/webapp_template/backend/pyproject.toml b/backend/apps/outputs/webapp_template/backend/pyproject.toml new file mode 100644 index 00000000..e96191a6 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "openswarm-backend" +version = "0.1.0" +description = "OpenSwarm web app backend — FastAPI + SubApp plugin pattern" +requires-python = ">=3.10" +dependencies = [ + "fastapi[standard]", + "typeguard==4.4.2", +] + +[tool.setuptools] +packages = [] diff --git a/backend/apps/outputs/webapp_template/backend/run.sh b/backend/apps/outputs/webapp_template/backend/run.sh new file mode 100755 index 00000000..121a5cf2 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend/run.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# The comment above is shebang, DO NOT REMOVE +RUN_BACKEND_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +if [[ "$OSTYPE" == "darwin"* ]]; then + # echo "In macOS server sed START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i '' 's/\r//g' "$RUN_BACKEND_ABSPATH" + # echo "In macOS server sed END" +else + # echo "NOT in macOS server START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i 's/\r//g' "$RUN_BACKEND_ABSPATH" + # echo "NOT in macOS server START" +fi +chmod +x "$RUN_BACKEND_ABSPATH" + +if [[ "${BACKEND_PORT}" == "NONE" ]]; then + echo "BACKEND_PORT=NONE — backend disabled. Exiting." + exit 0 +fi + +BACKEND_DIR_ABSPATH="$(dirname "$RUN_BACKEND_ABSPATH")" + +# --- Find a working Python 3 --- +PYTHON="" +for candidate in python3.13 python3.12 python3.11 python3.10 python3; do + if command -v "$candidate" &>/dev/null && "$candidate" -c "print('ok')" &>/dev/null; then + PYTHON="$candidate" + break + fi +done +if [[ -z "$PYTHON" ]]; then + echo "Error: No working Python 3 found." + exit 1 +fi +echo "Using Python: $PYTHON ($($PYTHON --version 2>&1))" + +# --- Create virtual environment if it doesn't exist --- +VENV_DIR="$BACKEND_DIR_ABSPATH/.venv" +if [[ ! -d "$VENV_DIR" ]]; then + echo "Creating virtual environment..." + "$PYTHON" -m venv "$VENV_DIR" + if [[ $? -ne 0 ]]; then + echo "Error: Failed to create virtual environment." + exit 1 + fi +fi +source "$VENV_DIR/bin/activate" + +# --- Install Python dependencies --- +echo "Installing dependencies..." +cd "$BACKEND_DIR_ABSPATH" +if [[ -n "${OPENSWARM_DEBUGGER_PATH:-}" && -d "$OPENSWARM_DEBUGGER_PATH" ]]; then + echo "Installing OpenSwarm debugger (swarm_debug) from $OPENSWARM_DEBUGGER_PATH" + pip install -e "$OPENSWARM_DEBUGGER_PATH" +fi +pip install -e . +if [[ $? -ne 0 ]]; then + echo "Error: Failed to install Python dependencies." + exit 1 +fi + +# --- Start the backend server --- +echo "Starting backend server on http://0.0.0.0:${BACKEND_PORT:-8324} ..." +cd "$BACKEND_DIR_ABSPATH/.." +python -m uvicorn backend.main:app --host 0.0.0.0 --port "${BACKEND_PORT:-8324}" --reload diff --git a/backend/apps/outputs/webapp_template/backend_init.sh b/backend/apps/outputs/webapp_template/backend_init.sh new file mode 100755 index 00000000..ac3ecdf6 --- /dev/null +++ b/backend/apps/outputs/webapp_template/backend_init.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# Enable a FastAPI backend for this App. +# +# Idempotent. The workspace is seeded frontend-only (no backend/ dir, +# BACKEND_PORT=NONE). Run this script when your App needs server-side +# code — it copies the master template's backend/ into the workspace +# and flips BACKEND_PORT in both .env files to a free port. +# +# After running this, hard-reload the preview (right-click the reload +# button in the App Builder) so the runtime restarts with the new +# BACKEND_PORT and `bash run.sh` brings the backend up. + +set -euo pipefail +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$HERE" + +if [[ ! -f .env ]]; then + echo "ERROR: .env not found at $HERE — is this the workspace root?" >&2 + exit 1 +fi + +# Source .env so we know the current BACKEND_PORT and the path to the +# master template's backend/ (written by OpenSwarm at seed time). +set -a +source .env +set +a + +if [[ "${BACKEND_PORT:-NONE}" != "NONE" ]]; then + echo "Backend already enabled on port $BACKEND_PORT — nothing to do." >&2 + exit 0 +fi + +if [[ -d ./backend ]]; then + echo "ERROR: ./backend/ already exists but BACKEND_PORT=NONE — your" >&2 + echo " workspace is in an inconsistent state. Either delete" >&2 + echo " ./backend/ and re-run, or set BACKEND_PORT manually." >&2 + exit 1 +fi + +# Resolve master template backend/ path. OPENSWARM_TEMPLATE_BACKEND_PATH +# is written into .env at seed time; OPENSWARM_DEBUGGER_PATH the same. +if [[ -z "${OPENSWARM_TEMPLATE_BACKEND_PATH:-}" ]]; then + echo "ERROR: OPENSWARM_TEMPLATE_BACKEND_PATH not set in .env. This" >&2 + echo " workspace was seeded by an older OpenSwarm; ask the" >&2 + echo " App Builder to recreate it." >&2 + exit 1 +fi + +if [[ ! -d "$OPENSWARM_TEMPLATE_BACKEND_PATH" ]]; then + echo "ERROR: master template backend dir not found at" >&2 + echo " $OPENSWARM_TEMPLATE_BACKEND_PATH" >&2 + exit 1 +fi + +echo "Copying backend/ from $OPENSWARM_TEMPLATE_BACKEND_PATH..." +cp -R "$OPENSWARM_TEMPLATE_BACKEND_PATH" ./backend +chmod +x ./backend/run.sh + +# Pick a free port. SO_REUSEADDR=0 means the kernel won't immediately +# recycle, so the small race between bind+close and the backend +# re-binding is harmless in practice. +PORT="$(python3 -c "import socket +s = socket.socket() +s.bind(('127.0.0.1', 0)) +print(s.getsockname()[1]) +s.close()")" + +# sed-flip both .env and .env.example so an LLM reading either gets the +# same answer. macOS sed needs the '' arg for in-place edits. +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env + sed -i '' "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env.example +else + sed -i "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env + sed -i "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env.example +fi + +echo "" +echo "Backend enabled on port $PORT." +echo "Hard-reload the preview (right-click the reload button in" +echo "the App Builder) to bring it up." diff --git a/backend/apps/outputs/webapp_template/frontend/.gitignore b/backend/apps/outputs/webapp_template/frontend/.gitignore new file mode 100644 index 00000000..5a1f03f9 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/.gitignore @@ -0,0 +1,104 @@ +# Dependencies +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +yarn.lock + +# Build outputs +dist/ +build/ +*.tgz +*.tar.gz + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# IDE and Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Chrome Extension specific +*.crx +*.pem +*.zip + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ +*.lcov + +# nyc test coverage +.nyc_output + +# Dependency directories +jspm_packages/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt + +# Storybook build outputs +.out +.storybook-out + +# Temporary folders +tmp/ +temp/ + +# webpack generated files +*.hot-update.js +*.hot-update.json diff --git a/backend/apps/outputs/webapp_template/frontend/DESIGN.md b/backend/apps/outputs/webapp_template/frontend/DESIGN.md new file mode 100644 index 00000000..596ce48e --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/DESIGN.md @@ -0,0 +1,462 @@ +--- +name: themed-ui-design +description: Use when building, designing, or modifying any frontend UI component, page, or interface for the OpenSwarm app. Covers both general design excellence principles AND the specific OpenSwarm theme system, tokens, and component conventions. Trigger this for any React/MUI component work, UI design tasks, layout creation, styling questions, or when the user asks to build something visual. +--- + +# Themed UI Design + +Build distinctive, production-grade frontend interfaces for the OpenSwarm app that are visually striking AND perfectly aligned with the app's warm, editorial design system. + +This skill combines two concerns: +1. **Design Excellence** — Bold aesthetic thinking, anti-slop principles, creative typography/color/motion +2. **Theme Compliance** — OpenSwarm's specific tokens, MUI conventions, and component patterns + +Both matter equally. A component that follows the token system but looks generic has failed. A component that looks stunning but ignores the theme system has also failed. + +--- + +## Part 1: Design Thinking (Do This First) + +Before writing any code, answer these questions: + +- **Purpose**: What problem does this interface solve? Who interacts with it? +- **Tone within the brand**: The OpenSwarm aesthetic is warm, editorial, and refined — but within that envelope there's range. Is this component playful? Dense and utilitarian? Spacious and luxurious? Dramatic? +- **Differentiation**: What makes this component memorable? What's the one detail someone would notice and appreciate? +- **Hierarchy**: What's the single most important thing on screen? Everything else should defer to it. + +**CRITICAL**: The OpenSwarm brand is "sophisticated productivity tool meets premium design magazine meets dev IDE." Every component should feel like it belongs in that world — warm, organic, quietly confident. But within that world, make bold choices. Asymmetric layouts. Unexpected spacing. Elegant motion. The goal is *intentional* design, not safe design. + +### Anti-Slop Checklist + +NEVER produce generic AI-generated aesthetics: +- ❌ Cookie-cutter card grids with no visual hierarchy +- ❌ Predictable, evenly-spaced layouts with no rhythm +- ❌ Animations that exist for no reason (bouncing icons, gratuitous fades) +- ❌ Every element getting equal visual weight +- ❌ Defaulting to the most obvious layout for every problem + +ALWAYS pursue: +- ✅ Clear visual hierarchy — one thing dominates, others support +- ✅ Intentional spacing rhythm — not everything needs equal gaps +- ✅ Motion that communicates meaning (entrance = "I'm new", hover = "I'm interactive") +- ✅ Typography that creates atmosphere, not just displays text +- ✅ At least one unexpected detail that rewards attention + +--- + +## Part 2: Tech Stack (Non-Negotiable) + +| Concern | Tool | Notes | +|---------|------|-------| +| Framework | React 18 + TypeScript | Functional components only | +| UI Library | **MUI (Material UI) v7** | Use MUI components, not raw HTML | +| Styling | **MUI `sx` prop** | NO CSS files, NO styled-components, NO inline `style={}` | +| State | Redux Toolkit | `useAppDispatch()` / `useAppSelector()` typed hooks | +| Theming | `useClaudeTokens()` hook | NEVER hardcode colors | +| Animation | Framer Motion | For complex entrance/drag/spring animations | +| Icons | `@mui/icons-material` | Import individually, not barrel | +| Routing | react-router-dom v7 | `useNavigate`, `NavLink` | +| Markdown | react-markdown + remark-gfm | For rendered markdown | +| Path alias | `@/` → `src/` | Use `@/shared/...`, `@/app/...` | + +--- + +## Part 3: The Token System + +Access tokens via hook — **never hardcode colors**: +```tsx +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +const c = useClaudeTokens(); +``` + +### 3.1 Color Palette + +| Token | Light | Dark | Usage | +|-------|-------|------|-------| +| `c.bg.page` | `#F5F5F0` warm cream | `#1a1918` deep charcoal | Full-page background | +| `c.bg.surface` | `#FFFFFF` | `#262624` | Cards, panels, dialogs | +| `c.bg.elevated` | `#FAF9F5` | `#30302E` | Hover states, raised elements | +| `c.bg.secondary` | `#F5F4ED` | `#1f1e1b` | Sidebar, secondary panels | +| `c.bg.inverse` | `#141413` | `#FAF9F5` | Tooltips, inverted elements | +| `c.text.primary` | `#1a1a18` | `#FAF9F5` | Headings, body text | +| `c.text.secondary` | `#3D3D3A` | `#C2C0B6` | Secondary labels | +| `c.text.tertiary` | `#73726C` | `#9C9A92` | Placeholders, captions | +| `c.text.muted` | `#6b6a68` | `#85837C` | De-emphasized text | +| `c.text.ghost` | `rgba(115,114,108,0.5)` | `rgba(156,154,146,0.5)` | Timestamps, hints | +| `c.accent.primary` | `#ae5630` burnt orange | `#c4633a` | Primary buttons, links, active indicators | +| `c.accent.hover` | `#c4633a` | `#d47548` | Hover on accent | +| `c.accent.pressed` | `#924828` | `#ae5630` | Active/pressed state | +| `c.user.bubble` | `#DDD9CE` | `#393937` | User chat bubbles | + +### 3.2 Borders + +Borders are extremely subtle — transparency, not solid colors: +```tsx +border: `1px solid ${c.border.subtle}` // 6-8% opacity — default for cards +border: `1px solid ${c.border.medium}` // 8-12% opacity — dividers +border: `1px solid ${c.border.strong}` // 15-20% opacity — hover, emphasis +border: `0.5px solid ${c.border.medium}` // Hairline dividers +``` + +### 3.3 Shadows + +Very soft, low-contrast. No heavy drop shadows: +```tsx +c.shadow.sm // "0 1px 3px rgba(0,0,0,0.04)" — cards at rest +c.shadow.md // "0 0.25rem 1.25rem rgba(0,0,0,0.035)" — hover elevation +c.shadow.lg // "0 0.5rem 2rem rgba(0,0,0,0.08)" — dialogs, drag +``` + +### 3.4 Border Radius + +```tsx +c.radius.xs // 4px — chips, badges +c.radius.sm // 6px — input fields +c.radius.md // 8px — chips, tags +c.radius.lg // 10px — buttons, list items +c.radius.xl // 12px — cards, panels +c.radius.full // 9999px — pills, avatars +``` + +### 3.5 Typography + +**Serif-first** — this is intentional and core to the brand identity: +``` +Font family: "Anthropic Sans", ui-serif, Georgia, Cambria, "Times New Roman", Times, serif +Mono font: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace +``` + +| Use Case | Size | Weight | +|----------|------|--------| +| Page heading | `h6` or manual | 700 | +| Section heading | `0.95rem` | 600 | +| Body text | `0.875rem` | 400 | +| Small label | `0.8rem` | 400 | +| Caption/timestamp | `0.75rem` / `0.65rem` | 400 | +| Button text | inherited | 500 | + +**Important**: `textTransform: 'none'` on ALL buttons. No uppercase anywhere. + +### 3.6 Transitions + +Signature easing for interactive elements: +```tsx +transition: c.transition // "all 300ms cubic-bezier(0.165, 0.85, 0.45, 1)" +``` +For micro-interactions: +```tsx +transition: 'opacity 0.15s' +transition: 'all 0.2s ease' +``` + +### 3.7 Accent-Tinted Backgrounds + +The signature technique for active/selected states — accent color at very low opacity: +```tsx +bgcolor: `${c.accent.primary}0F` // ~6% — active state +bgcolor: `${c.accent.primary}08` // ~3% — hover state +bgcolor: `${c.accent.primary}0A` // ~4% — subtle hover +bgcolor: `${c.accent.primary}0C` // ~5% — hover on active +bgcolor: `${c.accent.primary}18` // ~9% — decorative fill +``` + +### 3.8 Spacing (MUI units = 8px) + +| `sx` value | Pixels | Usage | +|------------|--------|-------| +| `p: 0.25` | 2px | Tiny icon padding | +| `gap: 0.5` | 4px | Tight button groups | +| `p: 0.75` | 6px | Compact list items | +| `gap: 1` / `p: 1` | 8px | Standard small gap | +| `gap: 1.5` | 12px | Logo + text | +| `p: 2` | 16px | Card content | +| `p: 2.5` | 20px | Header/section | + +--- + +## Part 4: Component Structure + +Every component follows this skeleton: + +```tsx +import React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import SomeIcon from '@mui/icons-material/SomeIcon'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface Props { + // Explicit interface, not inline types +} + +const MyComponent: React.FC = ({ prop1, prop2 }) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + + return ( + + {/* content */} + + ); +}; + +export default MyComponent; +``` + +**Rules:** +- `export default` the component +- Destructure props in the signature +- `const c = useClaudeTokens()` as the first line +- `Box` for containers (not `div`), `Typography` for text (not `p`/`span`/`h1`) +- All styling via `sx={{}}` — never `style={{}}` +- Import MUI components from individual paths, not barrel + +--- + +## Part 5: Pattern Library + +### 5.1 Card +```tsx + +``` + +### 5.2 Hover-Reveal Actions +```tsx + + + + + + + +``` + +### 5.3 Sidebar Nav Item +```tsx + + + + + + +``` + +### 5.4 Icon Buttons (Always in Tooltip) +```tsx + + + + + +``` + +### 5.5 Dialog/Modal +```tsx + +``` + +### 5.6 Status Chips +```tsx + +``` + +### 5.7 Destructive Actions +```tsx + + + +``` + +### 5.8 Custom Scrollbar +```tsx +sx={{ + overflow: 'auto', + '&::-webkit-scrollbar': { width: 4 }, + '&::-webkit-scrollbar-track': { background: 'transparent' }, + '&::-webkit-scrollbar-thumb': { background: c.border.medium, borderRadius: 2 }, + scrollbarWidth: 'thin', + scrollbarColor: `${c.border.medium} transparent`, +}} +``` + +### 5.9 Text Truncation +```tsx +// Single line: +sx={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }} + +// Multi-line clamp (2 lines): +sx={{ + display: '-webkit-box', + WebkitLineClamp: 2, + WebkitBoxOrient: 'vertical', + overflow: 'hidden', +}} +``` + +--- + +## Part 6: Animation Conventions + +### Framer Motion (entrance, drag, springs) +```tsx +import { motion } from 'framer-motion'; + + +``` + +### CSS Keyframes (via sx) +```tsx +// Pulsing dot: +sx={{ + '@keyframes pulse': { + '0%, 100%': { opacity: 0.4, transform: 'scale(0.8)' }, + '50%': { opacity: 1, transform: 'scale(1.2)' }, + }, + animation: 'pulse 1.5s ease-in-out infinite', +}} +``` + +### Motion Philosophy +- **Entrance**: Staggered reveals with `animation-delay` create delight +- **Hover**: Cards lift (`translateY(-2px)`), borders sharpen, shadows deepen +- **Active**: `transform: 'scale(0.98)'` on press +- **Reveal**: Actions fade in on parent hover (opacity 0 → 1) +- **Scroll**: Use scroll-triggered animations sparingly but memorably +- One well-orchestrated page load > scattered micro-interactions + +--- + +## Part 7: Hard Rules (Don'ts) + +- ❌ Hardcode any color value — use `c.xxx` tokens +- ❌ CSS files, CSS modules, styled-components, emotion `css` prop +- ❌ Raw HTML (`div`, `span`, `p`, `button`) — use MUI equivalents +- ❌ `style={{}}` — use `sx={{}}` +- ❌ Uppercase text transforms on buttons or labels +- ❌ Heavy/solid borders — always transparent/opacity-based +- ❌ Bright/saturated colors outside the token palette +- ❌ Sharp corners (0 radius) on interactive elements +- ❌ Icon buttons without `` wrapper +- ❌ Barrel imports from `@mui/material` — import each component from its path +- ❌ `React.memo` unless measured performance need +- ❌ Separate type files — keep interfaces colocated unless shared + +--- + +## Part 8: File & Folder Conventions + +Routes use **file-based routing** via `vite-plugin-pages`. Any `.tsx` file in `src/pages/` automatically becomes a route (e.g. `src/pages/health.tsx` → `/health`, `src/pages/index.tsx` → `/`). + +``` +src/pages/ # File-based routes (auto-registered) + index.tsx # Home page → / + health.tsx # Health page → /health + settings.tsx # Example → /settings + +src/app/ + Main.tsx # Root: providers + BrowserRouter + AppShell + components/ + Layout/ + AppShell.tsx # Sidebar + content area shell + Sidebar.tsx # Navigation rail, theme toggle + SharedComponent.tsx # Truly shared/reusable + +src/shared/ + hooks.ts # useAppDispatch, useAppSelector + state/ # Redux slices + styles/ # Theme tokens, context + modals/ # Modal components +``` + +--- + +## Part 9: Quality Checklist + +Before delivering any component, verify: + +1. ☐ `useClaudeTokens()` is the first hook call +2. ☐ Zero hardcoded colors — every color references a token +3. ☐ All styling via `sx={{}}` — no `style`, no CSS files +4. ☐ Every `IconButton` wrapped in `Tooltip` +5. ☐ `textTransform: 'none'` on all buttons +6. ☐ Borders use `c.border.*` tokens (opacity-based) +7. ☐ Interactive elements have `transition: c.transition` +8. ☐ Active states use accent-tinted backgrounds (`${c.accent.primary}0F`) +9. ☐ Cards have subtle border + shadow + hover lift pattern +10. ☐ Component has clear visual hierarchy — not everything equal weight +11. ☐ At least one thoughtful design detail that elevates beyond generic +12. ☐ Dark mode works correctly (tokens handle this automatically if used properly) +13. ☐ MUI imports are from individual paths, not barrel +14. ☐ `export default` at the bottom diff --git a/backend/apps/outputs/webapp_template/frontend/index.html b/backend/apps/outputs/webapp_template/frontend/index.html new file mode 100644 index 00000000..48dcae4b --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + OpenSwarm - Web App Template + + +
+ + + diff --git a/backend/apps/outputs/webapp_template/frontend/package.json b/backend/apps/outputs/webapp_template/frontend/package.json new file mode 100644 index 00000000..1ca8db08 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/package.json @@ -0,0 +1,32 @@ +{ + "name": "open-swarm-app-template", + "version": "1.0.0", + "description": "SaaS skeleton frontend built with React", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "clean": "rm -rf dist" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.9", + "@mui/material": "^7.3.9", + "@reduxjs/toolkit": "^2.8.2", + "framer-motion": "^12.36.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^9.2.0", + "react-router-dom": "^7.13.1" + }, + "devDependencies": { + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.0.0", + "vite": "^6.3.5", + "vite-plugin-pages": "^0.33.3", + "vite-plugin-terminal": "^1.4.0" + } +} diff --git a/backend/apps/outputs/webapp_template/frontend/public/logo.png b/backend/apps/outputs/webapp_template/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9f86117d01dbf67e874f4deaaaa3686f26d9c6 GIT binary patch literal 327756 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
  • S(bcTweX!!_){>Jc*aBWslZZLT6s1H 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 literal 0 HcmV?d00001 diff --git a/backend/apps/outputs/webapp_template/frontend/run.sh b/backend/apps/outputs/webapp_template/frontend/run.sh new file mode 100755 index 00000000..09edef65 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/run.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# The comment above is shebang, DO NOT REMOVE +RUN_FRONTEND_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +if [[ "$OSTYPE" == "darwin"* ]]; then + # echo "In macOS server sed START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i '' 's/\r//g' "$RUN_FRONTEND_ABSPATH" + # echo "In macOS server sed END" +else + # echo "NOT in macOS server START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i 's/\r//g' "$RUN_FRONTEND_ABSPATH" + # echo "NOT in macOS server START" +fi +chmod +x "$RUN_FRONTEND_ABSPATH" + +FRONTEND_DIR_ABSPATH="$(dirname "$RUN_FRONTEND_ABSPATH")" + +echo "Installing dependencies..." +cd "$FRONTEND_DIR_ABSPATH" +npm install + +echo "Building with development mode..." +npm run dev + +# exit back to the dir that we were in before +cd - \ No newline at end of file diff --git a/backend/apps/outputs/webapp_template/frontend/src/app/Main.tsx b/backend/apps/outputs/webapp_template/frontend/src/app/Main.tsx new file mode 100644 index 00000000..6e8ae4f8 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/app/Main.tsx @@ -0,0 +1,27 @@ +import React, { Suspense } from 'react'; +import { Provider } from 'react-redux'; +import { BrowserRouter, useRoutes } from 'react-router-dom'; +import routes from '~react-pages'; +import { store } from '../shared/state/store'; +import ClaudeThemeProvider from '@/shared/styles/ThemeContext'; +import AppShell from '@/app/components/Layout/AppShell'; + +const Pages: React.FC = () => { + return {useRoutes(routes)}; +}; + +const Main: React.FC = () => { + return ( + + + + + + + + + + ); +}; + +export default Main; diff --git a/backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/AppShell.tsx b/backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/AppShell.tsx new file mode 100644 index 00000000..9b7dff82 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/AppShell.tsx @@ -0,0 +1,37 @@ +import React, { useState } from 'react'; +import Box from '@mui/material/Box'; +import Sidebar from './Sidebar'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface AppShellProps { + children: React.ReactNode; +} + +const AppShell: React.FC = ({ children }) => { + const c = useClaudeTokens(); + const [collapsed, setCollapsed] = useState(false); + + return ( + + setCollapsed((prev) => !prev)} /> + + {children} + + + ); +}; + +export default AppShell; diff --git a/backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/Sidebar.tsx b/backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/Sidebar.tsx new file mode 100644 index 00000000..1c16a525 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/app/components/Layout/Sidebar.tsx @@ -0,0 +1,190 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import List from '@mui/material/List'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import HomeIcon from '@mui/icons-material/Home'; +import FavoriteIcon from '@mui/icons-material/Favorite'; +import LightModeIcon from '@mui/icons-material/LightMode'; +import DarkModeIcon from '@mui/icons-material/DarkMode'; +import { NavLink, useLocation } from 'react-router-dom'; +import { useClaudeTokens, useThemeMode } from '@/shared/styles/ThemeContext'; + +const NAV_ITEMS = [ + { path: '/', label: 'Home', icon: HomeIcon }, + { path: '/health', label: 'Health', icon: FavoriteIcon }, +]; + +const SIDEBAR_WIDTH_EXPANDED = 240; +const SIDEBAR_WIDTH_COLLAPSED = 64; + +interface SidebarProps { + collapsed: boolean; + onToggle: () => void; +} + +const Sidebar: React.FC = ({ collapsed, onToggle }) => { + const c = useClaudeTokens(); + const { mode, toggleMode } = useThemeMode(); + const location = useLocation(); + + const width = collapsed ? SIDEBAR_WIDTH_COLLAPSED : SIDEBAR_WIDTH_EXPANDED; + + return ( + + + + {!collapsed && ( + + OpenSwarm + + )} + + + + {NAV_ITEMS.map(({ path, label, icon: Icon }) => { + const isActive = + path === '/' ? location.pathname === '/' : location.pathname.startsWith(path); + + const button = ( + + + + + {!collapsed && ( + + )} + + ); + + return collapsed ? ( + + {button} + + ) : ( + button + ); + })} + + + + + + {mode === 'light' ? ( + + ) : ( + + )} + + + {!collapsed && ( + + {mode === 'light' ? 'Light' : 'Dark'} + + )} + + + ); +}; + +export { SIDEBAR_WIDTH_EXPANDED, SIDEBAR_WIDTH_COLLAPSED }; +export default Sidebar; diff --git a/backend/apps/outputs/webapp_template/frontend/src/index.tsx b/backend/apps/outputs/webapp_template/frontend/src/index.tsx new file mode 100644 index 00000000..b970a9af --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import Main from './app/Main'; + +console.log('[App] Bootstrapping React app'); +const rootEl = document.getElementById('root'); +if (!rootEl) { + console.error('[App] FATAL: #root element not found in DOM'); +} else { + createRoot(rootEl).render(
    ); + console.log('[App] React root mounted'); +} diff --git a/backend/apps/outputs/webapp_template/frontend/src/pages/health.tsx b/backend/apps/outputs/webapp_template/frontend/src/pages/health.tsx new file mode 100644 index 00000000..0ada3456 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/pages/health.tsx @@ -0,0 +1,272 @@ +import React, { useState, useCallback } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import CircularProgress from '@mui/material/CircularProgress'; +import FavoriteIcon from '@mui/icons-material/Favorite'; +import CloudOffIcon from '@mui/icons-material/CloudOff'; +import { motion } from 'framer-motion'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { HEALTH_CHECK_URL } from '@/shared/state/API_ENDPOINTS'; + +const BACKEND_ENABLED = process.env.BACKEND_ENABLED; + +type HealthStatus = 'idle' | 'loading' | 'ok' | 'error'; + +interface HealthResult { + status: HealthStatus; + message: string; + latencyMs: number | null; +} + +const Health: React.FC = () => { + const c = useClaudeTokens(); + const [result, setResult] = useState({ + status: 'idle', + message: '', + latencyMs: null, + }); + + const pingHealth = useCallback(async () => { + setResult({ status: 'loading', message: '', latencyMs: null }); + const start = performance.now(); + try { + const res = await fetch(HEALTH_CHECK_URL); + const elapsed = Math.round(performance.now() - start); + const text = await res.text(); + if (res.ok) { + setResult({ status: 'ok', message: text, latencyMs: elapsed }); + } else { + setResult({ status: 'error', message: `${res.status} — ${text}`, latencyMs: elapsed }); + } + } catch (err) { + const elapsed = Math.round(performance.now() - start); + const msg = err instanceof Error ? err.message : 'Network error'; + setResult({ status: 'error', message: msg, latencyMs: elapsed }); + } + }, []); + + const statusColor = + result.status === 'ok' + ? c.status.success + : result.status === 'error' + ? c.status.error + : c.text.tertiary; + + const statusBg = + result.status === 'ok' + ? c.status.successBg + : result.status === 'error' + ? c.status.errorBg + : 'transparent'; + + return ( + + + + + Health + + + + {BACKEND_ENABLED ? 'Backend health check' : 'Frontend-only mode'} + + + + {BACKEND_ENABLED ? ( + <> + + + + + Service Status + + + + + + + {result.status !== 'idle' && result.status !== 'loading' && ( + + + + {result.status === 'ok' ? 'Healthy' : 'Unreachable'} + + + Response: {result.message} + {result.latencyMs !== null && ` · ${result.latencyMs}ms`} + + + + )} + + ) : ( + + + + + No Backend Configured + + + + Initialize the backend and set +
    + the BACKEND_PORT in .env. +
    +
    + )} +
    +
    +
    +
    + ); +}; + +export default Health; diff --git a/backend/apps/outputs/webapp_template/frontend/src/pages/index.tsx b/backend/apps/outputs/webapp_template/frontend/src/pages/index.tsx new file mode 100644 index 00000000..4314518e --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/pages/index.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import { motion } from 'framer-motion'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +const Home: React.FC = () => { + const c = useClaudeTokens(); + + return ( + + + + + + OpenSwarm + + + Web app template — ready to build. + + + + + ); +}; + +export default Home; diff --git a/backend/apps/outputs/webapp_template/frontend/src/shared/hooks.ts b/backend/apps/outputs/webapp_template/frontend/src/shared/hooks.ts new file mode 100644 index 00000000..3c4157e2 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/shared/hooks.ts @@ -0,0 +1,5 @@ +import { useDispatch, useSelector } from 'react-redux'; +import type { RootState, AppDispatch } from './state/store'; + +export const useAppDispatch = useDispatch.withTypes(); +export const useAppSelector = useSelector.withTypes(); diff --git a/backend/apps/outputs/webapp_template/frontend/src/shared/state/API_ENDPOINTS.ts b/backend/apps/outputs/webapp_template/frontend/src/shared/state/API_ENDPOINTS.ts new file mode 100644 index 00000000..ccff23bc --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/shared/state/API_ENDPOINTS.ts @@ -0,0 +1,4 @@ +const API_URL = '/api'; + +// HEALTH - Endpoints +export const HEALTH_CHECK_URL = API_URL + '/health/check'; \ No newline at end of file diff --git a/backend/apps/outputs/webapp_template/frontend/src/shared/state/store.ts b/backend/apps/outputs/webapp_template/frontend/src/shared/state/store.ts new file mode 100644 index 00000000..7fc45b7c --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/shared/state/store.ts @@ -0,0 +1,13 @@ +import { configureStore } from '@reduxjs/toolkit'; +import tempStateReducer from './tempStateSlice'; + +export const store = configureStore({ + reducer: { + tempState: tempStateReducer, + }, +}); + +console.log('[Store] Redux store created with slices:', Object.keys(store.getState())); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; diff --git a/backend/apps/outputs/webapp_template/frontend/src/shared/state/tempStateSlice.ts b/backend/apps/outputs/webapp_template/frontend/src/shared/state/tempStateSlice.ts new file mode 100644 index 00000000..2a9a8727 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/shared/state/tempStateSlice.ts @@ -0,0 +1,30 @@ +// store/tempStateSlice.ts +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +interface TempState { + temp_state: string | null; +} + +const initialState: TempState = { + temp_state: null, +}; + +const tempStateSlice = createSlice({ + name: 'tempState', + initialState, + reducers: { + setTempState(state, action: PayloadAction) { + state.temp_state = action.payload; + }, + resetTempState(state) { + state.temp_state = null; + }, + }, +}); + +export const { + setTempState, + resetTempState, +} = tempStateSlice.actions; + +export default tempStateSlice.reducer; diff --git a/backend/apps/outputs/webapp_template/frontend/src/shared/styles/ThemeContext.tsx b/backend/apps/outputs/webapp_template/frontend/src/shared/styles/ThemeContext.tsx new file mode 100644 index 00000000..88256a43 --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/shared/styles/ThemeContext.tsx @@ -0,0 +1,185 @@ +import React, { createContext, useContext, useMemo, useState, useCallback } from 'react'; +import { ThemeProvider, createTheme } from '@mui/material/styles'; +import CssBaseline from '@mui/material/CssBaseline'; + +type Mode = 'light' | 'dark'; + +const FONT_SERIF = '"Anthropic Sans", ui-serif, Georgia, Cambria, "Times New Roman", Times, serif'; +const FONT_MONO = 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace'; + +const lightTokens = { + bg: { + page: '#F5F5F0', + surface: '#FFFFFF', + elevated: '#FAF9F5', + secondary: '#F5F4ED', + inverse: '#141413', + }, + text: { + primary: '#1a1a18', + secondary: '#3D3D3A', + tertiary: '#73726C', + muted: '#6b6a68', + ghost: 'rgba(115,114,108,0.5)', + }, + accent: { + primary: '#ae5630', + hover: '#c4633a', + pressed: '#924828', + }, + user: { bubble: '#DDD9CE' }, + border: { + subtle: 'rgba(0,0,0,0.07)', + medium: 'rgba(0,0,0,0.10)', + strong: 'rgba(0,0,0,0.18)', + }, + shadow: { + sm: '0 1px 3px rgba(0,0,0,0.04)', + md: '0 0.25rem 1.25rem rgba(0,0,0,0.035)', + lg: '0 0.5rem 2rem rgba(0,0,0,0.08)', + }, + status: { + success: '#2e7d32', + successBg: 'rgba(46,125,50,0.08)', + error: '#c62828', + errorBg: 'rgba(198,40,40,0.08)', + }, +}; + +const darkTokens = { + bg: { + page: '#1a1918', + surface: '#262624', + elevated: '#30302E', + secondary: '#1f1e1b', + inverse: '#FAF9F5', + }, + text: { + primary: '#FAF9F5', + secondary: '#C2C0B6', + tertiary: '#9C9A92', + muted: '#85837C', + ghost: 'rgba(156,154,146,0.5)', + }, + accent: { + primary: '#c4633a', + hover: '#d47548', + pressed: '#ae5630', + }, + user: { bubble: '#393937' }, + border: { + subtle: 'rgba(255,255,255,0.07)', + medium: 'rgba(255,255,255,0.10)', + strong: 'rgba(255,255,255,0.18)', + }, + shadow: { + sm: '0 1px 3px rgba(0,0,0,0.12)', + md: '0 0.25rem 1.25rem rgba(0,0,0,0.15)', + lg: '0 0.5rem 2rem rgba(0,0,0,0.25)', + }, + status: { + success: '#66bb6a', + successBg: 'rgba(102,187,106,0.12)', + error: '#ef5350', + errorBg: 'rgba(239,83,80,0.12)', + }, +}; + +const sharedTokens = { + radius: { + xs: 4, + sm: 6, + md: 8, + lg: 10, + xl: 12, + full: 9999, + }, + font: { + serif: FONT_SERIF, + mono: FONT_MONO, + }, + transition: 'all 300ms cubic-bezier(0.165, 0.85, 0.45, 1)', +}; + +export type ClaudeTokens = typeof lightTokens & typeof sharedTokens; + +function buildTokens(mode: Mode): ClaudeTokens { + const modeTokens = mode === 'light' ? lightTokens : darkTokens; + return { ...modeTokens, ...sharedTokens }; +} + +interface ThemeModeContextValue { + mode: Mode; + toggleMode: () => void; +} + +const ThemeModeContext = createContext({ + mode: 'light', + toggleMode: () => {}, +}); + +const TokensContext = createContext(buildTokens('light')); + +export function useThemeMode() { + return useContext(ThemeModeContext); +} + +export function useClaudeTokens(): ClaudeTokens { + return useContext(TokensContext); +} + +interface ClaudeThemeProviderProps { + children: React.ReactNode; +} + +const ClaudeThemeProvider: React.FC = ({ children }) => { + const [mode, setMode] = useState('light'); + + const toggleMode = useCallback(() => { + setMode((prev) => { + const next = prev === 'light' ? 'dark' : 'light'; + console.log(`[Theme] Toggled ${prev} → ${next}`); + return next; + }); + }, []); + + const tokens = useMemo(() => buildTokens(mode), [mode]); + + const muiTheme = useMemo( + () => + createTheme({ + palette: { mode }, + typography: { + fontFamily: FONT_SERIF, + button: { textTransform: 'none' as const }, + }, + components: { + MuiCssBaseline: { + styleOverrides: { + body: { + backgroundColor: tokens.bg.page, + color: tokens.text.primary, + transition: 'background-color 300ms ease, color 300ms ease', + }, + }, + }, + }, + }), + [mode, tokens], + ); + + const modeValue = useMemo(() => ({ mode, toggleMode }), [mode, toggleMode]); + + return ( + + + + + {children} + + + + ); +}; + +export default ClaudeThemeProvider; diff --git a/backend/apps/outputs/webapp_template/frontend/src/vite-env.d.ts b/backend/apps/outputs/webapp_template/frontend/src/vite-env.d.ts new file mode 100644 index 00000000..f07ec82e --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/backend/apps/outputs/webapp_template/frontend/tsconfig.json b/backend/apps/outputs/webapp_template/frontend/tsconfig.json new file mode 100644 index 00000000..ca3ff3de --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/backend/apps/outputs/webapp_template/frontend/vite.config.ts b/backend/apps/outputs/webapp_template/frontend/vite.config.ts new file mode 100644 index 00000000..b7bc361d --- /dev/null +++ b/backend/apps/outputs/webapp_template/frontend/vite.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import Pages from 'vite-plugin-pages'; +import terminal from 'vite-plugin-terminal'; +import path from 'path'; + +export default defineConfig(({ mode }) => { + const backendPort = process.env.BACKEND_PORT; + const backendEnabled = backendPort && backendPort !== 'NONE'; + + return { + plugins: [ + react(), + Pages({ dirs: 'src/pages', extensions: ['tsx'] }), + terminal({ console: 'terminal', output: ['terminal', 'console'] }), + ], + resolve: { + alias: { + '@': path.resolve(__dirname, 'src'), + }, + }, + define: { + 'process.env.BACKEND_ENABLED': JSON.stringify(backendEnabled ? 'true' : ''), + }, + server: { + port: Number(process.env.FRONTEND_PORT) || 3000, + open: true, + proxy: backendEnabled + ? { + '/api': { + target: `http://localhost:${backendPort || 8324}`, + changeOrigin: true, + }, + } + : undefined, + }, + }; +}); diff --git a/backend/apps/outputs/webapp_template/run.sh b/backend/apps/outputs/webapp_template/run.sh new file mode 100755 index 00000000..0895346e --- /dev/null +++ b/backend/apps/outputs/webapp_template/run.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +if [[ -f "$ROOT_DIR/.env" ]]; then + set -a + source "$ROOT_DIR/.env" + set +a +fi + +cleanup() { + echo "" + echo "Shutting down all processes..." + kill 0 2>/dev/null + wait 2>/dev/null +} +trap cleanup EXIT + +if [[ "${BACKEND_PORT}" == "NONE" ]]; then + echo "BACKEND_PORT=NONE — running frontend only (no backend)." + echo "" + + bash "$ROOT_DIR/frontend/run.sh" 2>&1 | awk '{printf "\033[32m[frontend]\033[0m %s\n", $0; fflush()}' & + FRONTEND_PID=$! + + while true; do + if ! kill -0 $FRONTEND_PID 2>/dev/null; then + echo "" + echo "ERROR: Frontend process exited. Tearing down..." + exit 1 + fi + sleep 2 + done +else + BACKEND_URL="http://localhost:${BACKEND_PORT:-8324}/api/health/check" + MAX_WAIT=60 + + echo "Starting backend..." + echo "" + + bash "$ROOT_DIR/backend/run.sh" 2>&1 | awk '{printf "\033[34m[backend]\033[0m %s\n", $0; fflush()}' & + BACKEND_PID=$! + + echo "Waiting for backend to be ready..." + elapsed=0 + while [ $elapsed -lt $MAX_WAIT ]; do + if ! kill -0 $BACKEND_PID 2>/dev/null; then + echo "ERROR: Backend process died before becoming ready. Aborting." + exit 1 + fi + if curl -s -o /dev/null -w "%{http_code}" "$BACKEND_URL" 2>/dev/null | grep -q "200"; then + echo "" + echo "Backend is ready! Starting frontend..." + echo "" + break + fi + sleep 1 + elapsed=$((elapsed + 1)) + done + + if [ $elapsed -ge $MAX_WAIT ]; then + echo "ERROR: Backend failed to start within ${MAX_WAIT}s. Aborting." + exit 1 + fi + + bash "$ROOT_DIR/frontend/run.sh" 2>&1 | awk '{printf "\033[32m[frontend]\033[0m %s\n", $0; fflush()}' & + FRONTEND_PID=$! + + while true; do + if ! kill -0 $BACKEND_PID 2>/dev/null; then + echo "" + echo "ERROR: Backend process exited. Tearing down..." + exit 1 + fi + if ! kill -0 $FRONTEND_PID 2>/dev/null; then + echo "" + echo "ERROR: Frontend process exited. Tearing down..." + exit 1 + fi + sleep 2 + done +fi diff --git a/backend/apps/skills/skills.py b/backend/apps/skills/skills.py index 42d0f6d1..0107fa8c 100644 --- a/backend/apps/skills/skills.py +++ b/backend/apps/skills/skills.py @@ -37,7 +37,10 @@ def _built_in_skill_registry() -> list[dict]: # Imported lazily so this module stays cheap to import from # everywhere (the skills outputs module pulls in pydantic+fastapi # transitively and we don't want a cycle). - from backend.apps.outputs.view_builder_templates import APP_BUILDER_SKILL_SOURCE_PATH + from backend.apps.outputs.view_builder_templates import ( + APP_BUILDER_SKILL_SOURCE_PATH, + SWARM_DEBUG_SKILL_SOURCE_PATH, + ) return [ { "id": "app_builder_skill", @@ -51,6 +54,19 @@ def _built_in_skill_registry() -> list[dict]: "command": "app-builder-skill", "source_path": APP_BUILDER_SKILL_SOURCE_PATH, }, + { + "id": "swarm_debug_skill", + "name": "swarm-debug Logger", + "description": ( + "How to use `swarm_debug.debug()` in an App backend — the " + "colored frame-aware logger that lands in the App Builder's " + "Terminal pane under [BACKEND]. Edit to teach your debugging " + "conventions to the App Builder agent. Built-in: editable, " + "not deletable." + ), + "command": "swarm-debug-skill", + "source_path": SWARM_DEBUG_SKILL_SOURCE_PATH, + }, ] diff --git a/backend/main.py b/backend/main.py index 7bb8e33b..471c902a 100644 --- a/backend/main.py +++ b/backend/main.py @@ -288,18 +288,28 @@ async def websocket_runtime_logs(websocket: WebSocket, workspace_id: str): pass unsubscribe = rt.subscribe(_on_line) - try: - # Initial status frame so the client knows port/running state - # without a second HTTP round-trip. - await websocket.send_text(json.dumps({ + + def _build_status_frame() -> dict: + return { "event": "runtime:status", "workspace_id": workspace_id, "data": { "running": rt.running, "port": rt.port, "backend_url": f"http://127.0.0.1:{rt.port}" if rt.running and rt.port else None, + "frontend_port": rt.frontend_port, + "frontend_url": rt.frontend_url if rt.running else None, + "is_new_mode": rt.is_new_mode, }, - })) + } + + try: + # Initial status frame so the client knows port/running state + # without a second HTTP round-trip. `frontend_url` is the + # new-mode preview pointer (Vite dev server); `backend_url` is + # the workspace's optional FastAPI backend (old-mode backend.py + # OR new-mode post-backend_init.sh). + await websocket.send_text(json.dumps(_build_status_frame())) while True: stream, text = await queue.get() await websocket.send_text(json.dumps({ @@ -307,6 +317,14 @@ async def websocket_runtime_logs(websocket: WebSocket, workspace_id: str): "workspace_id": workspace_id, "data": {"stream": stream, "text": text}, })) + # Runtime-level events (start, frontend-ready, exit) flow + # through the same log channel with stream="runtime". When + # the client sees one, it usually wants the fresh status — + # bind-ready in particular flips frontend_url from null + # to the Vite URL and the preview pane has to know to + # switch over. Re-push status after every runtime line. + if stream == "runtime": + await websocket.send_text(json.dumps(_build_status_frame())) except WebSocketDisconnect: pass finally: diff --git a/debugger/setup.py b/debugger/setup.py index 6be2ed70..fb81c755 100644 --- a/debugger/setup.py +++ b/debugger/setup.py @@ -1,8 +1,12 @@ from setuptools import setup, find_packages +# `py_modules` exposes BOTH `debug` (legacy import name used by OpenSwarm's +# own backend) and `swarm_debug` (the import name the webapp-template +# scaffold uses, matching the published-package convention `swarm-debug`). +# The `swarm_debug` module is a thin re-export of `debug` — see swarm_debug.py. setup( name="debug", version="0.1", packages=find_packages(), - py_modules=["debug"] + py_modules=["debug", "swarm_debug"] ) diff --git a/debugger/swarm_debug.py b/debugger/swarm_debug.py new file mode 100644 index 00000000..0d811605 --- /dev/null +++ b/debugger/swarm_debug.py @@ -0,0 +1,21 @@ +"""Module alias — exposes the `debug()` function under the `swarm_debug` +name so code that does `from swarm_debug import debug` resolves to the +same OpenSwarm-bundled package that the legacy `import debug` path +already serves. + +`debug.py` ends with `sys.modules[__name__] = debug`, which replaces the +module object with the bare function. That trick lets OpenSwarm's own +code write `import debug; debug(x)` (the imported name binds to the +function directly), but it means `from debug import debug` doesn't work +(you can't attribute-walk a function). This shim captures the function +via `import debug` (which now binds to the function thanks to the +sys.modules swap) and re-exports it as a normal module attribute, so +the more conventional `from swarm_debug import debug` pattern works. +""" + +import debug as _debug # noqa: F401 — `_debug` is actually the function + +# Re-export as a module attribute so `from swarm_debug import debug` resolves. +debug = _debug + +__all__ = ["debug"] diff --git a/frontend/src/app/components/Onboarding/ac/ACPopup.tsx b/frontend/src/app/components/Onboarding/ac/ACPopup.tsx index 4f39e134..bf7a763f 100644 --- a/frontend/src/app/components/Onboarding/ac/ACPopup.tsx +++ b/frontend/src/app/components/Onboarding/ac/ACPopup.tsx @@ -102,9 +102,17 @@ const ACPopup: React.FC = ({ text, offset = { x: 14, y: 14 }, side = 'rig // drawn to the LEFT of the cursor (and its tail anchors on the // bubble's right edge). Default preference is right. let flipX = side === 'left'; + // `side: 'left'` AND cursor in the lower half → also flip + // vertically so the bubble sits ABOVE-LEFT of the cursor rather + // than beside its target row. This matters for the chat-input + // cluster (cursor-circle / clip / mic) where a below-left bubble + // would extend horizontally across the input field's placeholder + // text. Above-left stacks the bubble above the input box where + // there's clear canvas. Top-half cursors (dashboard toolbar) stay + // below-left so the bubble doesn't fly off into the title bar. + let flipY = side === 'left' && y > vh / 2; let nx = flipX ? x - w - offset.x : x + offset.x; - let ny = y + offset.y; - let flipY = false; + let ny = flipY ? y - h - offset.y : y + offset.y; // Viewport clip: if the preferred side would overflow, flip to the // other side. The flip wins over the preference so the bubble stays @@ -116,9 +124,12 @@ const ACPopup: React.FC = ({ text, offset = { x: 14, y: 14 }, side = 'rig nx = x + offset.x; flipX = false; } - if (ny + h + SAFE_PAD > vh) { + if (!flipY && ny + h + SAFE_PAD > vh) { ny = y - h - offset.y; flipY = true; + } else if (flipY && ny < SAFE_PAD) { + ny = y + offset.y; + flipY = false; } nx = Math.max(SAFE_PAD, Math.min(nx, vw - w - SAFE_PAD)); ny = Math.max(SAFE_PAD, Math.min(ny, vh - h - SAFE_PAD)); diff --git a/frontend/src/app/pages/Views/ViewEditor.tsx b/frontend/src/app/pages/Views/ViewEditor.tsx index 4f614b39..da8e682d 100644 --- a/frontend/src/app/pages/Views/ViewEditor.tsx +++ b/frontend/src/app/pages/Views/ViewEditor.tsx @@ -1,6 +1,7 @@ import React, { useState, useMemo, useEffect, useRef, useCallback, PointerEvent as ReactPointerEvent } from 'react'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; +import CircularProgress from '@mui/material/CircularProgress'; import Button from '@mui/material/Button'; import IconButton from '@mui/material/IconButton'; import TextField from '@mui/material/TextField'; @@ -340,17 +341,59 @@ const ViewEditor: React.FC = ({ output }) => { // agent made) and skip createDraftSession (would orphan the live session). // Just resolve the workspace path and tell AgentChat which session to bind to. if (output?.session_id && output?.workspace_id) { + // Resolve the workspace path first (best-effort; chat works without it). + let resolvedWorkspacePath: string | null = null; try { const res = await fetch(`${WORKSPACE_API}/${output.workspace_id}`); if (res.ok) { const data = await res.json(); - if (data.path) setWorkspacePath(data.path); + if (data.path) { + resolvedWorkspacePath = data.path; + setWorkspacePath(data.path); + } } - } catch { /* path is best-effort; chat still works without it */ } - // Pull the latest session state from the backend so the chat catches up - // on anything the agent did while the user was on another tab. - dispatch(fetchSession(output.session_id)); - setInitialDraftId(output.session_id); + } catch { /* path is best-effort */ } + + // Verify the persisted session still exists on the backend before + // binding to it. The id can become stale (backend data wiped, + // sessions cleared, different OpenSwarm install) — without this + // check we'd hand AgentChat a non-existent id and the chat pane + // would be stuck on "Initializing agent…" forever. On 200 we + // bind; on 404 we fall through to seed a fresh draft session + // attached to the same workspace (preserves app code on disk; + // only the chat history is lost — acceptable trade). + let sessionStillExists = false; + try { + const sr = await fetch(`${API_BASE}/agents/sessions/${output.session_id}`); + sessionStillExists = sr.ok; + } catch { /* network blip — treat as missing */ } + + if (sessionStillExists) { + // Pull the latest session state from the backend so the chat + // catches up on anything the agent did while the user was on + // another tab. + dispatch(fetchSession(output.session_id)); + setInitialDraftId(output.session_id); + return; + } + + // Stale linkage. Clear it from the Output so future opens skip + // the 404 round-trip, then fall through to createDraftSession + // with the same workspace. + if (output.id) { + try { + await dispatch(updateOutput({ id: output.id, session_id: null })).unwrap(); + } catch { /* best-effort cleanup */ } + } + const action = dispatch(createDraftSession({ + mode: 'view-builder', + setActive: false, + targetDirectory: resolvedWorkspacePath || undefined, + model: defaultModel || undefined, + provider: resolvedProvider, + thinkingLevel: defaultThinkingLevel || undefined, + })); + setInitialDraftId(action.payload.draftId); return; } @@ -661,19 +704,34 @@ const ViewEditor: React.FC = ({ output }) => { }, [workspaceId]); // Persistent backend lifecycle. Once we know the workspaceId: - // 1. POST /runtime/start so the workspace's backend.py (if present) - // gets spawned and an `OUTPUT_BACKEND_URL` lands in the preview's - // injected script. - // 2. Open the runtime WS to stream [BACKEND] stdout/stderr into the - // Terminal pane. + // 1. POST /runtime/start so the workspace's runtime (bash run.sh + // for new-mode webapp-template workspaces; python backend.py for + // legacy flat workspaces) gets spawned. + // 2. Open the runtime WS to stream [BACKEND]/[RUNTIME] stdout/stderr + // into the Terminal pane AND surface the frontend_url for new- + // mode workspaces (so the preview pane can point at Vite's dev + // server instead of our legacy /serve/ endpoint). // 3. On unmount, POST /runtime/stop. Multiple editors on the same // workspace share the runtime (ref-counted server-side); detach // is a no-op until the last subscriber leaves. const runtimeWsRef = useRef(null); + // Where the preview pane should point. New-mode workspaces report a + // frontend_url via runtime:status; until it arrives (or for old-mode + // workspaces that never set it), we fall back to the legacy + // /api/outputs/workspace/{ws}/serve/ endpoint below. + const [frontendUrl, setFrontendUrl] = useState(null); + // Track new-mode separately so the preview pane can show a + // "Installing dependencies…" placeholder while Vite is still booting + // instead of trying to load the legacy /serve/index.html path (which + // 404s — new-mode workspaces have no `index.html` at root, only + // `frontend/index.html` reachable via Vite). + const [isNewModeRuntime, setIsNewModeRuntime] = useState(false); useEffect(() => { if (!workspaceId) return; let cancelled = false; let ws: WebSocket | null = null; + setFrontendUrl(null); // reset when workspace changes + setIsNewModeRuntime(false); const auth = getAuthToken(); const headers: Record = { 'Content-Type': 'application/json' }; @@ -695,7 +753,18 @@ const ViewEditor: React.FC = ({ output }) => { ws.onmessage = (ev) => { try { const msg = JSON.parse(ev.data); - if (msg.event === 'runtime:log') { + if (msg.event === 'runtime:status') { + // New-mode runtimes report a frontend_url here as soon as + // Vite has actually bound (the runtime poll-gates it); + // old-mode workspaces report null and the preview pane + // stays on the legacy /serve/ path. We also track + // is_new_mode separately so the placeholder pane shows + // "Installing dependencies…" instead of the 404'd /serve + // path while Vite is mid-npm-install. + const fu = msg.data?.frontend_url ?? null; + setFrontendUrl(fu || null); + setIsNewModeRuntime(!!msg.data?.is_new_mode); + } else if (msg.event === 'runtime:log') { const stream = msg.data?.stream || 'stdout'; const text = msg.data?.text || ''; if (stream === 'runtime') { @@ -713,6 +782,8 @@ const ViewEditor: React.FC = ({ output }) => { cancelled = true; try { ws?.close(); } catch (_) {} runtimeWsRef.current = null; + setFrontendUrl(null); + setIsNewModeRuntime(false); fetch(`${API_BASE}/outputs/workspace/${workspaceId}/runtime/stop`, { method: 'POST', headers, @@ -720,9 +791,17 @@ const ViewEditor: React.FC = ({ output }) => { }; }, [workspaceId, appendTerminalLine]); - const workspaceServeUrl = workspaceId - ? `${SERVE_BASE}/workspace/${workspaceId}/serve/index.html` - : undefined; + // Preview URL: prefer the new-mode Vite dev server when the runtime + // reports one; otherwise fall back to the legacy serve endpoint. + // For new-mode workspaces where Vite hasn't bound yet (npm install + // still running), `workspaceServeUrl` is undefined and the preview + // pane renders the "Installing dependencies…" placeholder below + // instead of falling back to the legacy /serve/ path (which 404s — + // new-mode workspaces have no `index.html` at root). + const showInstallPlaceholder = isNewModeRuntime && !frontendUrl; + const workspaceServeUrl = showInstallPlaceholder + ? undefined + : (frontendUrl ?? (workspaceId ? `${SERVE_BASE}/workspace/${workspaceId}/serve/index.html` : undefined)); const filePaths = useMemo(() => Object.keys(files).filter(p => p !== 'meta.json' && p !== 'SKILL.md').sort(), [files]); const fileTree = useMemo(() => buildFileTree(filePaths), [filePaths]); @@ -994,14 +1073,41 @@ const ViewEditor: React.FC = ({ output }) => { {/* Tab content */} {activeTab === TAB_PREVIEW && ( - + showInstallPlaceholder ? ( + + + + Installing dependencies… + + + Cold start can take 60–90 seconds. Check the Terminal tab to follow{' '} + npm install + Vite startup output. The preview will appear here automatically{' '} + once Vite is ready. + + + ) : ( + + ) )} {activeTab === TAB_CODE && ( diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 4c4e9145..348f9e2f 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -355,8 +355,14 @@ rsync -a \ --exclude='*.pyc' --exclude='.venv' \ --exclude='data/tools' \ --exclude='tests' --exclude='**/tests' \ - --exclude='.env' --exclude='.env.*' --exclude='**/.env' --exclude='**/.env.*' \ + --exclude='/.env' --exclude='/.env.*' \ "$PROJECT_ROOT/backend/" "$STAGING_DIR/backend/" +# Note: .env exclude is anchored to the backend/ source root (`/.env` / +# `/.env.*`), not recursive. The vendored webapp-template snapshot at +# backend/apps/outputs/webapp_template/.env.example MUST be shipped so +# new App workspaces can seed from it; recursive `**/.env*` excludes +# would strip it. The top-level backend/.env is still excluded (it's +# (re)generated at the production .env step below). # Production .env: OAuth helper base URL + Google client_id and client_secret. # v1.0.29 moved the *OAuth flow* (auth-code exchange + refresh) to the Fly diff --git a/scripts/fetch-webapp-template.sh b/scripts/fetch-webapp-template.sh new file mode 100755 index 00000000..9234dd85 --- /dev/null +++ b/scripts/fetch-webapp-template.sh @@ -0,0 +1,177 @@ +#!/usr/bin/env bash +# Re-vendor openswarm-ai/webapp-template into backend/apps/outputs/webapp_template/. +# +# Idempotent — wipes the existing vendored dir and re-clones at the pinned ref. +# Strips files we don't want shipped (LICENSE, README.md, .gitignore — we +# author our own minimal .gitignore inside the snapshot). Applies our two +# patches: +# 1. backend/run.sh: pip-install $OPENSWARM_DEBUGGER_PATH if set, before +# the existing `pip install -e .` — resolves the `swarm-debug` dep +# from OpenSwarm's bundled debugger/ package instead of PyPI (where +# it doesn't exist). +# 2. Add our own backend_init.sh at the snapshot root. +# +# Update REF to bump the pinned snapshot. CI / a future test could compare +# `git rev-parse HEAD` of a fresh clone against REF and fail on drift. + +set -euo pipefail + +REPO="openswarm-ai/webapp-template" +REF="main" +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +DEST="$ROOT/backend/apps/outputs/webapp_template" +TMP="$(mktemp -d)" + +cleanup() { rm -rf "$TMP"; } +trap cleanup EXIT + +echo "[fetch-webapp-template] cloning $REPO@$REF into $TMP" +git clone --depth 1 --branch "$REF" "https://github.com/$REPO.git" "$TMP/clone" >/dev/null + +# Wipe the vendored dir cleanly so deleted upstream files actually leave. +rm -rf "$DEST" +mkdir -p "$DEST" + +# Copy everything except files we don't ship in OpenSwarm. +( cd "$TMP/clone" && rm -rf .git LICENSE README.md .gitignore ) +cp -R "$TMP/clone/." "$DEST/" + +# Patch 1: backend/run.sh installs OpenSwarm's local debugger/ before the +# template's own `pip install -e .` so `from swarm_debug import debug` in +# the template's backend code resolves to our bundled package (the PyPI +# `swarm-debug` doesn't exist — our local package registers as `debug` +# and exposes both `debug` and `swarm_debug` module names via setup.py +# py_modules). +RUN_SH="$DEST/backend/run.sh" +if ! grep -q "OPENSWARM_DEBUGGER_PATH" "$RUN_SH"; then + # Insert the install line just before `pip install -e .`. macOS sed + # vs GNU sed: use a portable awk inline rewrite. + awk ' + /pip install -e \./ && !inserted { + print "if [[ -n \"${OPENSWARM_DEBUGGER_PATH:-}\" && -d \"$OPENSWARM_DEBUGGER_PATH\" ]]; then" + print " echo \"Installing OpenSwarm debugger (swarm_debug) from $OPENSWARM_DEBUGGER_PATH\"" + print " pip install -e \"$OPENSWARM_DEBUGGER_PATH\"" + print "fi" + inserted = 1 + } + { print } + ' "$RUN_SH" > "$RUN_SH.tmp" && mv "$RUN_SH.tmp" "$RUN_SH" + chmod +x "$RUN_SH" +fi + +# Patch 1b: drop `"swarm-debug"` from the template's backend/pyproject.toml +# dependencies. The OpenSwarm debugger gets installed separately via Patch +# 1's `pip install -e $OPENSWARM_DEBUGGER_PATH`. Leaving the dep listed +# would make pip 404 against PyPI (no such package). +PYPROJECT="$DEST/backend/pyproject.toml" +awk ' + /^[[:space:]]*"swarm-debug",?[[:space:]]*$/ { next } + { print } +' "$PYPROJECT" > "$PYPROJECT.tmp" && mv "$PYPROJECT.tmp" "$PYPROJECT" + +# Patch 2: ship a minimal .gitignore inside the snapshot so per-app +# workspaces don't accidentally commit node_modules / .env / venv. +cat > "$DEST/.gitignore" <<'EOF' +.DS_Store +.env +node_modules/ +.venv/ +__pycache__/ +*.pyc +dist/ +build/ +EOF + +# Patch 3: backend_init.sh — copied verbatim into every new workspace. +# We author this ourselves (not upstream) because the user spec says the +# agent runs it to *bring in* the backend dir on demand; the initial seed +# leaves backend/ out. +cat > "$DEST/backend_init.sh" <<'EOF' +#!/usr/bin/env bash +# Enable a FastAPI backend for this App. +# +# Idempotent. The workspace is seeded frontend-only (no backend/ dir, +# BACKEND_PORT=NONE). Run this script when your App needs server-side +# code — it copies the master template's backend/ into the workspace +# and flips BACKEND_PORT in both .env files to a free port. +# +# After running this, hard-reload the preview (right-click the reload +# button in the App Builder) so the runtime restarts with the new +# BACKEND_PORT and `bash run.sh` brings the backend up. + +set -euo pipefail +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$HERE" + +if [[ ! -f .env ]]; then + echo "ERROR: .env not found at $HERE — is this the workspace root?" >&2 + exit 1 +fi + +# Source .env so we know the current BACKEND_PORT and the path to the +# master template's backend/ (written by OpenSwarm at seed time). +set -a +source .env +set +a + +if [[ "${BACKEND_PORT:-NONE}" != "NONE" ]]; then + echo "Backend already enabled on port $BACKEND_PORT — nothing to do." >&2 + exit 0 +fi + +if [[ -d ./backend ]]; then + echo "ERROR: ./backend/ already exists but BACKEND_PORT=NONE — your" >&2 + echo " workspace is in an inconsistent state. Either delete" >&2 + echo " ./backend/ and re-run, or set BACKEND_PORT manually." >&2 + exit 1 +fi + +# Resolve master template backend/ path. OPENSWARM_TEMPLATE_BACKEND_PATH +# is written into .env at seed time; OPENSWARM_DEBUGGER_PATH the same. +if [[ -z "${OPENSWARM_TEMPLATE_BACKEND_PATH:-}" ]]; then + echo "ERROR: OPENSWARM_TEMPLATE_BACKEND_PATH not set in .env. This" >&2 + echo " workspace was seeded by an older OpenSwarm; ask the" >&2 + echo " App Builder to recreate it." >&2 + exit 1 +fi + +if [[ ! -d "$OPENSWARM_TEMPLATE_BACKEND_PATH" ]]; then + echo "ERROR: master template backend dir not found at" >&2 + echo " $OPENSWARM_TEMPLATE_BACKEND_PATH" >&2 + exit 1 +fi + +echo "Copying backend/ from $OPENSWARM_TEMPLATE_BACKEND_PATH..." +cp -R "$OPENSWARM_TEMPLATE_BACKEND_PATH" ./backend +chmod +x ./backend/run.sh + +# Pick a free port. SO_REUSEADDR=0 means the kernel won't immediately +# recycle, so the small race between bind+close and the backend +# re-binding is harmless in practice. +PORT="$(python3 -c "import socket +s = socket.socket() +s.bind(('127.0.0.1', 0)) +print(s.getsockname()[1]) +s.close()")" + +# sed-flip both .env and .env.example so an LLM reading either gets the +# same answer. macOS sed needs the '' arg for in-place edits. +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env + sed -i '' "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env.example +else + sed -i "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env + sed -i "s/^BACKEND_PORT=NONE/BACKEND_PORT=$PORT/" .env.example +fi + +echo "" +echo "Backend enabled on port $PORT." +echo "Hard-reload the preview (right-click the reload button in" +echo "the App Builder) to bring it up." +EOF +chmod +x "$DEST/backend_init.sh" + +echo "" +echo "[fetch-webapp-template] vendored snapshot at $DEST" +echo "[fetch-webapp-template] pinned ref: $REF" +echo "[fetch-webapp-template] file count: $(find "$DEST" -type f | wc -l | tr -d ' ')"