deployai 0.1.0-beta.1 → 0.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +25 -10
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -20910,7 +20910,9 @@ var DeployResponse = external_exports.object({
20910
20910
  versionId: external_exports.string(),
20911
20911
  number: external_exports.number(),
20912
20912
  queuePosition: external_exports.number(),
20913
- previewUrl: external_exports.string()
20913
+ previewUrl: external_exports.string(),
20914
+ /** Only for a heavy home page (D-420): the files it loads from the site and whether it prefetches links. */
20915
+ page: external_exports.object({ files: external_exports.number(), prefetches: external_exports.boolean() }).optional()
20914
20916
  });
20915
20917
  var Version = external_exports.object({
20916
20918
  id: external_exports.string(),
@@ -21127,9 +21129,9 @@ var ARCH_NODES = [
21127
21129
  { id: "postgres", kind: "db", zone: "platform", label: "Postgres", summary: "\u05DE\u05E1\u05D3 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E9\u05DC\u05E0\u05D5: \u05DE\u05E9\u05EA\u05DE\u05E9\u05D9\u05DD, \u05D0\u05EA\u05E8\u05D9\u05DD, \u05D2\u05E8\u05E1\u05D0\u05D5\u05EA, \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD, \u05D1\u05D9\u05E7\u05D5\u05E8\u05D9\u05DD \u05D5\u05D9\u05D5\u05DE\u05DF. \u05D1\u05D9\u05D9\u05E6\u05D5\u05E8 \u05D2\u05D9\u05D1\u05D5\u05D9 pg_dump \u05DC\u05D9\u05DC\u05D9 \u05DC\u05D3\u05DC\u05D9 R2 \u05E0\u05E4\u05E8\u05D3 (14 \u05D9\u05D5\u05DE\u05D9\u05D9\u05DD, 4 \u05E9\u05D1\u05D5\u05E2\u05D9\u05D9\u05DD), \u05DE\u05D5\u05E6\u05E4\u05DF \u05D1\u05BEage, \u05D5\u05DE\u05D2\u05D1\u05D9\u05DD \u05D2\u05DD \u05D9\u05D3\u05E0\u05D9\u05EA \u05DE\u05D0\u05D3\u05DE\u05D9\u05DF, \u05E9\u05E8\u05EA, \u05D2\u05D9\u05D1\u05D5\u05D9\u05D9\u05DD.", summaryEn: "Our database: users, sites, versions, payments, visits and the audit log. In production a nightly pg_dump goes to its own R2 bucket (14 daily, 4 weekly), encrypted with age, plus manual copies from Admin, Server, Backups.", code: ["apps/web/src/server/db/schema.ts", "scripts/backup-db.sh", "apps/web/src/server/backups.ts"], env: ["DATABASE_URL", "BACKUP_S3_ACCESS_KEY_ID", "BACKUP_S3_SECRET_ACCESS_KEY", "BACKUP_AGE_RECIPIENT"], portability: "Our database", docs: ["docs/04-architecture.md", "docs/22-go-live.md", "docs/23-server.md"], decisions: ["D-336", "D-340"] },
21128
21130
  { id: "files", kind: "storage", zone: "platform", label: "Version files", summary: "\u05D0\u05E8\u05DB\u05D9\u05D5\u05E0\u05D9 \u05DE\u05E7\u05D5\u05E8 \u05D5\u05EA\u05D5\u05E6\u05E8\u05D9 \u05D1\u05E0\u05D9\u05D9\u05D4 \u05E9\u05DC \u05DB\u05DC \u05D2\u05E8\u05E1\u05D4, \u05D3\u05E8\u05DA storage.ts \u05D1\u05DC\u05D1\u05D3. \u05D3\u05DC\u05D9 R2 \u05DC\u05DB\u05DC \u05E1\u05D1\u05D9\u05D1\u05D4, \u05D5\u05E0\u05D9\u05E7\u05D5\u05D9 \u05DC\u05D9\u05DC\u05D9 \u05E9\u05DC \u05E7\u05D1\u05E6\u05D9\u05DD \u05E9\u05D0\u05E3 \u05D2\u05E8\u05E1\u05D4 \u05DC\u05D0 \u05DE\u05E9\u05EA\u05DE\u05E9\u05EA \u05D1\u05D4\u05DD.", summaryEn: "Source archives and build output of every version, through storage.ts only. One R2 bucket per place, and a nightly sweep of files no version uses.", code: ["apps/web/src/server/storage.ts", "apps/web/src/server/storage-sweep.ts"], env: ["STORAGE_DIR", "S3_ACCESS_KEY_ID", "S3_SECRET_ACCESS_KEY"], portability: "Version files (uploads and build output)", docs: ["docs/17-portability.md"], decisions: ["D-095", "D-096", "D-316"] },
21129
21131
  // Services
21130
- { id: "email-sending", kind: "external", zone: "services", label: "CF Email Sending", summary: "\u05E9\u05DC\u05D9\u05D7\u05EA \u05DE\u05D9\u05D9\u05DC\u05D9\u05DD \u05D3\u05E8\u05DA Cloudflare Email Sending. \u05D1\u05DC\u05D9 \u05D8\u05D5\u05E7\u05DF \u05D4\u05DE\u05D9\u05D9\u05DC \u05DE\u05D5\u05D3\u05E4\u05E1 \u05D1\u05DC\u05D5\u05D2.", summaryEn: "Sends email through Cloudflare Email Sending. Without a token, the email is printed to the log.", code: ["apps/web/src/server/email.ts"], env: ["MAIL_POSTAL_ADDRESS"], portability: "Emails" },
21132
+ { id: "email-sending", kind: "external", zone: "services", label: "CF Email Sending", summary: "\u05E9\u05DC\u05D9\u05D7\u05EA \u05DE\u05D9\u05D9\u05DC\u05D9\u05DD \u05D3\u05E8\u05DA Cloudflare Email Sending. \u05D1\u05DC\u05D9 \u05D8\u05D5\u05E7\u05DF \u05D4\u05DE\u05D9\u05D9\u05DC \u05DE\u05D5\u05D3\u05E4\u05E1 \u05D1\u05DC\u05D5\u05D2.", summaryEn: "Sends email through Cloudflare Email Sending. Without a token, the email is printed to the log.", code: ["apps/web/src/server/email.ts"], portability: "Emails" },
21131
21133
  { id: "oauth", kind: "external", zone: "services", label: "Google / GitHub OAuth", summary: "\u05D4\u05EA\u05D7\u05D1\u05E8\u05D5\u05EA \u05E2\u05DD Google \u05D0\u05D5 GitHub \u05D3\u05E8\u05DA Better Auth.", summaryEn: "Log in with Google or GitHub through Better Auth.", code: ["apps/web/src/server/auth.ts"], env: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET"], decisions: ["D-020"] },
21132
- { id: "payments", kind: "external", zone: "services", label: "Payment provider (Cardcom)", summary: "\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC, \u05D5\u05E0\u05D1\u05D7\u05E8 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05D0\u05D3\u05DE\u05D9\u05DF (\u05D0\u05D5 \u05DE\u05D3\u05D5\u05DE\u05D4 \u05DC\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA). \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1 \u05DE\u05D5\u05E7\u05DC\u05D3 \u05D1\u05D3\u05E3 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E9\u05DC \u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05D5\u05E0\u05E9\u05DE\u05E8 \u05DB\u05D8\u05D5\u05E7\u05DF \u05DE\u05D5\u05E6\u05E4\u05DF, \u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05E2\u05DD \u05DE\u05E4\u05EA\u05D7 \u05D0\u05D9\u05D3\u05DE\u05E4\u05D5\u05D8\u05E0\u05D8\u05D9\u05D5\u05EA, \u05D5\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DE\u05E4\u05D9\u05E7\u05D4 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05DE\u05E1 \u05DC\u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05D5\u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05D6\u05D9\u05DB\u05D5\u05D9 \u05DC\u05DB\u05DC \u05D4\u05D7\u05D6\u05E8.", summaryEn: "Cardcom by default, chosen in admin settings (or simulated for tests). The card is typed on the secure Cardcom page and saved as a sealed token, every charge carries an idempotency key, and Cardcom issues a tax invoice per charge and a credit invoice per refund.", code: ["apps/web/src/server/billing/provider.ts", "apps/web/src/server/billing/cardcom.ts", "apps/web/src/server/billing/card-pages.ts", "apps/web/src/app/api/billing/card"], env: ["BILLING_PROVIDER", "BILLING_MOCK_FAIL", "CARDCOM_TERMINAL", "CARDCOM_API_NAME", "CARDCOM_API_PASSWORD", "CARDCOM_INVOICES", "CARDCOM_CSS_URL", "CARDCOM_TOKEN_KEY"], portability: "Payments", decisions: ["D-175", "D-292"] },
21134
+ { id: "payments", kind: "external", zone: "services", label: "Payment provider (Cardcom)", summary: "\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DB\u05D1\u05E8\u05D9\u05E8\u05EA \u05DE\u05D7\u05D3\u05DC, \u05D5\u05E0\u05D1\u05D7\u05E8 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05D0\u05D3\u05DE\u05D9\u05DF (\u05D0\u05D5 \u05DE\u05D3\u05D5\u05DE\u05D4 \u05DC\u05D1\u05D3\u05D9\u05E7\u05D5\u05EA). \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1 \u05DE\u05D5\u05E7\u05DC\u05D3 \u05D1\u05D3\u05E3 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E9\u05DC \u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05D5\u05E0\u05E9\u05DE\u05E8 \u05DB\u05D8\u05D5\u05E7\u05DF \u05DE\u05D5\u05E6\u05E4\u05DF, \u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05E2\u05DD \u05DE\u05E4\u05EA\u05D7 \u05D0\u05D9\u05D3\u05DE\u05E4\u05D5\u05D8\u05E0\u05D8\u05D9\u05D5\u05EA, \u05D5\u05E7\u05D0\u05E8\u05D3\u05E7\u05D5\u05DD \u05DE\u05E4\u05D9\u05E7\u05D4 \u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05DE\u05E1 \u05DC\u05DB\u05DC \u05D7\u05D9\u05D5\u05D1 \u05D5\u05D7\u05E9\u05D1\u05D5\u05E0\u05D9\u05EA \u05D6\u05D9\u05DB\u05D5\u05D9 \u05DC\u05DB\u05DC \u05D4\u05D7\u05D6\u05E8.", summaryEn: "Cardcom by default, chosen in admin settings (or simulated for tests). The card is typed on the secure Cardcom page and saved as a sealed token, every charge carries an idempotency key, and Cardcom issues a tax invoice per charge and a credit invoice per refund.", code: ["apps/web/src/server/billing/provider.ts", "apps/web/src/server/billing/cardcom.ts", "apps/web/src/server/billing/card-pages.ts", "apps/web/src/app/api/billing/card"], env: ["BILLING_PROVIDER", "BILLING_MOCK_FAIL", "CARDCOM_TERMINAL", "CARDCOM_API_NAME", "CARDCOM_API_PASSWORD", "CARDCOM_INVOICES", "CARDCOM_CSS_URL", "CARDCOM_TOKEN_KEY", "CARDCOM_DEPARTMENT_ID"], portability: "Payments", decisions: ["D-175", "D-292"] },
21133
21135
  { id: "registrar", kind: "external", zone: "services", label: "Domain registrar (Cloudflare Registrar)", summary: "\u05E7\u05E0\u05D9\u05D9\u05EA \u05D3\u05D5\u05DE\u05D9\u05D9\u05E0\u05D9\u05DD \u05DC\u05D0\u05EA\u05E8: \u05D7\u05D9\u05E4\u05D5\u05E9 \u05D5\u05DE\u05D7\u05D9\u05E8 \u05D1\u05D3\u05D5\u05DC\u05E8\u05D9\u05DD, \u05E8\u05D9\u05E9\u05D5\u05DD \u05D0\u05D7\u05D3 \u05DC\u05DB\u05DC \u05D4\u05D6\u05DE\u05E0\u05D4 \u05D1\u05D8\u05D5\u05E7\u05DF \u05E0\u05E4\u05E8\u05D3, \u05D5\u05D7\u05D9\u05D3\u05D5\u05E9 \u05E9\u05E0\u05EA\u05D9. \u05D3\u05D5\u05DE\u05D9\u05D9\u05E0\u05D9\u05DD \u05D9\u05E9\u05E8\u05D0\u05DC\u05D9\u05D9\u05DD \u05E0\u05E8\u05E9\u05DE\u05D9\u05DD \u05D9\u05D3\u05E0\u05D9\u05EA \u05DE\u05EA\u05D5\u05E8 \u05D4\u05E6\u05D5\u05D5\u05EA. \u05DC\u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05E9\u05E0\u05E7\u05E0\u05D4: \u05D3\u05D5\u05D0\u05E8 \u05D3\u05E8\u05DA Cloudflare Email Routing.", summaryEn: "Buying domains for a site: search and price in dollars, one registration per order with its own token, yearly renewal. Israeli domains are registered by hand from the team queue. For a bought domain: email through Cloudflare Email Routing.", code: ["apps/web/src/server/registrar.ts", "apps/web/src/server/domain-sales.ts", "apps/web/src/server/domain-email.ts", "apps/web/src/server/billing/services.ts"], env: ["CF_REGISTRAR_TOKEN"], decisions: ["D-299", "D-300", "D-301"] },
21134
21136
  { id: "mcp", kind: "external", zone: "services", label: "MCP for AI tools (/api/mcp)", summary: "ChatGPT \u05D5-Claude \u05DE\u05EA\u05D7\u05D1\u05E8\u05D9\u05DD \u05D1\u05DC\u05D9 \u05D8\u05E8\u05DE\u05D9\u05E0\u05DC: OAuth \u05E2\u05DD \u05D0\u05D9\u05E9\u05D5\u05E8 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF, \u05D5\u05D0\u05D6 \u05DB\u05DC\u05D9\u05DD \u05DC\u05E8\u05E9\u05D9\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8\u05D9\u05DD, \u05D1\u05D3\u05D9\u05E7\u05D4, \u05D4\u05E2\u05DC\u05D0\u05EA \u05D2\u05E8\u05E1\u05D4 \u05DC\u05EA\u05E6\u05D5\u05D2\u05D4 \u05DE\u05E7\u05D3\u05D9\u05DE\u05D4, \u05D5\u05D4\u05E2\u05DC\u05D0\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05E8\u05E7 \u05E2\u05DD \u05D4\u05E8\u05E9\u05D0\u05D4 \u05D5\u05D0\u05D9\u05E9\u05D5\u05E8.", summaryEn: "ChatGPT and Claude connect without a terminal: OAuth with a browser consent, then tools to list sites, check, upload a version to a preview, and go live only with the permission and a yes.", code: ["apps/web/src/app/api/mcp/route.ts", "apps/web/src/server/mcp-tools.ts", "apps/web/src/server/auth.ts"], decisions: ["D-302"] },
21135
21137
  { id: "npm", kind: "external", zone: "services", label: "npm registry", summary: "\u05DE\u05E4\u05D9\u05E5 \u05D0\u05EA \u05D4\u05BECLI, \u05D5\u05DE\u05DE\u05E0\u05D5 \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4 \u05DE\u05EA\u05E7\u05D9\u05E0\u05D4 \u05EA\u05DC\u05D5\u05D9\u05D5\u05EA.", summaryEn: "Distributes the CLI, and the build installs dependencies from it." },
@@ -21210,7 +21212,7 @@ var ARCH_FLOWS = [
21210
21212
  labelEn: "Site visit",
21211
21213
  steps: [
21212
21214
  { edge: "visitor-dispatch", text: "\u05DB\u05DC \u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D2\u05D9\u05E2\u05D4 \u05DC\u05BEdispatch Worker.", textEn: "Every address reaches the dispatch Worker." },
21213
- { edge: dispatchEdgeId("ROUTES"), text: "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05DE\u05D5\u05E4\u05D4 \u05DC\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 (\u05EA\u05EA \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05D1\u05DC\u05D9 \u05E7\u05E8\u05D9\u05D0\u05D4, \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05E9\u05DC \u05DC\u05E7\u05D5\u05D7 \u05D1\u05BEhost:), \u05D5\u05E0\u05E7\u05E8\u05D0\u05EA \u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site:: \u05DE\u05E1\u05DC\u05D5\u05DC, \u05DE\u05E2\u05D1\u05D3, \u05EA\u05D2, \u05DE\u05D9 \u05E8\u05E9\u05D0\u05D9 \u05DC\u05D4\u05D9\u05DB\u05E0\u05E1, \u05DB\u05D1\u05D5\u05D9 \u05D5\u05E9\u05E4\u05D4. \u05E0\u05E9\u05DE\u05E8\u05EA \u05D1\u05D6\u05D9\u05DB\u05E8\u05D5\u05DF \u05D3\u05E7\u05D4 (D-249).", textEn: "The address is mapped to a script (our subdomain without a read, a customer domain by host:), and the site record site: is read: tier, CPU, badge, who may come in, off and language. Kept a minute in memory (D-249)." },
21215
+ { edge: dispatchEdgeId("ROUTES"), text: "\u05D4\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05DE\u05D5\u05E4\u05D4 \u05DC\u05E1\u05E7\u05E8\u05D9\u05E4\u05D8 (\u05EA\u05EA \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05D1\u05DC\u05D9 \u05E7\u05E8\u05D9\u05D0\u05D4, \u05D3\u05D5\u05DE\u05D9\u05D9\u05DF \u05E9\u05DC \u05DC\u05E7\u05D5\u05D7 \u05D1\u05BEhost:), \u05D5\u05E0\u05E7\u05E8\u05D0\u05EA \u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site:: \u05DE\u05E1\u05DC\u05D5\u05DC, \u05DE\u05E2\u05D1\u05D3, \u05EA\u05D2, \u05DE\u05D9 \u05E8\u05E9\u05D0\u05D9 \u05DC\u05D4\u05D9\u05DB\u05E0\u05E1 \u05D5\u05DB\u05D1\u05D5\u05D9. \u05E0\u05E9\u05DE\u05E8\u05EA \u05D1\u05D6\u05D9\u05DB\u05E8\u05D5\u05DF \u05D3\u05E7\u05D4 (D-249).", textEn: "The address is mapped to a script (our subdomain without a read, a customer domain by host:), and the site record site: is read: tier, CPU, badge, who may come in and off. Kept a minute in memory (D-249)." },
21214
21216
  { edge: dispatchEdgeId("RATE_FREE"), text: "\u05D1\u05D3\u05D9\u05E7\u05EA \u05E7\u05E6\u05D1 \u05DC\u05E4\u05D9 IP \u05D5\u05D0\u05EA\u05E8, \u05D1\u05DE\u05D2\u05D1\u05DC\u05D4 \u05E9\u05DC \u05D4\u05DE\u05E1\u05DC\u05D5\u05DC (\u05D6\u05DE\u05E0\u05D9, \u05D7\u05D9\u05E0\u05DE\u05D9 \u05D0\u05D5 \u05D1\u05EA\u05E9\u05DC\u05D5\u05DD).", textEn: "Rate check by IP and site, with the tier limit (temporary, free or paid)." },
21215
21217
  { edge: dispatchEdgeId("DISPATCHER"), text: "\u05D4\u05D1\u05E7\u05E9\u05D4 \u05E2\u05D5\u05D1\u05E8\u05EA \u05DC\u05BEnamespace.", textEn: "The request goes to the namespace." },
21216
21218
  { edge: "dispatcher-site", text: "\u05D4\u05BEWorker \u05E9\u05DC \u05D4\u05D0\u05EA\u05E8 \u05E2\u05D5\u05E0\u05D4.", textEn: "The site's Worker answers." },
@@ -21228,7 +21230,7 @@ var ARCH_FLOWS = [
21228
21230
  { edge: "web-queue", text: "\u05E2\u05D1\u05D5\u05D3\u05EA site-toggle \u05D1\u05E2\u05D3\u05D9\u05E4\u05D5\u05EA \u05D3\u05D7\u05D5\u05E4\u05D4.", textEn: "A site-toggle job with urgent priority." },
21229
21231
  { edge: "queue-worker", text: "\u05D4\u05BEworker \u05DE\u05E8\u05D9\u05E5 \u05D0\u05D5\u05EA\u05D4.", textEn: "The worker runs it." },
21230
21232
  { edge: "worker-cfapi", text: "\u05E4\u05E0\u05D9\u05D9\u05D4 \u05DC\u05BECloudflare API.", textEn: "A call to the Cloudflare API." },
21231
- { edge: "cfapi-kv", text: '\u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site: \u05D1\u05BEKV \u05E0\u05DB\u05EA\u05D1\u05EA \u05DE\u05D7\u05D3\u05E9 \u05E2\u05DD \u05DB\u05D1\u05D5\u05D9 \u05D5\u05E9\u05E4\u05EA \u05D4\u05D0\u05EA\u05E8, \u05D5\u05DE\u05D2\u05D9\u05E2\u05D4 \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD \u05EA\u05D5\u05DA \u05D3\u05E7\u05D4 (D-249). \u05D4\u05BEdispatch Worker \u05E2\u05D5\u05E0\u05D4 \u05D1\u05E2\u05DE\u05D5\u05D3 "\u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF" \u05D1\u05E9\u05E4\u05EA \u05D4\u05D0\u05EA\u05E8, \u05E2\u05DD \u05D4\u05DC\u05D5\u05D2\u05D5 \u05D5\u05E7\u05D9\u05E9\u05D5\u05E8 \u05DC DeployAI (D-178).', textEn: 'The site record site: in KV is written again with off and the site language, and reaches visitors within a minute (D-249). The dispatch Worker answers the "site unavailable" page in the site language, with the logo and a link to DeployAI (D-178).' }
21233
+ { edge: "cfapi-kv", text: '\u05E8\u05E9\u05D5\u05DE\u05EA \u05D4\u05D0\u05EA\u05E8 site: \u05D1\u05BEKV \u05E0\u05DB\u05EA\u05D1\u05EA \u05DE\u05D7\u05D3\u05E9 \u05E2\u05DD \u05DB\u05D1\u05D5\u05D9, \u05D5\u05DE\u05D2\u05D9\u05E2\u05D4 \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD \u05EA\u05D5\u05DA \u05D3\u05E7\u05D4 (D-249). \u05D4\u05BEdispatch Worker \u05E2\u05D5\u05E0\u05D4 \u05D1\u05E2\u05DE\u05D5\u05D3 "\u05D4\u05D0\u05EA\u05E8 \u05DC\u05D0 \u05D6\u05DE\u05D9\u05DF" \u05D1\u05E9\u05E4\u05EA \u05D4\u05D3\u05E4\u05D3\u05E4\u05DF \u05E9\u05DC \u05D4\u05DE\u05D1\u05E7\u05E8 (D-413), \u05E2\u05DD \u05D4\u05DC\u05D5\u05D2\u05D5 \u05D5\u05E7\u05D9\u05E9\u05D5\u05E8 \u05DC DeployAI (D-178).', textEn: 'The site record site: in KV is written again with off, and reaches visitors within a minute (D-249). The dispatch Worker answers the "site unavailable" page in the browser language of the visitor (D-413), with the logo and a link to DeployAI (D-178).' }
21232
21234
  ]
21233
21235
  },
21234
21236
  {
@@ -21283,12 +21285,10 @@ var PLAN_FEATURES = [
21283
21285
  { key: "ssl" },
21284
21286
  { key: "analytics", limit: "analyticsDays" },
21285
21287
  { key: "data", limit: "maxDataMb" },
21286
- { key: "requests", limit: "maxRequestsMonth" },
21288
+ { key: "pageViews", limit: "maxPageViewsMonth" },
21287
21289
  { key: "deploys", limit: "maxDeploysDay" },
21288
- { key: "buildMinutes", limit: "maxBuildMinutesMonth" },
21289
21290
  { key: "emails", limit: "maxEmailsMonth" },
21290
21291
  { key: "versions", limit: "maxVersionsMb" },
21291
- { key: "invitedUsers", limit: "maxInvitedUsers" },
21292
21292
  { key: "helpDeploys" },
21293
21293
  { key: "helpEmail" },
21294
21294
  { key: "whatsapp", soon: true }
@@ -21475,7 +21475,6 @@ var ENV_KEYS = {
21475
21475
  DISPATCH_RATE_LIMIT_FREE: { scope: "same", section: "cloudflare", about: "The same on a site on a free plan." },
21476
21476
  DISPATCH_RATE_LIMIT_PAID: { scope: "same", section: "cloudflare", about: "The same on a site on a paid plan." },
21477
21477
  DISPATCH_RATE_LIMIT_PERIOD: { scope: "same", section: "cloudflare", about: "The rate limit period in seconds: 10 or 60." },
21478
- MAIL_POSTAL_ADDRESS: { scope: "same", section: "email", about: "The business address in the footer of lifecycle emails (anti-spam law, D-180). Required before a tips or offers email can be turned on or sent (D-370)." },
21479
21478
  GOOGLE_CLIENT_ID: { scope: "same", section: "login", about: "Google Cloud Console, OAuth client, with both the laptop and the server redirect addresses on it." },
21480
21479
  GOOGLE_CLIENT_SECRET: { scope: "same", section: "login", about: "The secret of that Google client." },
21481
21480
  GITHUB_CLIENT_ID: { scope: "same", section: "login", about: "GitHub, Settings, Developer settings, OAuth Apps, with both redirect addresses on it." },
@@ -21765,6 +21764,9 @@ var M = {
21765
21764
  goesLive: "The new version goes live when its build is done.",
21766
21765
  followBuild: " Run: npx deployai@latest status (to follow the build)",
21767
21766
  thenPromote: " Then, only after the owner approves the preview: npx deployai@latest promote v{n} (to put it live)",
21767
+ heavyPage: "The home page loads {n} files from the site. Fewer files make it faster for visitors.",
21768
+ prefetchPage: "The home page fetches pages before anyone opens them (link prefetch). Turning it off on long link lists saves visitors data.",
21769
+ speedHint: " Check it: npx deployai@latest speed {url}",
21768
21770
  queueWaiting: "waiting in queue, position {n}",
21769
21771
  files: "Files",
21770
21772
  skipped: "Skipped",
@@ -21919,6 +21921,9 @@ var M = {
21919
21921
  goesLive: "\u05D4\u05D2\u05E8\u05E1\u05D4 \u05D4\u05D7\u05D3\u05E9\u05D4 \u05E2\u05D5\u05DC\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8 \u05DB\u05E9\u05D4\u05D1\u05E0\u05D9\u05D9\u05D4 \u05E9\u05DC\u05D4 \u05DE\u05E1\u05EA\u05D9\u05D9\u05DE\u05EA.",
21920
21922
  followBuild: " \u05D4\u05E8\u05D9\u05E6\u05D5: npx deployai@latest status (\u05DB\u05D3\u05D9 \u05DC\u05E2\u05E7\u05D5\u05D1 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05D1\u05E0\u05D9\u05D9\u05D4)",
21921
21923
  thenPromote: " \u05D5\u05E8\u05E7 \u05D0\u05D7\u05E8\u05D9 \u05E9\u05D1\u05E2\u05DC \u05D4\u05D0\u05EA\u05E8 \u05D0\u05D9\u05E9\u05E8 \u05D0\u05EA \u05D4\u05EA\u05E6\u05D5\u05D2\u05D4 \u05D4\u05DE\u05E7\u05D3\u05D9\u05DE\u05D4: npx deployai@latest promote v{n} (\u05DB\u05D3\u05D9 \u05DC\u05D4\u05E2\u05DC\u05D5\u05EA \u05D0\u05D5\u05EA\u05D4 \u05DC\u05D0\u05D5\u05D5\u05D9\u05E8)",
21924
+ heavyPage: "\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA \u05D8\u05D5\u05E2\u05DF {n} \u05E7\u05D1\u05E6\u05D9\u05DD \u05DE\u05D4\u05D0\u05EA\u05E8. \u05E4\u05D7\u05D5\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD \u05D6\u05D4 \u05D0\u05EA\u05E8 \u05DE\u05D4\u05D9\u05E8 \u05D9\u05D5\u05EA\u05E8 \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD.",
21925
+ prefetchPage: "\u05E2\u05DE\u05D5\u05D3 \u05D4\u05D1\u05D9\u05EA \u05D8\u05D5\u05E2\u05DF \u05E2\u05DE\u05D5\u05D3\u05D9\u05DD \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DE\u05D9\u05E9\u05D4\u05D5 \u05E4\u05D5\u05EA\u05D7 \u05D0\u05D5\u05EA\u05DD (prefetch). \u05DB\u05D9\u05D1\u05D5\u05D9 \u05E9\u05DC\u05D5 \u05D1\u05E8\u05E9\u05D9\u05DE\u05D5\u05EA \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D0\u05E8\u05D5\u05DB\u05D5\u05EA \u05D7\u05D5\u05E1\u05DA \u05DC\u05DE\u05D1\u05E7\u05E8\u05D9\u05DD \u05E0\u05EA\u05D5\u05E0\u05D9\u05DD.",
21926
+ speedHint: " \u05DC\u05D1\u05D3\u05D9\u05E7\u05D4: npx deployai@latest speed {url}",
21922
21927
  queueWaiting: "\u05DE\u05DE\u05EA\u05D9\u05DF \u05D1\u05EA\u05D5\u05E8, \u05DE\u05E7\u05D5\u05DD {n}",
21923
21928
  files: "\u05E7\u05D1\u05E6\u05D9\u05DD",
21924
21929
  skipped: "\u05D3\u05D9\u05DC\u05D2\u05E0\u05D5",
@@ -22050,7 +22055,7 @@ function messages(root) {
22050
22055
  }
22051
22056
 
22052
22057
  // src/version.ts
22053
- var CLI_VERSION = "0.1.0-beta.1";
22058
+ var CLI_VERSION = "0.1.0-beta.2";
22054
22059
 
22055
22060
  // src/api.ts
22056
22061
  function apiContext(apiFlag) {
@@ -23540,6 +23545,7 @@ async function deployVersion(root, ctx, opts, guest) {
23540
23545
  out(rows([[t("version"), `v${res.number}`], [t("queue"), queueText(res.queuePosition, root)], [t("address"), res.previewUrl]]));
23541
23546
  out();
23542
23547
  out(t("goesLive"));
23548
+ pageHint(res, root);
23543
23549
  return;
23544
23550
  }
23545
23551
  out(
@@ -23553,6 +23559,15 @@ async function deployVersion(root, ctx, opts, guest) {
23553
23559
  out(t("nextStep"));
23554
23560
  out(t("followBuild"));
23555
23561
  out(t("thenPromote", { n: res.number }));
23562
+ pageHint(res, root);
23563
+ }
23564
+ function pageHint(res, root) {
23565
+ if (!res.page) return;
23566
+ const t = messages(root);
23567
+ out();
23568
+ if (res.page.files > 40) out(t("heavyPage", { n: res.page.files }));
23569
+ if (res.page.prefetches) out(t("prefetchPage"));
23570
+ out(t("speedHint", { url: res.previewUrl.split("?")[0] }));
23556
23571
  }
23557
23572
  async function deployGuest(root, ctx, opts) {
23558
23573
  const message = (opts.message ?? "").trim() || "first version";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deployai",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.2",
4
4
  "description": "Check a site built with an AI editor, see what has to change, and publish it to DeployAI. Hebrew first.",
5
5
  "keywords": ["deployai", "deploy", "hosting", "cli", "ai", "claude-code", "cursor", "copilot", "codex", "antigravity", "static-site", "astro", "vite", "hebrew", "israel"],
6
6
  "homepage": "https://deployai.co.il/developers",