@alexanderolsen/create-deepagent 0.1.0

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 (193) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +661 -0
  3. package/dist/index.js.map +1 -0
  4. package/package.json +59 -0
  5. package/registry/frameworks/deno/.env.example +6 -0
  6. package/registry/frameworks/deno/README.md +137 -0
  7. package/registry/frameworks/deno/client/index.html +23 -0
  8. package/registry/frameworks/deno/client/package.json +30 -0
  9. package/registry/frameworks/deno/client/public/favicon.ico +0 -0
  10. package/registry/frameworks/deno/client/src/components/Chat.tsx +124 -0
  11. package/registry/frameworks/deno/client/src/components/ChatApp.tsx +129 -0
  12. package/registry/frameworks/deno/client/src/components/Conversation.tsx +91 -0
  13. package/registry/frameworks/deno/client/src/components/MessageBubbles.tsx +88 -0
  14. package/registry/frameworks/deno/client/src/components/MessageReasoning.tsx +71 -0
  15. package/registry/frameworks/deno/client/src/components/MessageThread.tsx +135 -0
  16. package/registry/frameworks/deno/client/src/components/StreamingIndicator.tsx +36 -0
  17. package/registry/frameworks/deno/client/src/components/Subagents.tsx +120 -0
  18. package/registry/frameworks/deno/client/src/components/ThemeIcons.tsx +31 -0
  19. package/registry/frameworks/deno/client/src/components/ThreadHistory.tsx +73 -0
  20. package/registry/frameworks/deno/client/src/components/ToolCall.tsx +89 -0
  21. package/registry/frameworks/deno/client/src/lib/agent-type.ts +4 -0
  22. package/registry/frameworks/deno/client/src/lib/chat/threads-client.ts +51 -0
  23. package/registry/frameworks/deno/client/src/main.tsx +11 -0
  24. package/registry/frameworks/deno/client/src/styles/globals.css +714 -0
  25. package/registry/frameworks/deno/client/src/vite-env.d.ts +1 -0
  26. package/registry/frameworks/deno/client/tsconfig.app.json +7 -0
  27. package/registry/frameworks/deno/client/tsconfig.json +24 -0
  28. package/registry/frameworks/deno/client/tsconfig.node.json +19 -0
  29. package/registry/frameworks/deno/client/vite.config.ts +24 -0
  30. package/registry/frameworks/deno/deno.json +16 -0
  31. package/registry/frameworks/deno/main.ts +23 -0
  32. package/registry/frameworks/deno/package.json +14 -0
  33. package/registry/frameworks/deno/server/agent/index.ts +60 -0
  34. package/registry/frameworks/deno/server/agent/middleware.ts +24 -0
  35. package/registry/frameworks/deno/server/agent/tools.ts +64 -0
  36. package/registry/frameworks/deno/server/registry.ts +40 -0
  37. package/registry/frameworks/deno/server/routes.ts +114 -0
  38. package/registry/frameworks/deno/server/serialize.ts +30 -0
  39. package/registry/frameworks/deno/server/session.ts +210 -0
  40. package/registry/frameworks/deno/server/threads.ts +404 -0
  41. package/registry/frameworks/deno.ts +17 -0
  42. package/registry/frameworks/hono/.env.example +6 -0
  43. package/registry/frameworks/hono/README.md +186 -0
  44. package/registry/frameworks/hono/index.html +22 -0
  45. package/registry/frameworks/hono/package.json +42 -0
  46. package/registry/frameworks/hono/src/components/Chat.tsx +124 -0
  47. package/registry/frameworks/hono/src/components/ChatApp.tsx +129 -0
  48. package/registry/frameworks/hono/src/components/Conversation.tsx +90 -0
  49. package/registry/frameworks/hono/src/components/MessageBubbles.tsx +88 -0
  50. package/registry/frameworks/hono/src/components/MessageReasoning.tsx +71 -0
  51. package/registry/frameworks/hono/src/components/MessageThread.tsx +135 -0
  52. package/registry/frameworks/hono/src/components/StreamingIndicator.tsx +36 -0
  53. package/registry/frameworks/hono/src/components/Subagents.tsx +120 -0
  54. package/registry/frameworks/hono/src/components/ThemeIcons.tsx +31 -0
  55. package/registry/frameworks/hono/src/components/ThreadHistory.tsx +73 -0
  56. package/registry/frameworks/hono/src/components/ToolCall.tsx +89 -0
  57. package/registry/frameworks/hono/src/lib/agent/types.ts +4 -0
  58. package/registry/frameworks/hono/src/lib/chat/threads-client.ts +57 -0
  59. package/registry/frameworks/hono/src/main.tsx +11 -0
  60. package/registry/frameworks/hono/src/styles/globals.css +714 -0
  61. package/registry/frameworks/hono/src/vite-env.d.ts +1 -0
  62. package/registry/frameworks/hono/tsconfig.app.json +22 -0
  63. package/registry/frameworks/hono/tsconfig.json +7 -0
  64. package/registry/frameworks/hono/tsconfig.worker.json +18 -0
  65. package/registry/frameworks/hono/vite.config.ts +16 -0
  66. package/registry/frameworks/hono/worker/agent/index.ts +53 -0
  67. package/registry/frameworks/hono/worker/agent/middleware.ts +20 -0
  68. package/registry/frameworks/hono/worker/agent/tools.ts +55 -0
  69. package/registry/frameworks/hono/worker/durable-objects/thread-session.ts +159 -0
  70. package/registry/frameworks/hono/worker/env.d.ts +17 -0
  71. package/registry/frameworks/hono/worker/index.ts +140 -0
  72. package/registry/frameworks/hono/worker/server/registry.ts +39 -0
  73. package/registry/frameworks/hono/worker/server/runs.ts +82 -0
  74. package/registry/frameworks/hono/worker/server/serialize.ts +30 -0
  75. package/registry/frameworks/hono/worker/server/threads.ts +404 -0
  76. package/registry/frameworks/hono/worker/tsconfig.json +4 -0
  77. package/registry/frameworks/hono/wrangler.jsonc +28 -0
  78. package/registry/frameworks/hono.ts +35 -0
  79. package/registry/frameworks/next/.env.example +6 -0
  80. package/registry/frameworks/next/README.md +173 -0
  81. package/registry/frameworks/next/app/api/threads/[threadId]/commands/route.ts +21 -0
  82. package/registry/frameworks/next/app/api/threads/[threadId]/history/route.ts +35 -0
  83. package/registry/frameworks/next/app/api/threads/[threadId]/route.ts +13 -0
  84. package/registry/frameworks/next/app/api/threads/[threadId]/state/route.ts +51 -0
  85. package/registry/frameworks/next/app/api/threads/[threadId]/stream/route.ts +30 -0
  86. package/registry/frameworks/next/app/api/threads/route.ts +11 -0
  87. package/registry/frameworks/next/app/favicon.ico +0 -0
  88. package/registry/frameworks/next/app/globals.css +712 -0
  89. package/registry/frameworks/next/app/layout.tsx +34 -0
  90. package/registry/frameworks/next/app/page.tsx +5 -0
  91. package/registry/frameworks/next/components/Chat.tsx +124 -0
  92. package/registry/frameworks/next/components/ChatApp.tsx +129 -0
  93. package/registry/frameworks/next/components/Conversation.tsx +90 -0
  94. package/registry/frameworks/next/components/MessageBubbles.tsx +88 -0
  95. package/registry/frameworks/next/components/MessageReasoning.tsx +71 -0
  96. package/registry/frameworks/next/components/MessageThread.tsx +135 -0
  97. package/registry/frameworks/next/components/StreamingIndicator.tsx +36 -0
  98. package/registry/frameworks/next/components/Subagents.tsx +120 -0
  99. package/registry/frameworks/next/components/ThemeIcons.tsx +31 -0
  100. package/registry/frameworks/next/components/ThreadHistory.tsx +73 -0
  101. package/registry/frameworks/next/components/ToolCall.tsx +89 -0
  102. package/registry/frameworks/next/eslint.config.mjs +18 -0
  103. package/registry/frameworks/next/lib/agent/index.ts +95 -0
  104. package/registry/frameworks/next/lib/agent/middleware.ts +40 -0
  105. package/registry/frameworks/next/lib/agent/tools.ts +66 -0
  106. package/registry/frameworks/next/lib/chat/threads-client.ts +57 -0
  107. package/registry/frameworks/next/lib/server/registry.ts +57 -0
  108. package/registry/frameworks/next/lib/server/serialize.ts +32 -0
  109. package/registry/frameworks/next/lib/server/session.ts +212 -0
  110. package/registry/frameworks/next/lib/server/threads.ts +406 -0
  111. package/registry/frameworks/next/next.config.ts +7 -0
  112. package/registry/frameworks/next/package.json +37 -0
  113. package/registry/frameworks/next/postcss.config.mjs +7 -0
  114. package/registry/frameworks/next/public/file.svg +1 -0
  115. package/registry/frameworks/next/public/globe.svg +1 -0
  116. package/registry/frameworks/next/public/next.svg +1 -0
  117. package/registry/frameworks/next/public/vercel.svg +1 -0
  118. package/registry/frameworks/next/public/window.svg +1 -0
  119. package/registry/frameworks/next/tsconfig.json +34 -0
  120. package/registry/frameworks/next.ts +17 -0
  121. package/registry/frameworks/nuxt/.env.example +3 -0
  122. package/registry/frameworks/nuxt/README.md +133 -0
  123. package/registry/frameworks/nuxt/app/app.vue +26 -0
  124. package/registry/frameworks/nuxt/app/assets/css/main.css +707 -0
  125. package/registry/frameworks/nuxt/app/components/Chat.vue +105 -0
  126. package/registry/frameworks/nuxt/app/components/ChatApp.vue +89 -0
  127. package/registry/frameworks/nuxt/app/components/ChatThread.vue +27 -0
  128. package/registry/frameworks/nuxt/app/components/MessageBubble.vue +60 -0
  129. package/registry/frameworks/nuxt/app/components/MessageBubbles.vue +213 -0
  130. package/registry/frameworks/nuxt/app/components/MessageList.vue +51 -0
  131. package/registry/frameworks/nuxt/app/components/MessageReasoning.vue +53 -0
  132. package/registry/frameworks/nuxt/app/components/StreamingIndicator.vue +9 -0
  133. package/registry/frameworks/nuxt/app/components/SubagentDetail.vue +51 -0
  134. package/registry/frameworks/nuxt/app/components/SubagentList.vue +49 -0
  135. package/registry/frameworks/nuxt/app/components/ThemeToggle.vue +43 -0
  136. package/registry/frameworks/nuxt/app/components/ThreadHistory.vue +65 -0
  137. package/registry/frameworks/nuxt/app/components/ToolCall.vue +81 -0
  138. package/registry/frameworks/nuxt/app/components/TypingDots.vue +14 -0
  139. package/registry/frameworks/nuxt/app/composables/useTheme.ts +14 -0
  140. package/registry/frameworks/nuxt/app/utils/streaming.ts +44 -0
  141. package/registry/frameworks/nuxt/app/utils/threads.ts +57 -0
  142. package/registry/frameworks/nuxt/nuxt.config.ts +6 -0
  143. package/registry/frameworks/nuxt/package.json +28 -0
  144. package/registry/frameworks/nuxt/public/favicon.ico +0 -0
  145. package/registry/frameworks/nuxt/public/robots.txt +2 -0
  146. package/registry/frameworks/nuxt/server/agent/index.ts +89 -0
  147. package/registry/frameworks/nuxt/server/agent/middleware.ts +38 -0
  148. package/registry/frameworks/nuxt/server/agent/tools.ts +66 -0
  149. package/registry/frameworks/nuxt/server/api/threads/[threadId]/commands.post.ts +16 -0
  150. package/registry/frameworks/nuxt/server/api/threads/[threadId]/history.post.ts +37 -0
  151. package/registry/frameworks/nuxt/server/api/threads/[threadId]/index.delete.ts +12 -0
  152. package/registry/frameworks/nuxt/server/api/threads/[threadId]/state.get.ts +22 -0
  153. package/registry/frameworks/nuxt/server/api/threads/[threadId]/state.post.ts +32 -0
  154. package/registry/frameworks/nuxt/server/api/threads/[threadId]/stream.post.ts +24 -0
  155. package/registry/frameworks/nuxt/server/api/threads/index.get.ts +13 -0
  156. package/registry/frameworks/nuxt/server/utils/runtime.ts +42 -0
  157. package/registry/frameworks/nuxt/server/utils/serialize.ts +30 -0
  158. package/registry/frameworks/nuxt/server/utils/session.ts +210 -0
  159. package/registry/frameworks/nuxt/server/utils/threads.ts +404 -0
  160. package/registry/frameworks/nuxt/tsconfig.json +18 -0
  161. package/registry/frameworks/nuxt.ts +17 -0
  162. package/registry/frameworks/vite/.env.example +20 -0
  163. package/registry/frameworks/vite/README.md +149 -0
  164. package/registry/frameworks/vite/agent/index.ts +59 -0
  165. package/registry/frameworks/vite/agent/middleware.ts +24 -0
  166. package/registry/frameworks/vite/agent/tools.ts +64 -0
  167. package/registry/frameworks/vite/index.html +23 -0
  168. package/registry/frameworks/vite/langgraph.json +16 -0
  169. package/registry/frameworks/vite/package.json +39 -0
  170. package/registry/frameworks/vite/public/favicon.ico +0 -0
  171. package/registry/frameworks/vite/scripts/vite-langgraph-proxy.ts +34 -0
  172. package/registry/frameworks/vite/src/components/Chat.tsx +124 -0
  173. package/registry/frameworks/vite/src/components/ChatApp.tsx +122 -0
  174. package/registry/frameworks/vite/src/components/Conversation.tsx +91 -0
  175. package/registry/frameworks/vite/src/components/MessageBubbles.tsx +88 -0
  176. package/registry/frameworks/vite/src/components/MessageReasoning.tsx +71 -0
  177. package/registry/frameworks/vite/src/components/MessageThread.tsx +135 -0
  178. package/registry/frameworks/vite/src/components/StreamingIndicator.tsx +36 -0
  179. package/registry/frameworks/vite/src/components/Subagents.tsx +120 -0
  180. package/registry/frameworks/vite/src/components/ThemeIcons.tsx +31 -0
  181. package/registry/frameworks/vite/src/components/ThreadHistory.tsx +73 -0
  182. package/registry/frameworks/vite/src/components/ToolCall.tsx +89 -0
  183. package/registry/frameworks/vite/src/lib/agent-type.ts +4 -0
  184. package/registry/frameworks/vite/src/lib/chat/threads-client.ts +114 -0
  185. package/registry/frameworks/vite/src/main.tsx +11 -0
  186. package/registry/frameworks/vite/src/styles/globals.css +714 -0
  187. package/registry/frameworks/vite/src/vite-env.d.ts +11 -0
  188. package/registry/frameworks/vite/tsconfig.app.json +24 -0
  189. package/registry/frameworks/vite/tsconfig.json +7 -0
  190. package/registry/frameworks/vite/tsconfig.node.json +21 -0
  191. package/registry/frameworks/vite/vercel.json +3 -0
  192. package/registry/frameworks/vite/vite.config.ts +24 -0
  193. package/registry/frameworks/vite.ts +17 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["tarExtract","packageJson.version"],"sources":["../src/utils/logger.ts","../src/utils/validate.ts","../src/commands/create/preflightCreate.ts","../src/registry/provider.ts","../src/registry/files/model.ts","../src/registry/files/envExample.ts","../src/registry/framework.ts","../registry/providers/openai.ts","../registry/providers/anthropic.ts","../registry/providers/google.ts","../registry/providers/fireworks.ts","../registry/frameworks/next.ts","../registry/frameworks/nuxt.ts","../registry/frameworks/hono.ts","../registry/frameworks/deno.ts","../registry/frameworks/vite.ts","../src/registry/index.ts","../src/commands/create/runCreateConfig.ts","../src/utils/handleError.ts","../src/utils/fileUtils.ts","../src/utils/git.ts","../src/schema/packageJson.ts","../src/commands/create/transformPackageJson.ts","../src/commands/create/installTemplate.ts","../src/commands/create/index.ts","../package.json","../src/index.ts"],"sourcesContent":["import pc from \"picocolors\";\n\nexport const logger = {\n info: (msg: string) => console.log(pc.cyan(msg)),\n success: (msg: string) => console.log(pc.green(msg)),\n warn: (msg: string) => console.log(pc.yellow(msg)),\n error: (msg: string) => console.error(pc.red(msg)),\n break: () => console.log(),\n step: (msg: string) => console.log(pc.dim(\"›\") + \" \" + msg),\n};\n","import fs from \"node:fs\";\n\n/** Check if a path exists and is a directory. */\nexport async function dirExists(dir: string): Promise<boolean> {\n try {\n const stat = await fs.promises.stat(dir);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Check if an existing directory is empty. Throws if the dir cannot be read. */\nexport async function isDirEmpty(dir: string): Promise<boolean> {\n const entries = await fs.promises.readdir(dir);\n return entries.length === 0;\n}\n\n/** Check if a directory is writable. */\nexport async function isWriteable(dir: string): Promise<boolean> {\n try {\n await fs.promises.access(dir, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Ensure a directory exists, creating it if necessary. */\nexport async function makeDir(dir: string): Promise<void> {\n await fs.promises.mkdir(dir, { recursive: true });\n}\n\n/** Validate a npm package name. Returns an error message or null if valid. */\nexport function validatePkgName(name: string): string | null {\n if (!name) return \"Project name is required\";\n if (name.length > 214) return \"Project name must be 214 characters or less\";\n if (name.startsWith(\".\") || name.startsWith(\"_\"))\n return \"Project name must not start with . or _\";\n if (name.toLowerCase() !== name) return \"Project name must be lowercase\";\n if (/\\s/.test(name)) return \"Project name must not contain spaces\";\n // Per npm naming rules\n if (!/^[a-z0-9._-]+$/.test(name))\n return \"Project name may only contain lowercase letters, numbers, ., _, and -\";\n return null;\n}\n","import path from \"node:path\";\nimport * as clack from \"@clack/prompts\";\nimport { logger } from \"../../utils/logger.js\";\nimport {\n dirExists,\n isDirEmpty,\n isWriteable,\n validatePkgName,\n} from \"../../utils/validate.js\";\n\nexport interface PreflightOptions {\n projectName: string;\n force?: boolean;\n}\n\n/**\n * Post-TUI checks before scaffolding. Fails fast on:\n * - Invalid package name\n * - Target directory not empty (unless --force or user confirms)\n * - Target directory not writable\n */\nexport async function preflightCreate(\n options: PreflightOptions,\n): Promise<string> {\n const { projectName, force } = options;\n\n // 1. Validate package name\n const nameErr = validatePkgName(projectName);\n if (nameErr) {\n logger.error(nameErr);\n process.exit(1);\n }\n\n // 2. Resolve project path\n const projectPath = path.resolve(projectName);\n\n // 3. Check if target dir already exists and is not empty\n const exists = await dirExists(projectPath);\n if (exists && !force) {\n const empty = await isDirEmpty(projectPath);\n if (!empty) {\n const proceed = await clack.confirm({\n message: `Directory \"${projectName}\" is not empty. Continue anyway?`,\n initialValue: false,\n });\n\n if (clack.isCancel(proceed) || proceed === false) {\n clack.cancel(\"Cancelled, exiting...\");\n process.exit(0);\n }\n }\n }\n\n // 4. Check if parent dir is writable\n const writeable = await isWriteable(path.dirname(projectPath));\n if (!writeable) {\n logger.error(`Cannot write to ${path.dirname(projectPath)}`);\n process.exit(1);\n }\n\n return projectPath;\n}\n","import { MODEL_PROVIDER_CONFIG } from \"langchain/chat_models/universal\";\nimport { JSONValue } from \"../types.js\";\n\nexport type ProviderAwareFile = {\n /** Path relative to project root, e.g. \"worker/env.d.ts\" */\n path: string;\n /** Returns the file content, optionally using provider config for string injection */\n getContent: (config: { providerConfig: ProviderConfig }) => string;\n};\n\nexport type EnvVarSpec = {\n /** Env var name, e.g. \"OPENAI_API_KEY\" */\n name: string;\n /** Prompt label, e.g. \"OpenAI API key\" */\n prompt?: string;\n /** Whether the user must enter a value (default: false — may skip and fill .env later) */\n required?: boolean;\n /** Prefill value */\n default?: string;\n};\n\ntype ProviderKey = keyof typeof MODEL_PROVIDER_CONFIG;\ntype ModelProviderConfig<T extends ProviderKey> =\n (typeof MODEL_PROVIDER_CONFIG)[T];\nexport interface ProviderConfig<T extends ProviderKey = ProviderKey> {\n /** Unique ID, one of `keyof typeof MODEL_PROVIDER_CONFIG` from langchain/chat_models/universal */\n id: T;\n /** Shown in the \"Select your provider\" prompt */\n title: string;\n /** Default model, e.g. \"openai:gpt-5.4-mini\" */\n defaultModel: string;\n /** LangChain chat model package, e.g. \"@langchain/openai\" */\n dependency: ModelProviderConfig<T>[\"package\"];\n /** Name of the chat model, e.g. ChatAnthropic */\n chatModelClassName: ModelProviderConfig<T>[\"className\"];\n /** Extra constructor options for the coordinator model, e.g. `{ reasoning: { effort: \"low\", summary: \"auto\" } }` */\n coordinatorModelConfig?: Record<string, JSONValue>;\n /** Credential vars to prompt for + write to the env file */\n env: EnvVarSpec[];\n}\n\nexport function createProvider<T extends ProviderKey>(\n config: Omit<ProviderConfig<T>, \"dependency\" | \"chatModelClassName\">,\n): ProviderConfig<T> {\n return {\n ...config,\n dependency: MODEL_PROVIDER_CONFIG[config.id].package,\n chatModelClassName: MODEL_PROVIDER_CONFIG[config.id].className,\n };\n}\n","import { inspect } from \"node:util\";\nimport type { ProviderAwareFile } from \"../provider.js\";\n\n/**\n * Create a ProviderAwareFile for `model.ts` that exports `coordinatorModel` and\n * `subagentModel`, instantiated via direct constructor imports with the selected\n * provider.\n *\n * @param agentPath - Path relative to project root, e.g. \"lib/agent\"\n */\nexport function createModelFile(agentPath: string): ProviderAwareFile {\n return {\n path: `${agentPath}/model.ts`,\n getContent: ({ providerConfig }) => {\n const {\n defaultModel,\n coordinatorModelConfig,\n dependency,\n chatModelClassName,\n } = providerConfig;\n\n const coordinatorOptions = {\n model: defaultModel,\n ...(coordinatorModelConfig ?? {}),\n };\n\n const lines: string[] = [\n `import { ${chatModelClassName} } from \"${dependency}\";`,\n \"\",\n `const coordinatorModel = new ${chatModelClassName}(${inspect(coordinatorOptions, { depth: null, compact: false })});`,\n \"\",\n `const subagentModel = new ${chatModelClassName}(${inspect({ model: defaultModel }, { depth: null, compact: false })});`,\n \"\",\n \"export { coordinatorModel, subagentModel };\",\n ];\n\n return lines.join(\"\\n\") + \"\\n\";\n },\n };\n}\n","import type { ProviderAwareFile } from \"../provider.js\";\n\n/**\n * Create a ProviderAwareFile for `.env.example` with the provider's env var\n * names and commented-out LangSmith tracing lines.\n */\nexport function createEnvExampleFile(): ProviderAwareFile {\n return {\n path: \".env.example\",\n getContent: ({ providerConfig }) => {\n const { env } = providerConfig;\n\n const lines: string[] = [];\n\n for (const spec of env) {\n const label = spec.prompt ?? spec.name;\n lines.push(`# Required: ${label} used by the agent and its subagents.`);\n lines.push(`${spec.name}=`);\n }\n\n lines.push(\"\");\n lines.push(\"# Optional: enable LangSmith tracing.\");\n lines.push(\"# LANGSMITH_TRACING=true\");\n lines.push(\"# LANGSMITH_API_KEY=lsv2-...\");\n\n return lines.join(\"\\n\") + \"\\n\";\n },\n };\n}\n","import { createModelFile } from \"./files/model.js\";\nimport { createEnvExampleFile } from \"./files/envExample.js\";\nimport type { ProviderAwareFile } from \"./provider.js\";\nimport type { Address } from \"./address.js\";\n\nexport interface FrameworkConfig<T extends string = string> {\n /** Unique identifier. Probably the same as frameworkDir */\n id: T;\n /** Shown in the \"Select your framework\" prompt */\n title: string;\n /** e.g. \"next-deepagents\" */\n defaultProjectName: string;\n /** Template project address, e.g. next-js or github.com/user/repo */\n address: Address;\n /** Path to the env file, relative to project root */\n envFilePath: string;\n /** Path to package.json, relative to project root */\n packageJsonPath: string;\n /** Where agent-related files are written, relative to project root */\n agentPath: string;\n /** Context-dependent files to be written (e.g. env.d.ts) */\n files: ProviderAwareFile[];\n /** Post-init instructions, if necessary */\n postInit?: (opts: { projectPath: string }) => void;\n}\n\nexport function createFramework<T extends string>(\n config: FrameworkConfig<T>,\n): FrameworkConfig<T> {\n const defaultFiles = [\n createModelFile(config.agentPath),\n createEnvExampleFile(),\n ];\n\n return {\n ...config,\n files: [...config.files, ...defaultFiles],\n };\n}\n","import { createProvider } from \"../../src/registry/provider.js\";\n\nexport const openai = createProvider({\n id: \"openai\",\n title: \"OpenAI\",\n defaultModel: \"gpt-5.4-mini\",\n coordinatorModelConfig: { reasoning: { effort: \"low\", summary: \"auto\" } },\n env: [\n {\n name: \"OPENAI_API_KEY\",\n prompt: \"OpenAI API key\",\n required: false,\n },\n ],\n});\n","import { createProvider } from \"../../src/registry/provider.js\";\n\nexport const anthropic = createProvider({\n id: \"anthropic\",\n title: \"Anthropic\",\n defaultModel: \"claude-sonnet-4-5-20250929\",\n env: [\n {\n name: \"ANTHROPIC_API_KEY\",\n prompt: \"Anthropic API key\",\n required: false,\n },\n ],\n});\n","import { createProvider } from \"../../src/registry/provider.js\";\n\nexport const google = createProvider({\n id: \"google-genai\",\n title: \"Google\",\n defaultModel: \"gemini-3.5-flash\",\n env: [\n {\n name: \"GOOGLE_API_KEY\",\n prompt: \"Google API key\",\n required: false,\n },\n ],\n});\n","import { createProvider } from \"../../src/registry/provider.js\";\n\nexport const fireworks = createProvider({\n id: \"fireworks\",\n title: \"Fireworks\",\n defaultModel: \"accounts/fireworks/models/glm-5p1\",\n env: [\n {\n name: \"FIREWORKS_API_KEY\",\n prompt: \"Fireworks API key\",\n required: false,\n },\n ],\n});\n","import { createFramework } from \"../../src/registry/framework.js\";\n\nexport const next = createFramework({\n id: \"next\",\n title: \"Next.js\",\n defaultProjectName: \"next-deepagents\",\n address: {\n scheme: \"github\",\n owner: \"aolsenjazz\",\n repo: \"deployment-cookbook\",\n subPath: \"js-next\",\n },\n envFilePath: \".env.local\",\n packageJsonPath: \"package.json\",\n agentPath: \"lib/agent\",\n files: [],\n});\n","import { createFramework } from \"../../src/registry/framework.js\";\n\nexport const nuxt = createFramework({\n id: \"nuxt\",\n title: \"Nuxt\",\n defaultProjectName: \"nuxt-deepagents\",\n address: {\n scheme: \"github\",\n owner: \"aolsenjazz\",\n repo: \"deployment-cookbook\",\n subPath: \"js-nuxt\",\n },\n envFilePath: \".env\",\n packageJsonPath: \"package.json\",\n agentPath: \"server/agent\",\n files: [],\n});\n","import { createFramework } from \"../../src/registry/framework.js\";\nimport type { ProviderAwareFile } from \"../../src/registry/provider.js\";\n\nconst ENV_D_TS: ProviderAwareFile = {\n path: \"worker/env.d.ts\",\n getContent: ({ providerConfig }) => {\n const envVars = providerConfig.env\n .map((e) => ` ${e.name}: string;`)\n .join(\"\\n\");\n\n return `interface Env {\n ASSETS: Fetcher;\n SESSIONS: DurableObjectNamespace;\n${envVars}\n [key: string]: string | undefined;\n}\n`;\n },\n};\n\nexport const hono = createFramework({\n id: \"hono\",\n title: \"Hono\",\n defaultProjectName: \"hono-deepagents\",\n address: {\n scheme: \"github\",\n owner: \"aolsenjazz\",\n repo: \"deployment-cookbook\",\n subPath: \"js-cloudflare\",\n },\n envFilePath: \".env\",\n packageJsonPath: \"package.json\",\n agentPath: \"worker/agent\",\n files: [ENV_D_TS],\n});\n","import { createFramework } from \"../../src/registry/framework.js\";\n\nexport const deno = createFramework({\n id: \"deno\",\n title: \"Deno\",\n defaultProjectName: \"deno-deepagents\",\n address: {\n scheme: \"github\",\n owner: \"aolsenjazz\",\n repo: \"deployment-cookbook\",\n subPath: \"js-deno\",\n },\n envFilePath: \".env\",\n packageJsonPath: \"package.json\",\n agentPath: \"server/agent\",\n files: [],\n});\n","import { createFramework } from \"../../src/registry/framework.js\";\n\nexport const vite = createFramework({\n id: \"react-vite\",\n title: \"React + Vite\",\n defaultProjectName: \"react-deepagents\",\n address: {\n scheme: \"github\",\n owner: \"aolsenjazz\",\n repo: \"deployment-cookbook\",\n subPath: \"js-langsmith\",\n },\n envFilePath: \".env\",\n packageJsonPath: \"package.json\",\n agentPath: \"agent\",\n files: [],\n});\n","export {\n createProvider,\n type ProviderConfig,\n type EnvVarSpec,\n} from \"./provider.js\";\nexport { createFramework, type FrameworkConfig } from \"./framework.js\";\n\nimport { openai } from \"../../registry/providers/openai.js\";\nimport { anthropic } from \"../../registry/providers/anthropic.js\";\nimport { google } from \"../../registry/providers/google.js\";\nimport { fireworks } from \"../../registry/providers/fireworks.js\";\n\nimport { next } from \"../../registry/frameworks/next.js\";\nimport { nuxt } from \"../../registry/frameworks/nuxt.js\";\nimport { hono } from \"../../registry/frameworks/hono.js\";\nimport { deno } from \"../../registry/frameworks/deno.js\";\nimport { vite } from \"../../registry/frameworks/vite.js\";\n\nexport const providers = {\n [openai.id]: openai,\n [anthropic.id]: anthropic,\n [google.id]: google,\n [fireworks.id]: fireworks,\n} as const;\nexport type ProviderKey = keyof typeof providers;\n\nexport const frameworks = {\n [next.id]: next,\n [nuxt.id]: nuxt,\n [hono.id]: hono,\n [vite.id]: vite,\n [deno.id]: deno,\n} as const;\nexport type FrameworkKey = keyof typeof frameworks;\n","import * as clack from \"@clack/prompts\";\nimport {\n frameworks,\n type FrameworkKey,\n type ProviderKey,\n providers,\n ProviderConfig,\n FrameworkConfig,\n} from \"../../registry/index.js\";\n\nconst PROCESSS_EXIT_MESSAGE = \"Cancelled, exiting...\";\n\n/**\n * Guides the user through the config TUI. On SIGINT, either moves to the next\n * step or kills the process via `process.kill(0)`\n */\nexport async function runCreateConfig() {\n clack.intro(\"create-deepagent\");\n\n const frameworkConfig = await selectFramework();\n const providerConfig = await selectProvider();\n const envVars = await collectEnvVars(providerConfig, frameworkConfig);\n const tracing = (await selectTracing()) ?? false;\n const langSmithKey = await collectLangSmithKey(tracing, frameworkConfig);\n\n return {\n frameworkChoice: frameworkConfig.id,\n providerChoice: providerConfig.id,\n envVars,\n tracing,\n langSmithKey,\n };\n}\n\n/** Prompt a user to select their framework */\nasync function selectFramework() {\n const frameworkOptions = Object.values(frameworks).map((f) => ({\n value: f.id,\n label: f.title,\n }));\n\n const frameworkChoice = await clack.select({\n message: \"Select your framework\",\n options: frameworkOptions,\n });\n\n if (clack.isCancel(frameworkChoice)) {\n clack.cancel(PROCESSS_EXIT_MESSAGE);\n process.exit(0);\n }\n\n const framework = frameworks[frameworkChoice as FrameworkKey];\n if (!framework) {\n throw new Error(`Framework \"${frameworkChoice}\" not found`);\n }\n\n return framework;\n}\n\n/** Prompt a user to select their provider */\nasync function selectProvider() {\n const providerOptions = Object.values(providers).map((p) => ({\n value: p.id,\n label: p.title,\n }));\n\n const providerChoice = (await clack.select({\n message: \"Select your provider\",\n options: providerOptions,\n })) as string;\n\n if (clack.isCancel(providerChoice)) {\n clack.cancel(PROCESSS_EXIT_MESSAGE);\n process.exit(0);\n }\n\n const provider = providers[providerChoice as ProviderKey];\n if (!provider) {\n throw new Error(`Provider \"${providerChoice}\" not found`);\n }\n\n return provider;\n}\n\n/** Prompt the user to enter env vars as are required by the provider spec */\nasync function collectEnvVars(\n provider: ProviderConfig,\n framework: FrameworkConfig,\n) {\n const envVars: Record<string, string> = {};\n for (const spec of provider.env) {\n const optionalExitMessage = `Skipping ${spec.prompt}. You can add this later in ${framework.envFilePath}`;\n const optionalSuffix = \" (press enter to skip)?\";\n\n const result = (await clack.password({\n message: `Enter ${spec.prompt ?? spec.name}${!spec.required && optionalSuffix}`,\n mask: \"*\",\n validate: (value) => {\n if (typeof value !== \"string\" && spec.required === true) {\n return `${spec.name} must not be empty.`;\n }\n\n if (value?.trim().length === 0) {\n return `Invalid ${spec.name}. Try again.`;\n }\n\n return undefined;\n },\n })) as string;\n const resultString =\n typeof result === \"string\" && result.trim() ? result.trim() : undefined;\n\n if (clack.isCancel(result) || resultString === undefined) {\n if (spec.required) {\n clack.cancel(PROCESSS_EXIT_MESSAGE);\n process.exit(0);\n }\n\n clack.cancel(optionalExitMessage);\n continue;\n }\n\n envVars[spec.name] = resultString;\n }\n return envVars;\n}\n\n/** Prompt a user to enable tracing */\nasync function selectTracing() {\n const tracing = (await clack.confirm({\n message: \"Add LangSmith tracing?\",\n initialValue: false,\n })) as boolean;\n\n if (clack.isCancel(tracing)) {\n clack.cancel(PROCESSS_EXIT_MESSAGE);\n process.exit(0);\n }\n\n return tracing;\n}\n\n/** Prompt a user for their LangSmith API if tracing is enabled */\nasync function collectLangSmithKey(\n tracing: boolean,\n framework: FrameworkConfig,\n) {\n if (!tracing) return;\n\n const exitMessage = `Skipping LangSmith API key. You can add this later in ${framework.envFilePath}`;\n\n const result = await clack.password({\n message: \"Enter your LangSmith API key (press enter to skip)?\",\n mask: \"*\",\n });\n const resultString =\n typeof result === \"string\" && result.trim() ? result.trim() : undefined;\n\n if (clack.isCancel(result) || resultString === undefined) {\n clack.cancel(exitMessage);\n return;\n }\n\n return resultString;\n}\n","import { logger } from \"./logger.js\";\n\nexport function handleError(e: unknown) {\n logger.break();\n logger.error(\n `Something went wrong. Please check the error below for more details.`,\n );\n logger.error(`If the problem persists, please open an issue on GitHub.`);\n logger.break();\n\n if (e && typeof e === \"object\" && \"name\" in e && e.name === \"ZodError\") {\n // Handle Zod errors\n const { flatten } = e as unknown as {\n flatten: () => { fieldErrors: Record<string, string[]> };\n };\n for (const [key, value] of Object.entries(flatten().fieldErrors)) {\n logger.error(`- ${key}: ${value}`);\n }\n } else if (\n e &&\n typeof e === \"object\" &&\n \"message\" in e &&\n typeof (e as { message: unknown }).message === \"string\"\n ) {\n // Handle `Error` types\n logger.error((e as { message: string }).message);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Resolve the template directory for a framework.\n * Templates live in `registry/frameworks/{frameworkDir}/` relative to the\n * package root. When running from the bundled dist, `import.meta.url` is\n * `dist/index.js`, so we go up one level to reach the package root.\n */\nexport function resolveFrameworkDir(frameworkDir: string): string {\n const distDir = path.dirname(fileURLToPath(import.meta.url));\n const packageRoot = path.resolve(distDir, \"..\");\n return path.join(packageRoot, \"registry\", \"frameworks\", frameworkDir);\n}\n\n/**\n * Copy a directory recursively. Filters out `node_modules` for dev ergonomics\n */\nexport async function copyDir(src: string, dest: string): Promise<void> {\n await fs.promises.cp(src, dest, {\n recursive: true,\n filter: (source) => !source.includes(\"node_modules\"),\n });\n}\n\n/** Loads a json file and asserts type. Performs no checks prior to read. */\nexport function loadJsonSync(filePath: string) {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw);\n}\n\n/**\n * Write a file, creating parent directories as needed.\n */\nexport async function writeFile(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.promises.mkdir(dir, { recursive: true });\n await fs.promises.writeFile(filePath, content);\n}\n","import { execSync } from \"node:child_process\";\n\n/** Initialize a git repo and make an initial commit. Silently ignores failures. */\nexport function gitInit(dir: string): void {\n const opts = { cwd: dir, stdio: \"ignore\" as const };\n try {\n execSync(\"git init\", opts);\n execSync(\"git add -A\", opts);\n execSync('git commit -m \"Initial commit\"', opts);\n } catch {\n /* This is fine */\n }\n}\n","import { z } from \"zod\";\n\nexport const packageJsonSchema = z.looseObject({\n name: z.string(),\n dependencies: z.record(z.string(), z.string()),\n packageManager: z.string().optional(),\n});\n\nexport type PackageJson = z.infer<typeof packageJsonSchema>;\n","import type { PackageJson } from \"../../schema/packageJson.js\";\nimport type { ProviderConfig } from \"../../registry/provider.js\";\n\nexport type TransformConfig = {\n projectName: string;\n provider: ProviderConfig;\n /** All provider dependencies to strip from the template */\n providerDependencies: string[];\n};\n\n/**\n * Pure transformation of a template's package.json for the scaffolded project.\n */\nexport function transformPackageJson(\n packageJson: PackageJson,\n config: TransformConfig,\n): PackageJson {\n const result: PackageJson = {\n ...packageJson,\n dependencies: { ...packageJson.dependencies },\n };\n\n // 1. Set the project name\n result.name = config.projectName;\n\n // 2. Strip extant provider dependencies from the template\n for (const dep of Object.keys(result.dependencies)) {\n if (config.providerDependencies.includes(dep)) {\n delete result.dependencies[dep];\n }\n }\n\n // 3. Inject the selected provider's dependency\n result.dependencies = {\n ...result.dependencies,\n [config.provider.dependency]: \"latest\",\n };\n\n // 4. Remove the packageManager field if present\n delete result.packageManager;\n\n return result;\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\nimport { x as tarExtract } from \"tar\";\n\nimport { copyDir } from \"../../utils/fileUtils.js\";\nimport { dirExists, isDirEmpty, makeDir } from \"../../utils/validate.js\";\nimport type { FrameworkConfig } from \"../../registry/framework.js\";\nimport { Address } from \"../../registry/address.js\";\n\nexport async function installTemplate(\n projectPath: string,\n framework: FrameworkConfig,\n) {\n const { address } = framework;\n\n switch (address.scheme) {\n case \"github\":\n await downloadGithubTemplate(address, projectPath);\n break;\n case \"local\":\n await copyDir(address.path, projectPath);\n break;\n default:\n throw new Error(`Invalid address scheme. This should not happen`);\n }\n}\n\n/**\n * Download a GitHub template by fetching the repo tarball and extracting it\n * into the project directory.\n */\nasync function downloadGithubTemplate(\n address: Extract<Address, { scheme: \"github\" }>,\n dest: string,\n): Promise<void> {\n const tarballUrl = `https://codeload.github.com/${address.owner}/${address.repo}/tar.gz/HEAD`;\n let tmpDir;\n\n try {\n tmpDir = await fs.promises.mkdtemp(\n path.join(os.tmpdir(), \"create-deepagent\"),\n );\n\n // 1. Fetch the repo tarball\n const response = await fetch(tarballUrl);\n if (!response.ok || !response.body) {\n throw new Error(\n `Failed to download template from GitHub: ${response.status} ${response.statusText}`,\n );\n }\n\n // 2. Extract and validate\n const extractDir = path.join(tmpDir, \"extracted\");\n await makeDir(extractDir);\n\n await pipeline(\n Readable.fromWeb(response.body as NodeReadableStream<Uint8Array>),\n tarExtract({ cwd: extractDir, strip: 1 }),\n );\n\n if (await isDirEmpty(extractDir)) {\n throw new Error(\n `Downloaded tarball for ${address.owner}/${address.repo} was empty.`,\n );\n }\n\n const sourceDir = address.subPath\n ? path.join(extractDir, address.subPath)\n : extractDir;\n\n if (address.subPath && !(await dirExists(sourceDir))) {\n throw new Error(\n `Subdirectory \"${address.subPath}\" not found in ${address.owner}/${address.repo}.`,\n );\n }\n\n // 3. Copy to dest\n await copyDir(sourceDir, dest);\n } catch (e) {\n throw new Error(\n `Failed to install template from ${address.owner}/${address.repo}: ${e}`,\n { cause: e },\n );\n } finally {\n if (tmpDir) await fs.promises.rm(tmpDir, { recursive: true, force: true });\n }\n}\n","import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { spinner } from \"@clack/prompts\";\n\nimport { preflightCreate } from \"./preflightCreate.js\";\nimport { runCreateConfig } from \"./runCreateConfig.js\";\nimport { frameworks, providers } from \"../../registry/index.js\";\nimport { handleError } from \"../../utils/handleError.js\";\nimport { logger } from \"../../utils/logger.js\";\nimport { writeFile, loadJsonSync } from \"../../utils/fileUtils.js\";\nimport { gitInit } from \"../../utils/git.js\";\nimport type { ProviderAwareFile } from \"../../registry/provider.js\";\nimport { packageJsonSchema } from \"../../schema/packageJson.js\";\nimport { transformPackageJson } from \"./transformPackageJson.js\";\nimport { installTemplate } from \"./installTemplate.js\";\n\nconst cliOptionsSchema = z.object({\n name: z.string().optional(),\n force: z.boolean().optional(),\n});\ntype CLIOptions = z.infer<typeof cliOptionsSchema>;\ntype TUIOptions = Awaited<ReturnType<typeof runCreateConfig>>;\n\nexport const create = new Command()\n .name(\"create\")\n .description(\"Initialize your project and install dependencies\")\n .option(\"-f, --force\", \"Force overwrite of existing files\")\n .option(\"-n, --name <name>\", \"The name for the new project\")\n .action(async (opts) => {\n try {\n const cliOptions = cliOptionsSchema.parse(opts);\n const tuiOptions = await runCreateConfig();\n const options = mergeOptions(cliOptions, tuiOptions);\n\n const projectPath = await preflightCreate(options);\n await runCreate(projectPath, options);\n } catch (e) {\n handleError(e);\n process.exit(1);\n }\n });\n\n/**\n * Merges CLI and TUI options. While CLI options are limited, this function will be\n * pretty slim.\n */\nfunction mergeOptions(cliOptions: CLIOptions, tuiOptions: TUIOptions) {\n const { name, force } = cliOptions;\n const { frameworkChoice, envVars, langSmithKey, providerChoice, tracing } =\n tuiOptions;\n\n const framework = frameworks[frameworkChoice];\n const provider = providers[providerChoice];\n\n return {\n framework,\n provider,\n projectName: name || framework.defaultProjectName,\n force,\n tracing,\n langSmithKey,\n envVars,\n };\n}\n\ntype RunCreateOptions = ReturnType<typeof mergeOptions>;\n\nasync function runCreate(projectPath: string, options: RunCreateOptions) {\n const s = spinner();\n\n try {\n const { framework, provider, projectName } = options;\n\n // 1. Install the template project\n s.start(`Copying ${framework.title} template...`);\n await installTemplate(projectPath, framework);\n\n // 2. Write files\n const envFile = createEnvFile(framework.envFilePath, options);\n const allFiles = [...framework.files, envFile];\n for (const file of allFiles) {\n const content = file.getContent({ providerConfig: provider });\n await writeFile(path.join(projectPath, file.path), content);\n }\n\n // 3. Transform package.json\n const packageJsonpath = path.join(projectPath, framework.packageJsonPath);\n const packageJson = packageJsonSchema.parse(loadJsonSync(packageJsonpath));\n const providerDependencies = Object.values(providers).map(\n (p) => p.dependency,\n );\n\n const transformed = transformPackageJson(packageJson, {\n projectName,\n provider,\n providerDependencies,\n });\n fs.writeFileSync(\n packageJsonpath,\n JSON.stringify(transformed, null, 2) + \"\\n\",\n );\n\n // 4. Git init\n gitInit(projectPath);\n\n s.stop();\n logger.break();\n logger.success(`${framework.title} project created at ${projectName}`);\n logger.break();\n\n // 5. Post-init. Frameworks provide instructions on next steps\n if (framework.postInit) {\n framework.postInit({ projectPath });\n }\n } finally {\n s.stop();\n }\n}\n\n/**\n * Create an env file with values the user fills in.\n */\nfunction createEnvFile(\n envFilePath: string,\n opts: {\n envVars?: Record<string, string>;\n tracing: boolean;\n langSmithKey?: string;\n },\n): ProviderAwareFile {\n const envVars = opts.envVars || {};\n\n return {\n path: envFilePath,\n getContent: () => {\n const lines: string[] = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n lines.push(`${key}=${value}`);\n }\n\n if (opts.tracing) {\n lines.push(\"LANGSMITH_TRACING=true\");\n if (opts.langSmithKey) {\n lines.push(`LANGSMITH_API_KEY=${opts.langSmithKey}`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n },\n };\n}\n","","import { Command } from \"commander\";\nimport { create } from \"./commands/create/index.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\nasync function main() {\n const program = new Command()\n .name(\"create-deepagent\")\n .description(\"Scaffold a new Deep Agents project\")\n .version(packageJson.version);\n\n program.addCommand(create, { isDefault: true });\n\n program.parse();\n}\n\nmain();\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@alexanderolsen/create-deepagent",
3
+ "version": "0.1.0",
4
+ "description": "Scaffold a new Deep Agents project with an interactive CLI",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-deepagent": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsdown",
11
+ "clean": "rm -rf dist/ .tsdown/",
12
+ "dev": "tsc --watch",
13
+ "typecheck": "tsc --noEmit",
14
+ "prepublishOnly": "pnpm build",
15
+ "test": "vitest run",
16
+ "test:unit": "vitest run",
17
+ "test:watch": "vitest",
18
+ "test:coverage": "vitest run --coverage"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/langchain-ai/deepagentsjs.git"
23
+ },
24
+ "keywords": [
25
+ "agents",
26
+ "deepagents",
27
+ "scaffold",
28
+ "cli",
29
+ "create",
30
+ "boilerplate"
31
+ ],
32
+ "author": "LangChain",
33
+ "license": "MIT",
34
+ "bugs": {
35
+ "url": "https://github.com/langchain-ai/deepagentsjs/issues"
36
+ },
37
+ "homepage": "https://docs.langchain.com/oss/javascript/deepagents",
38
+ "dependencies": {
39
+ "@clack/prompts": "^1.6.0",
40
+ "commander": "^15.0.0",
41
+ "langchain": "^1.5.2",
42
+ "picocolors": "^1.1.1",
43
+ "tar": "^7.5.16",
44
+ "zod": "^4.4.3"
45
+ },
46
+ "devDependencies": {
47
+ "@tsconfig/recommended": "^1.0.13",
48
+ "@types/node": "^25.2.3",
49
+ "@vitest/coverage-v8": "^4.0.18",
50
+ "tsdown": "^0.22.1",
51
+ "tsx": "^4.21.0",
52
+ "typescript": "^6.0.2",
53
+ "vitest": "^4.0.18"
54
+ },
55
+ "files": [
56
+ "dist/**/*",
57
+ "registry/frameworks/**/*"
58
+ ]
59
+ }
@@ -0,0 +1,6 @@
1
+ # Required: OpenAI API key used by the agent and its subagents.
2
+ OPENAI_API_KEY=sk-...
3
+
4
+ # Optional: enable LangSmith tracing.
5
+ # LANGSMITH_TRACING=true
6
+ # LANGSMITH_API_KEY=lsv2-...
@@ -0,0 +1,137 @@
1
+ # Deploying a LangChain Agent with Deno Deploy
2
+
3
+ An example app that deploys a LangChain **deep agent** on [Deno Deploy](https://deno.com/deploy) — streaming chat UI, subagents, and thread history, all backed by the [Agent Streaming Protocol](https://github.com/langchain-ai/agent-protocol/tree/main/streaming) implemented as HTTP + SSE route handlers on a Hono server. The React frontend is a Vite SPA (ported 1:1 from [`js-next`](../js-next)); Deno serves the built static assets and the API from a single `main.ts` entrypoint.
4
+
5
+ It is a port of the Next.js [`js-next`](../js-next) example into Deno + Hono, showing how to run the same agent stack on Deno Deploy instead of Vercel.
6
+
7
+ ## Deploy to Deno Deploy
8
+
9
+ 1. Fork or clone [`langchain-ai/deployment-cookbook`](https://github.com/langchain-ai/deployment-cookbook).
10
+ 2. In the [Deno Deploy dashboard](https://dash.deno.com/), create a new project linked to this repo.
11
+ 3. Set **Root Directory** to `js-deno`.
12
+ 4. Set the **build command** to `deno task build:client` (builds the Vite SPA into `dist/`).
13
+ 5. Set the **entrypoint** to `main.ts`.
14
+ 6. Add `OPENAI_API_KEY` in project environment variables.
15
+ 7. Deploy.
16
+
17
+ Alternatively, use the Deno Deploy CLI after building the client locally:
18
+
19
+ ```bash
20
+ cd js-deno
21
+ deno task build:client
22
+ deployctl deploy --project=your-project main.ts
23
+ ```
24
+
25
+ Optionally enable LangSmith tracing by adding the variables from [`.env.example`](./.env.example).
26
+
27
+ ## Required API endpoints
28
+
29
+ The app exposes the Agent Streaming Protocol under `/api/threads/...`. Route handlers live in `server/routes.ts` and mirror the Next.js handlers in `js-next/app/api/threads/`.
30
+
31
+ ### Minimum (streaming chat)
32
+
33
+ | Method | Path | Purpose |
34
+ | -------------- | --------------------------------- | -------------------------------------------------------------- |
35
+ | `POST` | `/api/threads/:threadId/commands` | Accept protocol commands (`run.start`, …) and start agent runs |
36
+ | `POST` | `/api/threads/:threadId/stream` | SSE stream of protocol events for a run |
37
+ | `GET` / `POST` | `/api/threads/:threadId/state` | Read and bootstrap checkpointed thread state |
38
+
39
+ ### Optional (this app's sidebar)
40
+
41
+ | Method | Path | Purpose |
42
+ | -------- | -------------------------------- | --------------------------------------------- |
43
+ | `GET` | `/api/threads` | List threads known to the checkpointer |
44
+ | `DELETE` | `/api/threads/:threadId` | Delete a thread's session and checkpoints |
45
+ | `POST` | `/api/threads/:threadId/history` | Paginated checkpoint history (Agent Protocol) |
46
+
47
+ ### Request flow
48
+
49
+ ```mermaid
50
+ flowchart TB
51
+ subgraph browser["Browser (Vite React SPA)"]
52
+ SP["StreamProvider"]
53
+ HAA["HttpAgentServerAdapter"]
54
+ SP --- HAA
55
+ end
56
+
57
+ subgraph deno["Deno.serve + Hono"]
58
+ CMD["POST /api/threads/:id/commands"]
59
+ STR["POST /api/threads/:id/stream (SSE)"]
60
+ STA["GET|POST /api/threads/:id/state"]
61
+ end
62
+
63
+ subgraph server["server/"]
64
+ SRV["registry · session · threads"]
65
+ end
66
+
67
+ subgraph agent["server/agent"]
68
+ AGT["createDeepAgent + checkpointer"]
69
+ end
70
+
71
+ HAA -->|POST| CMD
72
+ HAA -->|POST| STR
73
+ HAA -->|GET / POST| STA
74
+ CMD --> SRV
75
+ STR --> SRV
76
+ STA --> SRV
77
+ SRV --> AGT
78
+ ```
79
+
80
+ 1. Bootstrap thread state (`GET`/`POST /state`).
81
+ 2. On submit, the SDK sends `run.start` to `/commands` and receives a `run_id`.
82
+ 3. The SDK subscribes to `/stream` (SSE) for replay + live protocol events.
83
+ 4. Subagent (`task`) runs emit namespaced events surfaced as `stream.subagents`.
84
+
85
+ ## How the Deno backend works
86
+
87
+ This example runs as a **single Deno process**:
88
+
89
+ - **`main.ts`** — `Deno.serve` + Hono app. Mounts `/api` routes and serves the Vite-built SPA from `dist/`.
90
+ - **`server/routes.ts`** — Hono route definitions for the Agent Streaming Protocol (equivalent to `js-next/app/api/threads/`).
91
+ - **`server/session.ts`** — `LocalThreadSession`: buffers protocol events in a LangGraph `StreamChannel`, filters with `matchesSubscription`, and fans matching frames out over SSE `ReadableStream`.
92
+ - **`server/threads.ts`** — checkpointer-backed `getState` / `updateState` / `getHistory` helpers in the LangGraph SDK wire format.
93
+ - **`server/registry.ts`** — process-local singleton owning the agent and one session per thread id.
94
+ - **`server/agent/`** — same `createDeepAgent` orchestrator as `js-next` (researcher + math-whiz subagents, mock tools).
95
+
96
+ Deno Deploy runs each isolate with its own in-memory `MemorySaver` checkpointer. For production persistence across isolates, swap in a [durable checkpointer](https://docs.langchain.com/oss/javascript/langgraph/checkpointers#checkpointer-libraries) (Postgres, Redis, …) — the route handlers and `server/threads.ts` helpers stay the same.
97
+
98
+ ## Production persistence
99
+
100
+ Out of the box, the agent uses an in-memory `MemorySaver` checkpointer (`server/agent/index.ts`) and a process-local session map (`server/registry.ts`). That works for local dev and single-isolate deployments, but on Deno Deploy (multiple isolates, cold starts) conversation state is **not durable** across instances.
101
+
102
+ Replace `MemorySaver` in `server/agent/index.ts` with a durable checkpointer such as `@langchain/langgraph-checkpoint-postgres` or `@langchain/langgraph-checkpoint-redis`. You will also want a shared session/replay store so SSE reconnection works across isolates.
103
+
104
+ ## Local development
105
+
106
+ You need [Deno](https://deno.com/) 2.x and [pnpm](https://pnpm.io/) for the client.
107
+
108
+ ```bash
109
+ cp .env.example .env # set OPENAI_API_KEY
110
+ export $(grep -v '^#' .env | xargs) # load env for Deno
111
+
112
+ # Terminal 1 — API + static (after first client build)
113
+ deno task build:client # first time only
114
+ deno task dev
115
+
116
+ # Terminal 2 — Vite dev server with HMR (proxies /api to :8000)
117
+ cd client && pnpm install && pnpm dev
118
+ ```
119
+
120
+ Open [http://localhost:5173](http://localhost:5173) for development with hot reload. The Vite dev server proxies `/api` to the Deno server on port 8000.
121
+
122
+ For a production-like local run (single server, no HMR):
123
+
124
+ ```bash
125
+ deno task build:client
126
+ deno task start
127
+ ```
128
+
129
+ Open [http://localhost:8000](http://localhost:8000).
130
+
131
+ ## Project layout
132
+
133
+ - `main.ts` — Deno Deploy entrypoint (`Deno.serve` + Hono).
134
+ - `server/agent/` — deep agent (`createDeepAgent`) with subagents and mock tools.
135
+ - `server/` — protocol server logic: `session.ts`, `threads.ts`, `serialize.ts`, `registry.ts`, `routes.ts`.
136
+ - `client/` — Vite + React SPA (same UI as `js-next/components/`).
137
+ - `dist/` — Vite build output served by Deno (generated by `deno task build:client`).
@@ -0,0 +1,23 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/x-icon" href="/favicon.ico" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <meta
8
+ name="description"
9
+ content="Deploying a LangChain deep agent with Deno Deploy: streaming chat, subagents, and per-thread history."
10
+ />
11
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
12
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
13
+ <link
14
+ href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500&family=Inter:wght@400;500;600&display=swap"
15
+ rel="stylesheet"
16
+ />
17
+ <title>LangChain Deep Agent · Deno</title>
18
+ </head>
19
+ <body>
20
+ <div id="root"></div>
21
+ <script type="module" src="/src/main.tsx"></script>
22
+ </body>
23
+ </html>
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "js-deno-client",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "vite",
7
+ "build": "vite build",
8
+ "preview": "vite preview"
9
+ },
10
+ "dependencies": {
11
+ "@langchain/core": "1.1.48",
12
+ "@langchain/langgraph-sdk": "^1.9.20",
13
+ "@langchain/react": "^1.0.20",
14
+ "react": "19.2.4",
15
+ "react-dom": "19.2.4"
16
+ },
17
+ "devDependencies": {
18
+ "@types/react": "^19",
19
+ "@types/react-dom": "^19",
20
+ "@vitejs/plugin-react": "^4.4.1",
21
+ "typescript": "^5",
22
+ "vite": "^6.3.5"
23
+ },
24
+ "pnpm": {
25
+ "overrides": {
26
+ "@langchain/core": "1.1.50-dev-1781580357424"
27
+ }
28
+ },
29
+ "packageManager": "pnpm@10.33.2"
30
+ }
@@ -0,0 +1,124 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, useState } from "react";
4
+
5
+ import { HumanMessage } from "@langchain/core/messages";
6
+ import { useStreamContext } from "@langchain/react";
7
+
8
+ import type { Agent } from "@/lib/agent-type";
9
+ import { Conversation } from "./Conversation";
10
+ import { SubagentDetail } from "./Subagents";
11
+
12
+ const EXAMPLE_PROMPT =
13
+ "Research LangGraph streaming, and separately calculate 42 * 17.";
14
+
15
+ export function Chat({
16
+ onRunSettled,
17
+ }: {
18
+ threadId: string;
19
+ /** Called when a run settles, so the sidebar can refresh titles/order. */
20
+ onRunSettled: () => void;
21
+ }) {
22
+ const stream = useStreamContext<Agent>();
23
+ const [content, setContent] = useState(EXAMPLE_PROMPT);
24
+ const [openSubagentId, setOpenSubagentId] = useState<string | null>(null);
25
+ const textareaRef = useRef<HTMLTextAreaElement>(null);
26
+
27
+ // Refresh the sidebar whenever a run finishes (titles derive from the first
28
+ // message; order from the latest checkpoint, both owned by the server).
29
+ useEffect(() => {
30
+ if (!stream.isLoading) onRunSettled();
31
+ }, [stream.isLoading, onRunSettled]);
32
+
33
+ function autoGrow() {
34
+ const node = textareaRef.current;
35
+ if (!node) return;
36
+ node.style.height = "auto";
37
+ node.style.height = `${Math.min(node.scrollHeight, 200)}px`;
38
+ }
39
+
40
+ const subagents = [...stream.subagents.values()];
41
+ const openSubagent = openSubagentId
42
+ ? subagents.find((snapshot) => snapshot.id === openSubagentId)
43
+ : undefined;
44
+
45
+ function handleSubmit() {
46
+ const nextContent = content.trim();
47
+ if (nextContent.length === 0 || stream.isLoading) return;
48
+
49
+ setContent("");
50
+ if (textareaRef.current) textareaRef.current.style.height = "auto";
51
+ void stream.submit({
52
+ messages: [new HumanMessage(nextContent)],
53
+ });
54
+ }
55
+
56
+ // Subagent detail view: breadcrumb + that subagent's chat (no composer).
57
+ if (openSubagent) {
58
+ return (
59
+ <main className="chat-main">
60
+ <nav aria-label="Breadcrumb" className="breadcrumb">
61
+ <button
62
+ className="crumb-link"
63
+ onClick={() => setOpenSubagentId(null)}
64
+ type="button"
65
+ >
66
+ Main chat
67
+ </button>
68
+ <span className="crumb-sep">/</span>
69
+ <span className="crumb-current">{openSubagent.name}</span>
70
+ </nav>
71
+ <div className="conversation">
72
+ <div className="conversation-inner">
73
+ <SubagentDetail snapshot={openSubagent} />
74
+ </div>
75
+ </div>
76
+ </main>
77
+ );
78
+ }
79
+
80
+ // Main view: messages + subagent chips, with the composer pinned at the bottom.
81
+ return (
82
+ <main className="chat-main">
83
+ <div className="conversation">
84
+ <div className="conversation-inner">
85
+ <Conversation onOpenSubagent={setOpenSubagentId} />
86
+ </div>
87
+ </div>
88
+
89
+ <div className="composer-bar">
90
+ <form
91
+ className="composer"
92
+ onSubmit={(event) => {
93
+ event.preventDefault();
94
+ handleSubmit();
95
+ }}
96
+ >
97
+ <textarea
98
+ aria-label="Message"
99
+ onChange={(event) => {
100
+ setContent(event.target.value);
101
+ autoGrow();
102
+ }}
103
+ onKeyDown={(event) => {
104
+ if (event.key === "Enter" && !event.shiftKey) {
105
+ event.preventDefault();
106
+ handleSubmit();
107
+ }
108
+ }}
109
+ placeholder="Ask for research, a calculation, or both..."
110
+ ref={textareaRef}
111
+ rows={1}
112
+ value={content}
113
+ />
114
+ <button
115
+ disabled={content.trim() === "" || stream.isLoading}
116
+ type="submit"
117
+ >
118
+ Send
119
+ </button>
120
+ </form>
121
+ </div>
122
+ </main>
123
+ );
124
+ }
@@ -0,0 +1,129 @@
1
+ "use client";
2
+
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+
5
+ import { HttpAgentServerAdapter, StreamProvider } from "@langchain/react";
6
+
7
+ import {
8
+ type ThreadSummary,
9
+ createThread,
10
+ deleteThread,
11
+ fetchThreads,
12
+ getApiUrl,
13
+ } from "@/lib/chat/threads-client";
14
+ import { Chat } from "./Chat";
15
+ import { ThreadHistory } from "./ThreadHistory";
16
+ import { MoonIcon, SunIcon } from "./ThemeIcons";
17
+
18
+ export function ChatApp() {
19
+ const [mounted, setMounted] = useState(false);
20
+ const [theme, setTheme] = useState<"dark" | "light">("dark");
21
+ const [threads, setThreads] = useState<ThreadSummary[]>([]);
22
+ const [threadId, setThreadId] = useState<string>("");
23
+ // Guards the one-time init against React Strict Mode's double-invoke in dev,
24
+ // which would otherwise create two threads when none exist yet.
25
+ const initStarted = useRef(false);
26
+
27
+ const refreshThreads = useCallback(async () => {
28
+ setThreads(await fetchThreads());
29
+ }, []);
30
+
31
+ // On mount, load threads from the server (single source of truth). If none
32
+ // exist yet, create one. All setState happens in an async callback, so the
33
+ // effect body never calls setState synchronously.
34
+ useEffect(() => {
35
+ if (initStarted.current) return;
36
+ initStarted.current = true;
37
+ void (async () => {
38
+ const list = await fetchThreads();
39
+ if (list.length > 0) {
40
+ setThreads(list);
41
+ setThreadId(list[0].id);
42
+ } else {
43
+ const id = await createThread();
44
+ setThreads(await fetchThreads());
45
+ setThreadId(id);
46
+ }
47
+ setMounted(true);
48
+ })();
49
+ }, []);
50
+
51
+ const transport = useMemo(() => {
52
+ if (!threadId) return null;
53
+ return new HttpAgentServerAdapter({
54
+ apiUrl: getApiUrl(),
55
+ threadId,
56
+ paths: {
57
+ commands: `/threads/${threadId}/commands`,
58
+ stream: `/threads/${threadId}/stream`,
59
+ },
60
+ });
61
+ }, [threadId]);
62
+
63
+ const handleSelect = useCallback(
64
+ (id: string) => {
65
+ if (id !== threadId) setThreadId(id);
66
+ },
67
+ [threadId],
68
+ );
69
+
70
+ const handleCreate = useCallback(async () => {
71
+ const id = await createThread();
72
+ await refreshThreads();
73
+ setThreadId(id);
74
+ }, [refreshThreads]);
75
+
76
+ const handleDelete = useCallback(
77
+ async (id: string) => {
78
+ await deleteThread(id);
79
+ const list = await fetchThreads();
80
+ setThreads(list);
81
+ if (id !== threadId) return;
82
+ if (list.length > 0) {
83
+ setThreadId(list[0].id);
84
+ } else {
85
+ const freshId = await createThread();
86
+ setThreads(await fetchThreads());
87
+ setThreadId(freshId);
88
+ }
89
+ },
90
+ [threadId],
91
+ );
92
+
93
+ const shellClassName = `app-shell ${theme === "light" ? "light" : ""}`;
94
+
95
+ if (!mounted || !threadId || !transport) {
96
+ return (
97
+ <div className={shellClassName}>
98
+ <div className="empty-state center">Preparing chat…</div>
99
+ </div>
100
+ );
101
+ }
102
+
103
+ return (
104
+ <div className={shellClassName}>
105
+ <button
106
+ aria-label={
107
+ theme === "dark" ? "Switch to light mode" : "Switch to dark mode"
108
+ }
109
+ className="theme-toggle"
110
+ onClick={() => setTheme((cur) => (cur === "dark" ? "light" : "dark"))}
111
+ type="button"
112
+ >
113
+ {theme === "dark" ? <SunIcon /> : <MoonIcon />}
114
+ </button>
115
+
116
+ <ThreadHistory
117
+ activeThreadId={threadId}
118
+ onCreate={handleCreate}
119
+ onDelete={handleDelete}
120
+ onSelect={handleSelect}
121
+ threads={threads}
122
+ />
123
+
124
+ <StreamProvider key={threadId} threadId={threadId} transport={transport}>
125
+ <Chat onRunSettled={refreshThreads} threadId={threadId} />
126
+ </StreamProvider>
127
+ </div>
128
+ );
129
+ }