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.
Files changed (75) hide show
  1. package/README.md +40 -2
  2. package/dist/{chunk-OCIF3LSI.js → chunk-PXJTBSPX.js} +99 -23
  3. package/dist/chunk-PXJTBSPX.js.map +1 -0
  4. package/dist/cli.js +39 -61
  5. package/dist/cli.js.map +1 -1
  6. package/dist/index.d.ts +6 -7
  7. package/dist/index.js +9 -1
  8. package/dist/scaffold/components.json +25 -0
  9. package/dist/scaffold/manifest.json +28 -0
  10. package/dist/scaffold/src/app.tsx +71 -0
  11. package/dist/scaffold/src/chat.css +54 -0
  12. package/dist/scaffold/src/components/chat/chat-composer.tsx +237 -0
  13. package/dist/scaffold/src/components/chat/chat-message.tsx +76 -0
  14. package/dist/scaffold/src/components/chat/chat-shell.tsx +257 -0
  15. package/dist/scaffold/src/components/chat/collapsible-user-message.tsx +37 -0
  16. package/dist/scaffold/src/components/chat/external-link-dialog.tsx +48 -0
  17. package/dist/scaffold/src/components/chat/identity-control.tsx +69 -0
  18. package/dist/scaffold/src/components/chat/message-parts.tsx +83 -0
  19. package/dist/scaffold/src/components/chat/theme-menu.tsx +79 -0
  20. package/dist/scaffold/src/components/chat/thread-sidebar.tsx +114 -0
  21. package/dist/scaffold/src/components/chat/timeline-loading.ts +17 -0
  22. package/dist/scaffold/src/components/chat/turn-outline.tsx +73 -0
  23. package/dist/scaffold/src/components/theme-provider.tsx +91 -0
  24. package/dist/scaffold/src/components/ui/attachment.tsx +204 -0
  25. package/dist/scaffold/src/components/ui/bubble.tsx +125 -0
  26. package/dist/scaffold/src/components/ui/button-group.tsx +83 -0
  27. package/dist/scaffold/src/components/ui/button.tsx +65 -0
  28. package/dist/scaffold/src/components/ui/dialog.tsx +171 -0
  29. package/dist/scaffold/src/components/ui/dropdown-menu.tsx +271 -0
  30. package/dist/scaffold/src/components/ui/input.tsx +19 -0
  31. package/dist/scaffold/src/components/ui/marker.tsx +69 -0
  32. package/dist/scaffold/src/components/ui/message-scroller.tsx +129 -0
  33. package/dist/scaffold/src/components/ui/message.tsx +92 -0
  34. package/dist/scaffold/src/components/ui/popover.tsx +40 -0
  35. package/dist/scaffold/src/components/ui/select.tsx +92 -0
  36. package/dist/scaffold/src/components/ui/separator.tsx +28 -0
  37. package/dist/scaffold/src/components/ui/sheet.tsx +150 -0
  38. package/dist/scaffold/src/components/ui/sidebar.tsx +677 -0
  39. package/dist/scaffold/src/components/ui/skeleton.tsx +13 -0
  40. package/dist/scaffold/src/components/ui/textarea.tsx +18 -0
  41. package/dist/scaffold/src/components/ui/tooltip.tsx +56 -0
  42. package/dist/scaffold/src/hooks/use-mobile.ts +24 -0
  43. package/dist/scaffold/src/identity.ts +17 -0
  44. package/dist/scaffold/src/index.css +221 -0
  45. package/dist/scaffold/src/index.tsx +39 -0
  46. package/dist/scaffold/src/lib/utils.ts +6 -0
  47. package/dist/scaffold/styles.css +3 -0
  48. package/dist/scaffold-manifest.json +66 -0
  49. package/package.json +7 -3
  50. package/templates/common/README.md +16 -3
  51. package/templates/common/index.html +3 -3
  52. package/templates/common/scripts/apply-preset.mjs +17 -0
  53. package/templates/common/scripts/scope-preset-theme.mjs +38 -0
  54. package/templates/common/src/styles.css +10 -6
  55. package/templates/common/src/use-thread-query-navigation.ts +41 -0
  56. package/templates/common/tsconfig.json +2 -1
  57. package/templates/integrations/bff/server/env.ts +3 -3
  58. package/templates/integrations/bff/server/index.ts +1 -2
  59. package/templates/integrations/bff/server/principal.ts +3 -3
  60. package/templates/integrations/bff/src/host-identity.ts +6 -0
  61. package/templates/integrations/bff/src/main.tsx +21 -16
  62. package/templates/integrations/bff/tsconfig.json +2 -1
  63. package/templates/integrations/bff/vite.config.ts +5 -1
  64. package/templates/integrations/client-deployment/src/main.tsx +26 -18
  65. package/templates/integrations/client-deployment/vite.config.ts +37 -4
  66. package/templates/starters/rag/agents24/agents/assistant.md +11 -0
  67. package/templates/starters/rag/agents24/agents24.yaml +19 -0
  68. package/templates/starters/rag/agents24/rag/knowledge.yaml +32 -0
  69. package/templates/starters/rag/agents24/stores/knowledge.yaml +10 -0
  70. package/templates/starters/rag/agents24/workflows/main.yaml +16 -0
  71. package/versions.json +4 -4
  72. package/dist/chunk-OCIF3LSI.js.map +0 -1
  73. package/templates/themes/essential/src/theme.css +0 -2
  74. package/templates/themes/flow/src/theme.css +0 -60
  75. 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 externalUserId = existing || randomUUID();
