create-agents24-app 0.1.0 → 0.1.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/README.md +40 -2
- package/dist/{chunk-OCIF3LSI.js → chunk-PXJTBSPX.js} +99 -23
- package/dist/chunk-PXJTBSPX.js.map +1 -0
- package/dist/cli.js +39 -61
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.js +9 -1
- package/dist/scaffold/components.json +25 -0
- package/dist/scaffold/manifest.json +28 -0
- package/dist/scaffold/src/app.tsx +71 -0
- package/dist/scaffold/src/chat.css +54 -0
- package/dist/scaffold/src/components/chat/chat-composer.tsx +237 -0
- package/dist/scaffold/src/components/chat/chat-message.tsx +76 -0
- package/dist/scaffold/src/components/chat/chat-shell.tsx +257 -0
- package/dist/scaffold/src/components/chat/collapsible-user-message.tsx +37 -0
- package/dist/scaffold/src/components/chat/external-link-dialog.tsx +48 -0
- package/dist/scaffold/src/components/chat/identity-control.tsx +69 -0
- package/dist/scaffold/src/components/chat/message-parts.tsx +83 -0
- package/dist/scaffold/src/components/chat/theme-menu.tsx +79 -0
- package/dist/scaffold/src/components/chat/thread-sidebar.tsx +114 -0
- package/dist/scaffold/src/components/chat/timeline-loading.ts +17 -0
- package/dist/scaffold/src/components/chat/turn-outline.tsx +73 -0
- package/dist/scaffold/src/components/theme-provider.tsx +91 -0
- package/dist/scaffold/src/components/ui/attachment.tsx +204 -0
- package/dist/scaffold/src/components/ui/bubble.tsx +125 -0
- package/dist/scaffold/src/components/ui/button-group.tsx +83 -0
- package/dist/scaffold/src/components/ui/button.tsx +65 -0
- package/dist/scaffold/src/components/ui/dialog.tsx +171 -0
- package/dist/scaffold/src/components/ui/dropdown-menu.tsx +271 -0
- package/dist/scaffold/src/components/ui/input.tsx +19 -0
- package/dist/scaffold/src/components/ui/marker.tsx +69 -0
- package/dist/scaffold/src/components/ui/message-scroller.tsx +129 -0
- package/dist/scaffold/src/components/ui/message.tsx +92 -0
- package/dist/scaffold/src/components/ui/popover.tsx +40 -0
- package/dist/scaffold/src/components/ui/select.tsx +92 -0
- package/dist/scaffold/src/components/ui/separator.tsx +28 -0
- package/dist/scaffold/src/components/ui/sheet.tsx +150 -0
- package/dist/scaffold/src/components/ui/sidebar.tsx +677 -0
- package/dist/scaffold/src/components/ui/skeleton.tsx +13 -0
- package/dist/scaffold/src/components/ui/textarea.tsx +18 -0
- package/dist/scaffold/src/components/ui/tooltip.tsx +56 -0
- package/dist/scaffold/src/hooks/use-mobile.ts +24 -0
- package/dist/scaffold/src/identity.ts +17 -0
- package/dist/scaffold/src/index.css +221 -0
- package/dist/scaffold/src/index.tsx +39 -0
- package/dist/scaffold/src/lib/utils.ts +6 -0
- package/dist/scaffold/styles.css +3 -0
- package/dist/scaffold-manifest.json +66 -0
- package/package.json +7 -3
- package/templates/common/README.md +16 -3
- package/templates/common/index.html +3 -3
- package/templates/common/scripts/apply-preset.mjs +17 -0
- package/templates/common/scripts/scope-preset-theme.mjs +38 -0
- package/templates/common/src/styles.css +10 -6
- package/templates/common/src/use-thread-query-navigation.ts +41 -0
- package/templates/common/tsconfig.json +2 -1
- package/templates/integrations/bff/server/env.ts +3 -3
- package/templates/integrations/bff/server/index.ts +1 -2
- package/templates/integrations/bff/server/principal.ts +3 -3
- package/templates/integrations/bff/src/host-identity.ts +6 -0
- package/templates/integrations/bff/src/main.tsx +21 -16
- package/templates/integrations/bff/tsconfig.json +2 -1
- package/templates/integrations/bff/vite.config.ts +5 -1
- package/templates/integrations/client-deployment/src/main.tsx +26 -18
- package/templates/integrations/client-deployment/vite.config.ts +37 -4
- package/templates/starters/rag/agents24/agents/assistant.md +11 -0
- package/templates/starters/rag/agents24/agents24.yaml +19 -0
- package/templates/starters/rag/agents24/rag/knowledge.yaml +32 -0
- package/templates/starters/rag/agents24/stores/knowledge.yaml +10 -0
- package/templates/starters/rag/agents24/workflows/main.yaml +16 -0
- package/versions.json +4 -4
- package/dist/chunk-OCIF3LSI.js.map +0 -1
- package/templates/themes/essential/src/theme.css +0 -2
- package/templates/themes/flow/src/theme.css +0 -60
- package/templates/themes/workbench/src/theme.css +0 -51
|
@@ -6,11 +6,10 @@ catch (error) {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
const REQUIRED = [
|
|
9
|
-
"AGENTS24_BASE_URL",
|
|
10
9
|
"AGENTS24_API_KEY",
|
|
11
|
-
"AGENTS24_ORGANIZATION_ID",
|
|
12
|
-
"AGENTS24_PROJECT_ID",
|
|
13
10
|
"AGENTS24_AGENT_ID",
|
|
11
|
+
"AGENTS24_DEPLOYMENT_ID",
|
|
12
|
+
"AGENTS24_CUSTOMER_ISSUER",
|
|
14
13
|
"SESSION_COOKIE_SECRET",
|
|
15
14
|
] as const;
|
|
16
15
|
|
|
@@ -22,6 +21,7 @@ function required(name: (typeof REQUIRED)[number]): string {
|
|
|
22
21
|
|
|
23
22
|
export const env = {
|
|
24
23
|
...Object.fromEntries(REQUIRED.map((name) => [name, required(name)])) as Record<(typeof REQUIRED)[number], string>,
|
|
24
|
+
AGENTS24_BASE_URL: String(process.env.AGENTS24_BASE_URL || "https://api.agents24.dev").trim(),
|
|
25
25
|
AGENTS24_AGENT_VERSION_ID: String(process.env.AGENTS24_AGENT_VERSION_ID || "").trim() || undefined,
|
|
26
26
|
PORT: Number(process.env.PORT || 3001),
|
|
27
27
|
};
|
|
@@ -12,12 +12,11 @@ import { resolveAgents24Principal, revokeAgents24Principal } from "./principal.j
|
|
|
12
12
|
const client = new Agents24({
|
|
13
13
|
baseUrl: env.AGENTS24_BASE_URL,
|
|
14
14
|
apiKey: env.AGENTS24_API_KEY,
|
|
15
|
-
organizationId: env.AGENTS24_ORGANIZATION_ID,
|
|
16
|
-
projectId: env.AGENTS24_PROJECT_ID,
|
|
17
15
|
});
|
|
18
16
|
const agents24 = createAgents24BffHandler({
|
|
19
17
|
client,
|
|
20
18
|
agentId: env.AGENTS24_AGENT_ID,
|
|
19
|
+
deploymentId: env.AGENTS24_DEPLOYMENT_ID,
|
|
21
20
|
agentVersionId: env.AGENTS24_AGENT_VERSION_ID,
|
|
22
21
|
resolvePrincipal: resolveAgents24Principal,
|
|
23
22
|
revokePrincipal: (request) => revokeAgents24Principal(request),
|
|
@@ -39,10 +39,10 @@ function cookie(value: string, request: Request, maxAge = MAX_AGE): string {
|
|
|
39
39
|
// user ID supplied by browser request data.
|
|
40
40
|
export function resolveAgents24Principal(request: Request): AgentBffPrincipalResolution {
|
|
41
41
|
const existing = verifiedId(parseCookies(request)[COOKIE]);
|
|
42
|
-
const
|
|
42
|
+
const subject = existing || randomUUID();
|
|
43
43
|
return {
|
|
44
|
-
principal: {
|
|
45
|
-
...(existing ? {} : { responseHeaders: { "Set-Cookie": cookie(`${
|
|
44
|
+
principal: { issuer: env.AGENTS24_CUSTOMER_ISSUER, subject, externalSessionId: subject },
|
|
45
|
+
...(existing ? {} : { responseHeaders: { "Set-Cookie": cookie(`${subject}.${signature(subject)}`, request) } }),
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
|
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
import { AgentChatAppearanceControl, AgentChatApp } from "@agents24/chat-react/templates";
|
|
2
1
|
import { createBffAgentClient } from "@agents24/client/bff";
|
|
3
2
|
import { StrictMode } from "react";
|
|
4
3
|
import { createRoot } from "react-dom/client";
|
|
5
4
|
|
|
5
|
+
import { Agents24ChatScaffold } from "@/index";
|
|
6
|
+
import { useThreadQueryNavigation } from "@/use-thread-query-navigation";
|
|
7
|
+
import { getHostIdentity } from "./host-identity";
|
|
8
|
+
|
|
6
9
|
const client = createBffAgentClient({ basePath: "/api/agents24" });
|
|
7
10
|
|
|
8
|
-
function
|
|
11
|
+
function GeneratedChatApp() {
|
|
12
|
+
const navigation = useThreadQueryNavigation();
|
|
9
13
|
return (
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
slots={{ headerActions: <AgentChatAppearanceControl /> }}
|
|
21
|
-
/>
|
|
22
|
-
</div>
|
|
14
|
+
<Agents24ChatScaffold
|
|
15
|
+
client={client}
|
|
16
|
+
identity={getHostIdentity()}
|
|
17
|
+
{...navigation}
|
|
18
|
+
completeMcpAuthorization={async ({ completion, serverId }) => {
|
|
19
|
+
if (completion.serverId !== serverId || !completion.connectionId) {
|
|
20
|
+
throw new Error("MCP authorization did not return the expected connection.");
|
|
21
|
+
}
|
|
22
|
+
}}
|
|
23
|
+
/>
|
|
23
24
|
);
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
createRoot(document.getElementById("root")!).render(
|
|
27
|
+
createRoot(document.getElementById("root")!).render(
|
|
28
|
+
<StrictMode>
|
|
29
|
+
<GeneratedChatApp />
|
|
30
|
+
</StrictMode>,
|
|
31
|
+
);
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
1
4
|
import react from "@vitejs/plugin-react";
|
|
2
5
|
import { defineConfig } from "vite";
|
|
3
6
|
|
|
4
7
|
export default defineConfig({
|
|
5
|
-
plugins: [react()],
|
|
8
|
+
plugins: [react(), tailwindcss()],
|
|
9
|
+
resolve: { alias: { "@": path.resolve(fileURLToPath(new URL(".", import.meta.url)), "./src") } },
|
|
6
10
|
server: {
|
|
7
11
|
host: "127.0.0.1",
|
|
8
12
|
proxy: { "/api/agents24": "http://127.0.0.1:3001" },
|
|
@@ -1,31 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { createBrowserAgentClient } from "@agents24/client/browser";
|
|
4
|
-
import { StrictMode } from "react";
|
|
1
|
+
import { createBrowserDeploymentSessionController } from "@agents24/client/browser";
|
|
2
|
+
import { StrictMode, useEffect, useSyncExternalStore } from "react";
|
|
5
3
|
import { createRoot } from "react-dom/client";
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
import { Agents24ChatScaffold } from "@/index";
|
|
6
|
+
import { useThreadQueryNavigation } from "@/use-thread-query-navigation";
|
|
7
|
+
|
|
8
|
+
const baseUrl = String(import.meta.env.VITE_AGENTS24_BASE_URL || "https://api.agents24.dev").trim();
|
|
8
9
|
const deploymentId = String(import.meta.env.VITE_AGENTS24_DEPLOYMENT_ID || "").trim();
|
|
9
10
|
|
|
10
|
-
if (!baseUrl) throw new Error("VITE_AGENTS24_BASE_URL is required.");
|
|
11
11
|
if (!/^acd_[A-Za-z0-9_-]{10,}$/.test(deploymentId)) {
|
|
12
12
|
throw new Error("VITE_AGENTS24_DEPLOYMENT_ID must be a public acd_… deployment ID.");
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const
|
|
16
|
-
const client = createBrowserAgentClient({ baseUrl, deploymentId, sessionProvider });
|
|
15
|
+
const sessions = createBrowserDeploymentSessionController({ baseUrl, deploymentId });
|
|
17
16
|
|
|
18
|
-
function
|
|
17
|
+
function GeneratedChatApp() {
|
|
18
|
+
const navigation = useThreadQueryNavigation();
|
|
19
|
+
const session = useSyncExternalStore(sessions.subscribe, sessions.getSnapshot, sessions.getSnapshot);
|
|
20
|
+
useEffect(() => { void sessions.initialize(); }, []);
|
|
21
|
+
const canSignIn = session.authModes.includes("external_oidc");
|
|
19
22
|
return (
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
<Agents24ChatScaffold
|
|
24
|
+
client={sessions.client}
|
|
25
|
+
identity={{
|
|
26
|
+
...session.identity,
|
|
27
|
+
...(canSignIn ? { onSignIn: () => sessions.signIn() } : {}),
|
|
28
|
+
...(session.identity.state === "authenticated" ? { onSignOut: () => sessions.signOut() } : {}),
|
|
29
|
+
}}
|
|
30
|
+
{...navigation}
|
|
31
|
+
/>
|
|
28
32
|
);
|
|
29
33
|
}
|
|
30
34
|
|
|
31
|
-
createRoot(document.getElementById("root")!).render(
|
|
35
|
+
createRoot(document.getElementById("root")!).render(
|
|
36
|
+
<StrictMode>
|
|
37
|
+
<GeneratedChatApp />
|
|
38
|
+
</StrictMode>,
|
|
39
|
+
);
|
|
@@ -1,7 +1,40 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
1
4
|
import react from "@vitejs/plugin-react";
|
|
2
|
-
import { defineConfig } from "vite";
|
|
5
|
+
import { defineConfig, loadEnv, type Plugin } from "vite";
|
|
3
6
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
const DEFAULT_AGENTS24_BASE_URL = "https://api.agents24.dev";
|
|
8
|
+
|
|
9
|
+
export function agents24ConnectOrigin(value: string | undefined): string {
|
|
10
|
+
const candidate = String(value || DEFAULT_AGENTS24_BASE_URL).trim();
|
|
11
|
+
let url: URL;
|
|
12
|
+
try {
|
|
13
|
+
url = new URL(candidate);
|
|
14
|
+
} catch {
|
|
15
|
+
throw new Error("VITE_AGENTS24_BASE_URL must be a valid absolute HTTP(S) URL.");
|
|
16
|
+
}
|
|
17
|
+
if (!["http:", "https:"].includes(url.protocol)) {
|
|
18
|
+
throw new Error("VITE_AGENTS24_BASE_URL must be a valid absolute HTTP(S) URL.");
|
|
19
|
+
}
|
|
20
|
+
return url.origin;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function agents24CspPlugin(connectOrigin: string): Plugin {
|
|
24
|
+
return {
|
|
25
|
+
name: "agents24-csp",
|
|
26
|
+
transformIndexHtml(html) {
|
|
27
|
+
return html.replaceAll("__AGENTS24_CONNECT_SOURCE__", connectOrigin);
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default defineConfig(({ mode }) => {
|
|
33
|
+
const environment = loadEnv(mode, process.cwd(), "");
|
|
34
|
+
const connectOrigin = agents24ConnectOrigin(environment.VITE_AGENTS24_BASE_URL);
|
|
35
|
+
return {
|
|
36
|
+
plugins: [agents24CspPlugin(connectOrigin), react(), tailwindcss()],
|
|
37
|
+
resolve: { alias: { "@": path.resolve(fileURLToPath(new URL(".", import.meta.url)), "./src") } },
|
|
38
|
+
server: { host: "127.0.0.1" },
|
|
39
|
+
};
|
|
7
40
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: agents24.agent/v1
|
|
3
|
+
name: Customer Support Agent
|
|
4
|
+
description: Answers questions using the managed knowledge base when relevant.
|
|
5
|
+
model: $models.primary
|
|
6
|
+
tools:
|
|
7
|
+
- kind: rag
|
|
8
|
+
uses: ../rag/knowledge.yaml
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
You are a helpful assistant. Search the knowledge base when it can improve the answer. If the knowledge base has no relevant content, say so plainly and continue with the information available to you.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
schema: agents24.package/v1
|
|
2
|
+
name: __APP_NAME__-rag
|
|
3
|
+
description: A conversational Agent backed by a managed Knowledge Store.
|
|
4
|
+
resources:
|
|
5
|
+
- rag/knowledge.yaml
|
|
6
|
+
- stores/knowledge.yaml
|
|
7
|
+
- workflows/main.yaml
|
|
8
|
+
requires:
|
|
9
|
+
models:
|
|
10
|
+
embedding:
|
|
11
|
+
required: true
|
|
12
|
+
capability: embedding
|
|
13
|
+
match:
|
|
14
|
+
canonical_key: openai/text-embedding-3-small
|
|
15
|
+
primary:
|
|
16
|
+
required: true
|
|
17
|
+
capability: chat
|
|
18
|
+
match:
|
|
19
|
+
canonical_key: openai/gpt-5.6-luna
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
schema: agents24.rag/v1
|
|
2
|
+
name: Customer Support RAG
|
|
3
|
+
description: Searches the managed knowledge store.
|
|
4
|
+
mode: retrieval
|
|
5
|
+
inputs:
|
|
6
|
+
text: string
|
|
7
|
+
outputs:
|
|
8
|
+
results: array
|
|
9
|
+
steps:
|
|
10
|
+
query:
|
|
11
|
+
uses: query_input
|
|
12
|
+
embed:
|
|
13
|
+
uses: model_embedder
|
|
14
|
+
with:
|
|
15
|
+
model_id: $models.embedding
|
|
16
|
+
search:
|
|
17
|
+
uses: vector_search
|
|
18
|
+
with:
|
|
19
|
+
knowledge_store_id: ../stores/knowledge.yaml
|
|
20
|
+
top_k: 5
|
|
21
|
+
result:
|
|
22
|
+
uses: retrieval_result
|
|
23
|
+
flow:
|
|
24
|
+
- from: query
|
|
25
|
+
to: embed
|
|
26
|
+
- from: embed
|
|
27
|
+
to: search
|
|
28
|
+
- from: search
|
|
29
|
+
to: result
|
|
30
|
+
tool:
|
|
31
|
+
name: search_knowledge
|
|
32
|
+
description: Search the managed knowledge base for relevant information.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
schema: agents24.store/v1
|
|
2
|
+
name: Customer Support Knowledge
|
|
3
|
+
description: Managed knowledge for customer-support answers.
|
|
4
|
+
embedding_model: $models.embedding
|
|
5
|
+
chunking:
|
|
6
|
+
strategy: recursive
|
|
7
|
+
chunk_size: 512
|
|
8
|
+
chunk_overlap: 50
|
|
9
|
+
retrieval_policy: semantic_only
|
|
10
|
+
default_namespace: knowledge
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
schema: agents24.workflow/v1
|
|
2
|
+
name: Customer Support Agent
|
|
3
|
+
description: Answers questions with an attached knowledge search tool.
|
|
4
|
+
inputs:
|
|
5
|
+
text: string
|
|
6
|
+
outputs:
|
|
7
|
+
response: string
|
|
8
|
+
entry: assistant
|
|
9
|
+
nodes:
|
|
10
|
+
assistant:
|
|
11
|
+
uses: ../agents/assistant.md
|
|
12
|
+
inputs:
|
|
13
|
+
- text
|
|
14
|
+
flow:
|
|
15
|
+
- from: assistant.output_text
|
|
16
|
+
to: output.response
|
package/versions.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"agents24": {
|
|
3
|
-
"@agents24/client": "^0.2.
|
|
4
|
-
"@agents24/react": "^0.2.
|
|
5
|
-
"@agents24/chat-react": "^0.5.
|
|
6
|
-
"@agents24/node": "^0.2.
|
|
3
|
+
"@agents24/client": "^0.2.1",
|
|
4
|
+
"@agents24/react": "^0.2.1",
|
|
5
|
+
"@agents24/chat-react": "^0.5.1",
|
|
6
|
+
"@agents24/node": "^0.2.1"
|
|
7
7
|
},
|
|
8
8
|
"runtime": {
|
|
9
9
|
"react": "^19.2.3",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/generator.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport {\n chmodSync,\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { CreateAppOptions, GeneratedApp, PackageManager } from \"./types.js\";\n\ntype Versions = {\n agents24: Record<string, string>;\n runtime: Record<string, string>;\n development: Record<string, string>;\n};\n\nconst packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), \"..\");\nconst templateRoot = join(packageRoot, \"templates\");\nconst versions = JSON.parse(readFileSync(join(packageRoot, \"versions.json\"), \"utf8\")) as Versions;\n\nfunction packageName(directory: string): string {\n const value = basename(resolve(directory))\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[._-]+|[._-]+$/g, \"\");\n if (!value || !/^[a-z0-9]/.test(value)) throw new Error(\"The destination does not produce a valid npm package name.\");\n return value;\n}\n\nfunction assertDestination(destination: string): void {\n if (!existsSync(destination)) return;\n if (!statSync(destination).isDirectory()) throw new Error(\"The destination already exists and is not a directory.\");\n if (readdirSync(destination).length > 0) throw new Error(\"The destination directory must be empty.\");\n}\n\nfunction walk(directory: string): string[] {\n return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {\n const path = join(directory, entry.name);\n return entry.isDirectory() ? walk(path) : [path];\n });\n}\n\nfunction replaceTemplateValues(directory: string, replacements: Record<string, string>): void {\n for (const file of walk(directory)) {\n if (file.endsWith(\".png\") || file.endsWith(\".ico\")) continue;\n let content = readFileSync(file, \"utf8\");\n for (const [token, value] of Object.entries(replacements)) content = content.split(token).join(value);\n writeFileSync(file, content);\n }\n}\n\nfunction copyLayer(name: string, destination: string): void {\n cpSync(join(templateRoot, name), destination, { recursive: true, force: true });\n}\n\nfunction generatedManifest(options: CreateAppOptions, name: string): Record<string, unknown> {\n const dependencies: Record<string, string> = {\n \"@agents24/client\": versions.agents24[\"@agents24/client\"]!,\n \"@agents24/react\": versions.agents24[\"@agents24/react\"]!,\n \"@agents24/chat-react\": versions.agents24[\"@agents24/chat-react\"]!,\n react: versions.runtime.react!,\n \"react-dom\": versions.runtime[\"react-dom\"]!,\n };\n const devDependencies: Record<string, string> = {\n \"@types/react\": versions.development[\"@types/react\"]!,\n \"@types/react-dom\": versions.development[\"@types/react-dom\"]!,\n \"@vitejs/plugin-react\": versions.development[\"@vitejs/plugin-react\"]!,\n typescript: versions.development.typescript!,\n vite: versions.development.vite!,\n };\n const scripts: Record<string, string> = {\n dev: \"vite\",\n build: \"tsc --noEmit && vite build\",\n preview: \"vite preview\",\n };\n if (options.integration === \"bff\") {\n dependencies[\"@agents24/node\"] = versions.agents24[\"@agents24/node\"]!;\n dependencies.hono = versions.runtime.hono!;\n dependencies[\"@hono/node-server\"] = versions.runtime[\"@hono/node-server\"]!;\n devDependencies[\"@types/node\"] = versions.development[\"@types/node\"]!;\n devDependencies.concurrently = versions.development.concurrently!;\n devDependencies.tsx = versions.development.tsx!;\n devDependencies.tsup = \"^8.5.1\";\n scripts.dev = \"concurrently -k -n web,bff \\\"vite\\\" \\\"tsx watch server/index.ts\\\"\";\n scripts.build = \"tsc --noEmit && vite build && tsup server/index.ts --format esm --platform node --out-dir server-dist --external @agents24/node --external hono --external @hono/node-server\";\n scripts.start = \"node server-dist/index.js --production\";\n }\n return { name, private: true, version: \"0.0.0\", type: \"module\", engines: { node: \"^22.0.0 || ^24.0.0\" }, scripts, dependencies, devDependencies };\n}\n\nfunction envFiles(options: CreateAppOptions): { example: string; local: string } {\n const value = (input: string | undefined) => JSON.stringify(String(input || \"\"));\n if (options.integration === \"client-deployment\") {\n return {\n example: \"VITE_AGENTS24_BASE_URL=https://api.agents24.dev\\nVITE_AGENTS24_DEPLOYMENT_ID=acd_your_public_deployment_id\\n\",\n local: `VITE_AGENTS24_BASE_URL=${value(options.baseUrl)}\\nVITE_AGENTS24_DEPLOYMENT_ID=${value(options.deploymentId)}\\n`,\n };\n }\n return {\n example: [\n \"AGENTS24_BASE_URL=https://api.agents24.dev\",\n \"AGENTS24_API_KEY=your_server_only_api_key\",\n \"AGENTS24_ORGANIZATION_ID=your_organization_uuid\",\n \"AGENTS24_PROJECT_ID=your_project_uuid\",\n \"AGENTS24_AGENT_ID=your_agent_uuid\",\n \"AGENTS24_AGENT_VERSION_ID=\",\n \"SESSION_COOKIE_SECRET=generate_at_least_32_random_bytes\",\n \"PORT=3001\",\n \"\",\n ].join(\"\\n\"),\n local: [\n `AGENTS24_BASE_URL=${value(options.baseUrl)}`,\n `AGENTS24_API_KEY=${value(options.apiKey)}`,\n `AGENTS24_ORGANIZATION_ID=${value(options.organizationId)}`,\n `AGENTS24_PROJECT_ID=${value(options.projectId)}`,\n `AGENTS24_AGENT_ID=${value(options.agentId)}`,\n `AGENTS24_AGENT_VERSION_ID=${value(options.agentVersionId)}`,\n `SESSION_COOKIE_SECRET=${value(randomBytes(32).toString(\"base64url\"))}`,\n \"PORT=3001\",\n \"\",\n ].join(\"\\n\"),\n };\n}\n\nfunction installCommand(packageManager: PackageManager): [string, string[]] {\n if (packageManager === \"npm\") return [\"npm\", [\"install\"]];\n if (packageManager === \"yarn\") return [\"yarn\", []];\n if (packageManager === \"bun\") return [\"bun\", [\"install\"]];\n return [\"pnpm\", [\"install\"]];\n}\n\nfunction runScriptCommand(packageManager: PackageManager, script: string): string {\n if (packageManager === \"npm\") return `npm run ${script}`;\n if (packageManager === \"bun\") return `bun run ${script}`;\n return `${packageManager} ${script}`;\n}\n\nexport function installDependencies(directory: string, packageManager: PackageManager): void {\n const [command, args] = installCommand(packageManager);\n const { AGENTS24_API_KEY: _apiKey, ...installerEnvironment } = process.env;\n const result = spawnSync(command, args, { cwd: directory, stdio: \"inherit\", env: installerEnvironment });\n if (result.error) throw new Error(`Could not start ${command}: ${result.error.message}`);\n if (result.status !== 0) throw new Error(`${command} ${args.join(\" \")} failed with exit ${result.status}.`);\n}\n\nexport function createApp(options: CreateAppOptions): GeneratedApp {\n const destination = resolve(options.directory);\n assertDestination(destination);\n const name = packageName(destination);\n const parent = dirname(destination);\n mkdirSync(parent, { recursive: true });\n const staging = join(parent, `.${name}.agents24-${randomBytes(6).toString(\"hex\")}`);\n try {\n mkdirSync(staging, { mode: 0o700 });\n copyLayer(\"common\", staging);\n copyLayer(`integrations/${options.integration}`, staging);\n copyLayer(`themes/${options.theme}`, staging);\n const apiOrigin = new URL(options.baseUrl).origin;\n replaceTemplateValues(staging, {\n \"__APP_NAME__\": name,\n \"__THEME__\": options.theme,\n \"__INTEGRATION__\": options.integration,\n \"__CONNECT_SOURCE__\": options.integration === \"client-deployment\" ? apiOrigin : \"\",\n \"__PM_DEV__\": runScriptCommand(options.packageManager, \"dev\"),\n \"__PM_BUILD__\": runScriptCommand(options.packageManager, \"build\"),\n \"__PM_PRODUCTION__\": runScriptCommand(options.packageManager, options.integration === \"bff\" ? \"start\" : \"preview\"),\n });\n const gitignore = join(staging, \"_gitignore\");\n if (existsSync(gitignore)) renameSync(gitignore, join(staging, \".gitignore\"));\n writeFileSync(join(staging, \"package.json\"), `${JSON.stringify(generatedManifest(options, name), null, 2)}\\n`);\n const env = envFiles(options);\n writeFileSync(join(staging, \".env.example\"), env.example);\n if (options.install) installDependencies(staging, options.packageManager);\n writeFileSync(join(staging, \".env.local\"), env.local, { mode: 0o600 });\n chmodSync(join(staging, \".env.local\"), 0o600);\n if (existsSync(destination)) rmSync(destination, { recursive: true });\n renameSync(staging, destination);\n return { directory: destination, packageName: name };\n } catch (error) {\n rmSync(staging, { recursive: true, force: true });\n throw error;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
[data-agents24-theme="flow"] {
|
|
2
|
-
--a24-background: #fbfaf7;
|
|
3
|
-
--a24-surface: #f0eee8;
|
|
4
|
-
--a24-surface-hover: #e8e4dc;
|
|
5
|
-
--a24-text: #252a27;
|
|
6
|
-
--a24-muted: #60675f;
|
|
7
|
-
--a24-border: rgba(55, 63, 58, .13);
|
|
8
|
-
--a24-accent: #315648;
|
|
9
|
-
--a24-accent-text: #f8fbf8;
|
|
10
|
-
--a24-focus: #668276;
|
|
11
|
-
--a24-font-family: Charter, "Bitstream Charter", "Iowan Old Style", Georgia, serif;
|
|
12
|
-
isolation: isolate;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
:root[data-agents24-color-mode="dark"] [data-agents24-theme="flow"] {
|
|
16
|
-
--a24-background: #151916;
|
|
17
|
-
--a24-surface: #1d231f;
|
|
18
|
-
--a24-surface-hover: #283029;
|
|
19
|
-
--a24-text: #edf1ec;
|
|
20
|
-
--a24-muted: #a2aba3;
|
|
21
|
-
--a24-border: rgba(237, 241, 236, .13);
|
|
22
|
-
--a24-accent: #b9d5c6;
|
|
23
|
-
--a24-accent-text: #17231d;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@media (prefers-color-scheme: dark) {
|
|
27
|
-
:root:not([data-agents24-color-mode="light"]) [data-agents24-theme="flow"] {
|
|
28
|
-
--a24-background: #151916;
|
|
29
|
-
--a24-surface: #1d231f;
|
|
30
|
-
--a24-surface-hover: #283029;
|
|
31
|
-
--a24-text: #edf1ec;
|
|
32
|
-
--a24-muted: #a2aba3;
|
|
33
|
-
--a24-border: rgba(237, 241, 236, .13);
|
|
34
|
-
--a24-accent: #b9d5c6;
|
|
35
|
-
--a24-accent-text: #17231d;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
[data-agents24-theme="flow"] .a24-chat { grid-template-columns: 17.5rem minmax(0, 1fr); }
|
|
40
|
-
[data-agents24-theme="flow"] .a24-header { min-height: 4.5rem; }
|
|
41
|
-
[data-agents24-theme="flow"] .a24-shell__content { gap: 2.4rem; max-width: 50rem; }
|
|
42
|
-
[data-agents24-theme="flow"] .a24-shell__composer-inner,
|
|
43
|
-
[data-agents24-theme="flow"] .a24-shell__empty-composer { max-width: 50rem; }
|
|
44
|
-
[data-agents24-theme="flow"] .a24-thread,
|
|
45
|
-
[data-agents24-theme="flow"] .a24-button,
|
|
46
|
-
[data-agents24-theme="flow"] .a24-icon-button,
|
|
47
|
-
[data-agents24-theme="flow"] .a24-search { border-radius: .8rem; }
|
|
48
|
-
[data-agents24-theme="flow"] .a24-composer__surface { border-radius: 1.35rem; box-shadow: 0 14px 42px rgba(42, 53, 47, .1), 0 2px 7px rgba(42, 53, 47, .07); }
|
|
49
|
-
[data-agents24-theme="flow"] .a24-composer__surface[data-expanded] { border-radius: 1.15rem; }
|
|
50
|
-
[data-agents24-theme="flow"] .a24-chat .is-user > :is([data-slot="message-content"], [data-slot="bubble-content"]) { border-radius: 1rem 1rem .3rem 1rem; }
|
|
51
|
-
[data-agents24-theme="flow"] .a24-scroller__item { animation: a24-flow-enter 260ms ease-out both; }
|
|
52
|
-
|
|
53
|
-
@keyframes a24-flow-enter {
|
|
54
|
-
from { opacity: 0; transform: translateY(.35rem); }
|
|
55
|
-
to { opacity: 1; transform: translateY(0); }
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
@media (prefers-reduced-motion: reduce) {
|
|
59
|
-
[data-agents24-theme="flow"] .a24-scroller__item { animation: none; }
|
|
60
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
[data-agents24-theme="workbench"] {
|
|
2
|
-
--a24-background: #fcfcfb;
|
|
3
|
-
--a24-surface: #f0f1ef;
|
|
4
|
-
--a24-surface-hover: #e5e7e4;
|
|
5
|
-
--a24-text: #171a18;
|
|
6
|
-
--a24-muted: #626963;
|
|
7
|
-
--a24-border: rgba(23, 26, 24, .16);
|
|
8
|
-
--a24-accent: #1f3d32;
|
|
9
|
-
--a24-accent-text: #ffffff;
|
|
10
|
-
--a24-focus: #53665d;
|
|
11
|
-
--a24-font-family: "Avenir Next", Avenir, "Segoe UI", sans-serif;
|
|
12
|
-
isolation: isolate;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
:root[data-agents24-color-mode="dark"] [data-agents24-theme="workbench"] {
|
|
16
|
-
--a24-background: #111412;
|
|
17
|
-
--a24-surface: #191d1a;
|
|
18
|
-
--a24-surface-hover: #232925;
|
|
19
|
-
--a24-text: #eef1ee;
|
|
20
|
-
--a24-muted: #9ca69f;
|
|
21
|
-
--a24-border: rgba(238, 241, 238, .14);
|
|
22
|
-
--a24-accent: #d7e7dd;
|
|
23
|
-
--a24-accent-text: #152019;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@media (prefers-color-scheme: dark) {
|
|
27
|
-
:root:not([data-agents24-color-mode="light"]) [data-agents24-theme="workbench"] {
|
|
28
|
-
--a24-background: #111412;
|
|
29
|
-
--a24-surface: #191d1a;
|
|
30
|
-
--a24-surface-hover: #232925;
|
|
31
|
-
--a24-text: #eef1ee;
|
|
32
|
-
--a24-muted: #9ca69f;
|
|
33
|
-
--a24-border: rgba(238, 241, 238, .14);
|
|
34
|
-
--a24-accent: #d7e7dd;
|
|
35
|
-
--a24-accent-text: #152019;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
[data-agents24-theme="workbench"] .a24-chat { grid-template-columns: 18rem minmax(0, 1fr); }
|
|
40
|
-
[data-agents24-theme="workbench"] .a24-sidebar__inner { padding: .625rem; }
|
|
41
|
-
[data-agents24-theme="workbench"] .a24-header { min-height: 3.5rem; padding-block: .4rem; }
|
|
42
|
-
[data-agents24-theme="workbench"] .a24-thread,
|
|
43
|
-
[data-agents24-theme="workbench"] .a24-button,
|
|
44
|
-
[data-agents24-theme="workbench"] .a24-icon-button,
|
|
45
|
-
[data-agents24-theme="workbench"] .a24-search { border-radius: .35rem; }
|
|
46
|
-
[data-agents24-theme="workbench"] .a24-shell__content { gap: 1.5rem; max-width: 54rem; padding-top: 2rem; }
|
|
47
|
-
[data-agents24-theme="workbench"] .a24-shell__composer-inner,
|
|
48
|
-
[data-agents24-theme="workbench"] .a24-shell__empty-composer { max-width: 54rem; }
|
|
49
|
-
[data-agents24-theme="workbench"] .a24-composer__surface,
|
|
50
|
-
[data-agents24-theme="workbench"] .a24-composer__surface[data-expanded] { border-radius: .65rem; box-shadow: 0 2px 8px rgba(0,0,0,.06); }
|
|
51
|
-
[data-agents24-theme="workbench"] .a24-chat .is-user > :is([data-slot="message-content"], [data-slot="bubble-content"]) { border-radius: .35rem; }
|