mop-agent 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/apps/web/app/api/setup/status/route.ts +5 -4
- package/apps/web/app/assistant/page.tsx +33 -33
- package/apps/web/app/brain/[projectId]/page.tsx +4 -3
- package/apps/web/app/brain/graph/page.tsx +4 -4
- package/apps/web/app/brain/page.tsx +15 -15
- package/apps/web/app/chat/[projectId]/page.tsx +6 -6
- package/apps/web/app/globals.css +21 -0
- package/apps/web/app/icon.svg +489 -0
- package/apps/web/app/layout.tsx +4 -2
- package/apps/web/app/settings/page.tsx +4 -4
- package/apps/web/app/setup/page.tsx +20 -19
- package/apps/web/app/team/page.tsx +5 -5
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/apps/web/app/layout.tsx
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
|
+
import "./globals.css";
|
|
2
3
|
|
|
3
4
|
export const metadata = {
|
|
4
5
|
title: "MOP-AGENT",
|
|
5
6
|
description: "Self-hosted AI assistant with persistent, cross-project memory.",
|
|
7
|
+
icons: { icon: "/icon.svg" },
|
|
6
8
|
};
|
|
7
9
|
|
|
8
10
|
export default function RootLayout({ children }: { children: ReactNode }) {
|
|
@@ -13,8 +15,8 @@ export default function RootLayout({ children }: { children: ReactNode }) {
|
|
|
13
15
|
margin: 0,
|
|
14
16
|
fontFamily:
|
|
15
17
|
"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif",
|
|
16
|
-
background: "#
|
|
17
|
-
color: "#
|
|
18
|
+
background: "#fef9e1",
|
|
19
|
+
color: "#2d4a3e",
|
|
18
20
|
}}
|
|
19
21
|
>
|
|
20
22
|
{children}
|
|
@@ -33,10 +33,10 @@ export default function SettingsPage() {
|
|
|
33
33
|
|
|
34
34
|
return (
|
|
35
35
|
<main style={{ maxWidth: 520, margin: "0 auto", padding: "48px 24px" }}>
|
|
36
|
-
<a href="/assistant" style={{ color: "#
|
|
36
|
+
<a href="/assistant" style={{ color: "#742220" }}>← Assistant</a>
|
|
37
37
|
<h1 style={{ fontSize: 24 }}>⚙️ Provider settings</h1>
|
|
38
38
|
|
|
39
|
-
<div style={{ border: "1px solid
|
|
39
|
+
<div style={{ border: "1px solid rgba(45,74,62,.28)", borderRadius: 8, padding: 14, margin: "12px 0", opacity: 0.9, background: "#fffdf2" }}>
|
|
40
40
|
{config.configured
|
|
41
41
|
? <>Active: <strong>{config.provider}</strong>{config.model ? ` · ${config.model}` : ""} · key {config.keyHint}</>
|
|
42
42
|
: "No provider key saved yet — chat uses the offline echo provider."}
|
|
@@ -59,5 +59,5 @@ export default function SettingsPage() {
|
|
|
59
59
|
);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
const inp: React.CSSProperties = { padding: "10px 12px", borderRadius: 8, border: "1px solid
|
|
63
|
-
const btn: React.CSSProperties = { padding: "10px 12px", borderRadius: 8, border: "1px solid #
|
|
62
|
+
const inp: React.CSSProperties = { padding: "10px 12px", borderRadius: 8, border: "1px solid rgba(45,74,62,.32)", background: "#fffdf2", color: "#2d4a3e" };
|
|
63
|
+
const btn: React.CSSProperties = { padding: "10px 12px", borderRadius: 8, border: "1px solid #742220", background: "#742220", color: "#fef9e1", cursor: "pointer" };
|
|
@@ -13,12 +13,10 @@ export default function SetupPage() {
|
|
|
13
13
|
const [mode, setMode] = useState<"signup" | "signin">("signup");
|
|
14
14
|
|
|
15
15
|
useEffect(() => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
.then(([status, me]) => {
|
|
21
|
-
if (me.ok) {
|
|
16
|
+
fetch("/api/setup/status")
|
|
17
|
+
.then((r) => r.json() as Promise<{ ownerExists: boolean; authenticated: boolean }>)
|
|
18
|
+
.then((status) => {
|
|
19
|
+
if (status.authenticated) {
|
|
22
20
|
window.location.replace("/assistant");
|
|
23
21
|
return;
|
|
24
22
|
}
|
|
@@ -57,10 +55,12 @@ export default function SetupPage() {
|
|
|
57
55
|
const loading = ownerExists === null && !msg;
|
|
58
56
|
|
|
59
57
|
return (
|
|
60
|
-
<main style={shell}>
|
|
61
|
-
<section style={brandPanel}
|
|
58
|
+
<main className="mop-setup-shell" style={shell}>
|
|
59
|
+
<section className="mop-setup-brand" style={brandPanel}>
|
|
60
|
+
<img src="/icon.svg" alt="MOP-AGENT" style={heroLogo} />
|
|
61
|
+
</section>
|
|
62
62
|
|
|
63
|
-
<section style={formWrap}>
|
|
63
|
+
<section className="mop-setup-form" style={formWrap}>
|
|
64
64
|
<div style={formCard}>
|
|
65
65
|
<p style={eyebrow}>{mode === "signup" ? "FIRST-RUN SETUP" : "WELCOME BACK"}</p>
|
|
66
66
|
<h2 style={{ fontSize: 27, margin: "8px 0" }}>
|
|
@@ -91,7 +91,7 @@ export default function SetupPage() {
|
|
|
91
91
|
</form>
|
|
92
92
|
)}
|
|
93
93
|
|
|
94
|
-
{msg && <p role="alert" style={{ marginTop: 16, color: "#
|
|
94
|
+
{msg && <p role="alert" style={{ marginTop: 16, color: "#742220" }}>{msg}</p>}
|
|
95
95
|
|
|
96
96
|
{!loading && (
|
|
97
97
|
<p style={{ marginTop: 22, fontSize: 13, color: "#7f8da2" }}>
|
|
@@ -107,12 +107,13 @@ export default function SetupPage() {
|
|
|
107
107
|
);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
const shell: React.CSSProperties = { minHeight: "100vh", display: "grid", gridTemplateColumns: "minmax(0, 1.25fr) minmax(380px, .75fr)", background: "
|
|
111
|
-
const brandPanel: React.CSSProperties = { padding: "clamp(48px, 8vw, 110px)", display: "flex",
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
const
|
|
110
|
+
const shell: React.CSSProperties = { minHeight: "100vh", display: "grid", gridTemplateColumns: "minmax(0, 1.25fr) minmax(380px, .75fr)", background: "#fef9e1" };
|
|
111
|
+
const brandPanel: React.CSSProperties = { padding: "clamp(48px, 8vw, 110px)", display: "flex", alignItems: "center", justifyContent: "center", overflow: "hidden", background: "radial-gradient(circle at 50% 45%, #49685c 0, #2d4a3e 58%, #21382f 100%)" };
|
|
112
|
+
const heroLogo: React.CSSProperties = { display: "block", width: "min(72%, 560px)", height: "auto", maxHeight: "72vh", objectFit: "contain", filter: "drop-shadow(0 24px 34px rgba(0,0,0,.28))" };
|
|
113
|
+
const formWrap: React.CSSProperties = { display: "flex", alignItems: "center", justifyContent: "center", padding: 28, background: "#fef9e1", borderLeft: "1px solid #2d4a3e" };
|
|
114
|
+
const formCard: React.CSSProperties = { width: "min(100%, 430px)", padding: "38px 34px", border: "1px solid rgba(45,74,62,.45)", borderRadius: 18, background: "#fffdf2", boxShadow: "0 24px 70px rgba(45,74,62,.14)" };
|
|
115
|
+
const eyebrow: React.CSSProperties = { margin: "20px 0 0", color: "#742220", fontSize: 12, fontWeight: 800, letterSpacing: ".16em" };
|
|
116
|
+
const label: React.CSSProperties = { display: "grid", gap: 7, color: "#2d4a3e", fontSize: 13, fontWeight: 650 };
|
|
117
|
+
const inputStyle: React.CSSProperties = { padding: "12px 13px", borderRadius: 9, border: "1px solid rgba(45,74,62,.42)", outline: "none", background: "#fef9e1", color: "#2d4a3e", fontSize: 15 };
|
|
118
|
+
const buttonStyle: React.CSSProperties = { marginTop: 4, padding: "12px 14px", borderRadius: 9, border: "1px solid #742220", background: "#742220", color: "#fef9e1", fontWeight: 750, fontSize: 15, cursor: "pointer" };
|
|
119
|
+
const textButton: React.CSSProperties = { padding: 0, border: 0, background: "none", color: "#742220", cursor: "pointer" };
|
|
@@ -39,7 +39,7 @@ export default function TeamPage() {
|
|
|
39
39
|
|
|
40
40
|
return (
|
|
41
41
|
<main style={{ maxWidth: 640, margin: "0 auto", padding: "40px 24px" }}>
|
|
42
|
-
<a href="/brain" style={{ color: "#
|
|
42
|
+
<a href="/brain" style={{ color: "#742220" }}>← Brain</a>
|
|
43
43
|
<h1 style={{ fontSize: 24 }}>👥 Team</h1>
|
|
44
44
|
<p style={{ opacity: 0.7 }}>You are <strong>{me?.user.email}</strong> · role <strong>{me?.role}</strong></p>
|
|
45
45
|
|
|
@@ -69,7 +69,7 @@ export default function TeamPage() {
|
|
|
69
69
|
{invites.filter((i) => !i.usedAt).map((i) => (
|
|
70
70
|
<li key={i.email} style={row}>
|
|
71
71
|
✉️ {i.email} <span style={{ opacity: 0.5 }}>· {i.role}</span>
|
|
72
|
-
<button onClick={() => revoke(i.email)} style={{ float: "right", ...btn, background: "#
|
|
72
|
+
<button onClick={() => revoke(i.email)} style={{ float: "right", ...btn, background: "#742220", borderColor: "#742220", padding: "2px 10px" }}>revoke</button>
|
|
73
73
|
</li>
|
|
74
74
|
))}
|
|
75
75
|
{invites.filter((i) => !i.usedAt).length === 0 && <p style={{ opacity: 0.5 }}>None.</p>}
|
|
@@ -81,6 +81,6 @@ export default function TeamPage() {
|
|
|
81
81
|
);
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
const row: React.CSSProperties = { border: "1px solid
|
|
85
|
-
const inp: React.CSSProperties = { padding: "8px 10px", borderRadius: 8, border: "1px solid
|
|
86
|
-
const btn: React.CSSProperties = { padding: "8px 14px", borderRadius: 8, border: "1px solid #
|
|
84
|
+
const row: React.CSSProperties = { border: "1px solid rgba(45,74,62,.28)", borderRadius: 8, padding: "8px 12px", marginBottom: 6, background: "#fffdf2" };
|
|
85
|
+
const inp: React.CSSProperties = { padding: "8px 10px", borderRadius: 8, border: "1px solid rgba(45,74,62,.32)", background: "#fffdf2", color: "#2d4a3e" };
|
|
86
|
+
const btn: React.CSSProperties = { padding: "8px 14px", borderRadius: 8, border: "1px solid #742220", background: "#742220", color: "#fef9e1", cursor: "pointer" };
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mop-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "mop-agent",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.5",
|
|
10
10
|
"license": "UNLICENSED",
|
|
11
11
|
"workspaces": [
|
|
12
12
|
"packages/*",
|
package/package.json
CHANGED