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 CHANGED
@@ -5,7 +5,7 @@ through MOP-FLOW. It stores project memory, performs semantic recall and
5
5
  consolidation, serves grounded chat, and can request approved actions from a
6
6
  linked FLOW node.
7
7
 
8
- > **Release status:** npm package `mop-agent@0.1.4` contains the corrected VPS
8
+ > **Release status:** npm package `mop-agent@0.1.5` contains the corrected VPS
9
9
  > installer and first-run Admin/Assistant flow. The canonical installation command is
10
10
  > exactly `npx mop-agent`.
11
11
 
@@ -1,6 +1,7 @@
1
- /** GET /api/setup/status — whether the owner account has been created yet. */
2
- import { ownerExists } from "@/lib/auth";
1
+ /** GET /api/setup/status — first-run state plus a non-error session check. */
2
+ import { auth, ownerExists } from "@/lib/auth";
3
3
 
4
- export async function GET(): Promise<Response> {
5
- return Response.json({ ownerExists: ownerExists() });
4
+ export async function GET(req: Request): Promise<Response> {
5
+ const session = await auth.api.getSession({ headers: req.headers });
6
+ return Response.json({ ownerExists: ownerExists(), authenticated: !!session });
6
7
  }
@@ -81,8 +81,8 @@ export default function AssistantPage() {
81
81
  }
82
82
 
83
83
  return (
84
- <main style={appShell}>
85
- <aside style={sidebar}>
84
+ <main className="mop-assistant-shell" style={appShell}>
85
+ <aside className="mop-assistant-sidebar" style={sidebar}>
86
86
  <a href="/assistant" style={brand}><span style={brandMark}>M</span><strong>MOP-AGENT</strong></a>
87
87
  <nav style={{ display: "grid", gap: 6, marginTop: 34 }}>
88
88
  <a href="/assistant" style={{ ...navItem, ...navActive }}>✦ Assistant</a>
@@ -94,7 +94,7 @@ export default function AssistantPage() {
94
94
  <div style={{ marginTop: "auto", display: "grid", gap: 10 }}>
95
95
  {!provider.configured && (
96
96
  <a href="/settings" style={setupCard}>
97
- <strong style={{ color: "#e9efff" }}>Connect an AI model</strong>
97
+ <strong style={{ color: "#fef9e1" }}>Connect an AI model</strong>
98
98
  <span style={{ fontSize: 12, lineHeight: 1.45 }}>Offline demo is active. Add OpenRouter or Anthropic for full answers.</span>
99
99
  </a>
100
100
  )}
@@ -110,9 +110,9 @@ export default function AssistantPage() {
110
110
  <header style={topbar}>
111
111
  <div>
112
112
  <strong>Assistant</strong>
113
- <span style={{ color: "#637188", marginLeft: 9, fontSize: 12 }}>{provider.configured ? `${provider.provider}${provider.model ? ` · ${provider.model}` : ""}` : "offline demo"}</span>
113
+ <span style={{ color: "rgba(45,74,62,.68)", marginLeft: 9, fontSize: 12 }}>{provider.configured ? `${provider.provider}${provider.model ? ` · ${provider.model}` : ""}` : "offline demo"}</span>
114
114
  </div>
115
- <label style={{ color: "#8090a6", fontSize: 12 }}>
115
+ <label style={{ color: "#2d4a3e", fontSize: 12 }}>
116
116
  Memory scope&nbsp;
117
117
  <select value={selectedProject} onChange={(e) => setSelectedProject(e.target.value)} style={selectStyle}>
118
118
  <option value="">All memory</option>
@@ -125,19 +125,19 @@ export default function AssistantPage() {
125
125
  {turns.length === 0 ? (
126
126
  <div style={welcome}>
127
127
  <div style={assistantOrb}>✦</div>
128
- <p style={{ color: "#7d9dff", fontSize: 12, fontWeight: 800, letterSpacing: ".13em" }}>MOP-AGENT IS READY</p>
128
+ <p style={{ color: "#742220", fontSize: 12, fontWeight: 800, letterSpacing: ".13em" }}>MOP-AGENT IS READY</p>
129
129
  <h1 style={{ fontSize: "clamp(28px, 4vw, 42px)", margin: "8px 0 12px" }}>What are we working on, {name.split(" ")[0]}?</h1>
130
- <p style={{ color: "#8290a4", maxWidth: 610, lineHeight: 1.65 }}>
130
+ <p style={{ color: "rgba(45,74,62,.72)", maxWidth: 610, lineHeight: 1.65 }}>
131
131
  Start talking immediately. Link projects when you want MOP-AGENT to remember their state and work across them.
132
132
  </p>
133
- <div style={promptGrid}>
133
+ <div className="mop-prompt-grid" style={promptGrid}>
134
134
  {["Help me plan today’s work", "What can MOP-AGENT do?", "Summarize what you remember", "Plan a new software project"].map((prompt) => (
135
135
  <button key={prompt} onClick={() => send(prompt)} style={promptCard}>{prompt}<span>→</span></button>
136
136
  ))}
137
137
  </div>
138
138
  {projects.length === 0 && (
139
- <p style={{ fontSize: 13, color: "#6f7d91", marginTop: 24 }}>
140
- No project linked yet—this does not block chat. <a href="/brain" style={{ color: "#88a3ff" }}>Link one from Brain →</a>
139
+ <p style={{ fontSize: 13, color: "rgba(45,74,62,.68)", marginTop: 24 }}>
140
+ No project linked yet—this does not block chat. <a href="/brain" style={{ color: "#742220" }}>Link one from Brain →</a>
141
141
  </p>
142
142
  )}
143
143
  </div>
@@ -147,8 +147,8 @@ export default function AssistantPage() {
147
147
  <article key={index} style={{ display: "grid", gridTemplateColumns: "34px 1fr", gap: 13, marginBottom: 26 }}>
148
148
  <span style={turn.role === "assistant" ? botAvatar : userAvatar}>{turn.role === "assistant" ? "✦" : name.slice(0, 1).toUpperCase()}</span>
149
149
  <div>
150
- <strong style={{ fontSize: 13, color: turn.role === "assistant" ? "#91a9ff" : "#dce5f4" }}>{turn.role === "assistant" ? "MOP-AGENT" : "You"}</strong>
151
- <div style={{ whiteSpace: "pre-wrap", lineHeight: 1.7, marginTop: 6, color: "#c4cfdd" }}>{turn.content || "Thinking…"}</div>
150
+ <strong style={{ fontSize: 13, color: turn.role === "assistant" ? "#742220" : "#2d4a3e" }}>{turn.role === "assistant" ? "MOP-AGENT" : "You"}</strong>
151
+ <div style={{ whiteSpace: "pre-wrap", lineHeight: 1.7, marginTop: 6, color: "#2d4a3e" }}>{turn.content || "Thinking…"}</div>
152
152
  </div>
153
153
  </article>
154
154
  ))}
@@ -162,7 +162,7 @@ export default function AssistantPage() {
162
162
  <textarea value={input} onChange={(e) => setInput(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); send(); } }} placeholder="Message MOP-AGENT…" rows={1} style={textarea} />
163
163
  <button onClick={() => send()} disabled={busy || !input.trim()} style={{ ...sendButton, opacity: busy || !input.trim() ? .45 : 1 }}>↑</button>
164
164
  </div>
165
- <div style={{ textAlign: "center", color: "#536074", fontSize: 11, marginTop: 8 }}>
165
+ <div style={{ textAlign: "center", color: "rgba(45,74,62,.62)", fontSize: 11, marginTop: 8 }}>
166
166
  {providerUsed ? `Answered by ${providerUsed} · ` : ""}{selectedProject ? "Selected project memory" : "Cross-project memory"}
167
167
  </div>
168
168
  </div>
@@ -171,26 +171,26 @@ export default function AssistantPage() {
171
171
  );
172
172
  }
173
173
 
174
- const appShell: React.CSSProperties = { minHeight: "100vh", display: "grid", gridTemplateColumns: "235px 1fr", background: "#080c13" };
175
- const sidebar: React.CSSProperties = { padding: "22px 15px", borderRight: "1px solid #182131", background: "#0b1019", display: "flex", flexDirection: "column", minHeight: "calc(100vh - 44px)" };
176
- const brand: React.CSSProperties = { display: "flex", alignItems: "center", gap: 10, color: "#eaf0fa", textDecoration: "none", padding: "4px 8px" };
177
- const brandMark: React.CSSProperties = { width: 28, height: 28, borderRadius: 8, display: "grid", placeItems: "center", background: "linear-gradient(135deg,#4b73ff,#8159e8)", fontSize: 13 };
178
- const navItem: React.CSSProperties = { color: "#8795a9", textDecoration: "none", padding: "10px 12px", borderRadius: 8, fontSize: 14 };
179
- const navActive: React.CSSProperties = { color: "#e7edff", background: "#172137", boxShadow: "inset 2px 0 #6687ff" };
180
- const setupCard: React.CSSProperties = { display: "grid", gap: 5, padding: 12, border: "1px solid #293752", borderRadius: 10, background: "#111a2a", color: "#8090a8", textDecoration: "none" };
181
- const accountButton: React.CSSProperties = { display: "flex", alignItems: "center", gap: 9, padding: 8, border: 0, borderRadius: 9, background: "transparent", color: "#98a6b9", cursor: "pointer", textAlign: "left" };
182
- const avatar: React.CSSProperties = { width: 28, height: 28, borderRadius: 8, display: "grid", placeItems: "center", background: "#232f45", color: "#b9c8df", fontSize: 12 };
183
- const workspace: React.CSSProperties = { minWidth: 0, minHeight: "100vh", position: "relative", display: "flex", flexDirection: "column", background: "radial-gradient(circle at 50% 4%, #10182a 0, #080c13 38%)" };
184
- const topbar: React.CSSProperties = { height: 62, padding: "0 24px", display: "flex", alignItems: "center", justifyContent: "space-between", borderBottom: "1px solid #182131", background: "rgba(8,12,19,.72)", backdropFilter: "blur(16px)" };
185
- const selectStyle: React.CSSProperties = { color: "#b9c5d6", border: "1px solid #273348", borderRadius: 7, padding: "6px 8px", background: "#0d131e" };
174
+ const appShell: React.CSSProperties = { minHeight: "100vh", display: "grid", gridTemplateColumns: "235px 1fr", background: "#fef9e1" };
175
+ const sidebar: React.CSSProperties = { padding: "22px 15px", borderRight: "1px solid #20382f", background: "#2d4a3e", display: "flex", flexDirection: "column", minHeight: "calc(100vh - 44px)" };
176
+ const brand: React.CSSProperties = { display: "flex", alignItems: "center", gap: 10, color: "#fef9e1", textDecoration: "none", padding: "4px 8px" };
177
+ const brandMark: React.CSSProperties = { width: 28, height: 28, borderRadius: 8, display: "grid", placeItems: "center", background: "#742220", color: "#fef9e1", fontSize: 13 };
178
+ const navItem: React.CSSProperties = { color: "rgba(254,249,225,.76)", textDecoration: "none", padding: "10px 12px", borderRadius: 8, fontSize: 14 };
179
+ const navActive: React.CSSProperties = { color: "#fef9e1", background: "#742220", boxShadow: "inset 2px 0 #fef9e1" };
180
+ const setupCard: React.CSSProperties = { display: "grid", gap: 5, padding: 12, border: "1px solid rgba(254,249,225,.45)", borderRadius: 10, background: "#742220", color: "rgba(254,249,225,.74)", textDecoration: "none" };
181
+ const accountButton: React.CSSProperties = { display: "flex", alignItems: "center", gap: 9, padding: 8, border: 0, borderRadius: 9, background: "transparent", color: "#fef9e1", cursor: "pointer", textAlign: "left" };
182
+ const avatar: React.CSSProperties = { width: 28, height: 28, borderRadius: 8, display: "grid", placeItems: "center", background: "#742220", color: "#fef9e1", fontSize: 12 };
183
+ const workspace: React.CSSProperties = { minWidth: 0, minHeight: "100vh", position: "relative", display: "flex", flexDirection: "column", background: "radial-gradient(circle at 50% 4%, #fffdf2 0, #fef9e1 58%)" };
184
+ const topbar: React.CSSProperties = { height: 62, padding: "0 24px", display: "flex", alignItems: "center", justifyContent: "space-between", borderBottom: "1px solid rgba(45,74,62,.25)", background: "rgba(254,249,225,.88)", backdropFilter: "blur(16px)" };
185
+ const selectStyle: React.CSSProperties = { color: "#2d4a3e", border: "1px solid rgba(45,74,62,.38)", borderRadius: 7, padding: "6px 8px", background: "#fffdf2" };
186
186
  const conversation: React.CSSProperties = { flex: 1, overflowY: "auto", padding: "0 28px" };
187
187
  const welcome: React.CSSProperties = { minHeight: "calc(100vh - 220px)", display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", textAlign: "center", paddingBottom: 60 };
188
- const assistantOrb: React.CSSProperties = { width: 58, height: 58, borderRadius: 18, display: "grid", placeItems: "center", fontSize: 24, color: "white", background: "linear-gradient(135deg,#456fff,#8b56df)", boxShadow: "0 15px 55px rgba(85,105,255,.28)" };
188
+ const assistantOrb: React.CSSProperties = { width: 58, height: 58, borderRadius: 18, display: "grid", placeItems: "center", fontSize: 24, color: "#fef9e1", background: "#742220", boxShadow: "0 15px 55px rgba(116,34,32,.22)" };
189
189
  const promptGrid: React.CSSProperties = { width: "min(100%, 650px)", display: "grid", gridTemplateColumns: "repeat(2,minmax(0,1fr))", gap: 10, marginTop: 28 };
190
- const promptCard: React.CSSProperties = { display: "flex", justifyContent: "space-between", padding: "14px 15px", borderRadius: 10, border: "1px solid #222e42", background: "rgba(16,23,36,.72)", color: "#aebacc", cursor: "pointer", textAlign: "left" };
191
- const botAvatar: React.CSSProperties = { width: 32, height: 32, borderRadius: 9, display: "grid", placeItems: "center", background: "linear-gradient(135deg,#456fff,#8058df)", color: "white" };
192
- const userAvatar: React.CSSProperties = { ...botAvatar, background: "#263248", color: "#c5d0df", fontSize: 12 };
193
- const composerWrap: React.CSSProperties = { position: "absolute", left: 0, right: 0, bottom: 0, padding: "28px 30px 18px", background: "linear-gradient(transparent,#080c13 28%)" };
194
- const composer: React.CSSProperties = { width: "min(calc(100% - 32px), 800px)", margin: "0 auto", display: "flex", alignItems: "flex-end", gap: 10, padding: "10px 10px 10px 15px", border: "1px solid #2a3951", borderRadius: 14, background: "#101722", boxShadow: "0 15px 55px rgba(0,0,0,.28)" };
195
- const textarea: React.CSSProperties = { flex: 1, resize: "none", border: 0, outline: 0, background: "transparent", color: "#e7edf5", font: "inherit", lineHeight: 1.55, padding: "5px 0" };
196
- const sendButton: React.CSSProperties = { width: 34, height: 34, border: 0, borderRadius: 9, background: "#5577f7", color: "white", fontSize: 18, cursor: "pointer" };
190
+ const promptCard: React.CSSProperties = { display: "flex", justifyContent: "space-between", padding: "14px 15px", borderRadius: 10, border: "1px solid rgba(45,74,62,.3)", background: "#fffdf2", color: "#2d4a3e", cursor: "pointer", textAlign: "left" };
191
+ const botAvatar: React.CSSProperties = { width: 32, height: 32, borderRadius: 9, display: "grid", placeItems: "center", background: "#742220", color: "#fef9e1" };
192
+ const userAvatar: React.CSSProperties = { ...botAvatar, background: "#2d4a3e", color: "#fef9e1", fontSize: 12 };
193
+ const composerWrap: React.CSSProperties = { position: "absolute", left: 0, right: 0, bottom: 0, padding: "28px 30px 18px", background: "linear-gradient(transparent,#fef9e1 28%)" };
194
+ const composer: React.CSSProperties = { width: "min(calc(100% - 32px), 800px)", margin: "0 auto", display: "flex", alignItems: "flex-end", gap: 10, padding: "10px 10px 10px 15px", border: "1px solid rgba(45,74,62,.42)", borderRadius: 14, background: "#fffdf2", boxShadow: "0 15px 45px rgba(45,74,62,.16)" };
195
+ const textarea: React.CSSProperties = { flex: 1, resize: "none", border: 0, outline: 0, background: "transparent", color: "#2d4a3e", font: "inherit", lineHeight: 1.55, padding: "5px 0" };
196
+ const sendButton: React.CSSProperties = { width: 34, height: 34, border: 0, borderRadius: 9, background: "#742220", color: "#fef9e1", fontSize: 18, cursor: "pointer" };
@@ -17,9 +17,9 @@ export default function ProjectBrainPage({ params }: { params: Promise<{ project
17
17
 
18
18
  return (
19
19
  <main style={{ maxWidth: 900, margin: "0 auto", padding: "40px 24px" }}>
20
- <a href="/brain" style={{ color: "#7aa2ff" }}>← Brain</a>
20
+ <a href="/brain" style={{ color: "#742220" }}>← Brain</a>
21
21
  <h1 style={{ fontSize: 24 }}>{projectId}</h1>
22
- <a href={`/chat/${projectId}`} style={{ color: "#7aa2ff" }}>💬 Chat with this project →</a>
22
+ <a href={`/chat/${projectId}`} style={{ color: "#742220" }}>💬 Chat with this project →</a>
23
23
 
24
24
  <h2 style={{ fontSize: 16, marginTop: 24, opacity: 0.8 }}>
25
25
  Recent memory ({info?.memoryCount ?? mem.length})
@@ -43,7 +43,8 @@ export default function ProjectBrainPage({ params }: { params: Promise<{ project
43
43
  }
44
44
 
45
45
  const card: React.CSSProperties = {
46
- border: "1px solid #1f2a3a",
46
+ border: "1px solid rgba(45,74,62,.28)",
47
+ background: "#fffdf2",
47
48
  borderRadius: 8,
48
49
  padding: "10px 14px",
49
50
  marginBottom: 8,
@@ -7,7 +7,7 @@ import "reactflow/dist/style.css";
7
7
  type GNode = { id: string; label: string; type: "project" | "pattern" | "skill" };
8
8
  type GEdge = { from: string; to: string };
9
9
 
10
- const COLOR = { project: "#2b5cff", pattern: "#1a7f4b", skill: "#a15c00" };
10
+ const COLOR = { project: "#742220", pattern: "#2d4a3e", skill: "#9a6738" };
11
11
 
12
12
  export default function GraphPage() {
13
13
  const [data, setData] = useState<{ nodes: GNode[]; edges: GEdge[] }>({ nodes: [], edges: [] });
@@ -26,7 +26,7 @@ export default function GraphPage() {
26
26
  id: n.id,
27
27
  position: { x: col * 280, y: row * 90 },
28
28
  data: { label: `${n.type === "project" ? "📦" : n.type === "pattern" ? "🌐" : "🛠"} ${n.label}` },
29
- style: { border: `1px solid ${COLOR[n.type]}`, borderRadius: 8, background: "#111824", color: "#e6edf3", fontSize: 12, width: 240 },
29
+ style: { border: `1px solid ${COLOR[n.type]}`, borderRadius: 8, background: "#fffdf2", color: "#2d4a3e", fontSize: 12, width: 240 },
30
30
  };
31
31
  });
32
32
  }, [data.nodes]);
@@ -39,13 +39,13 @@ export default function GraphPage() {
39
39
  return (
40
40
  <main style={{ height: "100vh", display: "flex", flexDirection: "column" }}>
41
41
  <div style={{ padding: "12px 16px" }}>
42
- <a href="/brain" style={{ color: "#7aa2ff" }}>← Brain</a>{" "}
42
+ <a href="/brain" style={{ color: "#742220" }}>← Brain</a>{" "}
43
43
  <strong>Knowledge Graph</strong>{" "}
44
44
  <span style={{ opacity: 0.6, fontSize: 13 }}>{data.nodes.length} nodes · {data.edges.length} edges</span>
45
45
  </div>
46
46
  <div style={{ flex: 1 }}>
47
47
  <ReactFlow nodes={nodes} edges={edges} fitView>
48
- <Background color="#1f2a3a" />
48
+ <Background color="#b8b49f" />
49
49
  <Controls />
50
50
  </ReactFlow>
51
51
  </div>
@@ -68,27 +68,27 @@ export default function BrainPage() {
68
68
 
69
69
  return (
70
70
  <main style={{ maxWidth: 900, margin: "0 auto", padding: "40px 24px" }}>
71
- <p style={{ margin: 0 }}><a href="/assistant" style={{ color: "#7aa2ff" }}>← Assistant</a></p>
71
+ <p style={{ margin: 0 }}><a href="/assistant" style={{ color: "#742220" }}>← Assistant</a></p>
72
72
  <h1 style={{ fontSize: 24 }}>🧠 Brain</h1>
73
73
  <p style={{ opacity: 0.65 }}>
74
- Main Brain + linked project brains. <a href="/brain/graph" style={{ color: "#7aa2ff" }}>🕸 Knowledge graph →</a>{" "}
75
- <a href="/settings" style={{ color: "#7aa2ff" }}>⚙️ Settings →</a>{" "}
76
- <a href="/team" style={{ color: "#7aa2ff" }}>👥 Team →</a>
74
+ Main Brain + linked project brains. <a href="/brain/graph" style={{ color: "#742220" }}>🕸 Knowledge graph →</a>{" "}
75
+ <a href="/settings" style={{ color: "#742220" }}>⚙️ Settings →</a>{" "}
76
+ <a href="/team" style={{ color: "#742220" }}>👥 Team →</a>
77
77
  </p>
78
78
 
79
79
  <div style={{ margin: "20px 0", display: "flex", gap: 12, alignItems: "center" }}>
80
80
  <button onClick={genCode} style={btn}>+ Link project</button>
81
81
  {code && (
82
- <code style={{ background: "#111824", padding: "6px 10px", borderRadius: 6 }}>
82
+ <code style={{ background: "#fffdf2", padding: "6px 10px", borderRadius: 6 }}>
83
83
  mop-flow-dev link --url {typeof window !== "undefined" ? window.location.origin : ""} --code {code} --project &lt;id&gt;
84
84
  </code>
85
85
  )}
86
86
  </div>
87
87
 
88
- <section style={{ margin: "8px 0 24px", border: "1px solid #1f2a3a", borderRadius: 8, padding: 16 }}>
88
+ <section style={{ margin: "8px 0 24px", border: "1px solid rgba(45,74,62,.28)", borderRadius: 8, padding: 16, background: "#fffdf2" }}>
89
89
  <div style={{ display: "flex", alignItems: "center", gap: 12 }}>
90
90
  <h2 style={{ fontSize: 16, margin: 0, opacity: 0.85 }}>🌐 Main Brain ({notes.length})</h2>
91
- <button onClick={runConsolidate} disabled={consolidating} style={{ ...btn, background: "#1a7f4b", borderColor: "#1a7f4b" }}>
91
+ <button onClick={runConsolidate} disabled={consolidating} style={{ ...btn, background: "#2d4a3e", borderColor: "#2d4a3e" }}>
92
92
  {consolidating ? "consolidating…" : "⟳ Consolidate"}
93
93
  </button>
94
94
  {consolidateMsg && <span style={{ opacity: 0.65, fontSize: 13 }}>{consolidateMsg}</span>}
@@ -123,8 +123,8 @@ export default function BrainPage() {
123
123
  <span style={{ opacity: 0.5, fontSize: 12 }}>[{a.status}{a.error ? `: ${a.error}` : ""}]</span>
124
124
  {a.status === "pending" && (
125
125
  <span style={{ float: "right" }}>
126
- <button onClick={() => decide(a.id, "approve")} style={{ ...btn, padding: "4px 10px", background: "#1a7f4b", borderColor: "#1a7f4b" }}>Approve</button>{" "}
127
- <button onClick={() => decide(a.id, "deny")} style={{ ...btn, padding: "4px 10px", background: "#7f1a1a", borderColor: "#7f1a1a" }}>Deny</button>
126
+ <button onClick={() => decide(a.id, "approve")} style={{ ...btn, padding: "4px 10px", background: "#2d4a3e", borderColor: "#2d4a3e" }}>Approve</button>{" "}
127
+ <button onClick={() => decide(a.id, "deny")} style={{ ...btn, padding: "4px 10px", background: "#742220", borderColor: "#742220" }}>Deny</button>
128
128
  </span>
129
129
  )}
130
130
  </li>
@@ -138,13 +138,13 @@ export default function BrainPage() {
138
138
  <ul style={{ listStyle: "none", padding: 0 }}>
139
139
  {projects.map((p) => (
140
140
  <li key={p.id} style={card}>
141
- <a href={`/brain/${p.id}`} style={{ color: "#7aa2ff", textDecoration: "none", fontWeight: 600 }}>
141
+ <a href={`/brain/${p.id}`} style={{ color: "#742220", textDecoration: "none", fontWeight: 600 }}>
142
142
  {p.name}
143
143
  </a>
144
144
  <span style={{ opacity: 0.6, marginLeft: 8 }}>
145
145
  {p.status === "online" ? "🟢 online" : "⚪ offline"} · {p.memoryCount} memories · {p.artifactCount} artifacts
146
146
  </span>
147
- <a href={`/chat/${p.id}`} style={{ float: "right", color: "#7aa2ff" }}>chat →</a>
147
+ <a href={`/chat/${p.id}`} style={{ float: "right", color: "#742220" }}>chat →</a>
148
148
  </li>
149
149
  ))}
150
150
  </ul>
@@ -153,7 +153,7 @@ export default function BrainPage() {
153
153
  }
154
154
 
155
155
  const card: React.CSSProperties = {
156
- border: "1px solid #1f2a3a",
156
+ border: "1px solid rgba(45,74,62,.28)",
157
157
  borderRadius: 8,
158
158
  padding: "12px 16px",
159
159
  marginBottom: 8,
@@ -161,8 +161,8 @@ const card: React.CSSProperties = {
161
161
  const btn: React.CSSProperties = {
162
162
  padding: "8px 14px",
163
163
  borderRadius: 8,
164
- border: "1px solid #2b5cff",
165
- background: "#2b5cff",
166
- color: "white",
164
+ border: "1px solid #742220",
165
+ background: "#742220",
166
+ color: "#fef9e1",
167
167
  cursor: "pointer",
168
168
  };
@@ -72,13 +72,13 @@ export default function ChatPage({ params }: { params: Promise<{ projectId: stri
72
72
 
73
73
  return (
74
74
  <main style={{ maxWidth: 760, margin: "0 auto", padding: "32px 24px", display: "flex", flexDirection: "column", height: "90vh" }}>
75
- <a href={`/brain/${projectId}`} style={{ color: "#7aa2ff" }}>← {projectId}</a>
75
+ <a href={`/brain/${projectId}`} style={{ color: "#742220" }}>← {projectId}</a>
76
76
  <h1 style={{ fontSize: 20 }}>💬 Chat · {projectId}</h1>
77
77
 
78
- <div style={{ flex: 1, overflowY: "auto", border: "1px solid #1f2a3a", borderRadius: 8, padding: 16, margin: "12px 0" }}>
78
+ <div style={{ flex: 1, overflowY: "auto", border: "1px solid rgba(45,74,62,.28)", borderRadius: 8, padding: 16, margin: "12px 0", background: "#fffdf2" }}>
79
79
  {turns.map((t, i) => (
80
80
  <div key={i} style={{ marginBottom: 14 }}>
81
- <strong style={{ color: t.role === "user" ? "#e6edf3" : "#7aa2ff" }}>{t.role === "user" ? "you" : "agent"}</strong>
81
+ <strong style={{ color: t.role === "user" ? "#2d4a3e" : "#742220" }}>{t.role === "user" ? "you" : "agent"}</strong>
82
82
  <div style={{ whiteSpace: "pre-wrap", marginTop: 2 }}>{t.content || "…"}</div>
83
83
  </div>
84
84
  ))}
@@ -91,7 +91,7 @@ export default function ChatPage({ params }: { params: Promise<{ projectId: stri
91
91
  </label>
92
92
  <span style={{ fontSize: 13 }}>
93
93
  {saveMsg && <span style={{ opacity: 0.6, marginRight: 8 }}>{saveMsg}</span>}
94
- <button onClick={saveLastToMemory} disabled={turns.length === 0} style={{ padding: "4px 10px", borderRadius: 6, border: "1px solid #1f2a3a", background: "#111824", color: "#e6edf3", cursor: "pointer" }}>
94
+ <button onClick={saveLastToMemory} disabled={turns.length === 0} style={{ padding: "4px 10px", borderRadius: 6, border: "1px solid rgba(45,74,62,.32)", background: "#fffdf2", color: "#2d4a3e", cursor: "pointer" }}>
95
95
  💾 Save to memory
96
96
  </button>
97
97
  </span>
@@ -102,9 +102,9 @@ export default function ChatPage({ params }: { params: Promise<{ projectId: stri
102
102
  onChange={(e) => setInput(e.target.value)}
103
103
  onKeyDown={(e) => e.key === "Enter" && send()}
104
104
  placeholder="Ask about this project…"
105
- style={{ flex: 1, padding: "10px 12px", borderRadius: 8, border: "1px solid #1f2a3a", background: "#111824", color: "#e6edf3" }}
105
+ style={{ flex: 1, padding: "10px 12px", borderRadius: 8, border: "1px solid rgba(45,74,62,.32)", background: "#fffdf2", color: "#2d4a3e" }}
106
106
  />
107
- <button onClick={send} disabled={busy} style={{ padding: "10px 16px", borderRadius: 8, border: "1px solid #2b5cff", background: "#2b5cff", color: "white", cursor: "pointer" }}>
107
+ <button onClick={send} disabled={busy} style={{ padding: "10px 16px", borderRadius: 8, border: "1px solid #742220", background: "#742220", color: "#fef9e1", cursor: "pointer" }}>
108
108
  {busy ? "…" : "Send"}
109
109
  </button>
110
110
  </div>
@@ -0,0 +1,21 @@
1
+ :root {
2
+ --mop-red: #742220;
3
+ --mop-green: #2d4a3e;
4
+ --mop-cream: #fef9e1;
5
+ --mop-paper: #fffdf2;
6
+ --mop-muted: #8b8b7f;
7
+ }
8
+
9
+ * { box-sizing: border-box; }
10
+ html { color-scheme: light; }
11
+ body { min-height: 100vh; }
12
+ ::selection { background: #742220; color: #fef9e1; }
13
+
14
+ @media (max-width: 760px) {
15
+ .mop-setup-shell { grid-template-columns: 1fr !important; }
16
+ .mop-setup-brand { min-height: 34vh; padding: 36px !important; }
17
+ .mop-setup-form { border-left: 0 !important; border-top: 1px solid #2d4a3e !important; }
18
+ .mop-assistant-shell { grid-template-columns: 1fr !important; }
19
+ .mop-assistant-sidebar { display: none !important; }
20
+ .mop-prompt-grid { grid-template-columns: 1fr !important; }
21
+ }