diff --git a/.changeset/fix-share-list-schema-drift.md b/.changeset/fix-share-list-schema-drift.md new file mode 100644 index 00000000000..9db4dff6049 --- /dev/null +++ b/.changeset/fix-share-list-schema-drift.md @@ -0,0 +1,12 @@ +--- +"@agent-native/core": patch +"@agent-native/dispatch": patch +--- + +Keep share dialogs readable while additive migrations are pending, and let +ordinary iframe pages load cross-origin subresources. Improve new-project setup +and Slack identity recovery guidance. Keep Cloudflare Workers builds below the +static-header rule limit, allow local Ollama endpoints on local non-production +servers, surface provider-setting errors, keep one PGlite client across dev +reload realms, permit the optional terminal build in fresh scaffolds, and +clarify standalone deployment. diff --git a/.github/workflows/deploy-beta-sites-prebuilt.yml b/.github/workflows/deploy-beta-sites-prebuilt.yml index f1095bc8454..f1628622ffd 100644 --- a/.github/workflows/deploy-beta-sites-prebuilt.yml +++ b/.github/workflows/deploy-beta-sites-prebuilt.yml @@ -222,7 +222,13 @@ jobs: changed_files="$(git diff --name-only "$base_sha" "$source_sha")" # ponytail: path-based schema gate; replace with production migration # status when GitHub Actions can access Netlify's masked secrets. - schema_files="$(printf '%s\n' "$changed_files" | rg -N '(^|/)(server/db/|packages/core/src/db/|packages/core/src/(resources|extensions|data-programs)/).+\.ts$|(^|/)store\.ts$|(^|/)(server/db/schema\.ts|server/db/migrations\.ts|server/plugins/(db|factory-migrations)\.ts|(?:scripts/)?migrate-production\.ts|drizzle(?:\.local)?\.config\.ts|netlify\.toml)$|(^|/)(migrations|supabase/migrations)/|(^|/).*schema\.ts$|(^|/).*migrations\.ts$|\.sql$' || true)" + schema_files="$( + printf '%s\n' "$changed_files" | + grep -E '(^|/)(server/db/|packages/core/src/db/|packages/core/src/(resources|extensions|data-programs)/).+\.ts$|(^|/)store\.ts$|(^|/)(server/db/schema\.ts|server/db/migrations\.ts|server/plugins/(db|factory-migrations)\.ts|(scripts/)?migrate-production\.ts|drizzle(\.local)?\.config\.ts|netlify\.toml)$|(^|/)(migrations|supabase/migrations)/|(^|/).*schema\.ts$|(^|/).*migrations\.ts$|\.sql$' || { + status=$? + [[ "$status" -eq 1 ]] || exit "$status" + } + )" if [[ -n "$unresolved_pending_sha" ]]; then echo "::error::Beta remains withheld for unconfirmed production migration at $unresolved_pending_sha." if [[ -n "$schema_files" ]]; then diff --git a/packages/core/README.md b/packages/core/README.md index 5e9cb4a3a24..97070af0e0a 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -13,10 +13,10 @@ Agent-Native is an open-source TypeScript framework for building agents that pai ## Quick start -You need [Node.js](https://nodejs.org) 22.22 or later, [pnpm](https://pnpm.io), and an LLM connection. +You need [Node.js](https://nodejs.org) 22.22 or later, [pnpm](https://pnpm.io) available on your `PATH`, and an LLM connection. ```bash -npx @agent-native/core@latest create my-agent --standalone --template chat +npx --yes @agent-native/core@latest create my-agent --standalone --template chat cd my-agent pnpm install pnpm dev diff --git a/packages/core/bin/agent-native.js b/packages/core/bin/agent-native.js index 96ed4baa19a..c721fc3aa4e 100755 --- a/packages/core/bin/agent-native.js +++ b/packages/core/bin/agent-native.js @@ -6,7 +6,15 @@ import { createRequire } from "node:module"; import { dirname, join } from "node:path"; import { fileURLToPath, pathToFileURL } from "node:url"; -import { shouldUseSourceFallback } from "./launcher.js"; +import { shouldUseSourceFallback, supportsNodeVersion } from "./launcher.js"; + +if (!supportsNodeVersion(process.versions.node)) { + console.error( + `agent-native requires Node.js 22.22.0 or newer, but you're on Node ${process.versions.node}.\n` + + "Upgrade Node (https://nodejs.org) and re-run. With nvm: `nvm install 22.22`.", + ); + process.exit(1); +} const binDir = dirname(fileURLToPath(import.meta.url)); const distEntry = join(binDir, "../dist/cli/index.js"); diff --git a/packages/core/bin/launcher.js b/packages/core/bin/launcher.js index dcc7b069a1d..ff5504ba818 100644 --- a/packages/core/bin/launcher.js +++ b/packages/core/bin/launcher.js @@ -32,3 +32,9 @@ export function shouldUseSourceFallback({ pair.sourceMtimeMs > pair.distMtimeMs, ); } + +/** @param {string} version */ +export function supportsNodeVersion(version) { + const [major, minor] = version.split(".").map(Number); + return major > 22 || (major === 22 && minor >= 22); +} diff --git a/packages/core/docs/content/deploy-an-app.mdx b/packages/core/docs/content/deploy-an-app.mdx index 50d61c0ee99..683939e8f10 100644 --- a/packages/core/docs/content/deploy-an-app.mdx +++ b/packages/core/docs/content/deploy-an-app.mdx @@ -14,7 +14,8 @@ workspace](/docs/workspace-deployment) instead. ### Create or open the app -Create a standalone Chat app, or work from an existing app: +Follow [Getting Started](/docs/getting-started) to create a standalone Chat app, +or work from an existing app: ```bash npx @agent-native/core@latest create my-app --standalone --template chat @@ -70,9 +71,15 @@ For a local production-shaped check with Postgres and Docker, follow the ### Configure the deployment -Set `DATABASE_URL` to a persistent PostgreSQL database before the first production -deploy. A standalone app using framework auth also needs a stable -`BETTER_AUTH_SECRET`. Add the provider and integration variables your app uses. +Set `DATABASE_URL` in your deployment provider's environment settings, not only +in the local `.env`, before the first production deploy. A standalone app using +framework auth also needs a stable `BETTER_AUTH_SECRET`; generate one with +`openssl rand -hex 32` and save it in the same provider settings. Add only the +provider and integration variables your app actually uses. + +The **Continue as local dev** shortcut is limited to local development. A +deployed app uses the sign-up and sign-in flow backed by that persistent +database and auth secret. Use the [deployment environment reference](/docs/deployment-environment-variables) for production secrets, auth, webhooks, workspace inheritance, and runtime diff --git a/packages/core/docs/content/deployment.mdx b/packages/core/docs/content/deployment.mdx index 5374c87ce76..420de7d2fdf 100644 --- a/packages/core/docs/content/deployment.mdx +++ b/packages/core/docs/content/deployment.mdx @@ -43,15 +43,17 @@ connection URL. ### Set the connection string -Set `DATABASE_URL` in the deployment environment before the first production -deploy. +Set `DATABASE_URL` in the hosting provider's environment-variable or secret +settings before the first production deploy. A local `.env` configures your +machine only and is not uploaded by the deploy command. ### Add production secrets -Set a stable `BETTER_AUTH_SECRET` for a standalone app. A workspace also needs -`A2A_SECRET` when it uses signed cross-app requests or background handoffs. The -[deployment environment reference](/docs/deployment-environment-variables) -covers the rest of the production configuration. +Generate a stable signing secret with `openssl rand -hex 32`, then set it as +`BETTER_AUTH_SECRET` for a standalone app. A workspace also needs `A2A_SECRET` +when it uses signed cross-app requests or background handoffs. The [deployment +environment reference](/docs/deployment-environment-variables) covers the rest +of the production configuration. @@ -68,7 +70,8 @@ An email provider is not required for email/password authentication. Without one, a deployed app uses email/password signup and login, skips signup email verification, and does not offer magic-link authentication. -Connect Resend or SendGrid before deploying if you want magic links, email +Agent-Native does not bundle an email-delivery account. Connect Resend or +SendGrid before deploying if you want magic links, email verification, password resets, invitations, or share notifications. Set `RESEND_API_KEY` or `SENDGRID_API_KEY` in the deployment environment; SendGrid also needs `EMAIL_FROM`. See [Authentication](/docs/authentication) for the diff --git a/packages/core/docs/content/docker.mdx b/packages/core/docs/content/docker.mdx index f809e79461b..ecdfd65210c 100644 --- a/packages/core/docs/content/docker.mdx +++ b/packages/core/docs/content/docker.mdx @@ -12,7 +12,8 @@ Node.js, Vercel, Netlify, Cloudflare, or another Nitro target. ## Local quickstart {#self-host-quickstart} -Create an app, install dependencies, and build the image: +Create an app and install dependencies. Then add the `Dockerfile` from the +production image section below before building the image: ```bash npx @agent-native/core@latest create my-app --standalone --template chat @@ -35,7 +36,7 @@ into the image. ```dockerfile filename="Dockerfile" FROM node:24-slim AS build WORKDIR /app -COPY package.json pnpm-lock.yaml ./ +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ RUN corepack enable && pnpm install --frozen-lockfile COPY . . RUN pnpm build diff --git a/packages/core/docs/content/getting-started.mdx b/packages/core/docs/content/getting-started.mdx index af39f215b43..41ae26f05ae 100644 --- a/packages/core/docs/content/getting-started.mdx +++ b/packages/core/docs/content/getting-started.mdx @@ -17,8 +17,8 @@ In this guide, you'll create an agent with a chat UI and call its included ## Prerequisites -- [Node.js](https://nodejs.org) 22 or later -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 or later +- [pnpm](https://pnpm.io) installed and available on your `PATH` - An LLM connection for the agent: Builder.io, an Anthropic or OpenAI API key, or a local Ollama model @@ -27,7 +27,7 @@ In this guide, you'll create an agent with a chat UI and call its included In a new directory, start from the Chat template: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -44,8 +44,8 @@ Start the development server: pnpm dev ``` -The browser UI opens at `http://localhost:8080`. If it doesn't open -automatically, visit that URL in your browser. +The browser UI opens automatically. If it does not, open the local URL printed +by `pnpm dev`; the port increments when another app is already using 8080. @@ -77,7 +77,7 @@ Hello, Alex! ## Inspect the action -Open `actions/hello.ts`: +In your local `my-app` directory, open `actions/hello.ts` in your code editor: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -107,7 +107,8 @@ Read [Defining Actions](/docs/actions-defining) for the complete API. ## Call the action from React -Add a route at `app/routes/hello.tsx`: +The template includes `actions/hello.ts`, but not a page for it. Create +`app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -139,8 +140,8 @@ export default function HelloRoute() { -Restart the development server so it discovers the new route, then open -`http://localhost:8080/hello`. +Restart the development server so it discovers the new route, then append +`/hello` to the local URL printed by `pnpm dev`. @@ -200,4 +201,9 @@ together. Define actions for reads, writes, and approvals, then call them from the UI, agents, and external clients. +### [Deploy an app](/docs/deploy-an-app) + +Move from local development to a persistent database, production auth, and a +supported deployment target. + diff --git a/packages/core/docs/content/locales/ar-SA/deploy-an-app.mdx b/packages/core/docs/content/locales/ar-SA/deploy-an-app.mdx index 542d792f0cf..a08d78086af 100644 --- a/packages/core/docs/content/locales/ar-SA/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/ar-SA/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "أنشئ تطبيق Agent-Native وانشره على هدف Nitro. اتبع [دليل نشر التطبيق الكامل باللغة الإنجليزية](/docs/deploy-an-app) للخطوات والأوامر الخاصة بكل موفر. -قبل النشر، اضبط قاعدة بيانات PostgreSQL دائمة و`BETTER_AUTH_SECRET` ثابتًا. اختر هدفًا من [Node.js](/docs/node-js) أو [Docker](/docs/docker) أو [Vercel](/docs/vercel) أو [Netlify](/docs/netlify) أو [Cloudflare Pages](/docs/cloudflare#cloudflare-pages) أو [Cloudflare Workers](/docs/cloudflare#cloudflare-workers) أو [AWS Amplify](/docs/aws-amplify) أو [AWS Lambda](/docs/aws-lambda) أو [Deno Deploy](/docs/deno-deploy) أو [Azure Static Web Apps](/docs/azure-static-web-apps) أو [Koyeb](/docs/koyeb) أو [Render](/docs/render). +ابدأ من [البدء](/docs/getting-started). قبل النشر، اضبط `DATABASE_URL` في إعدادات بيئة موفر الاستضافة وليس في ملف `.env` المحلي فقط. أنشئ `BETTER_AUTH_SECRET` ثابتًا باستخدام `openssl rand -hex 32` واحفظه هناك أيضًا. خيار **Continue as local dev** محلي فقط؛ يستخدم التطبيق المنشور التسجيل وتسجيل الدخول. اختر هدفًا من [Node.js](/docs/node-js) أو [Docker](/docs/docker) أو [Vercel](/docs/vercel) أو [Netlify](/docs/netlify) أو [Cloudflare Pages](/docs/cloudflare#cloudflare-pages) أو [Cloudflare Workers](/docs/cloudflare#cloudflare-workers) أو [AWS Amplify](/docs/aws-amplify) أو [AWS Lambda](/docs/aws-lambda) أو [Deno Deploy](/docs/deno-deploy) أو [Azure Static Web Apps](/docs/azure-static-web-apps) أو [Koyeb](/docs/koyeb) أو [Render](/docs/render). لعدة تطبيقات خلف أصل واحد، استخدم [نشر مساحة عمل](/docs/workspace-deployment). diff --git a/packages/core/docs/content/locales/ar-SA/deployment.mdx b/packages/core/docs/content/locales/ar-SA/deployment.mdx index 3ab07c2d0e1..ba612d45b7a 100644 --- a/packages/core/docs/content/locales/ar-SA/deployment.mdx +++ b/packages/core/docs/content/locales/ar-SA/deployment.mdx @@ -30,6 +30,8 @@ description: "انشر تطبيق Agent-Native أو مساحة عمل على م تحتاج التطبيقات المستقلة إلى `BETTER_AUTH_SECRET` ثابت. تحتاج مساحات العمل التي تستخدم الطلبات الموقعة بين التطبيقات إلى `A2A_SECRET`. +اضبط هذه القيم في إعدادات بيئة موفر الاستضافة، لا في ملف `.env` المحلي فقط. أنشئ سر المصادقة باستخدام `openssl rand -hex 32`. لا يتضمن Agent-Native حسابًا لإرسال البريد؛ يجب ربط Resend أو SendGrid بشكل منفصل. + ## تسليم البريد الإلكتروني اختياري، لكنه موصى به {#email-provider} موفر البريد الإلكتروني ليس مطلوبًا لمصادقة البريد الإلكتروني وكلمة المرور. بدونه، تستخدم التطبيقات المنشورة التسجيل وتسجيل الدخول بالبريد الإلكتروني وكلمة المرور، وتتخطى التحقق من البريد عند التسجيل، ولا تعرض مصادقة الروابط السحرية. diff --git a/packages/core/docs/content/locales/ar-SA/docker.mdx b/packages/core/docs/content/locales/ar-SA/docker.mdx index 37306fef1eb..f5e0e07057a 100644 --- a/packages/core/docs/content/locales/ar-SA/docker.mdx +++ b/packages/core/docs/content/locales/ar-SA/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +راجع [دليل Docker بالإنجليزية](/docs/docker) وأنشئ ملف `Dockerfile` الموضح فيه +قبل تشغيل `docker build`. The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/ar-SA/getting-started.mdx b/packages/core/docs/content/locales/ar-SA/getting-started.mdx index 86e006cbb81..a552660dd41 100644 --- a/packages/core/docs/content/locales/ar-SA/getting-started.mdx +++ b/packages/core/docs/content/locales/ar-SA/getting-started.mdx @@ -16,8 +16,8 @@ Agent-Native هو إطار عمل TypeScript مفتوح المصدر لبناء ## المتطلبات الأساسية -- [Node.js](https://nodejs.org) 22 أو أحدث -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 أو أحدث +- [pnpm](https://pnpm.io) مثبت ومتاح في `PATH` - اتصال LLM للوكيل: Builder.io، أو مفتاح API من Anthropic أو OpenAI، أو نموذج Ollama محلي @@ -26,7 +26,7 @@ Agent-Native هو إطار عمل TypeScript مفتوح المصدر لبناء في دليل جديد، ابدأ من قالب Chat: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -43,8 +43,8 @@ pnpm install pnpm dev ``` -تُفتح واجهة المستخدم في المتصفح على `http://localhost:8080`. إذا لم تُفتح -تلقائيًا، فانتقل إلى هذا العنوان في متصفحك. +تُفتح واجهة المستخدم تلقائيًا. إذا لم تُفتح، فاستخدم العنوان المحلي الذي يطبعه +`pnpm dev`؛ يزداد رقم المنفذ إذا كان تطبيق آخر يستخدم 8080. @@ -75,7 +75,7 @@ Hello, Alex! ## فحص الإجراء -افتح `actions/hello.ts`: +في دليل `my-app` المحلي، افتح `actions/hello.ts` في محرر الشفرة: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -105,7 +105,8 @@ export default defineAction({ ## استدعاء الإجراء من React -أضف مسارًا في `app/routes/hello.tsx`: +يتضمن القالب `actions/hello.ts`، لكنه لا يتضمن صفحة له. أنشئ +`app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -138,7 +139,7 @@ export default function HelloRoute() { أعد تشغيل خادم التطوير كي يكتشف المسار الجديد، ثم افتح -`http://localhost:8080/hello`. +`http://localhost:/hello`. @@ -197,4 +198,8 @@ return { message: `Welcome, ${name}.` }; عرّف إجراءات للقراءة والكتابة والموافقات، ثم استدعها من واجهة المستخدم والوكلاء والعملاء الخارجيين. +### [نشر تطبيق](/docs/deploy-an-app) + +انتقل من التطوير المحلي إلى قاعدة بيانات دائمة ومصادقة إنتاجية وهدف نشر مدعوم. + diff --git a/packages/core/docs/content/locales/ar-SA/netlify.mdx b/packages/core/docs/content/locales/ar-SA/netlify.mdx index fe71ea859c6..b58e3edd28f 100644 --- a/packages/core/docs/content/locales/ar-SA/netlify.mdx +++ b/packages/core/docs/content/locales/ar-SA/netlify.mdx @@ -13,8 +13,18 @@ export default defineConfig({ }); ``` +قد تسمي القوالب الجديدة الدالة المستوردة `agentNativePlugins` وتنشر نتيجتها +للمحافظة على توافق أنواع حزم Vite. وهي إضافة `agentNative` نفسها وتقبل الخيارات نفسها. + ...أو تضبط `NITRO_PRESET=netlify` عند وقت البناء. +للتطبيق المستقل، ابنِ مخرجات Netlify وانشر الأصول والدوال: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + بالنسبة لمساحة عمل، انشر كل تطبيق من موقع Netlify واحد عن طريق تشغيل: ```bash diff --git a/packages/core/docs/content/locales/ar-SA/template-calendar-developers.mdx b/packages/core/docs/content/locales/ar-SA/template-calendar-developers.mdx index e9b81204087..49957742a44 100644 --- a/packages/core/docs/content/locales/ar-SA/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/ar-SA/template-calendar-developers.mdx @@ -25,7 +25,7 @@ cd my-calendar pnpm install ``` -يتطلب هذا تثبيت [Node.js](https://nodejs.org) الإصدار 22 أو أحدث و +يتطلب هذا تثبيت [Node.js](https://nodejs.org) الإصدار 22.22 أو أحدث و [pnpm](https://pnpm.io) أولًا. راجع [بدء الاستخدام](/docs/getting-started) إذا لم تكن قد ثبّت أيًا منهما بعد، أو لم يكن لديك اتصال بنموذج لغوي (Builder.io، أو مفتاح Anthropic/OpenAI، أو Ollama محلي) مُعد. diff --git a/packages/core/docs/content/locales/ar-SA/vercel.mdx b/packages/core/docs/content/locales/ar-SA/vercel.mdx index 6f9a84c7a12..d4a9ec9c8ff 100644 --- a/packages/core/docs/content/locales/ar-SA/vercel.mdx +++ b/packages/core/docs/content/locales/ar-SA/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ انشر عبر Vercel CLI أو عبر git push: ```bash -vercel deploy +npx vercel deploy ``` +لإنشاء معاينة مؤقتة بدون تسجيل الدخول إلى Vercel، شغّل +`npx vercel deploy --temporary`. لا تحتفظ عمليات النشر المؤقتة بمتغيرات بيئة +المشروع، لذا مرّر قيم قاعدة البيانات والأسرار عبر خياري `--env` و`--build-env` +عندما تحتاج إلى أكثر من معاينة للواجهة. + بالنسبة لمساحة عمل، قم ببناء كل تطبيق في حزمة واحدة من Vercel Build Output API: ```bash diff --git a/packages/core/docs/content/locales/de-DE/deploy-an-app.mdx b/packages/core/docs/content/locales/de-DE/deploy-an-app.mdx index 578caf42639..d3d71b838c8 100644 --- a/packages/core/docs/content/locales/de-DE/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/de-DE/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Eine Agent-Native App auf einem Nitro-Ziel erstellen und bereitste Folge dem [vollständigen englischen Leitfaden zum Bereitstellen einer App](/docs/deploy-an-app) für die Schritte und Anbieterbefehle. -Setze vor dem Deployment eine dauerhafte PostgreSQL-Datenbank und ein stabiles `BETTER_AUTH_SECRET`. Wähle [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) oder [Render](/docs/render). +Beginne mit [Erste Schritte](/docs/getting-started). Setze vor dem Deployment `DATABASE_URL` in den Umgebungseinstellungen des Hosting-Anbieters, nicht nur in der lokalen `.env`. Erzeuge mit `openssl rand -hex 32` ein stabiles `BETTER_AUTH_SECRET` und speichere es dort ebenfalls. **Continue as local dev** gilt nur lokal; die bereitgestellte App verwendet Registrierung und Anmeldung. Wähle [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) oder [Render](/docs/render). Für mehrere Apps unter einer Origin nutze [Workspace-Deployment](/docs/workspace-deployment). diff --git a/packages/core/docs/content/locales/de-DE/deployment.mdx b/packages/core/docs/content/locales/de-DE/deployment.mdx index ad7fb3dc7ba..206cd14ddc5 100644 --- a/packages/core/docs/content/locales/de-DE/deployment.mdx +++ b/packages/core/docs/content/locales/de-DE/deployment.mdx @@ -30,6 +30,8 @@ Jede bereitgestellte App benötigt eine dauerhafte PostgreSQL-Datenbank. Setze ` Standalone-Apps benötigen ein stabiles `BETTER_AUTH_SECRET`. Workspaces mit signierten App-zu-App-Anfragen benötigen `A2A_SECRET`. +Setze diese Werte in den Umgebungseinstellungen des Hosting-Anbieters, nicht nur in der lokalen `.env`. Erzeuge das Auth-Secret mit `openssl rand -hex 32`. Agent-Native enthält kein E-Mail-Zustellkonto; Resend oder SendGrid muss separat verbunden werden. + ## E-Mail-Zustellung ist optional, aber empfohlen {#email-provider} Ein E-Mail-Anbieter ist für die E-Mail-/Passwort-Authentifizierung nicht erforderlich. Ohne Anbieter verwenden bereitgestellte Apps E-Mail/Passwort für Registrierung und Anmeldung, überspringen die E-Mail-Verifizierung bei der Registrierung und bieten keine Magic-Link-Authentifizierung an. diff --git a/packages/core/docs/content/locales/de-DE/docker.mdx b/packages/core/docs/content/locales/de-DE/docker.mdx index 37306fef1eb..aa0e78bf0fd 100644 --- a/packages/core/docs/content/locales/de-DE/docker.mdx +++ b/packages/core/docs/content/locales/de-DE/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +Lesen Sie den [englischen Docker-Leitfaden](/docs/docker) und erstellen Sie die +dort gezeigte `Dockerfile`, bevor Sie `docker build` ausführen. The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/de-DE/getting-started.mdx b/packages/core/docs/content/locales/de-DE/getting-started.mdx index 566f2387f6f..09229f188e8 100644 --- a/packages/core/docs/content/locales/de-DE/getting-started.mdx +++ b/packages/core/docs/content/locales/de-DE/getting-started.mdx @@ -17,8 +17,8 @@ dessen enthaltene `hello`-Action über den Agenten und die UI auf. ## Voraussetzungen -- [Node.js](https://nodejs.org) 22 oder höher -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 oder höher +- [pnpm](https://pnpm.io), installiert und über Ihren `PATH` verfügbar - Eine LLM-Verbindung für den Agenten: Builder.io, ein Anthropic- oder OpenAI-API-Schlüssel oder ein lokales Ollama-Modell @@ -27,7 +27,7 @@ dessen enthaltene `hello`-Action über den Agenten und die UI auf. Beginnen Sie in einem neuen Verzeichnis mit dem Chat-Template: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -45,8 +45,8 @@ Starten Sie den Entwicklungsserver: pnpm dev ``` -Die Browser-UI wird unter `http://localhost:8080` geöffnet. Falls sie nicht -automatisch geöffnet wird, rufen Sie diese URL im Browser auf. +Die Browser-UI wird automatisch geöffnet. Falls nicht, verwenden Sie die von +`pnpm dev` ausgegebene lokale URL; der Port wird erhöht, wenn 8080 belegt ist. @@ -79,7 +79,7 @@ Hello, Alex! ## Die Action ansehen -Öffnen Sie `actions/hello.ts`: +Öffnen Sie im lokalen Verzeichnis `my-app` die Datei `actions/hello.ts` in Ihrem Code-Editor: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -110,7 +110,8 @@ Die vollständige API finden Sie unter [Actions definieren](/docs/actions-defini ## Die Action über React aufrufen -Fügen Sie eine Route unter `app/routes/hello.tsx` hinzu: +Das Template enthält `actions/hello.ts`, aber noch keine Seite dafür. Erstellen +Sie `app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -143,7 +144,7 @@ export default function HelloRoute() { Starten Sie den Entwicklungsserver neu, damit er die neue Route erkennt, und -öffnen Sie anschließend `http://localhost:8080/hello`. +öffnen Sie anschließend `http://localhost:/hello`. @@ -206,4 +207,9 @@ zusammenwirken. Definieren Sie Actions für Lesevorgänge, Schreibvorgänge und Freigaben und rufen Sie sie anschließend über UI, Agenten und externe Clients auf. +### [Eine App bereitstellen](/docs/deploy-an-app) + +Wechseln Sie von lokaler Entwicklung zu einer dauerhaften Datenbank, +Produktions-Authentifizierung und einem unterstützten Ziel. + diff --git a/packages/core/docs/content/locales/de-DE/netlify.mdx b/packages/core/docs/content/locales/de-DE/netlify.mdx index 0235aa0d811..dc4528825b3 100644 --- a/packages/core/docs/content/locales/de-DE/netlify.mdx +++ b/packages/core/docs/content/locales/de-DE/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +Neue Scaffolds können die importierte Funktion `agentNativePlugins` nennen und +ihr Ergebnis verteilen, damit die Vite-Pakettypen übereinstimmen. Es ist dasselbe +`agentNative`-Plugin und akzeptiert dieselben Optionen. + … oder legen Sie `NITRO_PRESET=netlify` zur Build-Zeit fest. +Für eine Standalone-App bauen Sie die Netlify-Ausgabe und stellen Assets und Funktionen bereit: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + Stellen Sie für einen Arbeitsbereich jede App von einer Netlify-Site bereit, indem Sie Folgendes ausführen: ```bash diff --git a/packages/core/docs/content/locales/de-DE/template-calendar-developers.mdx b/packages/core/docs/content/locales/de-DE/template-calendar-developers.mdx index d0582f8747a..6ec975085e5 100644 --- a/packages/core/docs/content/locales/de-DE/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/de-DE/template-calendar-developers.mdx @@ -21,7 +21,7 @@ cd my-calendar pnpm install ``` -Dafür benötigen Sie zunächst [Node.js](https://nodejs.org) 22 oder neuer und [pnpm](https://pnpm.io). Wenn Sie noch keines von beiden installiert haben oder keine LLM-Verbindung (Builder.io, ein Anthropic/OpenAI-Schlüssel oder lokales Ollama) eingerichtet haben, lesen Sie [Erste Schritte](/docs/getting-started). +Dafür benötigen Sie zunächst [Node.js](https://nodejs.org) 22.22 oder neuer und [pnpm](https://pnpm.io). Wenn Sie noch keines von beiden installiert haben oder keine LLM-Verbindung (Builder.io, ein Anthropic/OpenAI-Schlüssel oder lokales Ollama) eingerichtet haben, lesen Sie [Erste Schritte](/docs/getting-started). ### Den Entwicklungsserver starten diff --git a/packages/core/docs/content/locales/de-DE/vercel.mdx b/packages/core/docs/content/locales/de-DE/vercel.mdx index b720e84ec71..14b8062850e 100644 --- a/packages/core/docs/content/locales/de-DE/vercel.mdx +++ b/packages/core/docs/content/locales/de-DE/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Bereitstellung über die Vercel CLI oder Git Push: ```bash -vercel deploy +npx vercel deploy ``` +Für eine kurzlebige Vorschau ohne Vercel-Anmeldung führen Sie +`npx vercel deploy --temporary` aus. Temporäre Deployments übernehmen keine +Projekt-Umgebungsvariablen. Übergeben Sie Datenbank- und Geheimniswerte daher +mit `--env` und `--build-env`, wenn Sie mehr als eine UI-Vorschau benötigen. + Bauen Sie für einen Arbeitsbereich jede App in ein einziges Vercel-Build-Output-API-Bundle: ```bash diff --git a/packages/core/docs/content/locales/es-ES/deploy-an-app.mdx b/packages/core/docs/content/locales/es-ES/deploy-an-app.mdx index 64de07e91b8..b880ce70069 100644 --- a/packages/core/docs/content/locales/es-ES/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/es-ES/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Construye e implementa una aplicación Agent-Native en un destino Consulta la [guía completa en inglés para implementar una aplicación](/docs/deploy-an-app) para ver los pasos y comandos de cada proveedor. -Antes de implementar, configura una base de datos PostgreSQL persistente y un `BETTER_AUTH_SECRET` estable. Elige [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) o [Render](/docs/render). +Empieza con [Primeros pasos](/docs/getting-started). Antes de implementar, configura `DATABASE_URL` en los ajustes de entorno del proveedor de alojamiento, no solo en el `.env` local. Genera un `BETTER_AUTH_SECRET` estable con `openssl rand -hex 32` y guárdalo allí. **Continue as local dev** solo funciona localmente; la aplicación implementada usa registro e inicio de sesión. Elige [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) o [Render](/docs/render). Para varias aplicaciones bajo un mismo origen, usa [Implementación de espacios de trabajo](/docs/workspace-deployment). diff --git a/packages/core/docs/content/locales/es-ES/deployment.mdx b/packages/core/docs/content/locales/es-ES/deployment.mdx index 718e8d86406..55b4b0f45b5 100644 --- a/packages/core/docs/content/locales/es-ES/deployment.mdx +++ b/packages/core/docs/content/locales/es-ES/deployment.mdx @@ -30,6 +30,8 @@ Cada aplicación implementada necesita una base de datos PostgreSQL persistente. Las aplicaciones independientes necesitan un `BETTER_AUTH_SECRET` estable. Los espacios de trabajo con solicitudes firmadas entre aplicaciones necesitan `A2A_SECRET`. +Configura estos valores en los ajustes de entorno del proveedor de alojamiento, no solo en el `.env` local. Genera el secreto de autenticación con `openssl rand -hex 32`. Agent-Native no incluye una cuenta de envío de correo; conecta Resend o SendGrid por separado. + ## El envío de correo es opcional, pero recomendable {#email-provider} Un proveedor de correo no es necesario para la autenticación con correo y contraseña. Sin uno, las aplicaciones implementadas usan el registro y el inicio de sesión con correo y contraseña, omiten la verificación del correo al registrarse y no ofrecen autenticación mediante enlaces mágicos. diff --git a/packages/core/docs/content/locales/es-ES/docker.mdx b/packages/core/docs/content/locales/es-ES/docker.mdx index 37306fef1eb..d032beb08cc 100644 --- a/packages/core/docs/content/locales/es-ES/docker.mdx +++ b/packages/core/docs/content/locales/es-ES/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +Consulta la [guía de Docker en inglés](/docs/docker) y crea el `Dockerfile` +mostrado allí antes de ejecutar `docker build`. The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/es-ES/getting-started.mdx b/packages/core/docs/content/locales/es-ES/getting-started.mdx index 400bd7c831f..ed74b382051 100644 --- a/packages/core/docs/content/locales/es-ES/getting-started.mdx +++ b/packages/core/docs/content/locales/es-ES/getting-started.mdx @@ -17,8 +17,8 @@ En esta guía, crearás un agente con una interfaz de chat y llamarás a su acci ## Requisitos previos -- [Node.js](https://nodejs.org) 22 o posterior -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 o posterior +- [pnpm](https://pnpm.io) instalado y disponible en tu `PATH` - Una conexión de LLM para el agente: Builder.io, una clave de API de Anthropic u OpenAI, o un modelo local de Ollama @@ -27,7 +27,7 @@ En esta guía, crearás un agente con una interfaz de chat y llamarás a su acci En un directorio nuevo, empieza con la plantilla de Chat: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -45,8 +45,8 @@ Inicia el servidor de desarrollo: pnpm dev ``` -La interfaz del navegador se abre en `http://localhost:8080`. Si no se abre -automáticamente, visita esa URL en tu navegador. +La interfaz del navegador se abre automáticamente. Si no lo hace, usa la URL +local que imprime `pnpm dev`; el puerto aumenta si otra aplicación usa 8080. @@ -80,7 +80,7 @@ Hello, Alex! ## Inspeccionar la acción -Abre `actions/hello.ts`: +En tu directorio local `my-app`, abre `actions/hello.ts` en tu editor de código: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -112,7 +112,8 @@ Consulta [Definir acciones](/docs/actions-defining) para ver la API completa. ## Llamar a la acción desde React -Añade una ruta en `app/routes/hello.tsx`: +La plantilla incluye `actions/hello.ts`, pero no una página para ella. Crea +`app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -145,7 +146,7 @@ export default function HelloRoute() { Reinicia el servidor de desarrollo para que detecte la nueva ruta y abre -`http://localhost:8080/hello`. +`http://localhost:/hello`. @@ -209,4 +210,9 @@ el acceso y la sincronización en tiempo real. Define acciones de lectura, escritura y aprobación, y después llámalas desde la interfaz de usuario, los agentes y clientes externos. +### [Implementar una aplicación](/docs/deploy-an-app) + +Pasa del desarrollo local a una base de datos persistente, autenticación de +producción y un destino de implementación compatible. + diff --git a/packages/core/docs/content/locales/es-ES/netlify.mdx b/packages/core/docs/content/locales/es-ES/netlify.mdx index b1e0c95f44d..0fc4416a118 100644 --- a/packages/core/docs/content/locales/es-ES/netlify.mdx +++ b/packages/core/docs/content/locales/es-ES/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +Los proyectos nuevos pueden llamar `agentNativePlugins` a la función importada +y expandir su resultado para mantener alineados los tipos de paquete de Vite. +Es el mismo plugin `agentNative` y acepta las mismas opciones. + …o establece `NITRO_PRESET=netlify` en el momento de la compilación. +Para una aplicación independiente, compila la salida de Netlify e implementa los activos y las funciones: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + Para un espacio de trabajo, implementa todas las aplicaciones desde un único sitio de Netlify ejecutando: ```bash diff --git a/packages/core/docs/content/locales/es-ES/template-calendar-developers.mdx b/packages/core/docs/content/locales/es-ES/template-calendar-developers.mdx index ae19f5d7ee1..015b9a79e7b 100644 --- a/packages/core/docs/content/locales/es-ES/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/es-ES/template-calendar-developers.mdx @@ -27,7 +27,7 @@ cd my-calendar pnpm install ``` -Esto necesita [Node.js](https://nodejs.org) 22 o posterior y +Esto necesita [Node.js](https://nodejs.org) 22.22 o posterior y [pnpm](https://pnpm.io) instalados primero. Consulta [Primeros pasos](/docs/getting-started) si todavía no tienes ninguno de los dos instalado, o si no tienes configurada una conexión LLM (Builder.io, una diff --git a/packages/core/docs/content/locales/es-ES/vercel.mdx b/packages/core/docs/content/locales/es-ES/vercel.mdx index 7e2343d7584..e10634cb87d 100644 --- a/packages/core/docs/content/locales/es-ES/vercel.mdx +++ b/packages/core/docs/content/locales/es-ES/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Implementa mediante la CLI de Vercel o con `git push`: ```bash -vercel deploy +npx vercel deploy ``` +Para crear una vista previa desechable sin iniciar sesión en Vercel, ejecuta +`npx vercel deploy --temporary`. Los despliegues temporales no conservan las +variables de entorno del proyecto, así que pasa la base de datos y los secretos +con `--env` y `--build-env` cuando necesites algo más que una vista previa de la interfaz. + Para un espacio de trabajo, compila todas las aplicaciones en un único paquete de la Vercel Build Output API: ```bash diff --git a/packages/core/docs/content/locales/fr-FR/deploy-an-app.mdx b/packages/core/docs/content/locales/fr-FR/deploy-an-app.mdx index ebc8e1291a3..d61a302a333 100644 --- a/packages/core/docs/content/locales/fr-FR/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/fr-FR/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Construisez et déployez une application Agent-Native sur une cibl Consultez le [guide complet en anglais pour déployer une application](/docs/deploy-an-app) pour les étapes et les commandes de chaque fournisseur. -Avant le déploiement, configurez une base PostgreSQL persistante et un `BETTER_AUTH_SECRET` stable. Choisissez [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) ou [Render](/docs/render). +Commencez par le [guide de démarrage](/docs/getting-started). Avant le déploiement, définissez `DATABASE_URL` dans les paramètres d’environnement de l’hébergeur, pas seulement dans le `.env` local. Générez un `BETTER_AUTH_SECRET` stable avec `openssl rand -hex 32` et enregistrez-le au même endroit. **Continue as local dev** est réservé au développement local ; l’application déployée utilise l’inscription et la connexion. Choisissez [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) ou [Render](/docs/render). Pour plusieurs applications sous une même origine, utilisez [Déployer un workspace](/docs/workspace-deployment). diff --git a/packages/core/docs/content/locales/fr-FR/deployment.mdx b/packages/core/docs/content/locales/fr-FR/deployment.mdx index 0f739eb9c04..931f47f8cd0 100644 --- a/packages/core/docs/content/locales/fr-FR/deployment.mdx +++ b/packages/core/docs/content/locales/fr-FR/deployment.mdx @@ -30,6 +30,8 @@ Chaque application déployée a besoin d'une base PostgreSQL persistante. Défin Une application autonome a besoin d'un `BETTER_AUTH_SECRET` stable. Un workspace avec des requêtes signées entre applications a besoin de `A2A_SECRET`. +Définissez ces valeurs dans les paramètres d’environnement de l’hébergeur, pas seulement dans le `.env` local. Générez le secret d’authentification avec `openssl rand -hex 32`. Agent-Native ne fournit pas de compte de livraison d’e-mails ; connectez Resend ou SendGrid séparément. + ## L'envoi d'e-mails est facultatif, mais recommandé {#email-provider} Un fournisseur d'e-mails n'est pas nécessaire pour l'authentification par e-mail et mot de passe. Sans fournisseur, les applications déployées utilisent l'inscription et la connexion par e-mail et mot de passe, ignorent la vérification de l'e-mail à l'inscription et ne proposent pas l'authentification par lien magique. diff --git a/packages/core/docs/content/locales/fr-FR/docker.mdx b/packages/core/docs/content/locales/fr-FR/docker.mdx index 37306fef1eb..32777ec9830 100644 --- a/packages/core/docs/content/locales/fr-FR/docker.mdx +++ b/packages/core/docs/content/locales/fr-FR/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +Consultez le [guide Docker en anglais](/docs/docker) et créez le `Dockerfile` +qui y est présenté avant d’exécuter `docker build`. The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/fr-FR/getting-started.mdx b/packages/core/docs/content/locales/fr-FR/getting-started.mdx index 104d1dc8b64..6cd31dca7d4 100644 --- a/packages/core/docs/content/locales/fr-FR/getting-started.mdx +++ b/packages/core/docs/content/locales/fr-FR/getting-started.mdx @@ -17,8 +17,8 @@ son action `hello` incluse depuis l’agent et l’interface utilisateur. ## Prérequis -- [Node.js](https://nodejs.org) 22 ou version ultérieure -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 ou version ultérieure +- [pnpm](https://pnpm.io) installé et disponible dans votre `PATH` - Une connexion LLM pour l’agent : Builder.io, une clé API Anthropic ou OpenAI, ou un modèle Ollama local @@ -27,7 +27,7 @@ son action `hello` incluse depuis l’agent et l’interface utilisateur. Dans un nouveau répertoire, partez du modèle Chat : ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -45,8 +45,8 @@ Démarrez le serveur de développement : pnpm dev ``` -L’interface de navigateur s’ouvre sur `http://localhost:8080`. Si elle ne s’ouvre pas -automatiquement, accédez à cette URL dans votre navigateur. +L’interface s’ouvre automatiquement. Sinon, utilisez l’URL locale affichée par +`pnpm dev` ; le port augmente si une autre application utilise déjà 8080. @@ -79,7 +79,7 @@ Hello, Alex! ## Examiner l’action -Ouvrez `actions/hello.ts` : +Dans votre dossier local `my-app`, ouvrez `actions/hello.ts` dans votre éditeur de code : ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -111,7 +111,8 @@ complète. ## Appeler l’action depuis React -Ajoutez une route dans `app/routes/hello.tsx` : +Le modèle inclut `actions/hello.ts`, mais pas de page correspondante. Créez +`app/routes/hello.tsx` : ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -144,7 +145,7 @@ export default function HelloRoute() { Redémarrez le serveur de développement afin qu’il détecte la nouvelle route, -puis ouvrez `http://localhost:8080/hello`. +puis ouvrez `http://localhost:/hello`. @@ -209,4 +210,9 @@ Définissez des actions pour les lectures, les écritures et les approbations, puis appelez-les depuis l’interface utilisateur, les agents et les clients externes. +### [Déployer une application](/docs/deploy-an-app) + +Passez du développement local à une base persistante, une authentification de +production et une cible de déploiement prise en charge. + diff --git a/packages/core/docs/content/locales/fr-FR/netlify.mdx b/packages/core/docs/content/locales/fr-FR/netlify.mdx index 7cec4755f22..4793c4c423d 100644 --- a/packages/core/docs/content/locales/fr-FR/netlify.mdx +++ b/packages/core/docs/content/locales/fr-FR/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +Les nouveaux projets peuvent nommer la fonction importée `agentNativePlugins` +et étaler son résultat pour aligner les types de paquets Vite. Il s’agit du même +plugin `agentNative`, avec les mêmes options. + …soit définissez `NITRO_PRESET=netlify` au moment du build. +Pour une application autonome, construisez la sortie Netlify puis déployez les assets et les fonctions : + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + Pour un workspace, déployez chaque application depuis un seul site Netlify en exécutant : ```bash diff --git a/packages/core/docs/content/locales/fr-FR/template-calendar-developers.mdx b/packages/core/docs/content/locales/fr-FR/template-calendar-developers.mdx index 42ceaade798..3f9c442a708 100644 --- a/packages/core/docs/content/locales/fr-FR/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/fr-FR/template-calendar-developers.mdx @@ -23,7 +23,7 @@ cd my-calendar pnpm install ``` -Cela nécessite [Node.js](https://nodejs.org) 22 ou une version plus récente, et +Cela nécessite [Node.js](https://nodejs.org) 22.22 ou une version plus récente, et [pnpm](https://pnpm.io) installé au préalable. Consultez [Bien démarrer](/docs/getting-started) si vous n'avez installé ni l'un ni l'autre encore, ou si vous n'avez pas de connexion LLM (Builder.io, une clé Anthropic/OpenAI, diff --git a/packages/core/docs/content/locales/fr-FR/vercel.mdx b/packages/core/docs/content/locales/fr-FR/vercel.mdx index d1dd7546e7f..df60d9eeb04 100644 --- a/packages/core/docs/content/locales/fr-FR/vercel.mdx +++ b/packages/core/docs/content/locales/fr-FR/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Déployez via la CLI Vercel ou un git push : ```bash -vercel deploy +npx vercel deploy ``` +Pour créer un aperçu temporaire sans vous connecter à Vercel, exécutez +`npx vercel deploy --temporary`. Les déploiements temporaires ne conservent pas +les variables d’environnement du projet. Transmettez donc la base de données et +les secrets avec `--env` et `--build-env` si vous avez besoin de plus qu’un aperçu de l’interface. + Pour un workspace, construisez chaque application dans un seul bundle Vercel Build Output API : ```bash diff --git a/packages/core/docs/content/locales/hi-IN/deploy-an-app.mdx b/packages/core/docs/content/locales/hi-IN/deploy-an-app.mdx index 168f88a74c3..db91e4fd5b8 100644 --- a/packages/core/docs/content/locales/hi-IN/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/hi-IN/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Agent-Native app को Nitro target पर build और deploy Steps और provider commands के लिए [पूरा English app deployment guide](/docs/deploy-an-app) देखें। -Deploy करने से पहले persistent PostgreSQL database और stable `BETTER_AUTH_SECRET` सेट करें। [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) या [Render](/docs/render) चुनें। +[Getting Started](/docs/getting-started) से शुरू करें। Deploy करने से पहले hosting provider की environment settings में `DATABASE_URL` सेट करें, केवल local `.env` में नहीं। `openssl rand -hex 32` से stable `BETTER_AUTH_SECRET` बनाकर वहीं सहेजें। **Continue as local dev** केवल local development के लिए है; deployed app signup और login उपयोग करता है। [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) या [Render](/docs/render) चुनें। एक origin के पीछे कई apps के लिए [Workspace Deployment](/docs/workspace-deployment) देखें। diff --git a/packages/core/docs/content/locales/hi-IN/deployment.mdx b/packages/core/docs/content/locales/hi-IN/deployment.mdx index 4cd54cc7f52..3c4e8fe7f9a 100644 --- a/packages/core/docs/content/locales/hi-IN/deployment.mdx +++ b/packages/core/docs/content/locales/hi-IN/deployment.mdx @@ -30,6 +30,8 @@ Shared login के साथ कई apps को एक origin के पीछ Standalone app को stable `BETTER_AUTH_SECRET` चाहिए। Signed cross-app requests वाले workspace को `A2A_SECRET` चाहिए। +इन values को केवल local `.env` में नहीं, hosting provider की environment settings में सेट करें। Auth secret `openssl rand -hex 32` से बनाएं। Agent-Native में email delivery account शामिल नहीं है; Resend या SendGrid को अलग से connect करें। + ## ईमेल डिलीवरी वैकल्पिक है, लेकिन इसकी सलाह दी जाती है {#email-provider} ईमेल और पासवर्ड वाले authentication के लिए ईमेल provider आवश्यक नहीं है। इसके बिना deployed apps ईमेल और पासवर्ड से signup और login करती हैं, signup email verification छोड़ देती हैं और magic-link authentication उपलब्ध नहीं कराती हैं। diff --git a/packages/core/docs/content/locales/hi-IN/docker.mdx b/packages/core/docs/content/locales/hi-IN/docker.mdx index 37306fef1eb..b97794f4bb8 100644 --- a/packages/core/docs/content/locales/hi-IN/docker.mdx +++ b/packages/core/docs/content/locales/hi-IN/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +[English Docker guide](/docs/docker) देखें और `docker build` चलाने से पहले उसमें +दिखाया गया `Dockerfile` बनाएं। The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/hi-IN/getting-started.mdx b/packages/core/docs/content/locales/hi-IN/getting-started.mdx index e7ebde2d65f..632e2ae8a30 100644 --- a/packages/core/docs/content/locales/hi-IN/getting-started.mdx +++ b/packages/core/docs/content/locales/hi-IN/getting-started.mdx @@ -17,8 +17,8 @@ code से call करता है। ## आवश्यकताएं -- [Node.js](https://nodejs.org) 22 या बाद का संस्करण -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 या बाद का संस्करण +- [pnpm](https://pnpm.io) इंस्टॉल हो और आपके `PATH` में उपलब्ध हो - Agent के लिए LLM connection: Builder.io, Anthropic या OpenAI API key, या local Ollama model ## Agent बनाएं @@ -26,7 +26,7 @@ code से call करता है। नई directory में Chat template से शुरू करें: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -43,7 +43,7 @@ Development server शुरू करें: pnpm dev ``` -Browser UI `http://localhost:8080` पर खुलेगा। अगर वह अपने आप न खुले, तो browser में उस URL पर जाएं। +Browser UI अपने आप खुलेगा। अगर ऐसा न हो, तो `pnpm dev` द्वारा दिखाई गई local URL खोलें; अगर 8080 उपयोग में है तो port बढ़ जाता है। @@ -74,7 +74,7 @@ Hello, Alex! ## Action देखें -`actions/hello.ts` खोलें: +अपनी स्थानीय `my-app` डायरेक्टरी में, कोड एडिटर से `actions/hello.ts` खोलें: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -103,7 +103,8 @@ export default defineAction({ ## React से action call करें -`app/routes/hello.tsx` पर route जोड़ें: +Template में `actions/hello.ts` शामिल है, लेकिन उसके लिए page नहीं है। +`app/routes/hello.tsx` बनाएं: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -136,7 +137,7 @@ export default function HelloRoute() { नया route खोजने के लिए development server restart करें, फिर -`http://localhost:8080/hello` खोलें। +`http://localhost:/hello` खोलें। @@ -192,4 +193,8 @@ action इसी pattern का पालन करता है। Reads, writes और approvals के लिए actions define करें, फिर उन्हें UI, agents और external clients से call करें। +### [ऐप deploy करें](/docs/deploy-an-app) + +Local development से persistent database, production auth और supported deployment target पर जाएं। + diff --git a/packages/core/docs/content/locales/hi-IN/netlify.mdx b/packages/core/docs/content/locales/hi-IN/netlify.mdx index c812702ec36..931ce263d33 100644 --- a/packages/core/docs/content/locales/hi-IN/netlify.mdx +++ b/packages/core/docs/content/locales/hi-IN/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +नए scaffolds imported function को `agentNativePlugins` नाम दे सकते हैं और Vite +package types को aligned रखने के लिए उसके result को spread कर सकते हैं। यह वही +`agentNative` plugin है और वही options स्वीकार करता है। + …या build time पर `NITRO_PRESET=netlify` सेट करें। +Standalone app के लिए Netlify output build करके static assets और functions deploy करें: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + एक कार्यस्थान के लिए, यह चलाकर एक ही Netlify site से हर ऐप तैनात करें: ```bash diff --git a/packages/core/docs/content/locales/hi-IN/template-calendar-developers.mdx b/packages/core/docs/content/locales/hi-IN/template-calendar-developers.mdx index fd0b118c7ea..0c762f84d05 100644 --- a/packages/core/docs/content/locales/hi-IN/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/hi-IN/template-calendar-developers.mdx @@ -27,7 +27,7 @@ cd my-calendar pnpm install ``` -इसके लिए पहले [Node.js](https://nodejs.org) 22 या उसके बाद का वर्शन और +इसके लिए पहले [Node.js](https://nodejs.org) 22.22 या उसके बाद का वर्शन और [pnpm](https://pnpm.io) इंस्टॉल होना चाहिए। अगर आपने अभी तक इनमें से कोई इंस्टॉल नहीं किया है, या आपके पास कोई LLM कनेक्शन (Builder.io, कोई Anthropic/OpenAI key, या लोकल Ollama) सेट अप नहीं है, तो [शुरुआत diff --git a/packages/core/docs/content/locales/hi-IN/vercel.mdx b/packages/core/docs/content/locales/hi-IN/vercel.mdx index 710413d338a..d3115477708 100644 --- a/packages/core/docs/content/locales/hi-IN/vercel.mdx +++ b/packages/core/docs/content/locales/hi-IN/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Vercel CLI या git push के ज़रिए तैनात करें: ```bash -vercel deploy +npx vercel deploy ``` +Vercel में साइन इन किए बिना अस्थायी प्रीव्यू के लिए +`npx vercel deploy --temporary` चलाएँ। अस्थायी डिप्लॉयमेंट प्रोजेक्ट के +environment variables नहीं रखते, इसलिए UI प्रीव्यू से अधिक चाहिए तो database +और secret values को `--env` और `--build-env` से दें। + एक कार्यस्थान के लिए, हर ऐप को एक Vercel Build Output API bundle में build करें: ```bash diff --git a/packages/core/docs/content/locales/ja-JP/deploy-an-app.mdx b/packages/core/docs/content/locales/ja-JP/deploy-an-app.mdx index 5157c78146a..c5b8b4d9d35 100644 --- a/packages/core/docs/content/locales/ja-JP/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/ja-JP/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Agent-Native アプリを Nitro ターゲットへビルドして 手順とプロバイダーごとのコマンドは、[英語の完全なアプリデプロイガイド](/docs/deploy-an-app)を参照してください。 -デプロイ前に永続 PostgreSQL データベースと安定した `BETTER_AUTH_SECRET` を設定します。[Node.js](/docs/node-js)、[Docker](/docs/docker)、[Vercel](/docs/vercel)、[Netlify](/docs/netlify)、[Cloudflare Pages](/docs/cloudflare#cloudflare-pages)、[Cloudflare Workers](/docs/cloudflare#cloudflare-workers)、[AWS Amplify](/docs/aws-amplify)、[AWS Lambda](/docs/aws-lambda)、[Deno Deploy](/docs/deno-deploy)、[Azure Static Web Apps](/docs/azure-static-web-apps)、[Koyeb](/docs/koyeb)、[Render](/docs/render) からターゲットを選択できます。 +[はじめに](/docs/getting-started)から始めます。デプロイ前に`DATABASE_URL`をローカル`.env`だけでなく、ホスティングプロバイダーの環境設定に保存してください。`openssl rand -hex 32`で安定した`BETTER_AUTH_SECRET`を生成し、同じ場所に保存します。**Continue as local dev**はローカル専用です。デプロイ済みアプリではサインアップとサインインを使います。[Node.js](/docs/node-js)、[Docker](/docs/docker)、[Vercel](/docs/vercel)、[Netlify](/docs/netlify)、[Cloudflare Pages](/docs/cloudflare#cloudflare-pages)、[Cloudflare Workers](/docs/cloudflare#cloudflare-workers)、[AWS Amplify](/docs/aws-amplify)、[AWS Lambda](/docs/aws-lambda)、[Deno Deploy](/docs/deno-deploy)、[Azure Static Web Apps](/docs/azure-static-web-apps)、[Koyeb](/docs/koyeb)、[Render](/docs/render)から選択できます。 複数のアプリを 1 つのオリジンで実行する場合は、[ワークスペースのデプロイ](/docs/workspace-deployment)を使用してください。 diff --git a/packages/core/docs/content/locales/ja-JP/deployment.mdx b/packages/core/docs/content/locales/ja-JP/deployment.mdx index c7804a198d5..0cdf6d56ba4 100644 --- a/packages/core/docs/content/locales/ja-JP/deployment.mdx +++ b/packages/core/docs/content/locales/ja-JP/deployment.mdx @@ -30,6 +30,8 @@ Agent-Native アプリは Nitro で動作します。デプロイするものに スタンドアロンアプリには安定した `BETTER_AUTH_SECRET` が必要です。署名付きのアプリ間リクエストを使うワークスペースには `A2A_SECRET` が必要です。 +これらの値はローカル`.env`だけでなく、ホスティングプロバイダーの環境設定に保存してください。認証シークレットは`openssl rand -hex 32`で生成します。Agent-Nativeにメール配信アカウントは含まれないため、ResendまたはSendGridを別途接続します。 + ## メール配信は任意ですが、推奨されます {#email-provider} メールプロバイダーはメール/パスワード認証に必須ではありません。プロバイダーがない場合、デプロイしたアプリはメール/パスワードでサインアップとサインインを行い、サインアップ時のメール確認をスキップし、マジックリンク認証を提供しません。 diff --git a/packages/core/docs/content/locales/ja-JP/docker.mdx b/packages/core/docs/content/locales/ja-JP/docker.mdx index 37306fef1eb..870a83e5176 100644 --- a/packages/core/docs/content/locales/ja-JP/docker.mdx +++ b/packages/core/docs/content/locales/ja-JP/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +[英語のDockerガイド](/docs/docker)を参照し、`docker build`を実行する前に +記載されている`Dockerfile`を作成してください。 The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/ja-JP/getting-started.mdx b/packages/core/docs/content/locales/ja-JP/getting-started.mdx index b3e8e37f95f..f037b48b349 100644 --- a/packages/core/docs/content/locales/ja-JP/getting-started.mdx +++ b/packages/core/docs/content/locales/ja-JP/getting-started.mdx @@ -16,8 +16,8 @@ Agent-Nativeは、直感的なUIを備えた自律型エージェントを構築 ## 前提条件 -- [Node.js](https://nodejs.org) 22以降 -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22以降 +- [pnpm](https://pnpm.io)がインストールされ、`PATH`から実行できること - エージェント用のLLM接続: Builder.io、AnthropicまたはOpenAIのAPIキー、またはローカルのOllamaモデル ## エージェントを作成する @@ -25,7 +25,7 @@ Agent-Nativeは、直感的なUIを備えた自律型エージェントを構築 新しいディレクトリでChatテンプレートから始めます。 ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -42,7 +42,7 @@ pnpm install pnpm dev ``` -ブラウザUIは`http://localhost:8080`で開きます。自動で開かない場合は、ブラウザでそのURLにアクセスしてください。 +ブラウザUIは自動で開きます。開かない場合は`pnpm dev`が表示するローカルURLを使ってください。8080が使用中ならポート番号が増えます。 @@ -68,7 +68,7 @@ Hello, Alex! ## アクションを確認する -`actions/hello.ts`を開きます。 +ローカルの `my-app` ディレクトリで、コードエディターから `actions/hello.ts` を開きます。 ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -97,7 +97,8 @@ export default defineAction({ ## Reactからアクションを呼び出す -`app/routes/hello.tsx`にルートを追加します。 +テンプレートには`actions/hello.ts`が含まれますが、そのページはありません。 +`app/routes/hello.tsx`を作成します。 ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -129,7 +130,7 @@ export default function HelloRoute() { -新しいルートを検出できるように開発サーバーを再起動してから、`http://localhost:8080/hello`を開いてください。 +新しいルートを検出できるように開発サーバーを再起動してから、`http://localhost:/hello`を開いてください。 @@ -178,4 +179,8 @@ UIとエージェントがアクション、データ、コンテキストを共 読み取り、書き込み、承認のアクションを定義し、UI、エージェント、外部クライアントから呼び出します。 +### [アプリをデプロイ](/docs/deploy-an-app) + +ローカル開発から、永続データベース、本番認証、対応するデプロイ先へ進みます。 + diff --git a/packages/core/docs/content/locales/ja-JP/netlify.mdx b/packages/core/docs/content/locales/ja-JP/netlify.mdx index d1dec4343b7..65a240020fd 100644 --- a/packages/core/docs/content/locales/ja-JP/netlify.mdx +++ b/packages/core/docs/content/locales/ja-JP/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +新しいスキャフォールドでは、Vite パッケージの型を揃えるため、インポートした関数を +`agentNativePlugins` と名付け、その結果を展開する場合があります。同じ +`agentNative` プラグインで、受け取るオプションも同じです。 + …もしくはビルド時に `NITRO_PRESET=netlify` を設定します。 +スタンドアロンアプリでは、Netlify出力をビルドして静的アセットとfunctionsをデプロイします。 + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + ワークスペースの場合、次を実行して 1 つの Netlify サイトからすべてのアプリをデプロイします。 ```bash diff --git a/packages/core/docs/content/locales/ja-JP/template-calendar-developers.mdx b/packages/core/docs/content/locales/ja-JP/template-calendar-developers.mdx index 411d439077d..ca2245e68a2 100644 --- a/packages/core/docs/content/locales/ja-JP/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/ja-JP/template-calendar-developers.mdx @@ -27,7 +27,7 @@ cd my-calendar pnpm install ``` -これには [Node.js](https://nodejs.org) 22 以降と [pnpm](https://pnpm.io) が +これには [Node.js](https://nodejs.org) 22.22 以降と [pnpm](https://pnpm.io) が 事前にインストールされている必要があります。どちらもまだインストールしていない 場合や、LLM 接続 (Builder.io、Anthropic/OpenAI のキー、またはローカルの Ollama) を設定していない場合は、[はじめに](/docs/getting-started) を参照してください。 diff --git a/packages/core/docs/content/locales/ja-JP/vercel.mdx b/packages/core/docs/content/locales/ja-JP/vercel.mdx index dcc243efc0c..988941fa016 100644 --- a/packages/core/docs/content/locales/ja-JP/vercel.mdx +++ b/packages/core/docs/content/locales/ja-JP/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Vercel CLI または git push でデプロイします。 ```bash -vercel deploy +npx vercel deploy ``` +Vercel にサインインせず一時プレビューを作るには、 +`npx vercel deploy --temporary` を実行します。一時デプロイにはプロジェクトの +環境変数が引き継がれないため、UI プレビュー以上の機能が必要な場合は +`--env` と `--build-env` でデータベースとシークレットの値を渡してください。 + ワークスペースの場合、すべてのアプリを 1 つの Vercel Build Output API バンドルにビルドします。 ```bash diff --git a/packages/core/docs/content/locales/ko-KR/deploy-an-app.mdx b/packages/core/docs/content/locales/ko-KR/deploy-an-app.mdx index 6a6dcb273c7..2c882b544dd 100644 --- a/packages/core/docs/content/locales/ko-KR/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/ko-KR/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Agent-Native 앱을 Nitro 대상으로 빌드하고 배포합니 단계와 공급자 명령은 [영문 앱 배포 전체 가이드](/docs/deploy-an-app)를 참고하세요. -배포 전에 영구 PostgreSQL 데이터베이스와 안정적인 `BETTER_AUTH_SECRET`을 설정하세요. [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb), [Render](/docs/render) 중에서 대상을 선택할 수 있습니다. +[시작하기](/docs/getting-started)에서 시작하세요. 배포 전에 로컬 `.env`뿐 아니라 호스팅 제공업체의 환경 설정에 `DATABASE_URL`을 저장하세요. `openssl rand -hex 32`로 안정적인 `BETTER_AUTH_SECRET`을 생성해 같은 곳에 저장합니다. **Continue as local dev**는 로컬 전용이며, 배포된 앱은 가입과 로그인을 사용합니다. [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb), [Render](/docs/render) 중에서 선택할 수 있습니다. 여러 앱을 하나의 오리진에서 실행하려면 [워크스페이스 배포](/docs/workspace-deployment)를 사용하세요. diff --git a/packages/core/docs/content/locales/ko-KR/deployment.mdx b/packages/core/docs/content/locales/ko-KR/deployment.mdx index 6f0bc45cf75..2fe7bddfb1f 100644 --- a/packages/core/docs/content/locales/ko-KR/deployment.mdx +++ b/packages/core/docs/content/locales/ko-KR/deployment.mdx @@ -30,6 +30,8 @@ Agent-Native 앱은 Nitro에서 실행됩니다. 배포 대상에 맞는 경로 독립 앱에는 안정적인 `BETTER_AUTH_SECRET`이 필요합니다. 서명된 앱 간 요청을 사용하는 워크스페이스에는 `A2A_SECRET`이 필요합니다. +이 값은 로컬 `.env`뿐 아니라 호스팅 제공업체의 환경 설정에 저장하세요. 인증 시크릿은 `openssl rand -hex 32`로 생성합니다. Agent-Native에는 이메일 전송 계정이 포함되지 않으므로 Resend 또는 SendGrid를 별도로 연결하세요. + ## 이메일 전송은 선택 사항이지만 권장됩니다 {#email-provider} 이메일 제공업체는 이메일/비밀번호 인증에 필수가 아닙니다. 제공업체가 없으면 배포된 앱은 이메일/비밀번호로 가입 및 로그인을 사용하고, 가입 이메일 인증을 건너뛰며, 매직 링크 인증을 제공하지 않습니다. diff --git a/packages/core/docs/content/locales/ko-KR/docker.mdx b/packages/core/docs/content/locales/ko-KR/docker.mdx index 37306fef1eb..50916373683 100644 --- a/packages/core/docs/content/locales/ko-KR/docker.mdx +++ b/packages/core/docs/content/locales/ko-KR/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +[영문 Docker 가이드](/docs/docker)를 참고해 `docker build`를 실행하기 전에 +안내된 `Dockerfile`을 만드세요. The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/ko-KR/getting-started.mdx b/packages/core/docs/content/locales/ko-KR/getting-started.mdx index 238dd5f0f8d..969a806d02c 100644 --- a/packages/core/docs/content/locales/ko-KR/getting-started.mdx +++ b/packages/core/docs/content/locales/ko-KR/getting-started.mdx @@ -14,8 +14,8 @@ TypeScript 프레임워크입니다. 각 기능을 [액션](/docs/actions-overvi ## 사전 요구 사항 -- [Node.js](https://nodejs.org) 22 이상 -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 이상 +- [pnpm](https://pnpm.io)이 설치되어 있고 `PATH`에서 실행 가능해야 합니다 - 에이전트용 LLM 연결: Builder.io, Anthropic 또는 OpenAI API 키, 또는 로컬 Ollama 모델 ## 에이전트 만들기 @@ -23,7 +23,7 @@ TypeScript 프레임워크입니다. 각 기능을 [액션](/docs/actions-overvi 새 디렉터리에서 Chat 템플릿으로 시작하세요. ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -40,7 +40,7 @@ pnpm install pnpm dev ``` -브라우저 UI는 `http://localhost:8080`에서 열립니다. 자동으로 열리지 않으면 브라우저에서 해당 URL로 이동하세요. +브라우저 UI가 자동으로 열립니다. 열리지 않으면 `pnpm dev`가 출력한 로컬 URL을 사용하세요. 8080이 사용 중이면 포트 번호가 증가합니다. @@ -66,7 +66,7 @@ Hello, Alex! ## 액션 살펴보기 -`actions/hello.ts`를 여세요. +로컬 `my-app` 디렉터리에서 코드 편집기로 `actions/hello.ts`를 여세요. ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -95,7 +95,8 @@ export default defineAction({ ## React에서 액션 호출하기 -`app/routes/hello.tsx`에 라우트를 추가하세요. +템플릿에는 `actions/hello.ts`가 포함되어 있지만 해당 페이지는 없습니다. +`app/routes/hello.tsx`를 만드세요. ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -127,7 +128,7 @@ export default function HelloRoute() { -새 라우트를 찾을 수 있도록 개발 서버를 다시 시작한 다음 `http://localhost:8080/hello`를 여세요. +새 라우트를 찾을 수 있도록 개발 서버를 다시 시작한 다음 `http://localhost:/hello`를 여세요. @@ -176,4 +177,8 @@ UI와 에이전트가 액션, 데이터, 컨텍스트를 공유하는 이유를 읽기, 쓰기, 승인을 위한 액션을 정의하고 UI, 에이전트, 외부 클라이언트에서 호출합니다. +### [앱 배포](/docs/deploy-an-app) + +로컬 개발에서 영구 데이터베이스, 프로덕션 인증, 지원되는 배포 대상으로 이동합니다. + diff --git a/packages/core/docs/content/locales/ko-KR/netlify.mdx b/packages/core/docs/content/locales/ko-KR/netlify.mdx index 2e2926557a4..5ecd632ea33 100644 --- a/packages/core/docs/content/locales/ko-KR/netlify.mdx +++ b/packages/core/docs/content/locales/ko-KR/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +새 스캐폴드에서는 Vite 패키지 타입을 맞추기 위해 가져온 함수의 이름을 +`agentNativePlugins`로 지정하고 결과를 펼칠 수 있습니다. 동일한 `agentNative` +플러그인이며 같은 옵션을 받습니다. + …또는 빌드 시점에 `NITRO_PRESET=netlify`를 설정하세요. +독립 앱은 Netlify 출력을 빌드한 뒤 정적 자산과 함수를 배포합니다: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + 작업 공간의 경우, 다음을 실행해 하나의 Netlify 사이트에서 모든 앱을 배포하세요: ```bash diff --git a/packages/core/docs/content/locales/ko-KR/template-calendar-developers.mdx b/packages/core/docs/content/locales/ko-KR/template-calendar-developers.mdx index 2fe5e597498..26826fd5e06 100644 --- a/packages/core/docs/content/locales/ko-KR/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/ko-KR/template-calendar-developers.mdx @@ -25,7 +25,7 @@ cd my-calendar pnpm install ``` -이를 위해서는 먼저 [Node.js](https://nodejs.org) 22 이상과 [pnpm](https://pnpm.io)이 +이를 위해서는 먼저 [Node.js](https://nodejs.org) 22.22 이상과 [pnpm](https://pnpm.io)이 설치되어 있어야 합니다. 아직 설치하지 않았거나 LLM 연결(Builder.io, Anthropic/OpenAI 키, 또는 로컬 Ollama)을 설정하지 않았다면 [시작하기](/docs/getting-started) 문서를 참고하세요. diff --git a/packages/core/docs/content/locales/ko-KR/vercel.mdx b/packages/core/docs/content/locales/ko-KR/vercel.mdx index d611cb06223..dc08afa4219 100644 --- a/packages/core/docs/content/locales/ko-KR/vercel.mdx +++ b/packages/core/docs/content/locales/ko-KR/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Vercel CLI나 git push로 배포하세요: ```bash -vercel deploy +npx vercel deploy ``` +Vercel에 로그인하지 않고 임시 미리보기를 만들려면 +`npx vercel deploy --temporary`를 실행하세요. 임시 배포에는 프로젝트 환경 변수가 +유지되지 않으므로 UI 미리보기 이상의 기능이 필요하면 `--env`와 `--build-env`로 +데이터베이스 및 비밀 값을 전달하세요. + 작업 공간의 경우, 모든 앱을 하나의 Vercel Build Output API 번들로 빌드하세요: ```bash diff --git a/packages/core/docs/content/locales/pt-BR/deploy-an-app.mdx b/packages/core/docs/content/locales/pt-BR/deploy-an-app.mdx index be9e8785f3b..e83d8663112 100644 --- a/packages/core/docs/content/locales/pt-BR/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/pt-BR/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "Construa e publique um app Agent-Native em um destino Nitro." Consulte o [guia completo em inglês para fazer deploy de um app](/docs/deploy-an-app) para ver as etapas e os comandos de cada provedor. -Antes do deploy, configure um banco PostgreSQL persistente e um `BETTER_AUTH_SECRET` estável. Escolha [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) ou [Render](/docs/render). +Comece pelo [guia de início](/docs/getting-started). Antes do deploy, defina `DATABASE_URL` nas configurações de ambiente do provedor de hospedagem, não apenas no `.env` local. Gere um `BETTER_AUTH_SECRET` estável com `openssl rand -hex 32` e salve-o no mesmo lugar. **Continue as local dev** funciona apenas localmente; o app publicado usa cadastro e login. Escolha [Node.js](/docs/node-js), [Docker](/docs/docker), [Vercel](/docs/vercel), [Netlify](/docs/netlify), [Cloudflare Pages](/docs/cloudflare#cloudflare-pages), [Cloudflare Workers](/docs/cloudflare#cloudflare-workers), [AWS Amplify](/docs/aws-amplify), [AWS Lambda](/docs/aws-lambda), [Deno Deploy](/docs/deno-deploy), [Azure Static Web Apps](/docs/azure-static-web-apps), [Koyeb](/docs/koyeb) ou [Render](/docs/render). Para vários apps em uma origem, use [Deploy de workspace](/docs/workspace-deployment). diff --git a/packages/core/docs/content/locales/pt-BR/deployment.mdx b/packages/core/docs/content/locales/pt-BR/deployment.mdx index 833d5c9bb1c..953f8f4a6a1 100644 --- a/packages/core/docs/content/locales/pt-BR/deployment.mdx +++ b/packages/core/docs/content/locales/pt-BR/deployment.mdx @@ -30,6 +30,8 @@ Todo app publicado precisa de um banco PostgreSQL persistente. Defina `DATABASE_ Apps independentes precisam de um `BETTER_AUTH_SECRET` estável. Workspaces com requisições assinadas entre apps precisam de `A2A_SECRET`. +Defina esses valores nas configurações de ambiente do provedor de hospedagem, não apenas no `.env` local. Gere o segredo de autenticação com `openssl rand -hex 32`. O Agent-Native não inclui uma conta de entrega de e-mail; conecte Resend ou SendGrid separadamente. + ## O envio de e-mail é opcional, mas recomendado {#email-provider} Um provedor de e-mail não é necessário para a autenticação com e-mail e senha. Sem ele, os apps publicados usam cadastro e login com e-mail e senha, ignoram a verificação de e-mail no cadastro e não oferecem autenticação por link mágico. diff --git a/packages/core/docs/content/locales/pt-BR/docker.mdx b/packages/core/docs/content/locales/pt-BR/docker.mdx index 37306fef1eb..d66f7cb2494 100644 --- a/packages/core/docs/content/locales/pt-BR/docker.mdx +++ b/packages/core/docs/content/locales/pt-BR/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +Consulte o [guia de Docker em inglês](/docs/docker) e crie o `Dockerfile` +mostrado nele antes de executar `docker build`. The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/pt-BR/getting-started.mdx b/packages/core/docs/content/locales/pt-BR/getting-started.mdx index c0d7866ca13..edfa86832a4 100644 --- a/packages/core/docs/content/locales/pt-BR/getting-started.mdx +++ b/packages/core/docs/content/locales/pt-BR/getting-started.mdx @@ -13,8 +13,8 @@ Neste guia, você criará um agente com uma UI de chat e chamará a ação `hell ## Pré-requisitos -- [Node.js](https://nodejs.org) 22 ou posterior -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 ou posterior +- [pnpm](https://pnpm.io) instalado e disponível no seu `PATH` - Uma conexão com LLM para o agente: Builder.io, uma chave de API Anthropic ou OpenAI, ou um modelo Ollama local ## Crie um agente @@ -22,7 +22,7 @@ Neste guia, você criará um agente com uma UI de chat e chamará a ação `hell Em um novo diretório, comece pelo modelo de Chat: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -37,7 +37,7 @@ Inicie o servidor de desenvolvimento: pnpm dev ``` -A UI do navegador abre em `http://localhost:8080`. Se não abrir automaticamente, acesse esse URL no navegador. +A UI abre automaticamente. Se isso não acontecer, use a URL local exibida por `pnpm dev`; a porta aumenta quando outro app já usa 8080. @@ -63,7 +63,7 @@ Hello, Alex! ## Inspecione a ação -Abra `actions/hello.ts`: +No diretório local `my-app`, abra `actions/hello.ts` no editor de código: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -92,7 +92,8 @@ Leia [Definindo ações](/docs/actions-defining) para a API completa. ## Chame a ação pelo React -Adicione uma rota em `app/routes/hello.tsx`: +O modelo inclui `actions/hello.ts`, mas não uma página para ela. Crie +`app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -124,7 +125,7 @@ export default function HelloRoute() { -Reinicie o servidor de desenvolvimento para que ele descubra a nova rota e abra `http://localhost:8080/hello`. +Reinicie o servidor de desenvolvimento para que ele descubra a nova rota e abra `http://localhost:/hello`. @@ -173,4 +174,8 @@ Aprenda como ações, dados SQL, contexto da aplicação, acesso e sincronizaç Defina ações para leituras, gravações e aprovações, depois chame-as pela UI, por agentes e por clientes externos. +### [Fazer deploy de um app](/docs/deploy-an-app) + +Passe do desenvolvimento local para um banco persistente, autenticação de produção e um destino de deploy compatível. + diff --git a/packages/core/docs/content/locales/pt-BR/netlify.mdx b/packages/core/docs/content/locales/pt-BR/netlify.mdx index 5ee8972c13e..68c07b34185 100644 --- a/packages/core/docs/content/locales/pt-BR/netlify.mdx +++ b/packages/core/docs/content/locales/pt-BR/netlify.mdx @@ -13,8 +13,19 @@ export default defineConfig({ }); ``` +Projetos novos podem nomear a função importada como `agentNativePlugins` e +espalhar o resultado para manter alinhados os tipos de pacote do Vite. É o mesmo +plugin `agentNative` e aceita as mesmas opções. + …ou defina `NITRO_PRESET=netlify` no momento do build. +Para um app independente, gere a saída do Netlify e publique os assets e as funções: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + Para um espaço de trabalho, implante todos os apps a partir de um único site Netlify executando: ```bash diff --git a/packages/core/docs/content/locales/pt-BR/template-calendar-developers.mdx b/packages/core/docs/content/locales/pt-BR/template-calendar-developers.mdx index dfa728dbd77..b7792580ef6 100644 --- a/packages/core/docs/content/locales/pt-BR/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/pt-BR/template-calendar-developers.mdx @@ -24,7 +24,7 @@ cd my-calendar pnpm install ``` -Isso requer [Node.js](https://nodejs.org) 22 ou posterior e +Isso requer [Node.js](https://nodejs.org) 22.22 ou posterior e [pnpm](https://pnpm.io) instalados primeiro. Veja [Primeiros passos](/docs/getting-started) se você ainda não instalou nenhum dos dois, ou não tem uma conexão LLM (Builder.io, uma chave Anthropic/OpenAI, diff --git a/packages/core/docs/content/locales/pt-BR/vercel.mdx b/packages/core/docs/content/locales/pt-BR/vercel.mdx index 0d6958e70b7..909184f8cf0 100644 --- a/packages/core/docs/content/locales/pt-BR/vercel.mdx +++ b/packages/core/docs/content/locales/pt-BR/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Implante via Vercel CLI ou git push: ```bash -vercel deploy +npx vercel deploy ``` +Para criar uma prévia descartável sem entrar no Vercel, execute +`npx vercel deploy --temporary`. Implantações temporárias não preservam as +variáveis de ambiente do projeto. Passe o banco de dados e os segredos com +`--env` e `--build-env` quando precisar de mais que uma prévia da interface. + Para um espaço de trabalho, compile todos os apps em um único pacote da Vercel Build Output API: ```bash diff --git a/packages/core/docs/content/locales/zh-CN/deploy-an-app.mdx b/packages/core/docs/content/locales/zh-CN/deploy-an-app.mdx index 3efee7ea62b..8f90a124b02 100644 --- a/packages/core/docs/content/locales/zh-CN/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/zh-CN/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "将 Agent-Native 应用构建并部署到 Nitro 目标。" 有关步骤和各提供商命令,请参阅[完整的英文应用部署指南](/docs/deploy-an-app)。 -部署前,请配置持久 PostgreSQL 数据库和稳定的 `BETTER_AUTH_SECRET`。可选择 [Node.js](/docs/node-js)、[Docker](/docs/docker)、[Vercel](/docs/vercel)、[Netlify](/docs/netlify)、[Cloudflare Pages](/docs/cloudflare#cloudflare-pages)、[Cloudflare Workers](/docs/cloudflare#cloudflare-workers)、[AWS Amplify](/docs/aws-amplify)、[AWS Lambda](/docs/aws-lambda)、[Deno Deploy](/docs/deno-deploy)、[Azure Static Web Apps](/docs/azure-static-web-apps)、[Koyeb](/docs/koyeb) 或 [Render](/docs/render)。 +从[入门指南](/docs/getting-started)开始。部署前,请在托管提供商的环境设置中保存 `DATABASE_URL`,而不只是本地 `.env`。使用 `openssl rand -hex 32` 生成稳定的 `BETTER_AUTH_SECRET` 并保存在同一位置。**Continue as local dev** 仅限本地使用;部署后的应用使用注册和登录。可选择 [Node.js](/docs/node-js)、[Docker](/docs/docker)、[Vercel](/docs/vercel)、[Netlify](/docs/netlify)、[Cloudflare Pages](/docs/cloudflare#cloudflare-pages)、[Cloudflare Workers](/docs/cloudflare#cloudflare-workers)、[AWS Amplify](/docs/aws-amplify)、[AWS Lambda](/docs/aws-lambda)、[Deno Deploy](/docs/deno-deploy)、[Azure Static Web Apps](/docs/azure-static-web-apps)、[Koyeb](/docs/koyeb) 或 [Render](/docs/render)。 如果要在一个来源下运行多个应用,请使用[工作区部署](/docs/workspace-deployment)。 diff --git a/packages/core/docs/content/locales/zh-CN/deployment.mdx b/packages/core/docs/content/locales/zh-CN/deployment.mdx index c38f503e173..13428b879a6 100644 --- a/packages/core/docs/content/locales/zh-CN/deployment.mdx +++ b/packages/core/docs/content/locales/zh-CN/deployment.mdx @@ -30,6 +30,8 @@ Agent-Native 应用运行在 Nitro 上。请选择适合你要发布内容的路 独立应用需要稳定的 `BETTER_AUTH_SECRET`。使用签名跨应用请求的工作区需要 `A2A_SECRET`。 +请将这些值保存到托管提供商的环境设置中,而不只是本地 `.env`。使用 `openssl rand -hex 32` 生成身份验证密钥。Agent-Native 不包含邮件发送账户;请单独连接 Resend 或 SendGrid。 + ## 邮件发送是可选的,但建议配置 {#email-provider} 电子邮件提供商不是邮箱和密码身份验证的必需项。没有提供商时,已部署的应用会使用邮箱和密码注册及登录,跳过注册时的邮箱验证,也不会提供魔法链接身份验证。 diff --git a/packages/core/docs/content/locales/zh-CN/docker.mdx b/packages/core/docs/content/locales/zh-CN/docker.mdx index 37306fef1eb..369c41eb5ad 100644 --- a/packages/core/docs/content/locales/zh-CN/docker.mdx +++ b/packages/core/docs/content/locales/zh-CN/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +请参阅[英文 Docker 指南](/docs/docker),并在运行 `docker build` 前创建其中 +所示的 `Dockerfile`。 The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/zh-CN/getting-started.mdx b/packages/core/docs/content/locales/zh-CN/getting-started.mdx index 094d4a3431c..0da647e1edd 100644 --- a/packages/core/docs/content/locales/zh-CN/getting-started.mdx +++ b/packages/core/docs/content/locales/zh-CN/getting-started.mdx @@ -13,8 +13,8 @@ Agent-Native 是一个开源 TypeScript 框架,用于构建配备直观 UI 的 ## 前提条件 -- [Node.js](https://nodejs.org) 22 或更高版本 -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 或更高版本 +- [pnpm](https://pnpm.io) 已安装并可通过 `PATH` 运行 - 供智能体使用的 LLM 连接:Builder.io、Anthropic 或 OpenAI API 密钥,或本地 Ollama 模型 ## 创建智能体 @@ -22,7 +22,7 @@ Agent-Native 是一个开源 TypeScript 框架,用于构建配备直观 UI 的 在一个新目录中,从 Chat 模板开始: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -37,7 +37,7 @@ pnpm install pnpm dev ``` -浏览器 UI 将在 `http://localhost:8080` 打开。如果没有自动打开,请在浏览器中访问该 URL。 +浏览器 UI 会自动打开。如果没有打开,请使用 `pnpm dev` 输出的本地 URL;如果 8080 已被占用,端口号会递增。 @@ -63,7 +63,7 @@ Hello, Alex! ## 查看动作 -打开 `actions/hello.ts`: +在本地 `my-app` 目录中,用代码编辑器打开 `actions/hello.ts`: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -92,7 +92,8 @@ export default defineAction({ ## 从 React 调用动作 -在 `app/routes/hello.tsx` 中添加路由: +模板包含 `actions/hello.ts`,但没有对应页面。创建 +`app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -124,7 +125,7 @@ export default function HelloRoute() { -重启开发服务器,让它发现新路由,然后打开 `http://localhost:8080/hello`。 +重启开发服务器,让它发现新路由,然后打开 `http://localhost:/hello`。 @@ -173,4 +174,8 @@ return { message: `Welcome, ${name}.` }; 定义用于读取、写入和审批的动作,然后从 UI、智能体和外部客户端调用它们。 +### [部署应用](/docs/deploy-an-app) + +从本地开发转向持久数据库、生产身份验证和受支持的部署目标。 + diff --git a/packages/core/docs/content/locales/zh-CN/netlify.mdx b/packages/core/docs/content/locales/zh-CN/netlify.mdx index 46c11834b30..a0822e4774d 100644 --- a/packages/core/docs/content/locales/zh-CN/netlify.mdx +++ b/packages/core/docs/content/locales/zh-CN/netlify.mdx @@ -13,8 +13,18 @@ export default defineConfig({ }); ``` +新脚手架可能会将导入的函数命名为 `agentNativePlugins` 并展开其结果,以保持 +Vite 软件包类型一致。它就是同一个 `agentNative` 插件,接受相同的选项。 + ……或者在构建时设置 `NITRO_PRESET=netlify`。 +对于独立应用,请构建 Netlify 输出并部署静态资源和函数: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + 对于工作区,通过运行以下命令从同一个 Netlify 站点部署每个应用: ```bash diff --git a/packages/core/docs/content/locales/zh-CN/template-calendar-developers.mdx b/packages/core/docs/content/locales/zh-CN/template-calendar-developers.mdx index 2b3c1e41b74..060aa626fa4 100644 --- a/packages/core/docs/content/locales/zh-CN/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/zh-CN/template-calendar-developers.mdx @@ -23,7 +23,7 @@ cd my-calendar pnpm install ``` -这需要先安装 [Node.js](https://nodejs.org) 22 或更高版本,以及 +这需要先安装 [Node.js](https://nodejs.org) 22.22 或更高版本,以及 [pnpm](https://pnpm.io)。如果您还没有安装它们,或者还没有配置好 LLM 连 接(Builder.io、Anthropic/OpenAI 密钥,或本地 Ollama),请参阅 [快速入门](/docs/getting-started)。 diff --git a/packages/core/docs/content/locales/zh-CN/vercel.mdx b/packages/core/docs/content/locales/zh-CN/vercel.mdx index 5b38937f37d..a91bdda4341 100644 --- a/packages/core/docs/content/locales/zh-CN/vercel.mdx +++ b/packages/core/docs/content/locales/zh-CN/vercel.mdx @@ -14,9 +14,13 @@ export default defineConfig({ 通过 Vercel CLI 或 git push 部署: ```bash -vercel deploy +npx vercel deploy ``` +要在不登录 Vercel 的情况下创建一次性预览,请运行 +`npx vercel deploy --temporary`。临时部署不会保留项目环境变量,因此当你需要的 +不只是界面预览时,请通过 `--env` 和 `--build-env` 传入数据库与密钥值。 + 对于工作区,把每个应用都构建进同一个 Vercel Build Output API 包: ```bash diff --git a/packages/core/docs/content/locales/zh-TW/deploy-an-app.mdx b/packages/core/docs/content/locales/zh-TW/deploy-an-app.mdx index 6df392923ac..de9e689c01a 100644 --- a/packages/core/docs/content/locales/zh-TW/deploy-an-app.mdx +++ b/packages/core/docs/content/locales/zh-TW/deploy-an-app.mdx @@ -7,6 +7,6 @@ description: "將 Agent-Native 應用程式建置並部署到 Nitro 目標。" 步驟和各供應商的指令,請參閱[完整的英文應用程式部署指南](/docs/deploy-an-app)。 -部署前,請設定持久性 PostgreSQL 資料庫和穩定的 `BETTER_AUTH_SECRET`。可選擇 [Node.js](/docs/node-js)、[Docker](/docs/docker)、[Vercel](/docs/vercel)、[Netlify](/docs/netlify)、[Cloudflare Pages](/docs/cloudflare#cloudflare-pages)、[Cloudflare Workers](/docs/cloudflare#cloudflare-workers)、[AWS Amplify](/docs/aws-amplify)、[AWS Lambda](/docs/aws-lambda)、[Deno Deploy](/docs/deno-deploy)、[Azure Static Web Apps](/docs/azure-static-web-apps)、[Koyeb](/docs/koyeb) 或 [Render](/docs/render)。 +從[入門指南](/docs/getting-started)開始。部署前,請在託管提供者的環境設定中儲存 `DATABASE_URL`,而不只是在本機 `.env`。使用 `openssl rand -hex 32` 產生穩定的 `BETTER_AUTH_SECRET` 並儲存在同一位置。**Continue as local dev** 僅限本機使用;已部署的應用程式使用註冊與登入。可選擇 [Node.js](/docs/node-js)、[Docker](/docs/docker)、[Vercel](/docs/vercel)、[Netlify](/docs/netlify)、[Cloudflare Pages](/docs/cloudflare#cloudflare-pages)、[Cloudflare Workers](/docs/cloudflare#cloudflare-workers)、[AWS Amplify](/docs/aws-amplify)、[AWS Lambda](/docs/aws-lambda)、[Deno Deploy](/docs/deno-deploy)、[Azure Static Web Apps](/docs/azure-static-web-apps)、[Koyeb](/docs/koyeb) 或 [Render](/docs/render)。 若要在單一來源下執行多個應用程式,請使用[工作區部署](/docs/workspace-deployment)。 diff --git a/packages/core/docs/content/locales/zh-TW/deployment.mdx b/packages/core/docs/content/locales/zh-TW/deployment.mdx index b44e4448383..665a2a18d07 100644 --- a/packages/core/docs/content/locales/zh-TW/deployment.mdx +++ b/packages/core/docs/content/locales/zh-TW/deployment.mdx @@ -30,6 +30,8 @@ Agent-Native 應用程式執行於 Nitro。請選擇符合部署內容的路徑 獨立應用程式需要穩定的 `BETTER_AUTH_SECRET`。使用簽署跨應用程式要求的工作區需要 `A2A_SECRET`。 +請將這些值儲存在託管提供者的環境設定中,而不只是在本機 `.env`。使用 `openssl rand -hex 32` 產生驗證密鑰。Agent-Native 不包含電子郵件傳送帳戶;請另外連接 Resend 或 SendGrid。 + ## 電子郵件傳送是選用功能,但建議設定 {#email-provider} 電子郵件供應商不是電子郵件/密碼驗證的必要條件。沒有供應商時,已部署的應用程式會使用電子郵件/密碼註冊與登入,略過註冊時的電子郵件驗證,也不會提供魔術連結驗證。 diff --git a/packages/core/docs/content/locales/zh-TW/docker.mdx b/packages/core/docs/content/locales/zh-TW/docker.mdx index 37306fef1eb..c388bf37fd4 100644 --- a/packages/core/docs/content/locales/zh-TW/docker.mdx +++ b/packages/core/docs/content/locales/zh-TW/docker.mdx @@ -7,8 +7,8 @@ description: "Localized pointer to the the Docker packaging guide." # Docker -Read the [English Docker guide](/docs/docker) for the build steps and -provider-specific production configuration. +請參閱[英文 Docker 指南](/docs/docker),並在執行 `docker build` 前建立其中 +所示的 `Dockerfile`。 The deployment must use a persistent PostgreSQL database. Configure `DATABASE_URL` and `BETTER_AUTH_SECRET` in the provider environment. The Nitro preset is diff --git a/packages/core/docs/content/locales/zh-TW/getting-started.mdx b/packages/core/docs/content/locales/zh-TW/getting-started.mdx index f8cdb49a05e..a0e560ec046 100644 --- a/packages/core/docs/content/locales/zh-TW/getting-started.mdx +++ b/packages/core/docs/content/locales/zh-TW/getting-started.mdx @@ -13,8 +13,8 @@ Agent-Native 是一個開放原始碼 TypeScript 框架,用於建置配備直 ## 先決條件 -- [Node.js](https://nodejs.org) 22 或更新版本 -- [pnpm](https://pnpm.io) +- [Node.js](https://nodejs.org) 22.22 或更新版本 +- [pnpm](https://pnpm.io) 已安裝且可透過 `PATH` 執行 - 供代理使用的 LLM 連線:Builder.io、Anthropic 或 OpenAI API 金鑰,或本機 Ollama 模型 ## 建立代理 @@ -22,7 +22,7 @@ Agent-Native 是一個開放原始碼 TypeScript 框架,用於建置配備直 在新目錄中從 Chat 範本開始: ```bash -npx @agent-native/core@latest create my-app --standalone --template chat +npx --yes @agent-native/core@latest create my-app --standalone --template chat cd my-app pnpm install ``` @@ -37,7 +37,7 @@ pnpm install pnpm dev ``` -瀏覽器 UI 會在 `http://localhost:8080` 開啟。若未自動開啟,請在瀏覽器中造訪該 URL。 +瀏覽器 UI 會自動開啟。若未開啟,請使用 `pnpm dev` 顯示的本機 URL;若 8080 已被使用,連接埠號碼會遞增。 @@ -63,7 +63,7 @@ Hello, Alex! ## 檢視 action -開啟 `actions/hello.ts`: +在本機 `my-app` 目錄中,用程式碼編輯器開啟 `actions/hello.ts`: ```ts filename="actions/hello.ts" import { defineAction } from "@agent-native/core/action"; @@ -92,7 +92,8 @@ export default defineAction({ ## 從 React 呼叫 action -在 `app/routes/hello.tsx` 新增路由: +範本包含 `actions/hello.ts`,但沒有對應頁面。建立 +`app/routes/hello.tsx`: ```tsx filename="app/routes/hello.tsx" import { useActionQuery } from "@agent-native/core/client/hooks"; @@ -124,7 +125,7 @@ export default function HelloRoute() { -重新啟動開發伺服器,讓它探索新路由,然後開啟 `http://localhost:8080/hello`。 +重新啟動開發伺服器,讓它探索新路由,然後開啟 `http://localhost:/hello`。 @@ -173,4 +174,8 @@ return { message: `Welcome, ${name}.` }; 定義讀取、寫入和核准 actions,接著從 UI、代理和外部用戶端呼叫它們。 +### [部署應用程式](/docs/deploy-an-app) + +從本機開發移至持久性資料庫、正式環境驗證與支援的部署目標。 + diff --git a/packages/core/docs/content/locales/zh-TW/netlify.mdx b/packages/core/docs/content/locales/zh-TW/netlify.mdx index 5816d2924bb..829b9b9a816 100644 --- a/packages/core/docs/content/locales/zh-TW/netlify.mdx +++ b/packages/core/docs/content/locales/zh-TW/netlify.mdx @@ -13,8 +13,18 @@ export default defineConfig({ }); ``` +新鷹架可能會將匯入的函式命名為 `agentNativePlugins` 並展開其結果,以保持 +Vite 套件型別一致。它就是同一個 `agentNative` 外掛,接受相同的選項。 + ……或者在建置時設定 `NITRO_PRESET=netlify`。 +對於獨立應用程式,請建置 Netlify 輸出並部署靜態資源與函式: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + 對於工作區,執行以下指令,從一個 Netlify 網站部署每個應用程式: ```bash diff --git a/packages/core/docs/content/locales/zh-TW/template-calendar-developers.mdx b/packages/core/docs/content/locales/zh-TW/template-calendar-developers.mdx index 300bc338eb0..9c8822ead81 100644 --- a/packages/core/docs/content/locales/zh-TW/template-calendar-developers.mdx +++ b/packages/core/docs/content/locales/zh-TW/template-calendar-developers.mdx @@ -23,7 +23,7 @@ cd my-calendar pnpm install ``` -這需要先安裝 [Node.js](https://nodejs.org) 22 或更新版本,以及 +這需要先安裝 [Node.js](https://nodejs.org) 22.22 或更新版本,以及 [pnpm](https://pnpm.io)。如果您還沒有安裝,或還沒有設定 LLM 連線 (Builder.io、Anthropic/OpenAI 金鑰,或本機 Ollama),請參閱 [開始使用](/docs/getting-started)。 diff --git a/packages/core/docs/content/locales/zh-TW/vercel.mdx b/packages/core/docs/content/locales/zh-TW/vercel.mdx index 5ed2a49f995..d9992fef9c7 100644 --- a/packages/core/docs/content/locales/zh-TW/vercel.mdx +++ b/packages/core/docs/content/locales/zh-TW/vercel.mdx @@ -14,9 +14,13 @@ export default defineConfig({ 透過 Vercel CLI 或 git push 進行部署: ```bash -vercel deploy +npx vercel deploy ``` +若要在不登入 Vercel 的情況下建立一次性預覽,請執行 +`npx vercel deploy --temporary`。暫時部署不會保留專案環境變數,因此當你需要的 +不只是介面預覽時,請透過 `--env` 和 `--build-env` 傳入資料庫與密鑰值。 + 對於工作區,將每個應用程式建置成一個 Vercel Build Output API 包: ```bash diff --git a/packages/core/docs/content/netlify.mdx b/packages/core/docs/content/netlify.mdx index 8ed5103026f..f20976833a7 100644 --- a/packages/core/docs/content/netlify.mdx +++ b/packages/core/docs/content/netlify.mdx @@ -13,8 +13,20 @@ export default defineConfig({ }); ``` +Fresh scaffolds may name the imported function `agentNativePlugins` and spread +its result to keep Vite package types aligned. It is the same `agentNative` +plugin and accepts the same options. + …or set `NITRO_PRESET=netlify` at build time. +For a standalone app, build the Netlify output and deploy its static assets and +functions: + +```bash +NITRO_PRESET=netlify npx @agent-native/core@latest build +npx netlify deploy --prod --dir=dist --functions=.netlify/functions-internal +``` + For a workspace, deploy every app from one Netlify site by running: ```bash diff --git a/packages/core/docs/content/template-calendar-developers.mdx b/packages/core/docs/content/template-calendar-developers.mdx index 4c724b09899..c37358b82ef 100644 --- a/packages/core/docs/content/template-calendar-developers.mdx +++ b/packages/core/docs/content/template-calendar-developers.mdx @@ -23,7 +23,7 @@ cd my-calendar pnpm install ``` -This needs [Node.js](https://nodejs.org) 22 or later and +This needs [Node.js](https://nodejs.org) 22.22 or later and [pnpm](https://pnpm.io) installed first. See [Getting started](/docs/getting-started) if you haven't installed either yet, or don't have an LLM connection (Builder.io, an Anthropic/OpenAI key, diff --git a/packages/core/docs/content/template-chat-developers.mdx b/packages/core/docs/content/template-chat-developers.mdx index 8c77e75ae6f..d84d042cb27 100644 --- a/packages/core/docs/content/template-chat-developers.mdx +++ b/packages/core/docs/content/template-chat-developers.mdx @@ -28,7 +28,7 @@ cd my-chat-app pnpm install ``` -This needs [Node.js](https://nodejs.org) 22 or later and +This needs [Node.js](https://nodejs.org) 22.22 or later and [pnpm](https://pnpm.io) installed first. See [Getting started](/docs/getting-started) if you haven't installed either yet. diff --git a/packages/core/docs/content/template-forms-developers.mdx b/packages/core/docs/content/template-forms-developers.mdx index 725519b9a8e..a923c55f43b 100644 --- a/packages/core/docs/content/template-forms-developers.mdx +++ b/packages/core/docs/content/template-forms-developers.mdx @@ -19,7 +19,7 @@ cd my-forms pnpm install ``` -This needs [Node.js](https://nodejs.org) 22 or later and [pnpm](https://pnpm.io) installed first. See [Getting started](/docs/getting-started) if you haven't installed either yet, or don't have an LLM connection (Builder.io, an Anthropic/OpenAI key, or local Ollama) set up. +This needs [Node.js](https://nodejs.org) 22.22 or later and [pnpm](https://pnpm.io) installed first. See [Getting started](/docs/getting-started) if you haven't installed either yet, or don't have an LLM connection (Builder.io, an Anthropic/OpenAI key, or local Ollama) set up. ### Start the dev server diff --git a/packages/core/docs/content/vercel.mdx b/packages/core/docs/content/vercel.mdx index 793db5b8c9b..a7631deda32 100644 --- a/packages/core/docs/content/vercel.mdx +++ b/packages/core/docs/content/vercel.mdx @@ -14,9 +14,14 @@ export default defineConfig({ Deploy via the Vercel CLI or git push: ```bash -vercel deploy +npx vercel deploy ``` +For a disposable preview without signing in to Vercel, run +`npx vercel deploy --temporary`. Temporary deployments do not retain project +environment variables, so pass any database and secret values with the CLI's +`--env` and `--build-env` options when you need more than a UI preview. + For a workspace, build every app into one Vercel Build Output API bundle: ```bash diff --git a/packages/core/src/agent/engine/provider-endpoint-validation.ts b/packages/core/src/agent/engine/provider-endpoint-validation.ts index 46f9f6abd33..b9bf62b7e25 100644 --- a/packages/core/src/agent/engine/provider-endpoint-validation.ts +++ b/packages/core/src/agent/engine/provider-endpoint-validation.ts @@ -22,9 +22,7 @@ export async function validateProviderBaseUrl( ): Promise { const normalized = normalizeProviderBaseUrl(value); const allowLocalOllama = - options.allowLocalOllama === true && - process.env.NODE_ENV === "development" && - isLoopbackOllamaEndpoint(normalized); + options.allowLocalOllama === true && isLoopbackOllamaEndpoint(normalized); if ( !options.allowPrivate && !allowLocalOllama && diff --git a/packages/core/src/agent/engine/registry.ts b/packages/core/src/agent/engine/registry.ts index c709b2e365e..b10ab40ce6a 100644 --- a/packages/core/src/agent/engine/registry.ts +++ b/packages/core/src/agent/engine/registry.ts @@ -857,7 +857,7 @@ async function resolveProviderBaseUrl( ? validateProviderBaseUrl(raw, { allowLocalOllama: envVar === OLLAMA_BASE_URL_ENV_VAR && - process.env.NODE_ENV === "development", + process.env.NODE_ENV !== "production", }) : undefined; } @@ -1043,7 +1043,7 @@ async function engineCreateConfigForEntry( safeExtra.baseUrl = await validateProviderBaseUrl(safeExtra.baseURL, { allowLocalOllama: entry.name === "ai-sdk:ollama" && - process.env.NODE_ENV === "development", + process.env.NODE_ENV !== "production", }); } if (safeExtra.baseUrl == null) { diff --git a/packages/core/src/cli/create-e2e.spec.ts b/packages/core/src/cli/create-e2e.spec.ts index ee82678197c..59974eb88f8 100644 --- a/packages/core/src/cli/create-e2e.spec.ts +++ b/packages/core/src/cli/create-e2e.spec.ts @@ -310,7 +310,7 @@ describe("standalone scaffold — chat template", { timeout: 180_000 }, () => { } }); - it("allows Tesseract builds through pnpm-workspace.yaml", async () => { + it("allows required native builds through pnpm-workspace.yaml", async () => { await createApp("test-app", { template: "chat" }); const root = path.join(tmpDir, "test-app"); const pkg = readPkg(root); @@ -321,6 +321,7 @@ describe("standalone scaffold — chat template", { timeout: 180_000 }, () => { expect(pkg.pnpm).toBeUndefined(); expect(workspaceYaml).toContain("allowBuilds:"); + expect(workspaceYaml).toContain("node-pty: true"); expect(workspaceYaml).toContain("tesseract.js: true"); expect(workspaceYaml).not.toContain("onlyBuiltDependencies:"); }); diff --git a/packages/core/src/cli/create.spec.ts b/packages/core/src/cli/create.spec.ts index 3986a454dab..7803a61f11e 100644 --- a/packages/core/src/cli/create.spec.ts +++ b/packages/core/src/cli/create.spec.ts @@ -232,6 +232,7 @@ describe("createApp", { timeout: 30000 }, () => { expect(fs.readFileSync(gitignore, "utf-8")).toContain( "node-compile-cache/", ); + expect(fs.readFileSync(gitignore, "utf-8")).toContain("data/*.lock"); }); it("normalizes @agent-native/core for blank standalone apps", async () => { diff --git a/packages/core/src/cli/create.ts b/packages/core/src/cli/create.ts index 96c2665243b..d31f1e8f94e 100644 --- a/packages/core/src/cli/create.ts +++ b/packages/core/src/cli/create.ts @@ -3982,7 +3982,15 @@ function tryGitInit(dir: string): boolean { function renameGitignore(dir: string): void { const src = path.join(dir, "_gitignore"); const dst = path.join(dir, ".gitignore"); - if (fs.existsSync(src)) fs.renameSync(src, dst); + if (!fs.existsSync(src)) return; + fs.renameSync(src, dst); + const contents = fs.readFileSync(dst, "utf8"); + if (!contents.includes("data/*.lock")) { + fs.appendFileSync( + dst, + `${contents.endsWith("\n") ? "" : "\n"}data/*.lock\n`, + ); + } } function replacePlaceholders( diff --git a/packages/core/src/cli/index.ts b/packages/core/src/cli/index.ts index 29e3442a678..d24f4453c64 100644 --- a/packages/core/src/cli/index.ts +++ b/packages/core/src/cli/index.ts @@ -28,21 +28,6 @@ try { _version = pkg.version; } catch {} -// Fail fast on unsupported Node versions. `engines.node: ">=22"` is only -// advisory — npx/pnpm merely warn — so without this an older Node (18/20) -// first fails deep inside a scaffold dynamic import with a cryptic -// ERR_MODULE / syntax error that `handleScaffoldImportError` misreports as a -// corrupt npx cache. A clear up-front message saves that whole detour. -const REQUIRED_NODE_MAJOR = 22; -const _nodeMajor = Number(process.versions.node.split(".")[0]); -if (Number.isFinite(_nodeMajor) && _nodeMajor < REQUIRED_NODE_MAJOR) { - console.error( - `agent-native requires Node.js ${REQUIRED_NODE_MAJOR} or newer, but you're on Node ${process.versions.node}.\n` + - `Upgrade Node (https://nodejs.org) and re-run. With nvm: \`nvm install ${REQUIRED_NODE_MAJOR}\`.`, - ); - process.exit(1); -} - /** * Build a redacted "command" tag from process.argv. Strips the value that * follows any --token / --key / --secret / --password / --api-key flag so diff --git a/packages/core/src/cli/launcher.spec.ts b/packages/core/src/cli/launcher.spec.ts index 13300257d77..75fb7cf32d4 100644 --- a/packages/core/src/cli/launcher.spec.ts +++ b/packages/core/src/cli/launcher.spec.ts @@ -1,7 +1,10 @@ import { describe, expect, it } from "vitest"; // @ts-expect-error - plain JS shim helper without type declarations -import { shouldUseSourceFallback } from "../../bin/launcher.js"; +import { + shouldUseSourceFallback, + supportsNodeVersion, +} from "../../bin/launcher.js"; const fresh = (over: Partial> = {}) => ({ sourceExists: true, @@ -94,3 +97,11 @@ describe("shouldUseSourceFallback", () => { ).toBe(false); }); }); + +describe("supportsNodeVersion", () => { + it("enforces the package's exact Node 22.22.0 minimum", () => { + expect(supportsNodeVersion("22.15.1")).toBe(false); + expect(supportsNodeVersion("22.22.0")).toBe(true); + expect(supportsNodeVersion("24.0.0")).toBe(true); + }); +}); diff --git a/packages/core/src/client/auth/AuthPage.spec.tsx b/packages/core/src/client/auth/AuthPage.spec.tsx index afe5477a127..4c94ff0a27e 100644 --- a/packages/core/src/client/auth/AuthPage.spec.tsx +++ b/packages/core/src/client/auth/AuthPage.spec.tsx @@ -8,6 +8,7 @@ import { isConfirmedAnonymousAuthSession, oauthReturnTarget, resolveGoogleAuthUrlPath, + shouldHideAuthSubtitle, type AuthPageProps, } from "./AuthPage.js"; @@ -20,6 +21,12 @@ function propsFromHtml(html: string): AuthPageProps { } describe("AuthPage", () => { + it("hides account-only guidance when local development sign-in is available", () => { + expect(shouldHideAuthSubtitle("signup", true)).toBe(true); + expect(shouldHideAuthSubtitle("signup", false)).toBe(false); + expect(shouldHideAuthSubtitle("login", true)).toBe(false); + }); + it("only confirms anonymous sessions from a readable auth response", () => { expect( isConfirmedAnonymousAuthSession( diff --git a/packages/core/src/client/auth/AuthPage.tsx b/packages/core/src/client/auth/AuthPage.tsx index fbb09e6b94d..91675eeef1b 100644 --- a/packages/core/src/client/auth/AuthPage.tsx +++ b/packages/core/src/client/auth/AuthPage.tsx @@ -634,6 +634,13 @@ function headingKeys(view: AuthView): { heading: string; subtitle: string } { return { heading: "welcomeTitle", subtitle: "createAccountSubtitle" }; } +export function shouldHideAuthSubtitle( + view: AuthView, + localDevAvailable: boolean, +): boolean { + return view === "signup" && localDevAvailable; +} + export function AuthPage(props: AuthPageProps) { const { authMode, @@ -2294,7 +2301,12 @@ export function AuthPage(props: AuthPageProps) {