42
+ const subject = existing || randomUUID();
43
43
  return {
44
- principal: { externalUserId, externalSessionId: externalUserId },
45
- ...(existing ? {} : { responseHeaders: { "Set-Cookie": cookie(`${externalUserId}.${signature(externalUserId)}`, request) } }),
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
 
@@ -0,0 +1,6 @@
1
+ import type { Agents24ChatIdentity } from "@/identity";
2
+
3
+ /** Replace this adapter with your host application's authenticated identity. */
4
+ export function getHostIdentity(): Agents24ChatIdentity {
5
+ return { state: "guest", displayName: "Guest" };
6
+ }
@@ -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 App() {
11
+ function GeneratedChatApp() {
12
+ const navigation = useThreadQueryNavigation();
9
13
  return (
10
- <div className="app-shell" data-agents24-theme="__THEME__">
11
- <AgentChatApp
12
- allowAttachments
13
- client={client}
14
- completeMcpAuthorization={async ({ completion, serverId }) => {
15
- if (completion.serverId !== serverId || !completion.connectionId) {
16
- throw new Error("MCP authorization did not return the expected connection.");
17
- }
18
- }}
19
- mcpRedirectUri={window.location.href}
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(<StrictMode><App /></StrictMode>);
27
+ createRoot(document.getElementById("root")!).render(
28
+ <StrictMode>
29
+ <GeneratedChatApp />
30
+ </StrictMode>,
31
+ );
@@ -15,7 +15,8 @@
15
15
  "isolatedModules": true,
16
16
  "noEmit": true,
17
17
  "jsx": "react-jsx",
18
- "types": ["vite/client", "node"]
18
+ "types": ["vite/client", "node"],
19
+ "paths": { "@/*": ["./src/*"] }
19
20
  },
20
21
  "include": ["src", "server", "vite.config.ts"]
21
22
  }
@@ -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 { AgentChatAppearanceControl, AgentChatApp } from "@agents24/chat-react/templates";
2
- import { createAnonymousSessionProvider } from "@agents24/client";
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
- const baseUrl = String(import.meta.env.VITE_AGENTS24_BASE_URL || "").trim();
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 sessionProvider = createAnonymousSessionProvider({ baseUrl, deploymentId });
16
- const client = createBrowserAgentClient({ baseUrl, deploymentId, sessionProvider });
15
+ const sessions = createBrowserDeploymentSessionController({ baseUrl, deploymentId });
17
16
 
18
- function App() {
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
- <div className="app-shell" data-agents24-theme="__THEME__">
21
- <AgentChatApp
22
- allowAttachments
23
- client={client}
24
- mcpRedirectUri={window.location.href}
25
- slots={{ headerActions: <AgentChatAppearanceControl /> }}
26
- />
27
- </div>
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(<StrictMode><App /></StrictMode>);
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
- export default defineConfig({
5
- plugins: [react()],
6
- server: { host: "127.0.0.1" },
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.0",
4
- "@agents24/react": "^0.2.0",
5
- "@agents24/chat-react": "^0.5.0",
6
- "@agents24/node": "^0.2.0"
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,2 +0,0 @@
1
- /* Essential is the exact canonical Agents24 shared-page presentation. */
2
- [data-agents24-theme="essential"] { isolation: isolate; }
@@ -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; }