@agentuity/cli 3.0.0-alpha.1 → 3.0.0-alpha.2
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/dist/cmd/project/frameworks.d.ts +13 -13
- package/dist/cmd/project/frameworks.d.ts.map +1 -1
- package/dist/cmd/project/frameworks.js +26 -21
- package/dist/cmd/project/frameworks.js.map +1 -1
- package/dist/cmd/project/scaffold.d.ts.map +1 -1
- package/dist/cmd/project/scaffold.js +13 -23
- package/dist/cmd/project/scaffold.js.map +1 -1
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +4 -1
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/package.json +7 -7
- package/src/cmd/project/frameworks.ts +31 -47
- package/src/cmd/project/scaffold.ts +14 -26
- package/src/cmd/project/template-flow.ts +3 -1
- package/src/cmd/project/templates/astro/src/pages/api/translate.ts +22 -0
- package/src/cmd/project/templates/astro/src/pages/index.astro +160 -0
- package/src/cmd/project/templates/hono/src/index.ts +103 -0
- package/src/cmd/project/templates/nextjs/src/app/api/translate/route.ts +19 -0
- package/src/cmd/project/templates/nextjs/src/app/globals.css +74 -0
- package/src/cmd/project/templates/nextjs/src/app/page.tsx +234 -0
- package/src/cmd/project/templates/nuxt/app.vue +191 -0
- package/src/cmd/project/templates/nuxt/server/api/translate.post.ts +18 -0
- package/src/cmd/project/templates/remix/app/routes/api.translate.ts +24 -0
- package/src/cmd/project/templates/remix/app/routes/home.tsx +241 -0
- package/src/cmd/project/templates/sveltekit/src/routes/+page.server.ts +24 -0
- package/src/cmd/project/templates/sveltekit/src/routes/+page.svelte +204 -0
- package/src/cmd/project/templates/vite-react/server.ts +39 -0
- package/src/cmd/project/templates/vite-react/src/App.tsx +241 -0
- package/src/cmd/project/templates/vite-react/src/index.css +31 -0
- package/src/cmd/project/templates/vite-react/src/main.tsx +15 -0
- package/dist/cmd/project/frameworks-ai-examples.d.ts +0 -15
- package/dist/cmd/project/frameworks-ai-examples.d.ts.map +0 -1
- package/dist/cmd/project/frameworks-ai-examples.js +0 -160
- package/dist/cmd/project/frameworks-ai-examples.js.map +0 -1
- package/dist/cmd/project/frameworks-landing-pages.d.ts +0 -17
- package/dist/cmd/project/frameworks-landing-pages.d.ts.map +0 -1
- package/dist/cmd/project/frameworks-landing-pages.js +0 -242
- package/dist/cmd/project/frameworks-landing-pages.js.map +0 -1
- package/src/cmd/project/frameworks-ai-examples.ts +0 -166
- package/src/cmd/project/frameworks-landing-pages.ts +0 -267
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentuity-branded landing page generators for each framework.
|
|
3
|
-
*
|
|
4
|
-
* Each function returns a map of relative file paths to file contents
|
|
5
|
-
* that replace the framework's default landing page with a dark-themed
|
|
6
|
-
* Agentuity welcome page matching the brand design system.
|
|
7
|
-
*
|
|
8
|
-
* Design: dark background (#09090b), cyan accent (#00FFFF), Agentuity
|
|
9
|
-
* logo, "Welcome to Agentuity" heading, and framework-specific next steps.
|
|
10
|
-
*/
|
|
11
|
-
// ─── Shared ──────────────────────────────────────────────────────────────────
|
|
12
|
-
const AGENTUITY_LOGO_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="48" height="42" viewBox="0 0 220 191" fill="none">
|
|
13
|
-
<path fill-rule="evenodd" clip-rule="evenodd" d="M220 191H0L31.427 136.5H0L8 122.5H180.5L220 191ZM47.588 136.5L24.234 177H195.766L172.412 136.5H47.588Z" fill="#00FFFF"/>
|
|
14
|
-
<path fill-rule="evenodd" clip-rule="evenodd" d="M110 0L157.448 82.5H189L197 96.5H54.5L110 0ZM78.702 82.5L110 28.081L141.298 82.5H78.702Z" fill="#00FFFF"/>
|
|
15
|
-
</svg>`;
|
|
16
|
-
const SHARED_STYLES = `
|
|
17
|
-
<style>
|
|
18
|
-
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
19
|
-
body { background: #09090b; color: #a1a1aa; font-family: system-ui, -apple-system, sans-serif; min-height: 100vh; display: flex; justify-content: center; }
|
|
20
|
-
.wrap { max-width: 48rem; width: 100%; padding: 4rem; display: flex; flex-direction: column; gap: 1rem; }
|
|
21
|
-
.header { text-align: center; margin-bottom: 2rem; }
|
|
22
|
-
.header svg { margin-bottom: 1rem; }
|
|
23
|
-
.header h1 { font-size: 3rem; font-weight: 100; color: #fff; }
|
|
24
|
-
.header p { font-size: 1.125rem; color: #71717a; }
|
|
25
|
-
.header em { font-style: italic; font-family: Georgia, serif; }
|
|
26
|
-
.card { background: #000; border: 1px solid #1c1c1e; border-radius: 0.5rem; padding: 2rem; }
|
|
27
|
-
.card h3 { color: #fff; font-size: 1.25rem; font-weight: 400; margin-bottom: 1.5rem; }
|
|
28
|
-
.step { display: flex; gap: 0.75rem; align-items: flex-start; margin-bottom: 1.25rem; }
|
|
29
|
-
.step:last-child { margin-bottom: 0; }
|
|
30
|
-
.check { width: 1rem; height: 1rem; border: 1px solid #22c55e; background: #052e16; border-radius: 0.25rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; margin-top: 0.1rem; }
|
|
31
|
-
.check svg { width: 0.625rem; height: 0.625rem; }
|
|
32
|
-
.step h4 { color: #fff; font-size: 0.875rem; font-weight: 400; margin-bottom: 0.25rem; }
|
|
33
|
-
.step p { font-size: 0.75rem; }
|
|
34
|
-
code { color: #fff; background: #1c1c1e; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-size: 0.75rem; }
|
|
35
|
-
a.badge { position: fixed; bottom: 1rem; right: 1rem; display: flex; align-items: center; gap: 0.5rem; padding: 0.5rem 0.75rem; background: #09090b; border: 1px solid #27272a; border-radius: 0.5rem; color: #a1a1aa; font-size: 0.75rem; text-decoration: none; transition: border-color 0.2s; z-index: 50; }
|
|
36
|
-
a.badge:hover { border-color: #00FFFF; }
|
|
37
|
-
a.badge svg { width: 16px; height: 14px; }
|
|
38
|
-
</style>`;
|
|
39
|
-
const CHECK_SVG = '<svg fill="none" stroke="#22c55e" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';
|
|
40
|
-
const BADGE_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 191" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M220 191H0L31.427 136.5H0L8 122.5H180.5L220 191ZM47.588 136.5L24.234 177H195.766L172.412 136.5H47.588Z" fill="#00FFFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M110 0L157.448 82.5H189L197 96.5H54.5L110 0ZM78.702 82.5L110 28.081L141.298 82.5H78.702Z" fill="#00FFFF"/></svg>';
|
|
41
|
-
function buildPage(frameworkLabel, steps) {
|
|
42
|
-
const stepsHtml = steps
|
|
43
|
-
.map((s) => `
|
|
44
|
-
<div class="step">
|
|
45
|
-
<div class="check">${CHECK_SVG}</div>
|
|
46
|
-
<div><h4>${s.title}</h4><p>${s.text}</p></div>
|
|
47
|
-
</div>`)
|
|
48
|
-
.join('');
|
|
49
|
-
return `<!DOCTYPE html>
|
|
50
|
-
<html lang="en">
|
|
51
|
-
<head>
|
|
52
|
-
<meta charset="utf-8"/>
|
|
53
|
-
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
54
|
-
<title>Agentuity + ${frameworkLabel}</title>
|
|
55
|
-
${SHARED_STYLES}
|
|
56
|
-
</head>
|
|
57
|
-
<body>
|
|
58
|
-
<div class="wrap">
|
|
59
|
-
<div class="header">
|
|
60
|
-
${AGENTUITY_LOGO_SVG}
|
|
61
|
-
<h1>Welcome to Agentuity</h1>
|
|
62
|
-
<p><em>${frameworkLabel}</em> + AI Gateway</p>
|
|
63
|
-
</div>
|
|
64
|
-
<div class="card">
|
|
65
|
-
<h3>Getting started</h3>
|
|
66
|
-
${stepsHtml}
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
<a class="badge" href="https://agentuity.dev/" target="_blank" rel="noopener noreferrer">${BADGE_SVG} Powered by Agentuity</a>
|
|
70
|
-
</body>
|
|
71
|
-
</html>`;
|
|
72
|
-
}
|
|
73
|
-
// ─── Framework-specific Landing Pages ────────────────────────────────────────
|
|
74
|
-
export function nextjsLandingPage() {
|
|
75
|
-
return {
|
|
76
|
-
'src/app/page.tsx': `export default function Home() {
|
|
77
|
-
return (
|
|
78
|
-
<div
|
|
79
|
-
style={{ background: '#09090b', color: '#a1a1aa', fontFamily: 'system-ui, -apple-system, sans-serif', minHeight: '100vh', display: 'flex', justifyContent: 'center' }}
|
|
80
|
-
dangerouslySetInnerHTML={{
|
|
81
|
-
__html: \`${buildReactInnerHtml('Next.js', [
|
|
82
|
-
{
|
|
83
|
-
title: 'AI Gateway',
|
|
84
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
title: 'API route',
|
|
88
|
-
text: 'Edit <code>app/api/chat/route.ts</code> to customize the AI endpoint.',
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
title: 'Deploy',
|
|
92
|
-
text: 'Run <code>agentuity deploy</code> to ship to production.',
|
|
93
|
-
},
|
|
94
|
-
])}\`
|
|
95
|
-
}}
|
|
96
|
-
/>
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
`,
|
|
100
|
-
'src/app/globals.css': `body { margin: 0; }
|
|
101
|
-
`,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
export function nuxtLandingPage() {
|
|
105
|
-
return {
|
|
106
|
-
'app.vue': `<template>
|
|
107
|
-
<div v-html="html" />
|
|
108
|
-
</template>
|
|
109
|
-
|
|
110
|
-
<script setup lang="ts">
|
|
111
|
-
const html = \`${buildPage('Nuxt', [
|
|
112
|
-
{
|
|
113
|
-
title: 'AI Gateway',
|
|
114
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
title: 'Server route',
|
|
118
|
-
text: 'Edit <code>server/api/chat.post.ts</code> to customize the AI endpoint.',
|
|
119
|
-
},
|
|
120
|
-
{ title: 'Deploy', text: 'Run <code>agentuity deploy</code> to ship to production.' },
|
|
121
|
-
])}\`;
|
|
122
|
-
</script>
|
|
123
|
-
`,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
export function remixLandingPage() {
|
|
127
|
-
return {
|
|
128
|
-
'app/routes/_index.tsx': `export default function Index() {
|
|
129
|
-
return (
|
|
130
|
-
<div
|
|
131
|
-
style={{ background: '#09090b', color: '#a1a1aa', fontFamily: 'system-ui, -apple-system, sans-serif', minHeight: '100vh', display: 'flex', justifyContent: 'center' }}
|
|
132
|
-
dangerouslySetInnerHTML={{
|
|
133
|
-
__html: \`${buildReactInnerHtml('Remix', [
|
|
134
|
-
{
|
|
135
|
-
title: 'AI Gateway',
|
|
136
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
title: 'Action route',
|
|
140
|
-
text: 'Edit <code>app/routes/api.chat.ts</code> to customize the AI endpoint.',
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
title: 'Deploy',
|
|
144
|
-
text: 'Run <code>agentuity deploy</code> to ship to production.',
|
|
145
|
-
},
|
|
146
|
-
])}\`
|
|
147
|
-
}}
|
|
148
|
-
/>
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
`,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
export function sveltekitLandingPage() {
|
|
155
|
-
return {
|
|
156
|
-
'src/routes/+page.svelte': `{@html \`${buildPage('SvelteKit', [
|
|
157
|
-
{
|
|
158
|
-
title: 'AI Gateway',
|
|
159
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
title: 'Server route',
|
|
163
|
-
text: 'Edit <code>src/routes/api/chat/+server.ts</code> to customize the AI endpoint.',
|
|
164
|
-
},
|
|
165
|
-
{ title: 'Deploy', text: 'Run <code>agentuity deploy</code> to ship to production.' },
|
|
166
|
-
])}\`}
|
|
167
|
-
`,
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
export function astroLandingPage() {
|
|
171
|
-
return {
|
|
172
|
-
'src/pages/index.astro': `---
|
|
173
|
-
---
|
|
174
|
-
${buildPage('Astro', [
|
|
175
|
-
{
|
|
176
|
-
title: 'AI Gateway',
|
|
177
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
title: 'API route',
|
|
181
|
-
text: 'Edit <code>src/pages/api/chat.ts</code> to customize the AI endpoint.',
|
|
182
|
-
},
|
|
183
|
-
{ title: 'Deploy', text: 'Run <code>agentuity deploy</code> to ship to production.' },
|
|
184
|
-
])}
|
|
185
|
-
`,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
export function viteReactLandingPage() {
|
|
189
|
-
return {
|
|
190
|
-
'src/App.tsx': `export default function App() {
|
|
191
|
-
return (
|
|
192
|
-
<div
|
|
193
|
-
style={{ background: '#09090b', color: '#a1a1aa', fontFamily: 'system-ui, -apple-system, sans-serif', minHeight: '100vh', display: 'flex', justifyContent: 'center' }}
|
|
194
|
-
dangerouslySetInnerHTML={{
|
|
195
|
-
__html: \`${buildReactInnerHtml('Vite + React', [
|
|
196
|
-
{
|
|
197
|
-
title: 'AI Gateway',
|
|
198
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
title: 'Server',
|
|
202
|
-
text: 'Edit <code>server.ts</code> to customize the AI endpoint.',
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
title: 'Deploy',
|
|
206
|
-
text: 'Run <code>agentuity deploy</code> to ship to production.',
|
|
207
|
-
},
|
|
208
|
-
])}\`
|
|
209
|
-
}}
|
|
210
|
-
/>
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
`,
|
|
214
|
-
'src/index.css': `body { margin: 0; }
|
|
215
|
-
`,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
219
|
-
/** Build inner HTML for React's dangerouslySetInnerHTML (no <html>/<body> wrapper) */
|
|
220
|
-
function buildReactInnerHtml(frameworkLabel, steps) {
|
|
221
|
-
const stepsHtml = steps
|
|
222
|
-
.map((s) => `
|
|
223
|
-
<div class="step">
|
|
224
|
-
<div class="check">${CHECK_SVG}</div>
|
|
225
|
-
<div><h4>${s.title}</h4><p>${s.text}</p></div>
|
|
226
|
-
</div>`)
|
|
227
|
-
.join('');
|
|
228
|
-
return `${SHARED_STYLES}
|
|
229
|
-
<div class="wrap">
|
|
230
|
-
<div class="header">
|
|
231
|
-
${AGENTUITY_LOGO_SVG}
|
|
232
|
-
<h1>Welcome to Agentuity</h1>
|
|
233
|
-
<p><em>${frameworkLabel}</em> + AI Gateway</p>
|
|
234
|
-
</div>
|
|
235
|
-
<div class="card">
|
|
236
|
-
<h3>Getting started</h3>
|
|
237
|
-
${stepsHtml}
|
|
238
|
-
</div>
|
|
239
|
-
</div>
|
|
240
|
-
<a class="badge" href="https://agentuity.dev/" target="_blank" rel="noopener noreferrer">${BADGE_SVG} Powered by Agentuity</a>`;
|
|
241
|
-
}
|
|
242
|
-
//# sourceMappingURL=frameworks-landing-pages.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frameworks-landing-pages.js","sourceRoot":"","sources":["../../../src/cmd/project/frameworks-landing-pages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI SDK example generators for each framework.
|
|
3
|
-
*
|
|
4
|
-
* Each function returns a map of relative file paths to file contents
|
|
5
|
-
* that demonstrate a simple AI chat endpoint using the Vercel AI SDK
|
|
6
|
-
* with the Agentuity AI Gateway.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export function nextjsAiExample(): Record<string, string> {
|
|
10
|
-
return {
|
|
11
|
-
'app/api/chat/route.ts': `import { generateText } from 'ai';
|
|
12
|
-
import { openai } from '@ai-sdk/openai';
|
|
13
|
-
import { NextResponse } from 'next/server';
|
|
14
|
-
|
|
15
|
-
export async function POST(request: Request) {
|
|
16
|
-
\tconst { message } = await request.json();
|
|
17
|
-
|
|
18
|
-
\tconst { text } = await generateText({
|
|
19
|
-
\t\tmodel: openai('gpt-4o-mini'),
|
|
20
|
-
\t\tprompt: message,
|
|
21
|
-
\t});
|
|
22
|
-
|
|
23
|
-
\treturn NextResponse.json({ reply: text });
|
|
24
|
-
}
|
|
25
|
-
`,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function nuxtAiExample(): Record<string, string> {
|
|
30
|
-
return {
|
|
31
|
-
'server/api/chat.post.ts': `import { generateText } from 'ai';
|
|
32
|
-
import { openai } from '@ai-sdk/openai';
|
|
33
|
-
|
|
34
|
-
export default defineEventHandler(async (event) => {
|
|
35
|
-
\tconst { message } = await readBody(event);
|
|
36
|
-
|
|
37
|
-
\tconst { text } = await generateText({
|
|
38
|
-
\t\tmodel: openai('gpt-4o-mini'),
|
|
39
|
-
\t\tprompt: message,
|
|
40
|
-
\t});
|
|
41
|
-
|
|
42
|
-
\treturn { reply: text };
|
|
43
|
-
});
|
|
44
|
-
`,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function remixAiExample(): Record<string, string> {
|
|
49
|
-
return {
|
|
50
|
-
'app/routes/api.chat.ts': `import { type ActionFunctionArgs, json } from '@remix-run/node';
|
|
51
|
-
import { generateText } from 'ai';
|
|
52
|
-
import { openai } from '@ai-sdk/openai';
|
|
53
|
-
|
|
54
|
-
export async function action({ request }: ActionFunctionArgs) {
|
|
55
|
-
\tconst { message } = await request.json();
|
|
56
|
-
|
|
57
|
-
\tconst { text } = await generateText({
|
|
58
|
-
\t\tmodel: openai('gpt-4o-mini'),
|
|
59
|
-
\t\tprompt: message,
|
|
60
|
-
\t});
|
|
61
|
-
|
|
62
|
-
\treturn json({ reply: text });
|
|
63
|
-
}
|
|
64
|
-
`,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function sveltekitAiExample(): Record<string, string> {
|
|
69
|
-
return {
|
|
70
|
-
'src/routes/api/chat/+server.ts': `import { json } from '@sveltejs/kit';
|
|
71
|
-
import type { RequestHandler } from './$types';
|
|
72
|
-
import { generateText } from 'ai';
|
|
73
|
-
import { openai } from '@ai-sdk/openai';
|
|
74
|
-
|
|
75
|
-
export const POST: RequestHandler = async ({ request }) => {
|
|
76
|
-
\tconst { message } = await request.json();
|
|
77
|
-
|
|
78
|
-
\tconst { text } = await generateText({
|
|
79
|
-
\t\tmodel: openai('gpt-4o-mini'),
|
|
80
|
-
\t\tprompt: message,
|
|
81
|
-
\t});
|
|
82
|
-
|
|
83
|
-
\treturn json({ reply: text });
|
|
84
|
-
};
|
|
85
|
-
`,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function astroAiExample(): Record<string, string> {
|
|
90
|
-
return {
|
|
91
|
-
'src/pages/api/chat.ts': `import type { APIRoute } from 'astro';
|
|
92
|
-
import { generateText } from 'ai';
|
|
93
|
-
import { openai } from '@ai-sdk/openai';
|
|
94
|
-
|
|
95
|
-
export const POST: APIRoute = async ({ request }) => {
|
|
96
|
-
\tconst { message } = await request.json();
|
|
97
|
-
|
|
98
|
-
\tconst { text } = await generateText({
|
|
99
|
-
\t\tmodel: openai('gpt-4o-mini'),
|
|
100
|
-
\t\tprompt: message,
|
|
101
|
-
\t});
|
|
102
|
-
|
|
103
|
-
\treturn new Response(
|
|
104
|
-
\t\tJSON.stringify({ reply: text }),
|
|
105
|
-
\t\t{ headers: { 'Content-Type': 'application/json' } }
|
|
106
|
-
\t);
|
|
107
|
-
};
|
|
108
|
-
`,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function honoAiExample(): Record<string, string> {
|
|
113
|
-
return {
|
|
114
|
-
'src/index.ts': `import { Hono } from 'hono';
|
|
115
|
-
import { generateText } from 'ai';
|
|
116
|
-
import { openai } from '@ai-sdk/openai';
|
|
117
|
-
|
|
118
|
-
const app = new Hono();
|
|
119
|
-
|
|
120
|
-
app.get('/', (c) => c.text('Hello from Hono + Agentuity!'));
|
|
121
|
-
|
|
122
|
-
app.post('/api/chat', async (c) => {
|
|
123
|
-
\tconst { message } = await c.req.json();
|
|
124
|
-
|
|
125
|
-
\tconst { text } = await generateText({
|
|
126
|
-
\t\tmodel: openai('gpt-4o-mini'),
|
|
127
|
-
\t\tprompt: message,
|
|
128
|
-
\t});
|
|
129
|
-
|
|
130
|
-
\treturn c.json({ reply: text });
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
export default app;
|
|
134
|
-
`,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function viteReactAiExample(): Record<string, string> {
|
|
139
|
-
return {
|
|
140
|
-
'server.ts': `import { generateText } from 'ai';
|
|
141
|
-
import { openai } from '@ai-sdk/openai';
|
|
142
|
-
|
|
143
|
-
Bun.serve({
|
|
144
|
-
\tport: process.env.PORT ?? 3000,
|
|
145
|
-
\tasync fetch(request) {
|
|
146
|
-
\t\tconst url = new URL(request.url);
|
|
147
|
-
|
|
148
|
-
\t\tif (url.pathname === '/api/chat' && request.method === 'POST') {
|
|
149
|
-
\t\t\tconst { message } = await request.json();
|
|
150
|
-
|
|
151
|
-
\t\t\tconst { text } = await generateText({
|
|
152
|
-
\t\t\t\tmodel: openai('gpt-4o-mini'),
|
|
153
|
-
\t\t\t\tprompt: message,
|
|
154
|
-
\t\t\t});
|
|
155
|
-
|
|
156
|
-
\t\t\treturn Response.json({ reply: text });
|
|
157
|
-
\t\t}
|
|
158
|
-
|
|
159
|
-
\t\treturn new Response('Not Found', { status: 404 });
|
|
160
|
-
\t},
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
console.log('Server running on http://localhost:' + (process.env.PORT ?? 3000));
|
|
164
|
-
`,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentuity-branded landing page generators for each framework.
|
|
3
|
-
*
|
|
4
|
-
* Each function returns a map of relative file paths to file contents
|
|
5
|
-
* that replace the framework's default landing page with a dark-themed
|
|
6
|
-
* Agentuity welcome page matching the brand design system.
|
|
7
|
-
*
|
|
8
|
-
* Design: dark background (#09090b), cyan accent (#00FFFF), Agentuity
|
|
9
|
-
* logo, "Welcome to Agentuity" heading, and framework-specific next steps.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
// ─── Shared ──────────────────────────────────────────────────────────────────
|
|
13
|
-
|
|
14
|
-
const AGENTUITY_LOGO_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="48" height="42" viewBox="0 0 220 191" fill="none">
|
|
15
|
-
<path fill-rule="evenodd" clip-rule="evenodd" d="M220 191H0L31.427 136.5H0L8 122.5H180.5L220 191ZM47.588 136.5L24.234 177H195.766L172.412 136.5H47.588Z" fill="#00FFFF"/>
|
|
16
|
-
<path fill-rule="evenodd" clip-rule="evenodd" d="M110 0L157.448 82.5H189L197 96.5H54.5L110 0ZM78.702 82.5L110 28.081L141.298 82.5H78.702Z" fill="#00FFFF"/>
|
|
17
|
-
</svg>`;
|
|
18
|
-
|
|
19
|
-
const SHARED_STYLES = `
|
|
20
|
-
<style>
|
|
21
|
-
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
22
|
-
body { background: #09090b; color: #a1a1aa; font-family: system-ui, -apple-system, sans-serif; min-height: 100vh; display: flex; justify-content: center; }
|
|
23
|
-
.wrap { max-width: 48rem; width: 100%; padding: 4rem; display: flex; flex-direction: column; gap: 1rem; }
|
|
24
|
-
.header { text-align: center; margin-bottom: 2rem; }
|
|
25
|
-
.header svg { margin-bottom: 1rem; }
|
|
26
|
-
.header h1 { font-size: 3rem; font-weight: 100; color: #fff; }
|
|
27
|
-
.header p { font-size: 1.125rem; color: #71717a; }
|
|
28
|
-
.header em { font-style: italic; font-family: Georgia, serif; }
|
|
29
|
-
.card { background: #000; border: 1px solid #1c1c1e; border-radius: 0.5rem; padding: 2rem; }
|
|
30
|
-
.card h3 { color: #fff; font-size: 1.25rem; font-weight: 400; margin-bottom: 1.5rem; }
|
|
31
|
-
.step { display: flex; gap: 0.75rem; align-items: flex-start; margin-bottom: 1.25rem; }
|
|
32
|
-
.step:last-child { margin-bottom: 0; }
|
|
33
|
-
.check { width: 1rem; height: 1rem; border: 1px solid #22c55e; background: #052e16; border-radius: 0.25rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; margin-top: 0.1rem; }
|
|
34
|
-
.check svg { width: 0.625rem; height: 0.625rem; }
|
|
35
|
-
.step h4 { color: #fff; font-size: 0.875rem; font-weight: 400; margin-bottom: 0.25rem; }
|
|
36
|
-
.step p { font-size: 0.75rem; }
|
|
37
|
-
code { color: #fff; background: #1c1c1e; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-size: 0.75rem; }
|
|
38
|
-
a.badge { position: fixed; bottom: 1rem; right: 1rem; display: flex; align-items: center; gap: 0.5rem; padding: 0.5rem 0.75rem; background: #09090b; border: 1px solid #27272a; border-radius: 0.5rem; color: #a1a1aa; font-size: 0.75rem; text-decoration: none; transition: border-color 0.2s; z-index: 50; }
|
|
39
|
-
a.badge:hover { border-color: #00FFFF; }
|
|
40
|
-
a.badge svg { width: 16px; height: 14px; }
|
|
41
|
-
</style>`;
|
|
42
|
-
|
|
43
|
-
const CHECK_SVG =
|
|
44
|
-
'<svg fill="none" stroke="#22c55e" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>';
|
|
45
|
-
|
|
46
|
-
const BADGE_SVG =
|
|
47
|
-
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 191" fill="none"><path fill-rule="evenodd" clip-rule="evenodd" d="M220 191H0L31.427 136.5H0L8 122.5H180.5L220 191ZM47.588 136.5L24.234 177H195.766L172.412 136.5H47.588Z" fill="#00FFFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M110 0L157.448 82.5H189L197 96.5H54.5L110 0ZM78.702 82.5L110 28.081L141.298 82.5H78.702Z" fill="#00FFFF"/></svg>';
|
|
48
|
-
|
|
49
|
-
function buildPage(frameworkLabel: string, steps: { title: string; text: string }[]): string {
|
|
50
|
-
const stepsHtml = steps
|
|
51
|
-
.map(
|
|
52
|
-
(s) => `
|
|
53
|
-
<div class="step">
|
|
54
|
-
<div class="check">${CHECK_SVG}</div>
|
|
55
|
-
<div><h4>${s.title}</h4><p>${s.text}</p></div>
|
|
56
|
-
</div>`
|
|
57
|
-
)
|
|
58
|
-
.join('');
|
|
59
|
-
|
|
60
|
-
return `<!DOCTYPE html>
|
|
61
|
-
<html lang="en">
|
|
62
|
-
<head>
|
|
63
|
-
<meta charset="utf-8"/>
|
|
64
|
-
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
65
|
-
<title>Agentuity + ${frameworkLabel}</title>
|
|
66
|
-
${SHARED_STYLES}
|
|
67
|
-
</head>
|
|
68
|
-
<body>
|
|
69
|
-
<div class="wrap">
|
|
70
|
-
<div class="header">
|
|
71
|
-
${AGENTUITY_LOGO_SVG}
|
|
72
|
-
<h1>Welcome to Agentuity</h1>
|
|
73
|
-
<p><em>${frameworkLabel}</em> + AI Gateway</p>
|
|
74
|
-
</div>
|
|
75
|
-
<div class="card">
|
|
76
|
-
<h3>Getting started</h3>
|
|
77
|
-
${stepsHtml}
|
|
78
|
-
</div>
|
|
79
|
-
</div>
|
|
80
|
-
<a class="badge" href="https://agentuity.dev/" target="_blank" rel="noopener noreferrer">${BADGE_SVG} Powered by Agentuity</a>
|
|
81
|
-
</body>
|
|
82
|
-
</html>`;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// ─── Framework-specific Landing Pages ────────────────────────────────────────
|
|
86
|
-
|
|
87
|
-
export function nextjsLandingPage(): Record<string, string> {
|
|
88
|
-
return {
|
|
89
|
-
'src/app/page.tsx': `export default function Home() {
|
|
90
|
-
return (
|
|
91
|
-
<div
|
|
92
|
-
style={{ background: '#09090b', color: '#a1a1aa', fontFamily: 'system-ui, -apple-system, sans-serif', minHeight: '100vh', display: 'flex', justifyContent: 'center' }}
|
|
93
|
-
dangerouslySetInnerHTML={{
|
|
94
|
-
__html: \`${buildReactInnerHtml('Next.js', [
|
|
95
|
-
{
|
|
96
|
-
title: 'AI Gateway',
|
|
97
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
title: 'API route',
|
|
101
|
-
text: 'Edit <code>app/api/chat/route.ts</code> to customize the AI endpoint.',
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
title: 'Deploy',
|
|
105
|
-
text: 'Run <code>agentuity deploy</code> to ship to production.',
|
|
106
|
-
},
|
|
107
|
-
])}\`
|
|
108
|
-
}}
|
|
109
|
-
/>
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
`,
|
|
113
|
-
'src/app/globals.css': `body { margin: 0; }
|
|
114
|
-
`,
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export function nuxtLandingPage(): Record<string, string> {
|
|
119
|
-
return {
|
|
120
|
-
'app.vue': `<template>
|
|
121
|
-
<div v-html="html" />
|
|
122
|
-
</template>
|
|
123
|
-
|
|
124
|
-
<script setup lang="ts">
|
|
125
|
-
const html = \`${buildPage('Nuxt', [
|
|
126
|
-
{
|
|
127
|
-
title: 'AI Gateway',
|
|
128
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
title: 'Server route',
|
|
132
|
-
text: 'Edit <code>server/api/chat.post.ts</code> to customize the AI endpoint.',
|
|
133
|
-
},
|
|
134
|
-
{ title: 'Deploy', text: 'Run <code>agentuity deploy</code> to ship to production.' },
|
|
135
|
-
])}\`;
|
|
136
|
-
</script>
|
|
137
|
-
`,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export function remixLandingPage(): Record<string, string> {
|
|
142
|
-
return {
|
|
143
|
-
'app/routes/_index.tsx': `export default function Index() {
|
|
144
|
-
return (
|
|
145
|
-
<div
|
|
146
|
-
style={{ background: '#09090b', color: '#a1a1aa', fontFamily: 'system-ui, -apple-system, sans-serif', minHeight: '100vh', display: 'flex', justifyContent: 'center' }}
|
|
147
|
-
dangerouslySetInnerHTML={{
|
|
148
|
-
__html: \`${buildReactInnerHtml('Remix', [
|
|
149
|
-
{
|
|
150
|
-
title: 'AI Gateway',
|
|
151
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
title: 'Action route',
|
|
155
|
-
text: 'Edit <code>app/routes/api.chat.ts</code> to customize the AI endpoint.',
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
title: 'Deploy',
|
|
159
|
-
text: 'Run <code>agentuity deploy</code> to ship to production.',
|
|
160
|
-
},
|
|
161
|
-
])}\`
|
|
162
|
-
}}
|
|
163
|
-
/>
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
`,
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export function sveltekitLandingPage(): Record<string, string> {
|
|
171
|
-
return {
|
|
172
|
-
'src/routes/+page.svelte': `{@html \`${buildPage('SvelteKit', [
|
|
173
|
-
{
|
|
174
|
-
title: 'AI Gateway',
|
|
175
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
title: 'Server route',
|
|
179
|
-
text: 'Edit <code>src/routes/api/chat/+server.ts</code> to customize the AI endpoint.',
|
|
180
|
-
},
|
|
181
|
-
{ title: 'Deploy', text: 'Run <code>agentuity deploy</code> to ship to production.' },
|
|
182
|
-
])}\`}
|
|
183
|
-
`,
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export function astroLandingPage(): Record<string, string> {
|
|
188
|
-
return {
|
|
189
|
-
'src/pages/index.astro': `---
|
|
190
|
-
---
|
|
191
|
-
${buildPage('Astro', [
|
|
192
|
-
{
|
|
193
|
-
title: 'AI Gateway',
|
|
194
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
title: 'API route',
|
|
198
|
-
text: 'Edit <code>src/pages/api/chat.ts</code> to customize the AI endpoint.',
|
|
199
|
-
},
|
|
200
|
-
{ title: 'Deploy', text: 'Run <code>agentuity deploy</code> to ship to production.' },
|
|
201
|
-
])}
|
|
202
|
-
`,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export function viteReactLandingPage(): Record<string, string> {
|
|
207
|
-
return {
|
|
208
|
-
'src/App.tsx': `export default function App() {
|
|
209
|
-
return (
|
|
210
|
-
<div
|
|
211
|
-
style={{ background: '#09090b', color: '#a1a1aa', fontFamily: 'system-ui, -apple-system, sans-serif', minHeight: '100vh', display: 'flex', justifyContent: 'center' }}
|
|
212
|
-
dangerouslySetInnerHTML={{
|
|
213
|
-
__html: \`${buildReactInnerHtml('Vite + React', [
|
|
214
|
-
{
|
|
215
|
-
title: 'AI Gateway',
|
|
216
|
-
text: 'Run <code>agentuity dev</code> to start with AI Gateway routing.',
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
title: 'Server',
|
|
220
|
-
text: 'Edit <code>server.ts</code> to customize the AI endpoint.',
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
title: 'Deploy',
|
|
224
|
-
text: 'Run <code>agentuity deploy</code> to ship to production.',
|
|
225
|
-
},
|
|
226
|
-
])}\`
|
|
227
|
-
}}
|
|
228
|
-
/>
|
|
229
|
-
);
|
|
230
|
-
}
|
|
231
|
-
`,
|
|
232
|
-
'src/index.css': `body { margin: 0; }
|
|
233
|
-
`,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
238
|
-
|
|
239
|
-
/** Build inner HTML for React's dangerouslySetInnerHTML (no <html>/<body> wrapper) */
|
|
240
|
-
function buildReactInnerHtml(
|
|
241
|
-
frameworkLabel: string,
|
|
242
|
-
steps: { title: string; text: string }[]
|
|
243
|
-
): string {
|
|
244
|
-
const stepsHtml = steps
|
|
245
|
-
.map(
|
|
246
|
-
(s) => `
|
|
247
|
-
<div class="step">
|
|
248
|
-
<div class="check">${CHECK_SVG}</div>
|
|
249
|
-
<div><h4>${s.title}</h4><p>${s.text}</p></div>
|
|
250
|
-
</div>`
|
|
251
|
-
)
|
|
252
|
-
.join('');
|
|
253
|
-
|
|
254
|
-
return `${SHARED_STYLES}
|
|
255
|
-
<div class="wrap">
|
|
256
|
-
<div class="header">
|
|
257
|
-
${AGENTUITY_LOGO_SVG}
|
|
258
|
-
<h1>Welcome to Agentuity</h1>
|
|
259
|
-
<p><em>${frameworkLabel}</em> + AI Gateway</p>
|
|
260
|
-
</div>
|
|
261
|
-
<div class="card">
|
|
262
|
-
<h3>Getting started</h3>
|
|
263
|
-
${stepsHtml}
|
|
264
|
-
</div>
|
|
265
|
-
</div>
|
|
266
|
-
<a class="badge" href="https://agentuity.dev/" target="_blank" rel="noopener noreferrer">${BADGE_SVG} Powered by Agentuity</a>`;
|
|
267
|
-
}
|