{t(keys.heading)}

-

+

EngineFixture[]); @@ -73,6 +74,7 @@ function createFetchFixture({ status?: Record; listResponse?: (request: number) => Promise | Response; setResponse: () => Promise | Response; + providerSettingsResponse?: () => Promise | Response; disconnectResponse?: () => Promise | Response; }) { const setRequests: Array> = []; @@ -106,7 +108,7 @@ function createFetchFixture({ } if (url.endsWith("/_agent-native/agent-engine/api-key")) { providerSettingsRequests.push(JSON.parse(String(init?.body))); - return json({ ok: true }); + return providerSettingsResponse?.() ?? json({ ok: true }); } if (url.endsWith("/_agent-native/actions/manage-agent-engine")) { const body = JSON.parse(String(init?.body ?? "{}")) as Record< @@ -230,6 +232,42 @@ afterEach(() => { }); describe("AgentSettingsContent provider save", () => { + it("shows the server error when provider settings cannot be saved", async () => { + const fixture = createFetchFixture({ + setResponse: () => json({ ok: true }), + providerSettingsResponse: () => + json( + { + error: + "Endpoint URL resolves to a private/internal address — SSRF not allowed.", + }, + 400, + ), + }); + const { root } = await renderSettings(fixture.fetchMock); + await chooseOpenAi(); + const endpointToggle = Array.from(document.querySelectorAll("button")).find( + (button) => button.textContent?.includes("Advanced"), + ); + if (!(endpointToggle instanceof HTMLButtonElement)) { + throw new Error("Missing endpoint settings toggle"); + } + await click(endpointToggle); + const endpoint = document.querySelector( + 'input[placeholder="https://gateway.example/v1"]', + ); + if (!endpoint) throw new Error("Missing endpoint input"); + await changeInput(endpoint, "http://localhost:11434"); + + await click(buttonNamed("Save endpoint")); + + expect(document.querySelector('[role="alert"]')?.textContent).toContain( + "SSRF not allowed", + ); + expect(fixture.providerSettingsRequests).toHaveLength(1); + act(() => root.unmount()); + }); + it("keeps Apply available and shows a bare action error without success or events", async () => { const fixture = createFetchFixture({ setResponse: () => json("Error: optional packages are not installed"), diff --git a/packages/core/src/client/settings/SettingsPanel.tsx b/packages/core/src/client/settings/SettingsPanel.tsx index 4fc059d8508..ce6676950af 100644 --- a/packages/core/src/client/settings/SettingsPanel.tsx +++ b/packages/core/src/client/settings/SettingsPanel.tsx @@ -41,6 +41,7 @@ import { IconApps, IconUsersGroup, IconTool, + IconAlertCircle, } from "@tabler/icons-react"; import React, { Suspense, @@ -862,6 +863,9 @@ function LLMSectionInner({ >(null); const [settingsStatus, setSettingsStatus] = useState(null); const [disconnectError, setDisconnectError] = useState(null); + const [providerSettingsError, setProviderSettingsError] = useState< + string | null + >(null); const [envProbeAvailable, setEnvProbeAvailable] = useState(false); const [enginesLoaded, setEnginesLoaded] = useState(false); const [engineCatalogAvailable, setEngineCatalogAvailable] = useState(false); @@ -1081,6 +1085,7 @@ function LLMSectionInner({ const handleSave = async () => { if (!providerSettingsChanged || (!envVar && !isEndpointProvider)) return; setSaving(true); + setProviderSettingsError(null); try { const nextBaseUrl = isEndpointProvider ? baseUrl.trim() : ""; await saveAgentEngineProviderSettings({ @@ -1101,6 +1106,10 @@ function LLMSectionInner({ if (clearBaseUrl) setBaseUrlConfigured(false); notifyConfigChanged(); setTimeout(() => setSaved(false), 2000); + } catch (err) { + setProviderSettingsError( + err instanceof Error ? err.message : String(err), + ); } finally { setSaving(false); } @@ -1615,6 +1624,18 @@ function LLMSectionInner({ Disconnect failed: {disconnectError}

)} + {providerSettingsError && ( +
+ + {providerSettingsError} +
+ )} {applyError && (

{ + const processState = process as NodeJS.Process & { + __agentNativePgliteClients?: Map>; + __agentNativePgliteProcessLocks?: Map; + __agentNativePgliteProcessExitCleanupRegistered?: boolean; + }; + let dataDir = ""; + + afterEach(async () => { + const { closePgliteClients } = await import("./client.js"); + await closePgliteClients(); + delete processState.__agentNativePgliteClients; + delete processState.__agentNativePgliteProcessLocks; + delete processState.__agentNativePgliteProcessExitCleanupRegistered; + vi.doUnmock("@electric-sql/pglite"); + vi.resetModules(); + if (dataDir) rmSync(dataDir, { recursive: true, force: true }); + }); + + it("reuses one client when a Vite reload gets a fresh global realm", async () => { + dataDir = mkdtempSync(join(tmpdir(), "agent-native-pglite-reload-")); + const client = { close: vi.fn(async () => {}) }; + const create = vi.fn(async () => client); + vi.doMock("@electric-sql/pglite", () => ({ PGlite: { create } })); + + const firstModule = await import("./client.js"); + const first = await firstModule.getPgliteClient(`pglite:${dataDir}`); + + Reflect.deleteProperty( + globalThis as Record, + "__agentNativePgliteClients", + ); + Reflect.deleteProperty( + globalThis as Record, + "__agentNativePgliteProcessLocks", + ); + vi.resetModules(); + + const reloadedModule = await import("./client.js"); + const reloaded = await reloadedModule.getPgliteClient(`pglite:${dataDir}`); + + expect(reloaded).toBe(first); + expect(create).toHaveBeenCalledTimes(1); + }); +}); + describe("db/client Postgres URL handling", () => { let originalEnv: NodeJS.ProcessEnv; diff --git a/packages/core/src/db/client.ts b/packages/core/src/db/client.ts index 03c075e36e8..7001130af6b 100644 --- a/packages/core/src/db/client.ts +++ b/packages/core/src/db/client.ts @@ -322,16 +322,16 @@ type PgliteProcessLock = { }; type PgliteProcessLockRegistry = Map; -const pgliteGlobal = globalThis as typeof globalThis & { +const pgliteProcess = process as NodeJS.Process & { __agentNativePgliteClients?: PgliteClientRegistry; __agentNativePgliteProcessLocks?: PgliteProcessLockRegistry; __agentNativePgliteProcessExitCleanupRegistered?: boolean; }; -const _pgliteClients = (pgliteGlobal.__agentNativePgliteClients ??= new Map< +const _pgliteClients = (pgliteProcess.__agentNativePgliteClients ??= new Map< string, Promise >()); -const _pgliteProcessLocks = (pgliteGlobal.__agentNativePgliteProcessLocks ??= +const _pgliteProcessLocks = (pgliteProcess.__agentNativePgliteProcessLocks ??= new Map()); function pgliteClientKey(dataDir: string): string { @@ -411,8 +411,8 @@ function releasePgliteProcessLock(lock: PgliteProcessLock): void { } function registerPgliteProcessExitCleanup(): void { - if (pgliteGlobal.__agentNativePgliteProcessExitCleanupRegistered) return; - pgliteGlobal.__agentNativePgliteProcessExitCleanupRegistered = true; + if (pgliteProcess.__agentNativePgliteProcessExitCleanupRegistered) return; + pgliteProcess.__agentNativePgliteProcessExitCleanupRegistered = true; process.once("exit", () => { for (const lock of _pgliteProcessLocks.values()) { releasePgliteProcessLock(lock); diff --git a/packages/core/src/deploy/build.spec.ts b/packages/core/src/deploy/build.spec.ts index 6f7b316a212..feda1b1f03d 100644 --- a/packages/core/src/deploy/build.spec.ts +++ b/packages/core/src/deploy/build.spec.ts @@ -2752,6 +2752,34 @@ describe("runNitroBuildPipeline", () => { ).toBeUndefined(); }); + it("skips exact immutable rules when the target limits header rule count", async () => { + const { cwd, clientDir, publicOutputDir } = setupFixture(); + const nitro: any = { + options: { + output: { publicDir: publicOutputDir }, + routeRules: { "/assets/**": { headers: { "x-test": "kept" } } }, + }, + }; + + await runNitroBuildPipeline({ + nitro, + hooks: { + prepare: async () => {}, + copyPublicAssets: async () => {}, + nitroBuild: async () => {}, + }, + clientDir, + publicOutputDir, + appBasePath: "", + cwd, + includeImmutableAssetRouteRules: false, + }); + + expect(nitro.options.routeRules).toEqual({ + "/assets/**": { headers: { "x-test": "kept" } }, + }); + }); + it("merges immutable headers into existing route rules", () => { const routeRules: Record }> = { "/assets/entry.client-aB12_cdE.js": { diff --git a/packages/core/src/deploy/build.ts b/packages/core/src/deploy/build.ts index d59f8482a2f..e1bff4c3fb1 100644 --- a/packages/core/src/deploy/build.ts +++ b/packages/core/src/deploy/build.ts @@ -4982,6 +4982,7 @@ export interface NitroBuildPipelineOptions { publicOutputDir: string | undefined; appBasePath: string; cwd: string; + includeImmutableAssetRouteRules?: boolean; } const DRIZZLE_MIGRATIONS_SOURCE_DIR = path.join("server", "db", "migrations"); @@ -5036,10 +5037,18 @@ export function copyDrizzleMigrationAssets( export async function runNitroBuildPipeline( opts: NitroBuildPipelineOptions, ): Promise { - const { nitro, hooks, clientDir, publicOutputDir, appBasePath, cwd } = opts; + const { + nitro, + hooks, + clientDir, + publicOutputDir, + appBasePath, + cwd, + includeImmutableAssetRouteRules = true, + } = opts; const hasClientBuild = fs.existsSync(clientDir) && Boolean(publicOutputDir); - if (hasClientBuild) { + if (hasClientBuild && includeImmutableAssetRouteRules) { // Install hashed-asset route rules before Nitro prepares platform output. // Some presets materialize headers during prepare/copy phases, not only in // nitroBuild; adding these later leaves Netlify/Vercel static assets without @@ -5502,6 +5511,7 @@ export default bundle; publicOutputDir: nitro.options.output.publicDir, appBasePath, cwd, + includeImmutableAssetRouteRules: !isCloudflareModulePreset(preset), }); const drizzleMigrationFiles = copyDrizzleMigrationAssets( diff --git a/packages/core/src/server/agent-engine-api-key-route.spec.ts b/packages/core/src/server/agent-engine-api-key-route.spec.ts index 39a14788ff3..5ef4a55837a 100644 --- a/packages/core/src/server/agent-engine-api-key-route.spec.ts +++ b/packages/core/src/server/agent-engine-api-key-route.spec.ts @@ -2,6 +2,7 @@ import type { H3Event } from "h3"; import { describe, expect, it, vi } from "vitest"; const mockGetSession = vi.fn(); +const mockIsLoopbackRequest = vi.fn(() => true); const mockGetOrgContext = vi.fn(); const mockIsBlockedExtensionUrlWithDns = vi.fn(); const mockWriteAppSecret = vi.fn(); @@ -10,6 +11,7 @@ const mockClearProviderCredentialAuthFailure = vi.fn(); vi.mock("./auth.js", () => ({ getSession: (...args: any[]) => mockGetSession(...args), + isLoopbackRequest: (...args: any[]) => mockIsLoopbackRequest(...args), })); vi.mock("../org/context.js", () => ({ @@ -159,8 +161,8 @@ describe("agent engine api-key route helpers", () => { }); }); - it("saves the documented local Ollama endpoint in development", async () => { - vi.stubEnv("NODE_ENV", "development"); + it("saves the documented local Ollama endpoint in a local non-production server", async () => { + vi.stubEnv("NODE_ENV", ""); mockIsBlockedExtensionUrlWithDns.mockClear(); mockWriteAppSecret.mockClear(); mockGetSession.mockResolvedValue({ email: "alice@example.test" }); @@ -196,6 +198,32 @@ describe("agent engine api-key route helpers", () => { vi.stubEnv("NODE_ENV", "test"); }); + it("rejects a local Ollama endpoint from a non-loopback request", async () => { + vi.stubEnv("NODE_ENV", "development"); + mockIsLoopbackRequest.mockReturnValueOnce(false); + mockIsBlockedExtensionUrlWithDns.mockResolvedValueOnce(true); + mockGetSession.mockResolvedValue({ email: "alice@example.test" }); + + const event = { + req: new Request("http://example.test/_agent-native/agent-engine-key", { + method: "POST", + body: JSON.stringify({ + provider: "ollama", + baseUrl: "http://localhost:11434", + }), + headers: { "content-type": "application/json" }, + }), + res: { headers: new Headers(), status: 200 }, + }; + + await expect( + createAgentEngineApiKeyHandler()(event as any), + ).resolves.toEqual({ + error: + "Endpoint URL resolves to a private/internal address — SSRF not allowed.", + }); + }); + it("rejects endpoint URLs for providers without endpoint support", () => { expect( normalizeAgentEngineApiKeyPayload({ diff --git a/packages/core/src/server/agent-engine-api-key-route.ts b/packages/core/src/server/agent-engine-api-key-route.ts index f90fc72de9a..63452278b9d 100644 --- a/packages/core/src/server/agent-engine-api-key-route.ts +++ b/packages/core/src/server/agent-engine-api-key-route.ts @@ -14,7 +14,7 @@ import { } from "../agent/engine/provider-env-vars.js"; import { getOrgContext } from "../org/context.js"; import { deleteAppSecret, writeAppSecret } from "../secrets/storage.js"; -import { getSession } from "./auth.js"; +import { getSession, isLoopbackRequest } from "./auth.js"; import { clearProviderCredentialAuthFailure } from "./credential-provider.js"; import { readBody } from "./h3-helpers.js"; @@ -249,7 +249,8 @@ export function createAgentEngineApiKeyHandler() { await validateProviderBaseUrl(payload.baseUrl, { allowLocalOllama: payload.key === OLLAMA_BASE_URL_ENV_VAR && - process.env.NODE_ENV === "development", + process.env.NODE_ENV !== "production" && + isLoopbackRequest(event), }); } catch (err) { setResponseStatus(event, 400); diff --git a/packages/core/src/server/security-headers.spec.ts b/packages/core/src/server/security-headers.spec.ts index db0d5b16f60..062ec2d71ea 100644 --- a/packages/core/src/server/security-headers.spec.ts +++ b/packages/core/src/server/security-headers.spec.ts @@ -129,7 +129,7 @@ describe("createSecurityHeadersMiddleware", () => { expect(res.headers.get("Content-Security-Policy-Report-Only")).toBeNull(); }); - it("allows iframe navigations to satisfy cross-origin isolated parents", async () => { + it("allows ordinary iframe navigations without isolating their subresources", async () => { const app = createApp(); app.use(createSecurityHeadersMiddleware()); @@ -153,9 +153,7 @@ describe("createSecurityHeadersMiddleware", () => { expect(res.headers.get("Cross-Origin-Resource-Policy")).toBe( "cross-origin", ); - expect(res.headers.get("Cross-Origin-Embedder-Policy")).toBe( - "require-corp", - ); + expect(res.headers.get("Cross-Origin-Embedder-Policy")).toBeNull(); }); it("keeps a same-origin Referer on embed responses", async () => { diff --git a/packages/core/src/server/security-headers.ts b/packages/core/src/server/security-headers.ts index 003d6265984..02d4ee96fc3 100644 --- a/packages/core/src/server/security-headers.ts +++ b/packages/core/src/server/security-headers.ts @@ -33,9 +33,8 @@ * - `Cross-Origin-Opener-Policy: same-origin` — isolates window.opener so * a popup-window opener reference can't read or modify our document. * - `Cross-Origin-Embedder-Policy: require-corp` — emitted only for - * validated MCP embed-session page loads and browser iframe navigations. - * COEP hosts such as Claude's MCP Apps proxy require framed cross-origin - * documents to opt in explicitly. + * validated MCP embed-session page loads. COEP hosts such as Claude's MCP + * Apps proxy require framed cross-origin documents to opt in explicitly. * - `Cross-Origin-Resource-Policy: same-site` — prevents other origins from * embedding our endpoints as `` / `