diff --git a/CLAUDE.md b/CLAUDE.md index 19ff989..9411b5d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,9 +7,9 @@ This file is a quick map, not a duplication of upstream docs. ## What Arcadia Admin is -- **Arcadia Admin** is the operator/admin UI for [arcadia-core](../reference/arcadia-app), a multi-tenant Phoenix backend. Surfaces tenant management, user/role admin, billing, audit logs, storage configs, scheduled tasks, feature flags, and platform monitoring on top of arcadia's `/api/v1` and `/admin/*` endpoints. +- **Arcadia Admin** is the operator/admin UI for [arcadia-core](../reference/arcadia-core), a multi-tenant Phoenix backend. Surfaces tenant management, user/role admin, billing, audit logs, storage configs, scheduled tasks, feature flags, and platform monitoring on top of arcadia's `/api/v1` and `/admin/*` endpoints. - **Cloned from** [Vibespace](../vibespace) — the starter for webapps in this style. Vibespace and Skyrise are the upstream sources of truth for the shell and the theme; don't backport arcadia-admin-specific changes into Vibespace unless they're broadly applicable. -- **Backend reference** lives at `../reference/arcadia-app/`. Treat it as read-only documentation — it's the Phoenix umbrella app that owns the OpenAPI spec, controllers, schemas, and seed data. Spec is regenerated from a running arcadia at `http://localhost:4000/api/openapi` via `node ../lib-arcadia-core-client/scripts/sync-spec.mjs` (run from this directory). +- **Backend reference** lives at `../reference/arcadia-core/`. Treat it as read-only documentation — it's the Phoenix umbrella app that owns the OpenAPI spec, controllers, schemas, and seed data. Spec is regenerated from a running arcadia at `http://localhost:4000/api/openapi` via `node ../lib-arcadia-core-client/scripts/sync-spec.mjs` (run from this directory). - **Skyrise** (`lib-theme-skyrise`) is the canonical theme — premium AI-first glass, iridescent body, vivid text, Apple-spring motion. Theme tweaks belong upstream in Vibespace + Skyrise, not here. - The brand string lives in **one place**: `app/lib/identity.ts` (`useBrand()` / `getBrand()`). Don't hardcode "Arcadia Admin" in components, page titles, or copy. diff --git a/README.md b/README.md index f413da9..c9272c9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Arcadia Admin -Admin webapp for [arcadia-core](../reference/arcadia-app) — the multi-tenant Phoenix backend. Built on the [Crema design system](https://git.sky-ai.com/CremaUIStudio) with the **Skyrise** theme and started from the [Vibespace](../vibespace) starter. +Admin webapp for [arcadia-core](../reference/arcadia-core) — the multi-tenant Phoenix backend. Built on the [Crema design system](https://git.sky-ai.com/CremaUIStudio) with the **Skyrise** theme and started from the [Vibespace](../vibespace) starter. Surfaces tenant management, user/role administration, billing, audit logs, storage configs, scheduled tasks, feature flags, and platform monitoring on top of arcadia's `/api/v1` and `/admin/*` endpoints. @@ -15,7 +15,7 @@ Open [http://localhost:5173](http://localhost:5173). The app talks to arcadia at To use it for real: -1. Have arcadia running locally (see `../reference/arcadia-app/DEV_SETUP.md`). +1. Have arcadia running locally (see `../reference/arcadia-core/DEV_SETUP.md`). 2. Visit `/login` and sign in with admin credentials. In dev seeds: `admin@example.com` / `AdminP@ssw0rd` (tenant `default`). ## Configuration @@ -50,7 +50,7 @@ Surface tints (`body[data-surface="snow|stone|sage|slate"]`) and dark mode (`htm your-workspace/ arcadia-admin/ ← this repo vibespace/ ← starter that this was cloned from - reference/arcadia-app/ ← Phoenix backend (read-only reference) + reference/arcadia-core/ ← Phoenix backend (read-only reference) lib-arcadia-core-client/ lib-arcadia-auth-ui/ lib-action-bus/ @@ -84,4 +84,4 @@ your-workspace/ - [`docs/AI_FIRST.md`](docs/AI_FIRST.md) — command-bus / DSL system tour - [`app/components/layout/THEME_CONTRACT.md`](app/components/layout/THEME_CONTRACT.md) — token contract every theme must satisfy - `CLAUDE.md` — orientation for an LLM working in this repo -- `../reference/arcadia-app/` — backend (DEV_SETUP, controllers, OpenAPI source-of-truth) +- `../reference/arcadia-core/` — backend (DEV_SETUP, controllers, OpenAPI source-of-truth) diff --git a/app/lib/admin-tools.ts b/app/lib/admin-tools.ts index 1dc9ab0..e8324ed 100644 --- a/app/lib/admin-tools.ts +++ b/app/lib/admin-tools.ts @@ -53,7 +53,7 @@ const docsClient = createRAGClient("/docs-index.json") // tooling and wire it through `.env.local`. // 3. operator session JWT — works only when arcadia-search shares the // JWT signing secret with the arcadia issuing the operator's session -// (i.e. local arcadia-app + local arcadia-search with matching keys). +// (i.e. local arcadia-core + local arcadia-search with matching keys). // 4. "dev" literal — only accepted by AUTH_MODE=dev backends. function readEnv(key: string): string | undefined { if (typeof import.meta === "undefined") return undefined @@ -667,7 +667,7 @@ const TOOLS: ToolDef[] = [ { name: "search_docs", description: - "Search the arcadia-app documentation (architecture, API surface, deploy/setup guides) for passages relevant to a question. Use this for conceptual or procedural questions where the live API tools won't help — e.g. 'how does multi-tenant isolation work', 'how do I deploy to production', 'what is the modular monolith pattern'. Returns up to `limit` ranked passages with title, sourcePath, and excerpt. Cite results by sourcePath in your reply.", + "Search the arcadia-core documentation (architecture, API surface, deploy/setup guides) for passages relevant to a question. Use this for conceptual or procedural questions where the live API tools won't help — e.g. 'how does multi-tenant isolation work', 'how do I deploy to production', 'what is the modular monolith pattern'. Returns up to `limit` ranked passages with title, sourcePath, and excerpt. Cite results by sourcePath in your reply.", parameters: { type: "object", properties: { @@ -715,7 +715,7 @@ const TOOLS: ToolDef[] = [ { name: "search_kb", description: - "Lexical (BM25) search over the arcadia-search Tantivy backend. Returns chunks with snippets + chunk_ids that can be passed to `read_chunk` to expand. Prefer this over `search_docs` (browser) when you need richer hits or when the content wouldn't be in the bundled docs.\n\nKnown corpora on the platform-admin tenant:\n- `docs` — arcadia-app architecture/ops docs (same as the browser RAG, server-hosted for parity).\n- `operator-tools` — arcadia-search + arcadia-admin documentation (admin sidecar, deploy script, search admin UI, MULTI_TENANT, RAG, AI_FIRST, LIBS, LLM_PROXY_CONTRACT).\n- `files` — markdown/text files uploaded by tenant users via arcadia-app.\n\nIf you're not sure what's available, call `list_search_corpora` first. Operators can add new corpora via the `/search` route.", + "Lexical (BM25) search over the arcadia-search Tantivy backend. Returns chunks with snippets + chunk_ids that can be passed to `read_chunk` to expand. Prefer this over `search_docs` (browser) when you need richer hits or when the content wouldn't be in the bundled docs.\n\nKnown corpora on the platform-admin tenant:\n- `docs` — arcadia-core architecture/ops docs (same as the browser RAG, server-hosted for parity).\n- `operator-tools` — arcadia-search + arcadia-admin documentation (admin sidecar, deploy script, search admin UI, MULTI_TENANT, RAG, AI_FIRST, LIBS, LLM_PROXY_CONTRACT).\n- `files` — markdown/text files uploaded by tenant users via arcadia-core.\n\nIf you're not sure what's available, call `list_search_corpora` first. Operators can add new corpora via the `/search` route.", parameters: { type: "object", properties: { diff --git a/app/lib/arcadia-knowledge.ts b/app/lib/arcadia-knowledge.ts index b0070f4..037e196 100644 --- a/app/lib/arcadia-knowledge.ts +++ b/app/lib/arcadia-knowledge.ts @@ -1,5 +1,5 @@ // Domain primer baked into the assistant's system prompt so it understands -// what arcadia-app is, what platform admins do, and how the data model fits +// what arcadia-core is, what platform admins do, and how the data model fits // together. Keep this tight — it costs context tokens on every turn. export const ARCADIA_KNOWLEDGE = `Arcadia (the backend you administer): @@ -31,7 +31,7 @@ Things to keep in mind when assisting: - Writes are auditable. Suggest the user double-check tenant slug and impact before suspend/deactivate. Deactivate is harsher than suspend — only use when clearly intended. - The operator can impersonate tenant users for debugging (POST /api/v1/admin/impersonate/:user_id) — surface this when they ask "why can't user X log in". - Quotas / rate cards / billing config errors usually surface as 402/403 from /api/v1 endpoints — diagnose by checking the tenant's billing-config and api-metering quotas. -- The reference Phoenix app lives at \`reference/arcadia-app/\` in the workspace; its OpenAPI spec is at /api/openapi (sync via \`node ../lib-arcadia-core-client/scripts/sync-spec.mjs\`). +- The reference Phoenix app lives at \`reference/arcadia-core/\` in the workspace; its OpenAPI spec is at /api/openapi (sync via \`node ../lib-arcadia-core-client/scripts/sync-spec.mjs\`). - Search admin (arcadia-search) is a separate service. Manage tenants/corpora at \`/search\`. Use \`list_search_corpora\` if you don't know what's indexed; \`rebuild_search_corpus\` after uploads or when results look stale; \`search_kb\` / \`read_chunk\` to query. When the user asks something that maps to a tool, call it. When they ask about a concept, explain it from this primer in plain language. Write tools (suspend_tenant, activate_tenant) prompt the operator with an inline confirm card before they actually run — you do not need to ask in prose first; just call the tool and the user will see the confirmation UI. If the user denies a write, do not retry it; ask what they'd like to do differently. diff --git a/app/lib/arcadia/health.ts b/app/lib/arcadia/health.ts index 9dc39a6..050396a 100644 --- a/app/lib/arcadia/health.ts +++ b/app/lib/arcadia/health.ts @@ -2,7 +2,7 @@ // // Backed by /api/v1/health* (public — no auth). Each subsystem is probed // independently; the overall endpoint aggregates and returns 503 if any -// subsystem is not "ok". See arcadia-app commit f427892. +// subsystem is not "ok". See arcadia-core commit f427892. import type { ArcadiaClient } from "@crema/arcadia-core-client" diff --git a/app/lib/arcadia/llm-configs.ts b/app/lib/arcadia/llm-configs.ts index bf10a31..936b0b2 100644 --- a/app/lib/arcadia/llm-configs.ts +++ b/app/lib/arcadia/llm-configs.ts @@ -124,7 +124,7 @@ export async function getCatalog(arcadia: ArcadiaClient): Promise, diff --git a/app/lib/arcadia/llm-proxy.ts b/app/lib/arcadia/llm-proxy.ts index e79baba..161c8c6 100644 --- a/app/lib/arcadia/llm-proxy.ts +++ b/app/lib/arcadia/llm-proxy.ts @@ -1,6 +1,6 @@ // Arcadia LLM proxy client. // -// Implements the spec in docs/LLM_PROXY_CONTRACT.md against arcadia-app's +// Implements the spec in docs/LLM_PROXY_CONTRACT.md against arcadia-core's // POST /api/v1/ai/llm/chat. The lib (@crema/llm-providers-ui buildAdapter) // owns the streaming chat path itself; this module exposes a lightweight // non-streaming probe so the Settings "Test connection" button can verify diff --git a/app/lib/gateway.ts b/app/lib/gateway.ts index 4919ccc..2871fea 100644 --- a/app/lib/gateway.ts +++ b/app/lib/gateway.ts @@ -1,9 +1,9 @@ // Arcadia LLM-gateway client. // -// The integration registry lives on arcadia-llm-gateway, not arcadia-app, so +// The integration registry lives on arcadia-llm-gateway, not arcadia-core, so // it needs its own ArcadiaClient pointed at a different base URL. Everything -// else is identical to the arcadia-app client: the same access token (the -// gateway validates arcadia-app JWTs via the shared Guardian secret) and the +// else is identical to the arcadia-core client: the same access token (the +// gateway validates arcadia-core JWTs via the shared Guardian secret) and the // same 401 cleanup. The gateway's CORS already allows localhost + any // *.sky-ai.com origin, so the browser calls it directly. diff --git a/app/routes/sso.tsx b/app/routes/sso.tsx index ec9b95b..2f22cb4 100644 --- a/app/routes/sso.tsx +++ b/app/routes/sso.tsx @@ -580,7 +580,7 @@ function IdpEditorDialog({ id="idp-callback" value={callbackUrl} onChange={(e) => setCallbackUrl(e.target.value)} - placeholder="https://your-arcadia-app/api/v1/auth/saml/callback" + placeholder="https://your-arcadia-core/api/v1/auth/saml/callback" className="font-mono text-xs" data-action="idp-form-callback" /> diff --git a/docs/LLM_PROXY_CONTRACT.md b/docs/LLM_PROXY_CONTRACT.md index 6014eb1..1411a3c 100644 --- a/docs/LLM_PROXY_CONTRACT.md +++ b/docs/LLM_PROXY_CONTRACT.md @@ -1,6 +1,6 @@ # LLM Proxy Contract -> **Status: implemented.** Backend lives in `arcadia-app` at `apps/arcadia_core/lib/arcadia/ai/llm_proxy*` (see commit `75669f1`). This document remains the contract that `lib-llm-providers-ui` and `app/lib/arcadia/llm-proxy.ts` expect from arcadia — keep it in sync if either side changes. +> **Status: implemented.** Backend lives in `arcadia-core` at `apps/arcadia_core/lib/arcadia/ai/llm_proxy*` (see commit `75669f1`). This document remains the contract that `lib-llm-providers-ui` and `app/lib/arcadia/llm-proxy.ts` expect from arcadia — keep it in sync if either side changes. ## Why a proxy? diff --git a/docs/RAG.md b/docs/RAG.md index 7da9af9..4ec7d80 100644 --- a/docs/RAG.md +++ b/docs/RAG.md @@ -14,7 +14,7 @@ shape. |---|---|---| | Lib / service | `@crema/lexical-rag-ui` | `arcadia-search` (Rust) | | Engine | MiniSearch (BM25, JS) | Tantivy (BM25, Rust) | -| Where it runs | In the user's browser | Sibling of arcadia-app | +| Where it runs | In the user's browser | Sibling of arcadia-core | | Index storage | Static JSON, fetched once | mmap'd disk, ~30–80MB resident | | Practical corpus size | ~5–10MB / ~50–100k chunks | GB-scale, no hard cap | | Update cadence | Static — rebuilt at app build time | Live — cron, webhook, or admin trigger | @@ -58,7 +58,7 @@ The index is a single JSON file built offline by **How it's wired here.** - Build script: `arcadia-admin/scripts/build-docs-index.mjs` reads - markdown from `../reference/arcadia-app/`, chunks at H1–H3, + markdown from `../reference/arcadia-core/`, chunks at H1–H3, produces `public/docs-index.json`. Runs on `npm run build:docs` (and as the `prebuild` step before `npm run build`). - Tool wrapper: `app/lib/admin-tools.ts` constructs a singleton @@ -130,7 +130,7 @@ text extraction, webhook signature, service tokens) see The default deploy runs **both**: -- `search_docs` indexes the same arcadia-app docs the parity corpus +- `search_docs` indexes the same arcadia-core docs the parity corpus on `arcadia-search` indexes. Same content, two engines. - This is intentional — it means the assistant always has *something* to search, even if `arcadia-search` is down or unreachable. The diff --git a/scripts/build-docs-index.mjs b/scripts/build-docs-index.mjs index c217807..4b3829c 100644 --- a/scripts/build-docs-index.mjs +++ b/scripts/build-docs-index.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env node // Build the /docs-index.json bundle consumed by @crema/lexical-rag-ui at // runtime. Thin wrapper — all engine logic lives in the lib's builder.ts; -// this file owns the per-app config (which arcadia-app docs to index and +// this file owns the per-app config (which arcadia-core docs to index and // how to tag them). // // Run: npm run build:docs @@ -18,11 +18,11 @@ import MiniSearch from "minisearch" import { buildIndex } from "../../lib-lexical-rag-ui/src/builder.mjs" const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..") -const ARCADIA = resolve(ROOT, "../reference/arcadia-app") +const ARCADIA = resolve(ROOT, "../reference/arcadia-core") const OUT = resolve(ROOT, "public/docs-index.json") const SOURCES = [ - // Arcadia platform docs (resolved against ARCADIA = ../reference/arcadia-app). + // Arcadia platform docs (resolved against ARCADIA = ../reference/arcadia-core). { path: "README.md", tags: ["core"] }, { path: "docs/ARCADIA.md", tags: ["core"] }, { path: "docs/MODULAR_MONOLITH.md", tags: ["core"] },