@clappstore/connect 0.6.1 → 0.7.1

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.
Files changed (60) hide show
  1. package/clapps/settings/README.md +74 -0
  2. package/clapps/settings/clapp.json +25 -0
  3. package/clapps/settings/components/ProviderEditor.tsx +512 -0
  4. package/clapps/settings/components/ProviderList.tsx +300 -0
  5. package/clapps/settings/components/SessionList.tsx +189 -0
  6. package/clapps/settings/handlers/settings-handler.js +760 -0
  7. package/clapps/settings/views/default.settings.view.md +38 -0
  8. package/clapps/settings/views/settings.app.md +12 -0
  9. package/dist/clapp-handler.d.ts +16 -0
  10. package/dist/clapp-handler.d.ts.map +1 -0
  11. package/dist/clapp-handler.js +2 -0
  12. package/dist/clapp-handler.js.map +1 -0
  13. package/dist/clapp-loader.d.ts +3 -0
  14. package/dist/clapp-loader.d.ts.map +1 -0
  15. package/dist/clapp-loader.js +61 -0
  16. package/dist/clapp-loader.js.map +1 -0
  17. package/dist/defaults.d.ts +9 -5
  18. package/dist/defaults.d.ts.map +1 -1
  19. package/dist/defaults.js +130 -79
  20. package/dist/defaults.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +57 -89
  24. package/dist/index.js.map +1 -1
  25. package/dist/server.d.ts +14 -0
  26. package/dist/server.d.ts.map +1 -0
  27. package/dist/server.js +204 -0
  28. package/dist/server.js.map +1 -0
  29. package/package.json +13 -5
  30. package/web-app/assets/index-BYIO2GGA.css +1 -0
  31. package/web-app/assets/index-kbnfuSZC.js +128 -0
  32. package/web-app/index.html +13 -0
  33. package/dist/agent-client.d.ts +0 -28
  34. package/dist/agent-client.d.ts.map +0 -1
  35. package/dist/agent-client.js +0 -159
  36. package/dist/agent-client.js.map +0 -1
  37. package/dist/agent-handler.d.ts +0 -18
  38. package/dist/agent-handler.d.ts.map +0 -1
  39. package/dist/agent-handler.js +0 -17
  40. package/dist/agent-handler.js.map +0 -1
  41. package/dist/credentials.d.ts +0 -5
  42. package/dist/credentials.d.ts.map +0 -1
  43. package/dist/credentials.js +0 -32
  44. package/dist/credentials.js.map +0 -1
  45. package/dist/intent-poller.d.ts +0 -22
  46. package/dist/intent-poller.d.ts.map +0 -1
  47. package/dist/intent-poller.js +0 -51
  48. package/dist/intent-poller.js.map +0 -1
  49. package/dist/relay-client.d.ts +0 -16
  50. package/dist/relay-client.d.ts.map +0 -1
  51. package/dist/relay-client.js +0 -121
  52. package/dist/relay-client.js.map +0 -1
  53. package/dist/settings-handler.d.ts +0 -26
  54. package/dist/settings-handler.d.ts.map +0 -1
  55. package/dist/settings-handler.js +0 -149
  56. package/dist/settings-handler.js.map +0 -1
  57. package/dist/state-watcher.d.ts +0 -23
  58. package/dist/state-watcher.d.ts.map +0 -1
  59. package/dist/state-watcher.js +0 -121
  60. package/dist/state-watcher.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import { resolve } from "node:path";
2
+ import { resolve, dirname } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { mkdirSync } from "node:fs";
5
+ import { fileURLToPath } from "node:url";
5
6
  import { AgentClient } from "./agent-client.js";
6
7
  import { AgentHandler } from "./agent-handler.js";
