harshlocham commited on
Commit
f0f2f77
·
1 Parent(s): a416f07

Refactor code structure for improved readability and maintainability

Browse files
.gitignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ .env
2
+ .DS_Store
3
+ node_modules
4
+ .next
5
+ dist
6
+ out
7
+ build
Dockerfile ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:20-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY package.json package-lock.json ./
6
+ COPY turbo.json tsconfig.json ./
7
+ COPY apps ./apps
8
+ COPY packages ./packages
9
+
10
+ RUN npm ci --include=dev --legacy-peer-deps
11
+ RUN npm run build --workspace=@chat/hf-demo
12
+
13
+ EXPOSE 3000
14
+
15
+ CMD ["npm", "run", "start", "--workspace=@chat/hf-demo"]
app/api/run-task/route.ts ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { randomUUID } from "node:crypto";
2
+ import { NextResponse } from "next/server";
3
+
4
+ export const dynamic = "force-dynamic";
5
+
6
+ type RunTaskBody = {
7
+ prompt?: string;
8
+ };
9
+
10
+ type ExecutionStep = {
11
+ stepId: string;
12
+ title: string;
13
+ description: string;
14
+ kind: "decision" | "tool_call" | "validation";
15
+ order: number;
16
+ };
17
+
18
+ type ExecutionPlan = {
19
+ goal: string;
20
+ successDefinition: string;
21
+ steps: ExecutionStep[];
22
+ };
23
+
24
+ function buildPlan(prompt: string): ExecutionPlan {
25
+ return {
26
+ goal: prompt,
27
+ successDefinition: "Generate a clear, concise response to the prompt.",
28
+ steps: [
29
+ {
30
+ stepId: "step-1-prep",
31
+ title: "Prepare context",
32
+ description: "Read the prompt and set up the execution context.",
33
+ kind: "decision",
34
+ order: 1,
35
+ },
36
+ {
37
+ stepId: "step-2-call",
38
+ title: "Call LLM provider",
39
+ description: "Use the configured LLM provider to generate a response.",
40
+ kind: "tool_call",
41
+ order: 2,
42
+ },
43
+ {
44
+ stepId: "step-3-done",
45
+ title: "Return result",
46
+ description: "Format and return the final response.",
47
+ kind: "validation",
48
+ order: 3,
49
+ },
50
+ ],
51
+ };
52
+ }
53
+
54
+ function formatTrace(plan: ExecutionPlan): string[] {
55
+ const trace = [
56
+ `Goal: ${plan.goal}`,
57
+ `Success definition: ${plan.successDefinition}`,
58
+ ];
59
+
60
+ for (const step of plan.steps) {
61
+ trace.push(`${step.order}. ${step.title} [${step.kind}] — ${step.description}`);
62
+ }
63
+
64
+ return trace;
65
+ }
66
+
67
+ async function callLlm(prompt: string, systemPrompt: string): Promise<string> {
68
+ const apiKey = process.env.OPENAI_API_KEY || "";
69
+ const model = process.env.HF_DEMO_MODEL || "gpt-4o-mini";
70
+ const baseUrl = process.env.OPENAI_BASE_URL || "https://api.openai.com/v1";
71
+
72
+ if (!apiKey) {
73
+ return "LLM API key not configured (OPENAI_API_KEY).";
74
+ }
75
+
76
+ try {
77
+ const response = await fetch(`${baseUrl}/chat/completions`, {
78
+ method: "POST",
79
+ headers: {
80
+ "Content-Type": "application/json",
81
+ Authorization: `Bearer ${apiKey}`,
82
+ },
83
+ body: JSON.stringify({
84
+ model,
85
+ messages: [
86
+ { role: "system", content: systemPrompt },
87
+ { role: "user", content: prompt },
88
+ ],
89
+ temperature: 0.2,
90
+ max_tokens: 1024,
91
+ }),
92
+ });
93
+
94
+ const data = (await response.json()) as Record<string, unknown>;
95
+
96
+ if (!response.ok) {
97
+ const errorMsg = (data as Record<string, unknown>).error;
98
+ return `LLM error: ${typeof errorMsg === "object" ? JSON.stringify(errorMsg) : errorMsg}`;
99
+ }
100
+
101
+ const choices = data.choices as unknown[];
102
+ if (!Array.isArray(choices) || !choices[0]) return "No response from LLM.";
103
+
104
+ const choice = choices[0] as Record<string, unknown>;
105
+ const message = choice.message as Record<string, unknown> | undefined;
106
+ if (!message) return "No content in LLM response.";
107
+
108
+ const content = message.content;
109
+ return typeof content === "string" ? content.trim() : "";
110
+ } catch (error) {
111
+ const msg = error instanceof Error ? error.message : String(error);
112
+ return `Failed to call LLM: ${msg}`;
113
+ }
114
+ }
115
+
116
+ export async function POST(request: Request) {
117
+ let body: RunTaskBody;
118
+
119
+ try {
120
+ body = (await request.json()) as RunTaskBody;
121
+ } catch {
122
+ body = {};
123
+ }
124
+
125
+ const prompt = typeof body.prompt === "string" ? body.prompt.trim() : "";
126
+
127
+ if (!prompt) {
128
+ return NextResponse.json(
129
+ { error: "Prompt is required." },
130
+ { status: 400 }
131
+ );
132
+ }
133
+
134
+ const plan = buildPlan(prompt);
135
+ const taskId = randomUUID();
136
+ const conversationId = randomUUID();
137
+ const providerLabel = process.env.LLM_PROVIDER || "openai";
138
+
139
+ // Generate the final result using the LLM
140
+ const finalResult = await callLlm(
141
+ prompt,
142
+ "You are a helpful assistant. Provide a clear, concise response."
143
+ );
144
+
145
+ return NextResponse.json({
146
+ providerUsed: providerLabel,
147
+ goal: plan.goal,
148
+ successDefinition: plan.successDefinition,
149
+ executionTrace: formatTrace(plan),
150
+ finalResult: finalResult || `Processed prompt: ${prompt.slice(0, 100)}...`,
151
+ planNotes: "Hackathon demo using minimal LLM provider abstraction.",
152
+ taskId,
153
+ conversationId,
154
+ });
155
+ }
app/globals.css ADDED
@@ -0,0 +1,343 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ color-scheme: dark;
3
+ --background: #060912;
4
+ --panel: rgba(11, 16, 30, 0.78);
5
+ --panel-strong: rgba(13, 20, 39, 0.94);
6
+ --panel-soft: rgba(255, 255, 255, 0.04);
7
+ --border: rgba(255, 255, 255, 0.1);
8
+ --text: #f5efe6;
9
+ --muted: rgba(245, 239, 230, 0.72);
10
+ --accent: #f0b76b;
11
+ --accent-2: #7fc7ff;
12
+ --shadow: 0 22px 80px rgba(0, 0, 0, 0.45);
13
+ }
14
+
15
+ * {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ html,
20
+ body {
21
+ margin: 0;
22
+ min-height: 100%;
23
+ }
24
+
25
+ body {
26
+ min-height: 100dvh;
27
+ font-family: var(--font-sans), sans-serif;
28
+ color: var(--text);
29
+ background:
30
+ radial-gradient(circle at top left, rgba(240, 183, 107, 0.24), transparent 30%),
31
+ radial-gradient(circle at 85% 15%, rgba(127, 199, 255, 0.2), transparent 26%),
32
+ linear-gradient(180deg, #07101d 0%, #04070d 100%);
33
+ }
34
+
35
+ body::before {
36
+ content: "";
37
+ position: fixed;
38
+ inset: 0;
39
+ pointer-events: none;
40
+ background-image: linear-gradient(rgba(255, 255, 255, 0.025) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.025) 1px, transparent 1px);
41
+ background-size: 64px 64px;
42
+ mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.85), transparent 95%);
43
+ opacity: 0.55;
44
+ }
45
+
46
+ button,
47
+ textarea {
48
+ font: inherit;
49
+ }
50
+
51
+ .app-shell {
52
+ position: relative;
53
+ z-index: 0;
54
+ max-width: 1200px;
55
+ margin: 0 auto;
56
+ padding: 32px;
57
+ }
58
+
59
+ .ambient {
60
+ position: fixed;
61
+ inset: auto;
62
+ border-radius: 999px;
63
+ filter: blur(18px);
64
+ opacity: 0.55;
65
+ pointer-events: none;
66
+ }
67
+
68
+ .ambient-one {
69
+ top: 56px;
70
+ left: 4vw;
71
+ width: 220px;
72
+ height: 220px;
73
+ background: rgba(240, 183, 107, 0.18);
74
+ }
75
+
76
+ .ambient-two {
77
+ right: 8vw;
78
+ top: 140px;
79
+ width: 180px;
80
+ height: 180px;
81
+ background: rgba(127, 199, 255, 0.16);
82
+ }
83
+
84
+ .hero {
85
+ margin-bottom: 24px;
86
+ padding: 28px;
87
+ }
88
+
89
+ .panel {
90
+ position: relative;
91
+ overflow: hidden;
92
+ border: 1px solid var(--border);
93
+ border-radius: 28px;
94
+ background: linear-gradient(180deg, var(--panel), var(--panel-strong));
95
+ box-shadow: var(--shadow);
96
+ backdrop-filter: blur(16px);
97
+ }
98
+
99
+ .panel::after {
100
+ content: "";
101
+ position: absolute;
102
+ inset: 0;
103
+ background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.05), transparent);
104
+ opacity: 0.24;
105
+ pointer-events: none;
106
+ }
107
+
108
+ .eyebrow,
109
+ .panel-kicker,
110
+ .hint,
111
+ dt,
112
+ .status-pill {
113
+ font-family: var(--font-mono), monospace;
114
+ letter-spacing: 0.08em;
115
+ text-transform: uppercase;
116
+ }
117
+
118
+ .eyebrow,
119
+ .panel-kicker {
120
+ margin: 0 0 10px;
121
+ color: var(--accent-2);
122
+ font-size: 0.72rem;
123
+ }
124
+
125
+ .hero h1,
126
+ .panel h2 {
127
+ margin: 0;
128
+ line-height: 1.08;
129
+ }
130
+
131
+ .hero h1 {
132
+ max-width: 12ch;
133
+ font-size: clamp(2.4rem, 7vw, 5.5rem);
134
+ letter-spacing: -0.05em;
135
+ }
136
+
137
+ .hero-copy {
138
+ max-width: 60ch;
139
+ margin: 16px 0 0;
140
+ color: var(--muted);
141
+ font-size: 1.02rem;
142
+ line-height: 1.7;
143
+ }
144
+
145
+ .workspace {
146
+ display: grid;
147
+ grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
148
+ gap: 20px;
149
+ align-items: start;
150
+ }
151
+
152
+ .form-panel,
153
+ .result-panel,
154
+ .trace-panel,
155
+ .output-panel {
156
+ padding: 24px;
157
+ }
158
+
159
+ .form-panel {
160
+ display: grid;
161
+ gap: 16px;
162
+ position: sticky;
163
+ top: 24px;
164
+ }
165
+
166
+ .label {
167
+ font-family: var(--font-mono), monospace;
168
+ font-size: 0.78rem;
169
+ letter-spacing: 0.08em;
170
+ text-transform: uppercase;
171
+ color: var(--muted);
172
+ }
173
+
174
+ .prompt-input {
175
+ min-height: 300px;
176
+ width: 100%;
177
+ resize: vertical;
178
+ border: 1px solid rgba(255, 255, 255, 0.12);
179
+ border-radius: 22px;
180
+ padding: 18px;
181
+ color: var(--text);
182
+ background: rgba(4, 7, 13, 0.5);
183
+ outline: none;
184
+ line-height: 1.65;
185
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
186
+ }
187
+
188
+ .prompt-input:focus {
189
+ border-color: rgba(127, 199, 255, 0.45);
190
+ box-shadow: 0 0 0 4px rgba(127, 199, 255, 0.08);
191
+ }
192
+
193
+ .actions {
194
+ display: flex;
195
+ flex-wrap: wrap;
196
+ gap: 12px;
197
+ align-items: center;
198
+ }
199
+
200
+ .run-button {
201
+ border: 0;
202
+ border-radius: 999px;
203
+ padding: 14px 20px;
204
+ color: #090d15;
205
+ background: linear-gradient(135deg, var(--accent), #ffe0a8);
206
+ font-weight: 700;
207
+ cursor: pointer;
208
+ box-shadow: 0 14px 30px rgba(240, 183, 107, 0.24);
209
+ }
210
+
211
+ .run-button:disabled {
212
+ opacity: 0.7;
213
+ cursor: progress;
214
+ }
215
+
216
+ .hint {
217
+ color: var(--muted);
218
+ font-size: 0.72rem;
219
+ }
220
+
221
+ .error-text {
222
+ margin: 0;
223
+ color: #ffb1b1;
224
+ }
225
+
226
+ .results-column {
227
+ display: grid;
228
+ gap: 20px;
229
+ }
230
+
231
+ .panel-header {
232
+ display: flex;
233
+ justify-content: space-between;
234
+ gap: 16px;
235
+ align-items: start;
236
+ margin-bottom: 18px;
237
+ }
238
+
239
+ .panel h2 {
240
+ font-size: 1.35rem;
241
+ }
242
+
243
+ .status-pill {
244
+ border-radius: 999px;
245
+ padding: 8px 12px;
246
+ font-size: 0.66rem;
247
+ color: #08111c;
248
+ background: linear-gradient(135deg, #c0ffb3, #f5ffe8);
249
+ }
250
+
251
+ .status-pill.muted {
252
+ color: var(--text);
253
+ background: rgba(255, 255, 255, 0.08);
254
+ }
255
+
256
+ .meta-grid {
257
+ display: grid;
258
+ gap: 16px;
259
+ margin: 0;
260
+ }
261
+
262
+ .meta-grid dt {
263
+ margin-bottom: 6px;
264
+ color: var(--accent-2);
265
+ font-size: 0.66rem;
266
+ }
267
+
268
+ .meta-grid dd {
269
+ margin: 0;
270
+ color: var(--muted);
271
+ line-height: 1.6;
272
+ }
273
+
274
+ .trace-list {
275
+ margin: 0;
276
+ padding-left: 1.2rem;
277
+ display: grid;
278
+ gap: 12px;
279
+ color: var(--muted);
280
+ line-height: 1.6;
281
+ }
282
+
283
+ .plan-notes {
284
+ margin: 18px 0 0;
285
+ color: var(--accent-2);
286
+ font-size: 0.92rem;
287
+ }
288
+
289
+ .output-box {
290
+ margin: 0;
291
+ white-space: pre-wrap;
292
+ word-break: break-word;
293
+ color: var(--text);
294
+ font-family: var(--font-mono), monospace;
295
+ line-height: 1.7;
296
+ background: rgba(4, 7, 13, 0.48);
297
+ border: 1px solid rgba(255, 255, 255, 0.08);
298
+ border-radius: 22px;
299
+ padding: 18px;
300
+ }
301
+
302
+ .empty-state {
303
+ margin: 0;
304
+ color: var(--muted);
305
+ line-height: 1.6;
306
+ }
307
+
308
+ @media (max-width: 960px) {
309
+ .app-shell {
310
+ padding: 20px;
311
+ }
312
+
313
+ .workspace {
314
+ grid-template-columns: 1fr;
315
+ }
316
+
317
+ .form-panel {
318
+ position: static;
319
+ }
320
+
321
+ .hero {
322
+ padding: 22px;
323
+ }
324
+ }
325
+
326
+ @media (max-width: 640px) {
327
+ .app-shell {
328
+ padding: 14px;
329
+ }
330
+
331
+ .hero h1 {
332
+ max-width: none;
333
+ }
334
+
335
+ .form-panel,
336
+ .result-panel,
337
+ .trace-panel,
338
+ .output-panel,
339
+ .hero {
340
+ padding: 18px;
341
+ border-radius: 22px;
342
+ }
343
+ }
app/layout.tsx ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { Metadata, Viewport } from "next";
2
+ import { IBM_Plex_Mono, Space_Grotesk } from "next/font/google";
3
+ import "./globals.css";
4
+
5
+ const spaceGrotesk = Space_Grotesk({
6
+ subsets: ["latin"],
7
+ variable: "--font-sans",
8
+ });
9
+
10
+ const ibmPlexMono = IBM_Plex_Mono({
11
+ subsets: ["latin"],
12
+ weight: ["400", "500"],
13
+ variable: "--font-mono",
14
+ });
15
+
16
+ export const metadata: Metadata = {
17
+ title: "HF Task Demo",
18
+ description: "Minimal Next.js demo wired to the shared task planner and provider abstraction.",
19
+ };
20
+
21
+ export const viewport: Viewport = {
22
+ width: "device-width",
23
+ initialScale: 1,
24
+ };
25
+
26
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
27
+ return (
28
+ <html lang="en">
29
+ <body className={`${spaceGrotesk.variable} ${ibmPlexMono.variable}`}>
30
+ {children}
31
+ </body>
32
+ </html>
33
+ );
34
+ }
app/page.tsx ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import { FormEvent, useState } from "react";
4
+
5
+ type RunTaskResponse = {
6
+ providerUsed: string;
7
+ goal: string;
8
+ successDefinition: string;
9
+ executionTrace: string[];
10
+ finalResult: string;
11
+ planNotes?: string | null;
12
+ error?: string;
13
+ };
14
+
15
+ const DEFAULT_PROMPT = "Plan and summarize a concise hackathon demo for a task runner UI.";
16
+
17
+ export default function Home() {
18
+ const [prompt, setPrompt] = useState(DEFAULT_PROMPT);
19
+ const [result, setResult] = useState<RunTaskResponse | null>(null);
20
+ const [error, setError] = useState<string | null>(null);
21
+ const [isRunning, setIsRunning] = useState(false);
22
+
23
+ async function handleSubmit(event: FormEvent<HTMLFormElement>) {
24
+ event.preventDefault();
25
+ const trimmed = prompt.trim();
26
+
27
+ if (!trimmed) {
28
+ setError("Enter a prompt before running the task.");
29
+ return;
30
+ }
31
+
32
+ setIsRunning(true);
33
+ setError(null);
34
+
35
+ try {
36
+ const response = await fetch("/api/run-task", {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/json" },
39
+ body: JSON.stringify({ prompt: trimmed }),
40
+ });
41
+
42
+ const payload = (await response.json()) as RunTaskResponse;
43
+
44
+ if (!response.ok) {
45
+ throw new Error(payload.error || "Task run failed.");
46
+ }
47
+
48
+ setResult(payload);
49
+ } catch (requestError) {
50
+ setResult(null);
51
+ setError(requestError instanceof Error ? requestError.message : "Task run failed.");
52
+ } finally {
53
+ setIsRunning(false);
54
+ }
55
+ }
56
+
57
+ return (
58
+ <main className="app-shell">
59
+ <div className="ambient ambient-one" />
60
+ <div className="ambient ambient-two" />
61
+
62
+ <section className="hero panel">
63
+ <p className="eyebrow">Hackathon demo</p>
64
+ <h1>Shared planner, shared provider, minimal surface.</h1>
65
+ <p className="hero-copy">
66
+ Run the same task planning path used by the worker services, but render it in a single Next.js page that is easy to ship to Hugging Face Spaces.
67
+ </p>
68
+ </section>
69
+
70
+ <section className="workspace">
71
+ <form className="panel form-panel" onSubmit={handleSubmit}>
72
+ <label className="label" htmlFor="prompt">
73
+ Prompt
74
+ </label>
75
+ <textarea
76
+ id="prompt"
77
+ className="prompt-input"
78
+ value={prompt}
79
+ onChange={(event) => setPrompt(event.target.value)}
80
+ spellCheck={false}
81
+ placeholder="Describe the task you want planned and summarized."
82
+ />
83
+
84
+ <div className="actions">
85
+ <button className="run-button" type="submit" disabled={isRunning}>
86
+ {isRunning ? "Running..." : "Run task"}
87
+ </button>
88
+ <span className="hint">POST /api/run-task</span>
89
+ </div>
90
+
91
+ {error ? <p className="error-text">{error}</p> : null}
92
+ </form>
93
+
94
+ <div className="results-column">
95
+ <section className="panel result-panel">
96
+ <div className="panel-header">
97
+ <div>
98
+ <p className="panel-kicker">Provider used</p>
99
+ <h2>{result?.providerUsed ?? "Waiting for a run"}</h2>
100
+ </div>
101
+ {result ? <span className="status-pill">Ready</span> : <span className="status-pill muted">Idle</span>}
102
+ </div>
103
+
104
+ <dl className="meta-grid">
105
+ <div>
106
+ <dt>Goal</dt>
107
+ <dd>{result?.goal ?? "No task has been executed yet."}</dd>
108
+ </div>
109
+ <div>
110
+ <dt>Success definition</dt>
111
+ <dd>{result?.successDefinition ?? "Run a prompt to see the planner output."}</dd>
112
+ </div>
113
+ </dl>
114
+ </section>
115
+
116
+ <section className="panel trace-panel">
117
+ <div className="panel-header">
118
+ <div>
119
+ <p className="panel-kicker">Execution trace</p>
120
+ <h2>Planner steps</h2>
121
+ </div>
122
+ </div>
123
+
124
+ {result?.executionTrace?.length ? (
125
+ <ol className="trace-list">
126
+ {result.executionTrace.map((entry) => (
127
+ <li key={entry}>{entry}</li>
128
+ ))}
129
+ </ol>
130
+ ) : (
131
+ <p className="empty-state">The execution trace will appear here after the first run.</p>
132
+ )}
133
+
134
+ {result?.planNotes ? <p className="plan-notes">{result.planNotes}</p> : null}
135
+ </section>
136
+
137
+ <section className="panel output-panel">
138
+ <div className="panel-header">
139
+ <div>
140
+ <p className="panel-kicker">Final result</p>
141
+ <h2>Provider output</h2>
142
+ </div>
143
+ </div>
144
+
145
+ <pre className="output-box">{result?.finalResult ?? "Run a task to see the final result."}</pre>
146
+ </section>
147
+ </div>
148
+ </section>
149
+ </main>
150
+ );
151
+ }
next-env.d.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+ /// <reference path="./.next/types/routes.d.ts" />
4
+
5
+ // NOTE: This file should not be edited
6
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
next.config.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {
4
+ experimental: {
5
+ externalDir: true,
6
+ },
7
+ };
8
+
9
+ export default nextConfig;
package-lock.json ADDED
@@ -0,0 +1,963 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@chat/hf-demo",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "@chat/hf-demo",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "next": "^15.5.9",
12
+ "react": "19.1.0",
13
+ "react-dom": "19.1.0"
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^25.6.2",
17
+ "@types/react": "^19.2.14",
18
+ "@types/react-dom": "^19.2.3",
19
+ "typescript": "5.8.2"
20
+ }
21
+ },
22
+ "node_modules/@emnapi/runtime": {
23
+ "version": "1.10.0",
24
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
25
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
26
+ "license": "MIT",
27
+ "optional": true,
28
+ "dependencies": {
29
+ "tslib": "^2.4.0"
30
+ }
31
+ },
32
+ "node_modules/@img/colour": {
33
+ "version": "1.1.0",
34
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
35
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
36
+ "license": "MIT",
37
+ "optional": true,
38
+ "engines": {
39
+ "node": ">=18"
40
+ }
41
+ },
42
+ "node_modules/@img/sharp-darwin-arm64": {
43
+ "version": "0.34.5",
44
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
45
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
46
+ "cpu": [
47
+ "arm64"
48
+ ],
49
+ "license": "Apache-2.0",
50
+ "optional": true,
51
+ "os": [
52
+ "darwin"
53
+ ],
54
+ "engines": {
55
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
56
+ },
57
+ "funding": {
58
+ "url": "https://opencollective.com/libvips"
59
+ },
60
+ "optionalDependencies": {
61
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
62
+ }
63
+ },
64
+ "node_modules/@img/sharp-darwin-x64": {
65
+ "version": "0.34.5",
66
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
67
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
68
+ "cpu": [
69
+ "x64"
70
+ ],
71
+ "license": "Apache-2.0",
72
+ "optional": true,
73
+ "os": [
74
+ "darwin"
75
+ ],
76
+ "engines": {
77
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
78
+ },
79
+ "funding": {
80
+ "url": "https://opencollective.com/libvips"
81
+ },
82
+ "optionalDependencies": {
83
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
84
+ }
85
+ },
86
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
87
+ "version": "1.2.4",
88
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
89
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
90
+ "cpu": [
91
+ "arm64"
92
+ ],
93
+ "license": "LGPL-3.0-or-later",
94
+ "optional": true,
95
+ "os": [
96
+ "darwin"
97
+ ],
98
+ "funding": {
99
+ "url": "https://opencollective.com/libvips"
100
+ }
101
+ },
102
+ "node_modules/@img/sharp-libvips-darwin-x64": {
103
+ "version": "1.2.4",
104
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
105
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
106
+ "cpu": [
107
+ "x64"
108
+ ],
109
+ "license": "LGPL-3.0-or-later",
110
+ "optional": true,
111
+ "os": [
112
+ "darwin"
113
+ ],
114
+ "funding": {
115
+ "url": "https://opencollective.com/libvips"
116
+ }
117
+ },
118
+ "node_modules/@img/sharp-libvips-linux-arm": {
119
+ "version": "1.2.4",
120
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
121
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
122
+ "cpu": [
123
+ "arm"
124
+ ],
125
+ "license": "LGPL-3.0-or-later",
126
+ "optional": true,
127
+ "os": [
128
+ "linux"
129
+ ],
130
+ "funding": {
131
+ "url": "https://opencollective.com/libvips"
132
+ }
133
+ },
134
+ "node_modules/@img/sharp-libvips-linux-arm64": {
135
+ "version": "1.2.4",
136
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
137
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
138
+ "cpu": [
139
+ "arm64"
140
+ ],
141
+ "license": "LGPL-3.0-or-later",
142
+ "optional": true,
143
+ "os": [
144
+ "linux"
145
+ ],
146
+ "funding": {
147
+ "url": "https://opencollective.com/libvips"
148
+ }
149
+ },
150
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
151
+ "version": "1.2.4",
152
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
153
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
154
+ "cpu": [
155
+ "ppc64"
156
+ ],
157
+ "license": "LGPL-3.0-or-later",
158
+ "optional": true,
159
+ "os": [
160
+ "linux"
161
+ ],
162
+ "funding": {
163
+ "url": "https://opencollective.com/libvips"
164
+ }
165
+ },
166
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
167
+ "version": "1.2.4",
168
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
169
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
170
+ "cpu": [
171
+ "riscv64"
172
+ ],
173
+ "license": "LGPL-3.0-or-later",
174
+ "optional": true,
175
+ "os": [
176
+ "linux"
177
+ ],
178
+ "funding": {
179
+ "url": "https://opencollective.com/libvips"
180
+ }
181
+ },
182
+ "node_modules/@img/sharp-libvips-linux-s390x": {
183
+ "version": "1.2.4",
184
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
185
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
186
+ "cpu": [
187
+ "s390x"
188
+ ],
189
+ "license": "LGPL-3.0-or-later",
190
+ "optional": true,
191
+ "os": [
192
+ "linux"
193
+ ],
194
+ "funding": {
195
+ "url": "https://opencollective.com/libvips"
196
+ }
197
+ },
198
+ "node_modules/@img/sharp-libvips-linux-x64": {
199
+ "version": "1.2.4",
200
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
201
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
202
+ "cpu": [
203
+ "x64"
204
+ ],
205
+ "license": "LGPL-3.0-or-later",
206
+ "optional": true,
207
+ "os": [
208
+ "linux"
209
+ ],
210
+ "funding": {
211
+ "url": "https://opencollective.com/libvips"
212
+ }
213
+ },
214
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
215
+ "version": "1.2.4",
216
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
217
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
218
+ "cpu": [
219
+ "arm64"
220
+ ],
221
+ "license": "LGPL-3.0-or-later",
222
+ "optional": true,
223
+ "os": [
224
+ "linux"
225
+ ],
226
+ "funding": {
227
+ "url": "https://opencollective.com/libvips"
228
+ }
229
+ },
230
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
231
+ "version": "1.2.4",
232
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
233
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
234
+ "cpu": [
235
+ "x64"
236
+ ],
237
+ "license": "LGPL-3.0-or-later",
238
+ "optional": true,
239
+ "os": [
240
+ "linux"
241
+ ],
242
+ "funding": {
243
+ "url": "https://opencollective.com/libvips"
244
+ }
245
+ },
246
+ "node_modules/@img/sharp-linux-arm": {
247
+ "version": "0.34.5",
248
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
249
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
250
+ "cpu": [
251
+ "arm"
252
+ ],
253
+ "license": "Apache-2.0",
254
+ "optional": true,
255
+ "os": [
256
+ "linux"
257
+ ],
258
+ "engines": {
259
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
260
+ },
261
+ "funding": {
262
+ "url": "https://opencollective.com/libvips"
263
+ },
264
+ "optionalDependencies": {
265
+ "@img/sharp-libvips-linux-arm": "1.2.4"
266
+ }
267
+ },
268
+ "node_modules/@img/sharp-linux-arm64": {
269
+ "version": "0.34.5",
270
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
271
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
272
+ "cpu": [
273
+ "arm64"
274
+ ],
275
+ "license": "Apache-2.0",
276
+ "optional": true,
277
+ "os": [
278
+ "linux"
279
+ ],
280
+ "engines": {
281
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
282
+ },
283
+ "funding": {
284
+ "url": "https://opencollective.com/libvips"
285
+ },
286
+ "optionalDependencies": {
287
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
288
+ }
289
+ },
290
+ "node_modules/@img/sharp-linux-ppc64": {
291
+ "version": "0.34.5",
292
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
293
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
294
+ "cpu": [
295
+ "ppc64"
296
+ ],
297
+ "license": "Apache-2.0",
298
+ "optional": true,
299
+ "os": [
300
+ "linux"
301
+ ],
302
+ "engines": {
303
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
304
+ },
305
+ "funding": {
306
+ "url": "https://opencollective.com/libvips"
307
+ },
308
+ "optionalDependencies": {
309
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
310
+ }
311
+ },
312
+ "node_modules/@img/sharp-linux-riscv64": {
313
+ "version": "0.34.5",
314
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
315
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
316
+ "cpu": [
317
+ "riscv64"
318
+ ],
319
+ "license": "Apache-2.0",
320
+ "optional": true,
321
+ "os": [
322
+ "linux"
323
+ ],
324
+ "engines": {
325
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
326
+ },
327
+ "funding": {
328
+ "url": "https://opencollective.com/libvips"
329
+ },
330
+ "optionalDependencies": {
331
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
332
+ }
333
+ },
334
+ "node_modules/@img/sharp-linux-s390x": {
335
+ "version": "0.34.5",
336
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
337
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
338
+ "cpu": [
339
+ "s390x"
340
+ ],
341
+ "license": "Apache-2.0",
342
+ "optional": true,
343
+ "os": [
344
+ "linux"
345
+ ],
346
+ "engines": {
347
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
348
+ },
349
+ "funding": {
350
+ "url": "https://opencollective.com/libvips"
351
+ },
352
+ "optionalDependencies": {
353
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
354
+ }
355
+ },
356
+ "node_modules/@img/sharp-linux-x64": {
357
+ "version": "0.34.5",
358
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
359
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
360
+ "cpu": [
361
+ "x64"
362
+ ],
363
+ "license": "Apache-2.0",
364
+ "optional": true,
365
+ "os": [
366
+ "linux"
367
+ ],
368
+ "engines": {
369
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
370
+ },
371
+ "funding": {
372
+ "url": "https://opencollective.com/libvips"
373
+ },
374
+ "optionalDependencies": {
375
+ "@img/sharp-libvips-linux-x64": "1.2.4"
376
+ }
377
+ },
378
+ "node_modules/@img/sharp-linuxmusl-arm64": {
379
+ "version": "0.34.5",
380
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
381
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
382
+ "cpu": [
383
+ "arm64"
384
+ ],
385
+ "license": "Apache-2.0",
386
+ "optional": true,
387
+ "os": [
388
+ "linux"
389
+ ],
390
+ "engines": {
391
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
392
+ },
393
+ "funding": {
394
+ "url": "https://opencollective.com/libvips"
395
+ },
396
+ "optionalDependencies": {
397
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
398
+ }
399
+ },
400
+ "node_modules/@img/sharp-linuxmusl-x64": {
401
+ "version": "0.34.5",
402
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
403
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
404
+ "cpu": [
405
+ "x64"
406
+ ],
407
+ "license": "Apache-2.0",
408
+ "optional": true,
409
+ "os": [
410
+ "linux"
411
+ ],
412
+ "engines": {
413
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
414
+ },
415
+ "funding": {
416
+ "url": "https://opencollective.com/libvips"
417
+ },
418
+ "optionalDependencies": {
419
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
420
+ }
421
+ },
422
+ "node_modules/@img/sharp-wasm32": {
423
+ "version": "0.34.5",
424
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
425
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
426
+ "cpu": [
427
+ "wasm32"
428
+ ],
429
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
430
+ "optional": true,
431
+ "dependencies": {
432
+ "@emnapi/runtime": "^1.7.0"
433
+ },
434
+ "engines": {
435
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
436
+ },
437
+ "funding": {
438
+ "url": "https://opencollective.com/libvips"
439
+ }
440
+ },
441
+ "node_modules/@img/sharp-win32-arm64": {
442
+ "version": "0.34.5",
443
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
444
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
445
+ "cpu": [
446
+ "arm64"
447
+ ],
448
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
449
+ "optional": true,
450
+ "os": [
451
+ "win32"
452
+ ],
453
+ "engines": {
454
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
455
+ },
456
+ "funding": {
457
+ "url": "https://opencollective.com/libvips"
458
+ }
459
+ },
460
+ "node_modules/@img/sharp-win32-ia32": {
461
+ "version": "0.34.5",
462
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
463
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
464
+ "cpu": [
465
+ "ia32"
466
+ ],
467
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
468
+ "optional": true,
469
+ "os": [
470
+ "win32"
471
+ ],
472
+ "engines": {
473
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
474
+ },
475
+ "funding": {
476
+ "url": "https://opencollective.com/libvips"
477
+ }
478
+ },
479
+ "node_modules/@img/sharp-win32-x64": {
480
+ "version": "0.34.5",
481
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
482
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
483
+ "cpu": [
484
+ "x64"
485
+ ],
486
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
487
+ "optional": true,
488
+ "os": [
489
+ "win32"
490
+ ],
491
+ "engines": {
492
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
493
+ },
494
+ "funding": {
495
+ "url": "https://opencollective.com/libvips"
496
+ }
497
+ },
498
+ "node_modules/@next/env": {
499
+ "version": "15.5.18",
500
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz",
501
+ "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==",
502
+ "license": "MIT"
503
+ },
504
+ "node_modules/@next/swc-darwin-arm64": {
505
+ "version": "15.5.18",
506
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz",
507
+ "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==",
508
+ "cpu": [
509
+ "arm64"
510
+ ],
511
+ "license": "MIT",
512
+ "optional": true,
513
+ "os": [
514
+ "darwin"
515
+ ],
516
+ "engines": {
517
+ "node": ">= 10"
518
+ }
519
+ },
520
+ "node_modules/@next/swc-darwin-x64": {
521
+ "version": "15.5.18",
522
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz",
523
+ "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==",
524
+ "cpu": [
525
+ "x64"
526
+ ],
527
+ "license": "MIT",
528
+ "optional": true,
529
+ "os": [
530
+ "darwin"
531
+ ],
532
+ "engines": {
533
+ "node": ">= 10"
534
+ }
535
+ },
536
+ "node_modules/@next/swc-linux-arm64-gnu": {
537
+ "version": "15.5.18",
538
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz",
539
+ "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==",
540
+ "cpu": [
541
+ "arm64"
542
+ ],
543
+ "license": "MIT",
544
+ "optional": true,
545
+ "os": [
546
+ "linux"
547
+ ],
548
+ "engines": {
549
+ "node": ">= 10"
550
+ }
551
+ },
552
+ "node_modules/@next/swc-linux-arm64-musl": {
553
+ "version": "15.5.18",
554
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz",
555
+ "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==",
556
+ "cpu": [
557
+ "arm64"
558
+ ],
559
+ "license": "MIT",
560
+ "optional": true,
561
+ "os": [
562
+ "linux"
563
+ ],
564
+ "engines": {
565
+ "node": ">= 10"
566
+ }
567
+ },
568
+ "node_modules/@next/swc-linux-x64-gnu": {
569
+ "version": "15.5.18",
570
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz",
571
+ "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==",
572
+ "cpu": [
573
+ "x64"
574
+ ],
575
+ "license": "MIT",
576
+ "optional": true,
577
+ "os": [
578
+ "linux"
579
+ ],
580
+ "engines": {
581
+ "node": ">= 10"
582
+ }
583
+ },
584
+ "node_modules/@next/swc-linux-x64-musl": {
585
+ "version": "15.5.18",
586
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz",
587
+ "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==",
588
+ "cpu": [
589
+ "x64"
590
+ ],
591
+ "license": "MIT",
592
+ "optional": true,
593
+ "os": [
594
+ "linux"
595
+ ],
596
+ "engines": {
597
+ "node": ">= 10"
598
+ }
599
+ },
600
+ "node_modules/@next/swc-win32-arm64-msvc": {
601
+ "version": "15.5.18",
602
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz",
603
+ "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==",
604
+ "cpu": [
605
+ "arm64"
606
+ ],
607
+ "license": "MIT",
608
+ "optional": true,
609
+ "os": [
610
+ "win32"
611
+ ],
612
+ "engines": {
613
+ "node": ">= 10"
614
+ }
615
+ },
616
+ "node_modules/@next/swc-win32-x64-msvc": {
617
+ "version": "15.5.18",
618
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz",
619
+ "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==",
620
+ "cpu": [
621
+ "x64"
622
+ ],
623
+ "license": "MIT",
624
+ "optional": true,
625
+ "os": [
626
+ "win32"
627
+ ],
628
+ "engines": {
629
+ "node": ">= 10"
630
+ }
631
+ },
632
+ "node_modules/@swc/helpers": {
633
+ "version": "0.5.15",
634
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
635
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
636
+ "license": "Apache-2.0",
637
+ "dependencies": {
638
+ "tslib": "^2.8.0"
639
+ }
640
+ },
641
+ "node_modules/@types/node": {
642
+ "version": "25.6.2",
643
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz",
644
+ "integrity": "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==",
645
+ "dev": true,
646
+ "license": "MIT",
647
+ "dependencies": {
648
+ "undici-types": "~7.19.0"
649
+ }
650
+ },
651
+ "node_modules/@types/react": {
652
+ "version": "19.2.14",
653
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
654
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
655
+ "dev": true,
656
+ "license": "MIT",
657
+ "dependencies": {
658
+ "csstype": "^3.2.2"
659
+ }
660
+ },
661
+ "node_modules/@types/react-dom": {
662
+ "version": "19.2.3",
663
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
664
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
665
+ "dev": true,
666
+ "license": "MIT",
667
+ "peerDependencies": {
668
+ "@types/react": "^19.2.0"
669
+ }
670
+ },
671
+ "node_modules/caniuse-lite": {
672
+ "version": "1.0.30001792",
673
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
674
+ "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
675
+ "funding": [
676
+ {
677
+ "type": "opencollective",
678
+ "url": "https://opencollective.com/browserslist"
679
+ },
680
+ {
681
+ "type": "tidelift",
682
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
683
+ },
684
+ {
685
+ "type": "github",
686
+ "url": "https://github.com/sponsors/ai"
687
+ }
688
+ ],
689
+ "license": "CC-BY-4.0"
690
+ },
691
+ "node_modules/client-only": {
692
+ "version": "0.0.1",
693
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
694
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
695
+ "license": "MIT"
696
+ },
697
+ "node_modules/csstype": {
698
+ "version": "3.2.3",
699
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
700
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
701
+ "dev": true,
702
+ "license": "MIT"
703
+ },
704
+ "node_modules/detect-libc": {
705
+ "version": "2.1.2",
706
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
707
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
708
+ "license": "Apache-2.0",
709
+ "optional": true,
710
+ "engines": {
711
+ "node": ">=8"
712
+ }
713
+ },
714
+ "node_modules/nanoid": {
715
+ "version": "3.3.12",
716
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
717
+ "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
718
+ "funding": [
719
+ {
720
+ "type": "github",
721
+ "url": "https://github.com/sponsors/ai"
722
+ }
723
+ ],
724
+ "license": "MIT",
725
+ "bin": {
726
+ "nanoid": "bin/nanoid.cjs"
727
+ },
728
+ "engines": {
729
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
730
+ }
731
+ },
732
+ "node_modules/next": {
733
+ "version": "15.5.18",
734
+ "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz",
735
+ "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==",
736
+ "license": "MIT",
737
+ "dependencies": {
738
+ "@next/env": "15.5.18",
739
+ "@swc/helpers": "0.5.15",
740
+ "caniuse-lite": "^1.0.30001579",
741
+ "postcss": "8.4.31",
742
+ "styled-jsx": "5.1.6"
743
+ },
744
+ "bin": {
745
+ "next": "dist/bin/next"
746
+ },
747
+ "engines": {
748
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
749
+ },
750
+ "optionalDependencies": {
751
+ "@next/swc-darwin-arm64": "15.5.18",
752
+ "@next/swc-darwin-x64": "15.5.18",
753
+ "@next/swc-linux-arm64-gnu": "15.5.18",
754
+ "@next/swc-linux-arm64-musl": "15.5.18",
755
+ "@next/swc-linux-x64-gnu": "15.5.18",
756
+ "@next/swc-linux-x64-musl": "15.5.18",
757
+ "@next/swc-win32-arm64-msvc": "15.5.18",
758
+ "@next/swc-win32-x64-msvc": "15.5.18",
759
+ "sharp": "^0.34.3"
760
+ },
761
+ "peerDependencies": {
762
+ "@opentelemetry/api": "^1.1.0",
763
+ "@playwright/test": "^1.51.1",
764
+ "babel-plugin-react-compiler": "*",
765
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
766
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
767
+ "sass": "^1.3.0"
768
+ },
769
+ "peerDependenciesMeta": {
770
+ "@opentelemetry/api": {
771
+ "optional": true
772
+ },
773
+ "@playwright/test": {
774
+ "optional": true
775
+ },
776
+ "babel-plugin-react-compiler": {
777
+ "optional": true
778
+ },
779
+ "sass": {
780
+ "optional": true
781
+ }
782
+ }
783
+ },
784
+ "node_modules/picocolors": {
785
+ "version": "1.1.1",
786
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
787
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
788
+ "license": "ISC"
789
+ },
790
+ "node_modules/postcss": {
791
+ "version": "8.4.31",
792
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
793
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
794
+ "funding": [
795
+ {
796
+ "type": "opencollective",
797
+ "url": "https://opencollective.com/postcss/"
798
+ },
799
+ {
800
+ "type": "tidelift",
801
+ "url": "https://tidelift.com/funding/github/npm/postcss"
802
+ },
803
+ {
804
+ "type": "github",
805
+ "url": "https://github.com/sponsors/ai"
806
+ }
807
+ ],
808
+ "license": "MIT",
809
+ "dependencies": {
810
+ "nanoid": "^3.3.6",
811
+ "picocolors": "^1.0.0",
812
+ "source-map-js": "^1.0.2"
813
+ },
814
+ "engines": {
815
+ "node": "^10 || ^12 || >=14"
816
+ }
817
+ },
818
+ "node_modules/react": {
819
+ "version": "19.1.0",
820
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
821
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
822
+ "license": "MIT",
823
+ "engines": {
824
+ "node": ">=0.10.0"
825
+ }
826
+ },
827
+ "node_modules/react-dom": {
828
+ "version": "19.1.0",
829
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
830
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
831
+ "license": "MIT",
832
+ "dependencies": {
833
+ "scheduler": "^0.26.0"
834
+ },
835
+ "peerDependencies": {
836
+ "react": "^19.1.0"
837
+ }
838
+ },
839
+ "node_modules/scheduler": {
840
+ "version": "0.26.0",
841
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
842
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
843
+ "license": "MIT"
844
+ },
845
+ "node_modules/semver": {
846
+ "version": "7.7.4",
847
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
848
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
849
+ "license": "ISC",
850
+ "optional": true,
851
+ "bin": {
852
+ "semver": "bin/semver.js"
853
+ },
854
+ "engines": {
855
+ "node": ">=10"
856
+ }
857
+ },
858
+ "node_modules/sharp": {
859
+ "version": "0.34.5",
860
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
861
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
862
+ "hasInstallScript": true,
863
+ "license": "Apache-2.0",
864
+ "optional": true,
865
+ "dependencies": {
866
+ "@img/colour": "^1.0.0",
867
+ "detect-libc": "^2.1.2",
868
+ "semver": "^7.7.3"
869
+ },
870
+ "engines": {
871
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
872
+ },
873
+ "funding": {
874
+ "url": "https://opencollective.com/libvips"
875
+ },
876
+ "optionalDependencies": {
877
+ "@img/sharp-darwin-arm64": "0.34.5",
878
+ "@img/sharp-darwin-x64": "0.34.5",
879
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
880
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
881
+ "@img/sharp-libvips-linux-arm": "1.2.4",
882
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
883
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
884
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
885
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
886
+ "@img/sharp-libvips-linux-x64": "1.2.4",
887
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
888
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
889
+ "@img/sharp-linux-arm": "0.34.5",
890
+ "@img/sharp-linux-arm64": "0.34.5",
891
+ "@img/sharp-linux-ppc64": "0.34.5",
892
+ "@img/sharp-linux-riscv64": "0.34.5",
893
+ "@img/sharp-linux-s390x": "0.34.5",
894
+ "@img/sharp-linux-x64": "0.34.5",
895
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
896
+ "@img/sharp-linuxmusl-x64": "0.34.5",
897
+ "@img/sharp-wasm32": "0.34.5",
898
+ "@img/sharp-win32-arm64": "0.34.5",
899
+ "@img/sharp-win32-ia32": "0.34.5",
900
+ "@img/sharp-win32-x64": "0.34.5"
901
+ }
902
+ },
903
+ "node_modules/source-map-js": {
904
+ "version": "1.2.1",
905
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
906
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
907
+ "license": "BSD-3-Clause",
908
+ "engines": {
909
+ "node": ">=0.10.0"
910
+ }
911
+ },
912
+ "node_modules/styled-jsx": {
913
+ "version": "5.1.6",
914
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
915
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
916
+ "license": "MIT",
917
+ "dependencies": {
918
+ "client-only": "0.0.1"
919
+ },
920
+ "engines": {
921
+ "node": ">= 12.0.0"
922
+ },
923
+ "peerDependencies": {
924
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
925
+ },
926
+ "peerDependenciesMeta": {
927
+ "@babel/core": {
928
+ "optional": true
929
+ },
930
+ "babel-plugin-macros": {
931
+ "optional": true
932
+ }
933
+ }
934
+ },
935
+ "node_modules/tslib": {
936
+ "version": "2.8.1",
937
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
938
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
939
+ "license": "0BSD"
940
+ },
941
+ "node_modules/typescript": {
942
+ "version": "5.8.2",
943
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
944
+ "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
945
+ "dev": true,
946
+ "license": "Apache-2.0",
947
+ "bin": {
948
+ "tsc": "bin/tsc",
949
+ "tsserver": "bin/tsserver"
950
+ },
951
+ "engines": {
952
+ "node": ">=14.17"
953
+ }
954
+ },
955
+ "node_modules/undici-types": {
956
+ "version": "7.19.2",
957
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz",
958
+ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==",
959
+ "dev": true,
960
+ "license": "MIT"
961
+ }
962
+ }
963
+ }
package.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@chat/hf-demo",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "typecheck": "tsc --noEmit -p tsconfig.json"
10
+ },
11
+ "dependencies": {
12
+ "next": "^15.5.9",
13
+ "react": "19.1.0",
14
+ "react-dom": "19.1.0"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^25.6.2",
18
+ "@types/react": "^19.2.14",
19
+ "@types/react-dom": "^19.2.3",
20
+ "typescript": "5.8.2"
21
+ }
22
+ }
tsconfig.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "module": "esnext",
4
+ "moduleResolution": "bundler",
5
+ "jsx": "preserve",
6
+ "skipLibCheck": true,
7
+ "noEmit": true,
8
+ "lib": [
9
+ "dom",
10
+ "dom.iterable",
11
+ "esnext"
12
+ ],
13
+ "plugins": [
14
+ {
15
+ "name": "next"
16
+ }
17
+ ],
18
+ "target": "ES2017",
19
+ "allowJs": true,
20
+ "strict": false,
21
+ "incremental": true,
22
+ "esModuleInterop": true,
23
+ "resolveJsonModule": true,
24
+ "isolatedModules": true
25
+ },
26
+ "include": [
27
+ "**/*.ts",
28
+ "**/*.tsx",
29
+ "next-env.d.ts",
30
+ ".next/types/**/*.ts"
31
+ ],
32
+ "exclude": [
33
+ "node_modules"
34
+ ]
35
+ }
tsconfig.tsbuildinfo ADDED
The diff for this file is too large to render. See raw diff