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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ ORA_ENV=production
ORA_WEB_API_TOKEN=
ORA_REQUIRE_WEB_API_TOKEN=0
ORA_TRUST_PROXY_HEADERS_FOR_LOCAL_AUTH=0
# Managed Cloud MVP chat limits
# - guest limit is only meaningful when guest chat is explicitly enabled
ORA_WEB_GUEST_DAILY_LIMIT=3
ORA_WEB_GOOGLE_DAILY_LIMIT=20
ADMIN_DASHBOARD_TOKEN=
ALLOW_INSECURE_ADMIN_DASHBOARD=0

Expand Down
26 changes: 26 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,38 @@ AGENT_MEMORY.md
# Private / non-distribution content (keep out of public releases)
# Website/marketing drafts and platform console pages live here during development.
src/web/static/*
!src/web/static/about.html
!src/web/static/architecture.html
!src/web/static/clients.html
!src/web/static/contact.html
!src/web/static/desktop-discord.html
!src/web/static/developers.html
!src/web/static/index.html
!src/web/static/linked.html
!src/web/static/login.html
!src/web/static/platform-preview.html
!src/web/static/privacy.html
!src/web/static/relay-model.html
!src/web/static/roadmap.html
!src/web/static/security-model.html
!src/web/static/security.html
!src/web/static/terms.html
!src/web/static/trust-safety.html
!src/web/static/web-mobile.html
!src/web/static/chat.html
!src/web/static/operator.html
!src/web/static/remote.html
!src/web/static/site.css
!src/web/static/site.js
!src/web/static/setup.html
!src/web/static/setup.css
!src/web/static/setup.js
!src/web/static/vendor/
!src/web/static/vendor/marked.min.js
!src/web/static/vendor/purify.min.js
!src/web/static/diagrams/
!src/web/static/diagrams/e2e_request_path_sequence_en_dark.png
!src/web/static/diagrams/e2e_request_path_sequence_jp_dark.png

# Local packaging/export helpers (generated during repo-splitting)
scripts/export_*_v6.ps1
Expand Down
45 changes: 41 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<div align="center">

# YonerAI
### **The Artificial Lifeform AI System (Node + Clients + Relay + Core)**
### **Public Distribution Core For YonerAI's 3-Mode Architecture**

![YonerAI Banner](docs/images/yonerai_banner.svg)

Expand All @@ -10,7 +10,7 @@
[![Discord](https://img.shields.io/badge/Discord-Join-7289DA?style=for-the-badge&logo=discord)](https://discord.gg/YoneRai12)
[![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)

[**[Manual]**](docs/USER_GUIDE.md) | [**[Env Templates]**](docs/ENV_FILES.md) | [**[Release Notes]**](docs/RELEASE_NOTES.md) | [**[Web Chat]**](http://localhost:3000) | [**[Dashboard]**](http://localhost:3333)
[**[Manual]**](docs/USER_GUIDE.md) | [**[Env Templates]**](docs/ENV_FILES.md) | [**[Route Freeze]**](docs/ROUTE_FREEZE_MVP.md) | [**[Public/Private Boundary]**](docs/PUBLIC_PRIVATE_BOUNDARY.md) | [**[Release Notes]**](docs/RELEASE_NOTES.md)

---

Expand All @@ -31,10 +31,27 @@ At its core, YonerAI is a **Node-style runtime** that can combine:
- an optional Core process for deeper routing / reasoning
- relay-compatible networking for hybrid or remote-assisted setups

This public repository is the **distributable YonerAI side**: the part that should be able to run on a user's PC, be extended locally, and remain useful without private production infrastructure.
This public repository is **not** the official `yonerai.com` production runtime itself.
Its role is the **public distribution core**: the part that can run on a user's PC, stay useful without private production infrastructure, and later branch into multiple product modes.

Note: many internal paths/env vars still use legacy `ORA_*` prefixes for compatibility. Product/release branding is controlled by `PRODUCT_NAME`.

## How This Repo Fits The 3-Mode Architecture

The wider YonerAI system is organized as three operating modes:

1. `Full Private Self-Host`
- the user hosts runtime, storage, domain, app, API, memory, and files
2. `Official Hybrid Private`
- official identity/orchestration connects to user-side node execution and local state
3. `Official Managed Cloud`
- official infrastructure hosts runtime, core, memory, files, and orchestration

These are **not three separate codebases**.
They are three modes branching from one common distribution foundation through profiles, connectors, permissions, service dependencies, and trust boundaries.

This public repo is that shared foundation.

### Scope Of This Public Repo

What this repo is for:
Expand All @@ -52,7 +69,7 @@ What this repo is **not** trying to be on its own:
- billing / production moderation / internal admin stacks
- private production secrets, runbooks, or internal-only services

In other words: this repo is the public YonerAI foundation you can run, inspect, and extend. The heavier private operations side is intentionally separate.
In other words: this repo is the **public side of YonerAI's shared distribution core**, while the heavier official runtime and ops layer remain intentionally private.

### Current Status Of The Split

Expand All @@ -63,6 +80,25 @@ The long-term direction is a clearer split between:

That separation is still being formalized. Because of that, this repo currently still contains some broader shared foundation code and docs, especially around hybrid deployment and future-facing architecture.

### Current Strongest Implementation Direction

The strongest surviving implementation evidence points to a split like this:

- `yonerai.com`
- official top page and user-facing entry
- `api.yonerai.com`
- web chat, auth, and public API
- `files.yonerai.com`
- controlled file delivery and share links
- `hooks.yonerai.com`
- webhook or gateway ingress

This section describes the **current strongest implementation direction**, not a final canonical production sign-off.
For the current MVP freeze, see:

- `docs/ROUTE_FREEZE_MVP.md`
- `docs/PUBLIC_PRIVATE_BOUNDARY.md`

### What You Can Do With YonerAI

With the current public repo, you can:
Expand Down Expand Up @@ -118,6 +154,7 @@ If you want the deeper docs:
- `docs/VPS_DEPLOYMENT.md` (run the always-on control plane on a VPS; hybrid mode)
- `docs/DOMAIN_ROUTES.md` (recommended `yonerai.com` subdomains and API path design)
- `docs/PLATFORM_PLAN.md` (product direction: Node + Clients + Relay + Cloud)
- `docs/ROUTE_FREEZE_MVP.md` (Official Managed Cloud MVP route freeze)
- `docs/PLATFORM_REVIEW_AND_RISKS.md` (devil's advocate review / risks)
- `ORA_SYSTEM_SPEC.md`
- `AGENTS.md` (Codex/agent workspace instructions for this repo)
Expand Down
6 changes: 6 additions & 0 deletions clients/web/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,9 @@ AUTH_TRUST_HOST=true

# Optional: explicit canonical URL for NextAuth (use when deployed)
# NEXTAUTH_URL=https://your-domain.example

# Optional OpenAI CUA sidecar integration
# Run the official sample app separately and point YonerAI at it.
NEXT_PUBLIC_CUA_WEB_URL=http://127.0.0.1:3100
NEXT_PUBLIC_CUA_RUNNER_URL=http://127.0.0.1:4100
NEXT_PUBLIC_CUA_DEFAULT_MODEL=gpt-5.4
139 changes: 139 additions & 0 deletions clients/web/app/cua/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
const cuaWebUrl = process.env.NEXT_PUBLIC_CUA_WEB_URL || "http://127.0.0.1:3100";
const cuaRunnerUrl = process.env.NEXT_PUBLIC_CUA_RUNNER_URL || "http://127.0.0.1:4100";
const cuaModel = process.env.NEXT_PUBLIC_CUA_DEFAULT_MODEL || "gpt-5.4";

const steps = [
"Run the official OpenAI CUA sample as a separate sidecar service.",
"Keep it on its own Node + pnpm + Playwright runtime.",
"Point YonerAI at the sidecar instead of merging the sample into this web app.",
];

const requirements = [
"Node.js 22.20.0",
"pnpm 10.26.0",
"Playwright Chromium install",
"OPENAI_API_KEY configured in the sample app",
];

export default function CuaPage() {
return (
<main className="min-h-screen bg-[#121418] text-white">
<div className="mx-auto flex w-full max-w-5xl flex-col gap-8 px-6 py-12">
<section className="rounded-3xl border border-cyan-400/20 bg-cyan-500/10 p-8 shadow-2xl shadow-cyan-950/20">
<p className="mb-3 text-xs font-semibold uppercase tracking-[0.28em] text-cyan-200/80">
OpenAI CUA Sidecar
</p>
<h1 className="text-4xl font-semibold tracking-tight text-white">
GPT-5.4 browser operator, connected to YonerAI the safe way.
</h1>
<p className="mt-4 max-w-3xl text-sm leading-7 text-cyan-50/85">
YonerAI already has its own Python backend and browser APIs. The official
OpenAI CUA sample is best introduced as a separate sidecar app, then linked
into YonerAI for operator workflows and experiments.
</p>
<div className="mt-6 flex flex-wrap gap-3 text-sm">
<a
href={cuaWebUrl}
target="_blank"
rel="noreferrer"
className="rounded-full bg-white px-5 py-3 font-medium text-black transition hover:opacity-90"
>
Open CUA console
</a>
<a
href={cuaRunnerUrl}
target="_blank"
rel="noreferrer"
className="rounded-full border border-white/15 px-5 py-3 font-medium text-white transition hover:bg-white/5"
>
Open runner base URL
</a>
<a
href="https://github.com/openai/openai-cua-sample-app"
target="_blank"
rel="noreferrer"
className="rounded-full border border-cyan-300/25 px-5 py-3 font-medium text-cyan-100 transition hover:bg-cyan-400/10"
>
View official repo
</a>
</div>
</section>

<section className="grid gap-6 md:grid-cols-2">
<article className="rounded-2xl border border-white/10 bg-white/5 p-6">
<h2 className="text-lg font-semibold">Current sidecar target</h2>
<dl className="mt-5 space-y-4 text-sm text-gray-300">
<div>
<dt className="text-xs uppercase tracking-[0.24em] text-gray-500">Demo web</dt>
<dd className="mt-1 break-all text-white">{cuaWebUrl}</dd>
</div>
<div>
<dt className="text-xs uppercase tracking-[0.24em] text-gray-500">Runner</dt>
<dd className="mt-1 break-all text-white">{cuaRunnerUrl}</dd>
</div>
<div>
<dt className="text-xs uppercase tracking-[0.24em] text-gray-500">Default model</dt>
<dd className="mt-1 text-white">{cuaModel}</dd>
</div>
</dl>
</article>

<article className="rounded-2xl border border-white/10 bg-white/5 p-6">
<h2 className="text-lg font-semibold">Sample requirements</h2>
<ul className="mt-5 space-y-3 text-sm text-gray-300">
{requirements.map((item) => (
<li key={item} className="rounded-xl border border-white/8 bg-black/20 px-4 py-3">
{item}
</li>
))}
</ul>
</article>
</section>

<section className="rounded-2xl border border-white/10 bg-[#171b22] p-6">
<h2 className="text-lg font-semibold">Why not merge it directly?</h2>
<div className="mt-5 grid gap-4 md:grid-cols-3">
<div className="rounded-2xl border border-white/8 bg-black/20 p-4">
<p className="text-xs uppercase tracking-[0.24em] text-gray-500">Runtime split</p>
<p className="mt-2 text-sm leading-6 text-gray-300">
The official sample expects a Node 22 + pnpm workspace, while YonerAI is already
split across Python, FastAPI, Next.js, and Playwright helpers.
</p>
</div>
<div className="rounded-2xl border border-white/8 bg-black/20 p-4">
<p className="text-xs uppercase tracking-[0.24em] text-gray-500">Safer adoption</p>
<p className="mt-2 text-sm leading-6 text-gray-300">
Sidecar adoption keeps the sample reversible. If it fails or drifts, it does not
break the public YonerAI runtime.
</p>
</div>
<div className="rounded-2xl border border-white/8 bg-black/20 p-4">
<p className="text-xs uppercase tracking-[0.24em] text-gray-500">Future path</p>
<p className="mt-2 text-sm leading-6 text-gray-300">
Once the runner proves useful, YonerAI can integrate replay links, auth, or task
bridges without importing the whole sample monorepo.
</p>
</div>
</div>
</section>

<section className="rounded-2xl border border-white/10 bg-white/[0.03] p-6">
<h2 className="text-lg font-semibold">Recommended first steps</h2>
<ol className="mt-5 space-y-3 text-sm text-gray-300">
{steps.map((item, index) => (
<li key={item} className="flex gap-4 rounded-xl border border-white/8 bg-black/20 px-4 py-3">
<span className="flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-cyan-400/15 text-cyan-200">
{index + 1}
</span>
<span className="leading-6">{item}</span>
</li>
))}
</ol>
<p className="mt-5 text-sm leading-7 text-gray-400">
See also: <code className="rounded bg-black/30 px-2 py-1 text-gray-200">docs/OPENAI_CUA_SIDECAR_ADOPTION.md</code>
</p>
</section>
</div>
</main>
);
}
4 changes: 2 additions & 2 deletions clients/web/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import "./globals.css";
import { Inter } from "next/font/google";
import { Plus, MessageSquare, Settings, User, LogOut } from "lucide-react";
import { Plus, MessageSquare, Settings, User } from "lucide-react";

const inter = Inter({ subsets: ["latin"] });

Expand All @@ -12,7 +12,7 @@ export default function RootLayout({
return (
<html lang="en">
<head>
<title>ORA Chat</title>
<title>YonerAI</title>
</head>
<body className={`${inter.className} flex h-screen w-screen bg-[#212121] text-gray-100`}>

Expand Down
Loading