7
- import { IntentPoller } from "./intent-poller.js";
8
- import { RelayClient } from "./relay-client.js";
9
- import { loadToken, saveToken, CREDENTIALS_PATH } from "./credentials.js";
10
- import { seedDefaults, checkAuthStatus, pushDefaults } from "./defaults.js";
11
- import { SettingsHandler } from "./settings-handler.js";
8
+ import { StateStore } from "./state-store.js";
9
+ import { startServer } from "./server.js";
10
+ import { seedDefaults, checkAuthStatus, getBundledClappsDir } from "./defaults.js";
11
+ import { loadClappHandlers } from "./clapp-loader.js";
12
12
  function parseArgs(args) {
13
13
  const opts = {};
14
14
  for (let i = 0; i < args.length; i++) {
@@ -19,125 +19,93 @@ function parseArgs(args) {
19
19
  }
20
20
  return opts;
21
21
  }
22
- async function selfRegister(relayUrl, agentId) {
23
- const res = await fetch(`${relayUrl}/api/agent/register`, {
24
- method: "POST",
25
- headers: { "Content-Type": "application/json" },
26
- body: JSON.stringify({ agentId }),
27
- });
28
- if (res.status === 409) {
29
- console.error(`❌ Agent ID "${agentId}" is already registered. If this is your agent, use --token YOUR_TOKEN`);
30
- process.exit(1);
31
- }
32
- if (!res.ok) {
33
- const body = await res.text();
34
- throw new Error(`Registration failed (${res.status}): ${body}`);
35
- }
36
- const { token } = (await res.json());
37
- return token;
38
- }
39
- async function resolveToken(relayUrl, agentId, explicitToken) {
40
- // 1. Explicit --token flag wins
41
- if (explicitToken)
42
- return explicitToken;
43
- // 2. Try saved credentials
44
- const saved = loadToken(relayUrl, agentId);
45
- if (saved)
46
- return saved;
47
- // 3. Self-register
48
- const token = await selfRegister(relayUrl, agentId);
49
- saveToken(relayUrl, agentId, token);
50
- console.log(`✅ Registered agent "${agentId}" (token saved to ${CREDENTIALS_PATH})`);
51
- return token;
52
- }
53
22
  async function main() {
54
23
  const opts = parseArgs(process.argv.slice(2));
55
- const relayUrl = opts.relay ?? "https://clapps.clawlab.app";
56
- const explicitToken = opts.token;
57
- const agentId = opts["agent-id"];
24
+ const port = parseInt(opts.port ?? "3080", 10);
58
25
  const agentToken = opts["agent-token"];
59
26
  const session = opts.session ?? "agent:main:main";
60
27
  const stateDir = opts["state-dir"] ??
61
28
  resolve(homedir(), ".openclaw", "workspace", "ui", "state");
62
29
  const viewsDir = opts["views-dir"] ??
63
30
  resolve(homedir(), ".openclaw", "workspace", "ui", "views");
64
- if (!agentId) {
65
- console.error("Usage: clapps-connect --agent-id AGENT_ID [--token TOKEN] [--relay URL] [--agent-token TOKEN] [--session SESSION] [--views-dir PATH]");
66
- process.exit(1);
67
- }
68
- console.log(`🔗 Connecting to relay: ${relayUrl}`);
69
- const token = await resolveToken(relayUrl, agentId, explicitToken);
70
31
  // Ensure directories exist
71
32
  mkdirSync(stateDir, { recursive: true });
72
33
  mkdirSync(viewsDir, { recursive: true });
73
- // 1. Create RelayClient
74
- const relay = new RelayClient({ relayUrl, token, agentId });
34
+ // 1. Create in-memory state store
35
+ const store = new StateStore();
75
36
  // 2. Seed defaults to disk
76
37
  seedDefaults(viewsDir, stateDir);
77
38
  checkAuthStatus(stateDir);
78
- const settingsHandler = new SettingsHandler({ stateDir, relay });
79
- settingsHandler.writeSettingsState();
80
- // 3. Push everything to relay (retried, awaited)
81
- await pushDefaults(relay, viewsDir, stateDir);
82
- console.log(`🤖 Agent ID: ${agentId}`);
83
- console.log(`📁 State dir: ${stateDir}`);
84
- console.log(`📄 Views dir: ${viewsDir}`);
85
- // Create/reuse a stable link token for browser access
86
- try {
87
- const linkRes = await fetch(`${relayUrl}/api/agent/links`, {
88
- method: "POST",
89
- headers: {
90
- "Content-Type": "application/json",
91
- Authorization: `Bearer ${token}`,
92
- },
93
- body: JSON.stringify({ agentId }),
94
- });
95
- if (linkRes.ok) {
96
- const link = (await linkRes.json());
97
- const browserUrl = `${relayUrl}/?agentId=${encodeURIComponent(agentId)}&link=${encodeURIComponent(link.linkToken)}`;
98
- console.log(`\n🌐 Open in browser: ${browserUrl}`);
99
- console.log(` (stable link — reuse across restarts)\n`);
100
- }
101
- else {
102
- console.warn(`⚠️ Failed to create link: ${linkRes.status}`);
103
- }
104
- }
105
- catch (err) {
106
- console.warn(`⚠️ Could not create link: ${err instanceof Error ? err.message : err}`);
107
- }
39
+ // 3. Load clapp handlers dynamically
40
+ const handlerContext = {
41
+ stateDir,
42
+ setState: (id, state) => store.setState(id, state),
43
+ checkAuthStatus: () => checkAuthStatus(stateDir),
44
+ };
45
+ const handlers = await loadClappHandlers(getBundledClappsDir(), handlerContext);
46
+ for (const h of handlers)
47
+ h.init?.();
108
48
  // 4. Start ACP subprocess
109
49
  const agentClient = new AgentClient({
110
50
  session,
111
51
  agentToken,
112
52
  onError: (err) => console.error("[acp]", err.message),
113
53
  });
54
+ let agentStarted = false;
114
55
  try {
115
56
  await agentClient.start();
57
+ agentStarted = true;
116
58
  }
117
59
  catch (err) {
118
60
  console.error(`⚠️ ACP failed to start: ${err instanceof Error ? err.message : err}`);
119
61
  console.error(" Intent processing will not work until ACP is available.");
120
62
  }
121
- // 5. Start polling for intents
63
+ // 5. Create agent handler (syncs disk → store after intents)
122
64
  const agentHandler = new AgentHandler({
123
65
  agentClient,
124
- relay,
66
+ store,
125
67
  stateDir,
126
68
  viewsDir,
127
69
  });
128
- const intentPoller = new IntentPoller({
129
- relayUrl,
130
- token,
131
- agentId,
132
- agentHandler,
133
- onIntent: settingsHandler.handleIntent,
134
- onError: (err) => console.error("[intent-poller]", err.message),
70
+ // 6. Initial sync: load all disk state into the store
71
+ await agentHandler.syncToStore();
72
+ // 7. Resolve static SPA directory
73
+ const __dirname = dirname(fileURLToPath(import.meta.url));
74
+ const staticDir = resolve(__dirname, "..", "web-app");
75
+ // 8. Start HTTP + WebSocket server
76
+ const server = startServer({
77
+ port,
78
+ store,
79
+ staticDir,
80
+ agentConnected: () => agentStarted,
81
+ onConnect: () => {
82
+ for (const h of handlers)
83
+ h.onConnect?.();
84
+ },
85
+ onIntent: (intent, _context) => {
86
+ // Let clapp handlers intercept first
87
+ for (const h of handlers) {
88
+ if (h.handleIntent(intent))
89
+ return;
90
+ }
91
+ // Forward to agent
92
+ agentHandler.handleIntent(intent).catch((err) => {
93
+ console.error(`[intent] ${err.message}`);
94
+ });
95
+ },
135
96
  });
136
- intentPoller.start();
97
+ // 9. Periodic refresh to detect external config changes (every 10s)
98
+ const refreshInterval = setInterval(() => {
99
+ for (const h of handlers)
100
+ h.refresh?.();
101
+ }, 10_000);
102
+ console.log(`📁 State dir: ${stateDir}`);
103
+ console.log(`📄 Views dir: ${viewsDir}`);
137
104
  // Graceful shutdown
138
105
  process.on("SIGINT", () => {
139
106
  console.log("\nShutting down...");
140
- intentPoller.stop();
107
+ clearInterval(refreshInterval);
108
+ server.close();
141
109
  agentClient.stop();
142
110
  process.exit(0);
143
111
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { IntentMessage } from "@clapps/core";
2
+ import { StateStore, type ClientContext } from "./state-store.js";
3
+ export interface ServerOptions {
4
+ port: number;
5
+ store: StateStore;
6
+ onIntent: (intent: IntentMessage, context?: ClientContext) => void;
7
+ staticDir?: string;
8
+ agentConnected?: () => boolean;
9
+ onConnect?: () => void;
10
+ }
11
+ export declare function startServer(options: ServerOptions): {
12
+ close: () => void;
13
+ };
14
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAcD,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAuCzE"}
package/dist/server.js ADDED
@@ -0,0 +1,204 @@
1
+ import { createServer } from "node:http";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolve, extname } from "node:path";
4
+ import { existsSync } from "node:fs";
5
+ import { WebSocketServer } from "ws";
6
+ import { StateStore } from "./state-store.js";
7
+ const MIME_TYPES = {
8
+ ".html": "text/html",
9
+ ".js": "text/javascript",
10
+ ".css": "text/css",
11
+ ".json": "application/json",
12
+ ".png": "image/png",
13
+ ".svg": "image/svg+xml",
14
+ ".ico": "image/x-icon",
15
+ ".woff": "font/woff",
16
+ ".woff2": "font/woff2",
17
+ };
18
+ export function startServer(options) {
19
+ const { port, store, onIntent, staticDir, agentConnected, onConnect } = options;
20
+ const server = createServer((req, res) => {
21
+ handleRequest(req, res, store, onIntent, staticDir, agentConnected);
22
+ });
23
+ const wss = new WebSocketServer({ server });
24
+ wss.on("connection", (ws) => {
25
+ const client = store.addClient(ws);
26
+ // Notify that a client connected (for state refresh)
27
+ onConnect?.();
28
+ ws.on("message", (raw) => {
29
+ try {
30
+ const msg = JSON.parse(String(raw));
31
+ handleWsMessage(msg, client, store, onIntent);
32
+ }
33
+ catch {
34
+ // Ignore malformed messages
35
+ }
36
+ });
37
+ ws.on("close", () => {
38
+ store.removeClient(client);
39
+ });
40
+ });
41
+ server.listen(port, () => {
42
+ console.log(`\n🌐 Server running at http://localhost:${port}`);
43
+ });
44
+ return {
45
+ close: () => {
46
+ wss.close();
47
+ server.close();
48
+ },
49
+ };
50
+ }
51
+ function handleWsMessage(msg, client, store, onIntent) {
52
+ switch (msg.type) {
53
+ case "hello": {
54
+ client.context = msg.context;
55
+ break;
56
+ }
57
+ case "subscribe": {
58
+ const clappIds = msg.clappIds;
59
+ if (Array.isArray(clappIds)) {
60
+ store.subscribe(client, clappIds);
61
+ }
62
+ break;
63
+ }
64
+ case "intent": {
65
+ const intent = {
66
+ id: crypto.randomUUID(),
67
+ agentId: "local",
68
+ clappId: msg.clappId ?? "",
69
+ intent: msg.intent,
70
+ payload: msg.payload ?? {},
71
+ timestamp: new Date().toISOString(),
72
+ };
73
+ onIntent(intent, client.context);
74
+ break;
75
+ }
76
+ }
77
+ }
78
+ async function handleRequest(req, res, store, onIntent, staticDir, agentConnected) {
79
+ const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
80
+ const path = url.pathname;
81
+ // CORS headers for all responses
82
+ res.setHeader("Access-Control-Allow-Origin", "*");
83
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
84
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
85
+ if (req.method === "OPTIONS") {
86
+ res.writeHead(204);
87
+ res.end();
88
+ return;
89
+ }
90
+ // API routes
91
+ if (path.startsWith("/api/")) {
92
+ return handleApi(req, res, path, store, onIntent, agentConnected);
93
+ }
94
+ // Serve static SPA files
95
+ if (staticDir) {
96
+ return serveStatic(req, res, path, staticDir);
97
+ }
98
+ res.writeHead(404, { "Content-Type": "text/plain" });
99
+ res.end("Not Found");
100
+ }
101
+ async function handleApi(req, res, path, store, onIntent, agentConnected) {
102
+ // GET /api/apps
103
+ if (path === "/api/apps" && req.method === "GET") {
104
+ json(res, store.getApps());
105
+ return;
106
+ }
107
+ // GET /api/state/:clappId
108
+ const stateMatch = path.match(/^\/api\/state\/([^/]+)$/);
109
+ if (stateMatch && req.method === "GET") {
110
+ const state = store.getState(stateMatch[1]);
111
+ if (!state) {
112
+ res.writeHead(404, { "Content-Type": "application/json" });
113
+ res.end(JSON.stringify({ error: "not found" }));
114
+ return;
115
+ }
116
+ json(res, state);
117
+ return;
118
+ }
119
+ // GET /api/views/:viewId
120
+ const viewMatch = path.match(/^\/api\/views\/([^/]+)$/);
121
+ if (viewMatch && req.method === "GET") {
122
+ const content = store.getView(viewMatch[1]);
123
+ if (!content) {
124
+ res.writeHead(404, { "Content-Type": "text/plain" });
125
+ res.end("not found");
126
+ return;
127
+ }
128
+ res.writeHead(200, { "Content-Type": "text/plain" });
129
+ res.end(content);
130
+ return;
131
+ }
132
+ // POST /api/intent
133
+ if (path === "/api/intent" && req.method === "POST") {
134
+ const body = await readBody(req);
135
+ try {
136
+ const data = JSON.parse(body);
137
+ const intent = {
138
+ id: data.id ?? crypto.randomUUID(),
139
+ agentId: data.agentId ?? "local",
140
+ clappId: data.clappId ?? "",
141
+ intent: data.intent,
142
+ payload: data.payload ?? {},
143
+ timestamp: data.timestamp ?? new Date().toISOString(),
144
+ };
145
+ onIntent(intent);
146
+ json(res, { ok: true });
147
+ }
148
+ catch {
149
+ res.writeHead(400, { "Content-Type": "application/json" });
150
+ res.end(JSON.stringify({ error: "invalid JSON" }));
151
+ }
152
+ return;
153
+ }
154
+ // GET /api/health
155
+ if (path === "/api/health" && req.method === "GET") {
156
+ json(res, {
157
+ status: "ok",
158
+ agent: agentConnected ? agentConnected() : false,
159
+ });
160
+ return;
161
+ }
162
+ res.writeHead(404, { "Content-Type": "application/json" });
163
+ res.end(JSON.stringify({ error: "not found" }));
164
+ }
165
+ async function serveStatic(_req, res, path, staticDir) {
166
+ // Normalize path
167
+ let filePath = path === "/" ? "/index.html" : path;
168
+ // Security: prevent directory traversal
169
+ const resolved = resolve(staticDir, filePath.slice(1));
170
+ if (!resolved.startsWith(resolve(staticDir))) {
171
+ res.writeHead(403);
172
+ res.end("Forbidden");
173
+ return;
174
+ }
175
+ // Try the exact file, then fall back to index.html (SPA routing)
176
+ let target = resolved;
177
+ if (!existsSync(target)) {
178
+ target = resolve(staticDir, "index.html");
179
+ }
180
+ try {
181
+ const content = await readFile(target);
182
+ const ext = extname(target);
183
+ const mime = MIME_TYPES[ext] ?? "application/octet-stream";
184
+ res.writeHead(200, { "Content-Type": mime });
185
+ res.end(content);
186
+ }
187
+ catch {
188
+ res.writeHead(404, { "Content-Type": "text/plain" });
189
+ res.end("Not Found");
190
+ }
191
+ }
192
+ function json(res, data) {
193
+ res.writeHead(200, { "Content-Type": "application/json" });
194
+ res.end(JSON.stringify(data));
195
+ }
196
+ function readBody(req) {
197
+ return new Promise((resolve, reject) => {
198
+ const chunks = [];
199
+ req.on("data", (chunk) => chunks.push(chunk));
200
+ req.on("end", () => resolve(Buffer.concat(chunks).toString()));
201
+ req.on("error", reject);
202
+ });
203
+ }
204
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,19 +1,27 @@
1
1
  {
2
2
  "name": "@clappstore/connect",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "clapps-connect": "./dist/index.js"
7
7
  },
8
- "files": ["dist"],
8
+ "files": [
9
+ "dist",
10
+ "web-app",
11
+ "clapps"
12
+ ],
9
13
  "publishConfig": {
10
14
  "access": "public"
11
15
  },
12
16
  "scripts": {
13
- "build": "tsc",
14
- "clean": "rm -rf dist"
17
+ "build": "tsc && tsc -p tsconfig.clapps.json && node scripts/build-clapps.mjs",
18
+ "clean": "rm -rf dist clapps"
19
+ },
20
+ "dependencies": {
21
+ "ws": "^8.18.0"
15
22
  },
16
23
  "devDependencies": {
17
- "@clapps/core": "workspace:*"
24
+ "@clapps/core": "workspace:*",
25
+ "@types/ws": "^8.5.13"
18
26
  }
19
27
  }
@@ -0,0 +1 @@
1
+ :root{--bg: #0a0a0a;--fg: #ededed;--muted: #888;--border: #222;--accent: #3b82f6;--card-bg: #111;--sidebar-bg: #0d0d0d;--hover-bg: #1a1a1a;--active-bg: #1e293b;--skeleton-bg: #1a1a1a;--skeleton-shine: #222;--radius: 8px;--font-mono: "SF Mono", "Fira Code", "Fira Mono", Menlo, monospace;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;background:var(--bg);color:var(--fg);font-family:var(--font-sans);-webkit-font-smoothing:antialiased}#root{height:100%}.clapp-shell{height:100vh;display:flex;flex-direction:column}.clapp-app{flex:1;display:flex;min-height:0;overflow:hidden}.clapp-heading{font-weight:600;letter-spacing:-.02em}h1.clapp-heading{font-size:1.5rem}h2.clapp-heading{font-size:1.25rem}h3.clapp-heading{font-size:1rem}.clapp-btn{display:inline-flex;align-items:center;gap:.375rem;border:1px solid var(--border);border-radius:var(--radius);background:transparent;color:var(--fg);cursor:pointer;font-family:inherit;transition:background .15s}.clapp-btn:hover{background:var(--hover-bg)}.clapp-btn-ghost{border-color:transparent}.clapp-btn-sm{padding:.25rem .5rem;font-size:.8125rem}.clapp-btn-md{padding:.5rem 1rem;font-size:.875rem}.clapp-list{list-style:none;display:flex;flex-direction:column}.clapp-list-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:var(--radius);cursor:pointer;font-size:.875rem;color:var(--fg);transition:background .15s}.clapp-list-item:hover{background:var(--hover-bg)}.clapp-list-item.active{background:var(--active-bg);color:var(--accent)}.clapp-icon{font-size:1rem;line-height:1}.clapp-skeleton{display:flex;flex-direction:column;gap:.5rem;padding:.5rem 0}.clapp-skeleton-line{height:1rem;background:linear-gradient(90deg,var(--skeleton-bg) 25%,var(--skeleton-shine) 50%,var(--skeleton-bg) 75%);background-size:200% 100%;animation:skeleton-shimmer 1.5s ease-in-out infinite;border-radius:4px}.clapp-skeleton-line:nth-child(odd){width:80%}.clapp-skeleton-line:nth-child(2n){width:60%}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.clapp-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--card-bg);overflow:hidden}.clapp-card-header{padding:.75rem 1rem;border-bottom:1px solid var(--border);font-weight:600;font-size:.875rem}.clapp-card-body{padding:1rem}.clapp-markdown{font-size:.9375rem;line-height:1.7;max-width:72ch}.clapp-markdown h1{font-size:1.5rem;font-weight:700;margin:1.5rem 0 .75rem}.clapp-markdown h2{font-size:1.25rem;font-weight:600;margin:1.25rem 0 .5rem}.clapp-markdown h3{font-size:1.1rem;font-weight:600;margin:1rem 0 .5rem}.clapp-markdown p{margin:.75rem 0}.clapp-markdown ul,.clapp-markdown ol{margin:.5rem 0;padding-left:1.5rem}.clapp-markdown li{margin:.25rem 0}.clapp-markdown code{font-family:var(--font-mono);background:var(--hover-bg);padding:.15em .35em;border-radius:4px;font-size:.85em}.clapp-markdown pre{background:var(--card-bg);border:1px solid var(--border);border-radius:var(--radius);padding:1rem;overflow-x:auto;margin:.75rem 0}.clapp-markdown pre code{background:none;padding:0}.clapp-markdown blockquote{border-left:3px solid var(--accent);padding-left:1rem;color:var(--muted);margin:.75rem 0}.clapp-markdown hr{border:none;border-top:1px solid var(--border);margin:1.5rem 0}.clapp-markdown a{color:var(--accent);text-decoration:none}.clapp-markdown a:hover{text-decoration:underline}.clapp-empty{color:var(--muted);font-size:.875rem;padding:2rem;text-align:center}.clapp-error{color:#ef4444;font-size:.875rem;padding:.5rem}.clapp-module{height:100%;overflow-y:auto}.home-shell{position:relative;height:100vh;overflow:hidden}.home-shell-layer{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;overflow-y:auto}.home-screen-layer{transition:transform .3s ease,opacity .3s ease;z-index:1}.home-screen-hidden{transform:translate(-30%);opacity:0;pointer-events:none}.app-layer{z-index:2;transform:translate(100%);opacity:0;transition:transform .3s ease,opacity .3s ease}.app-layer-visible{transform:translate(0);opacity:1}.app-back-btn{position:absolute;top:.75rem;left:.75rem;z-index:10;display:inline-flex;align-items:center;gap:.125rem;background:var(--card-bg);border:1px solid var(--border);border-radius:var(--radius);color:var(--accent);font-family:var(--font-sans);font-size:.8125rem;padding:.25rem .625rem .25rem .375rem;cursor:pointer;transition:background .15s}.app-back-btn:hover{background:var(--hover-bg)}