{"id":30295,"date":"2026-10-03T11:19:49","date_gmt":"2026-10-03T11:19:49","guid":{"rendered":"https:\/\/umang.pk\/2026\/10\/03\/next-js%d8%8c-aws%d8%8c-%d8%a7%d9%88%d8%b1-%d8%b3%db%8c%d9%86%da%88-%d8%a8%d8%a7%da%a9%d8%b3%d8%b2-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6\/"},"modified":"2026-10-03T11:19:54","modified_gmt":"2026-10-03T11:19:54","slug":"next-js%d8%8c-aws%d8%8c-%d8%a7%d9%88%d8%b1-%d8%b3%db%8c%d9%86%da%88-%d8%a8%d8%a7%da%a9%d8%b3%d8%b2-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/10\/03\/next-js%d8%8c-aws%d8%8c-%d8%a7%d9%88%d8%b1-%d8%b3%db%8c%d9%86%da%88-%d8%a8%d8%a7%da%a9%d8%b3%d8%b2-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6\/","title":{"rendered":"Next.js\u060c AWS\u060c \u0627\u0648\u0631 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 \u062e\u0648\u0628\u0635\u0648\u0631\u062a AI \u0627\u06cc\u067e \u0628\u0644\u0688\u0631 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4"},"content":{"rendered":"\n<div id=\"\">\n<p>Lovable\u060c Bolt\u060c \u0627\u0648\u0631 v0 \u062c\u06cc\u0633\u06d2 \u0679\u0648\u0644\u0632 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u062c\u0627\u062f\u0648 \u06a9\u06cc \u0637\u0631\u062d \u0645\u062d\u0633\u0648\u0633 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u0686 \u0645\u06cc\u06ba\u060c \u0645\u06cc\u06ba \u0646\u06d2 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0627\u06cc\u0633\u0627 \u06a9\u0686\u06be \u062f\u06cc\u06a9\u06be\u0627 \u062a\u0648 \u0645\u06cc\u06ba \u062d\u06cc\u0631\u0627\u0646 \u0631\u06c1 \u06af\u06cc\u0627 \u062a\u06be\u0627&#8230; \u0627\u0648\u0631 \u0622\u067e \u06cc\u06c1 \u0633\u0628 \u0686\u06cc\u0679 \u0645\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba! \u06cc\u06c1 \u0635\u0631\u0641 \u062c\u0646\u06af\u0644\u06cc \u062a\u06be\u0627\u06d4 \u0645\u062c\u06be\u06d2 \u06cc\u06c1 \u067e\u0648\u0631\u0627 \u0648\u062c\u0648\u062f\u06cc \u0628\u062d\u0631\u0627\u0646 \u0627\u0633 \u0648\u0642\u062a \u067e\u0691\u0627 \u062c\u0628 \u0645\u06cc\u06ba \u0646\u06d2 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0644\u0648 \u0627\u06cc\u0628\u0644 \u06a9\u0648 \u0622\u0632\u0645\u0627\u06cc\u0627\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u06a9\u06cc\u0627 \u0622\u067e \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u0633\u0648\u0686\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0648\u0627\u0642\u0639\u06cc \u0646\u06cc\u0686\u06d2 \u06a9\u06cc\u0627 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u061f \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u060c \u0627\u06cc\u06a9 \u0627\u06cc\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u06a9\u06cc\u0633\u06d2 \u0645\u0645\u06a9\u0646 \u06c1\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062e\u062a\u0644\u0641 \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06d2 \u062c\u0646 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1\u060c \u0627\u0634\u062a\u0631\u0627\u06a9\u060c \u0688\u0627\u0624\u0646 \u0644\u0648\u0688\u060c \u0648\u063a\u06cc\u0631\u06c1 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u061f<\/p>\n<p>\u06a9\u06c1\u06cc\u06ba\u060c \u0627\u06cc\u06a9 AI \u0645\u0627\u0688\u0644 \u06a9\u0648\u0688 \u0644\u06a9\u06be \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u0627\u0636\u062d \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u06a9\u06cc\u0633\u06d2\u061f \u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u0648\u0688 \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644\u060c \u0628\u0646\u0627\u0646\u06d2 \u0627\u0648\u0631 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u062c\u0633 \u0686\u06cc\u0632 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u062c\u06be\u06d2 \u062a\u06be\u0648\u0691\u0627 \u0633\u0627 \u0634\u0628\u06c1 \u062a\u06be\u0627 \u0648\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0646 \u062f\u0646\u0648\u06ba \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u0644\u06af\u062a\u0627 \u06a9\u06c1 \u06a9\u0648\u0688 \u06a9\u0648 \u067e\u06be\u0627\u0646\u0633\u06cc \u062f\u06cc\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u0691\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062e\u0631\u0627\u0628 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0633\u0633\u062a \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u0627 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0648\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0622\u067e \u06a9\u06d2 \u067e\u0648\u0631\u06d2 \u0633\u0633\u0679\u0645 \u06a9\u0627 \u0635\u0641\u0627\u06cc\u0627 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <code>rm -rf<\/code>. \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 AI \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06c1\u0648\u0627\u060c \u06c1\u0645 100% \u06cc\u0642\u06cc\u0646 \u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u06a9\u06c1\u06c1 \u0633\u06a9\u062a\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0648\u06c1 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u0645\u06cc\u06ba \u062a\u0648\u062c\u06c1 \u062f\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u06c1\u0645 \u0622\u067e \u06a9\u0627 \u0627\u067e\u0646\u0627 \u062f\u0644\u06a9\u0634 \u0627\u0646\u062f\u0627\u0632 AI \u0627\u06cc\u067e \u0628\u0644\u0688\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u06cc\u06c1 \u06a9\u0644\u0648\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627\u06d4 \u0628\u0644\u06a9\u06c1\u060c \u0622\u0626\u06cc\u06d2 \u0644\u0648 \u0627\u06cc\u0628\u0644 \u06a9\u06cc \u0645\u0646\u0637\u0642 \u067e\u0631 \u06af\u06c1\u0631\u06cc \u0646\u0638\u0631 \u0688\u0627\u0644\u06cc\u06ba \u0627\u0648\u0631 \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06a9\u06c1 \u06cc\u06c1 \u0639\u0645\u0644\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba UI \u06a9\u0648 \u0628\u06c1\u062a \u0628\u0646\u06cc\u0627\u062f\u06cc \u0631\u06a9\u06be\u0648\u06ba \u06af\u0627\u06d4<\/p>\n<p>\u06c1\u0645\u0627\u0631\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u06cc\u067e \u06a9\u0648 \u0633\u0627\u062f\u06c1 \u0627\u0646\u06af\u0631\u06cc\u0632\u06cc \u0645\u06cc\u06ba \u0628\u06cc\u0627\u0646 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 AI \u0627\u06cc\u062c\u0646\u0679 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u06a9\u0644\u0627\u0624\u0688 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u06a9\u0648\u0688 \u0644\u06a9\u06be\u06d2 \u06af\u0627\u06d4 AI \u0627\u067e\u0646\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0631\u06cc\u0626\u0644 \u0679\u0627\u0626\u0645 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1\u0627\u06ba \u0633\u06d2\u060c \u0635\u0627\u0631\u0641\u06cc\u0646 \u0686\u06cc\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062a\u0639\u0645\u06cc\u0631 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0648\u0631\u0698\u0646 \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u0644\u06a9 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u06cc\u0627\u0631 \u0634\u062f\u06c1 \u0627\u06cc\u067e \u06a9\u0648 \u0634\u0627\u0626\u0639 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-whats-covered-here\">\u06c1\u0645 \u06cc\u06c1\u0627\u06ba \u06a9\u06cc\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/h2>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u0622\u067e \u0633\u0628 \u06a9\u0686\u06be \u0634\u0631\u0648\u0639 \u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0627\u0633 \u06a9\u0648\u0631\u0633 \u0645\u06cc\u06ba \u0622\u067e \u062c\u0648 \u06a9\u0686\u06be \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u0648\u06c1 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>AI \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u06a9\u0648\u0688 \u06a9\u0648 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06cc\u0648\u06ba \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>30 \u0633\u06cc\u06a9\u0646\u0688 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 4 \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba \u0646\u06cc\u0627 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0627\u0633\u0646\u06cc\u067e \u0634\u0627\u0679\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062c\u0648 \u06a9\u0648\u0688 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u067e\u0646\u06d2 \u0627\u0639\u0645\u0627\u0644 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u067e\u0646\u06cc \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0648 \u062f\u0631\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0635\u0644 \u0648\u0642\u062a \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0627\u0633\u0679\u0631\u06cc\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 (\u062a\u0627\u06a9\u06c1 \u0635\u0641\u062d\u06c1 \u06a9\u06d2 \u062a\u0627\u0632\u06c1 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u06cc\u06c1 \u0636\u0627\u0626\u0639 \u0646\u06c1 \u06c1\u0648)<\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06c1\u0627\u0679 \u0631\u06cc \u0644\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0644\u0627\u0626\u06cc\u0648 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06cc\u0633\u06d2 \u0688\u0633\u067e\u0644\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u0679\u0648\u06a9\u0646 \u0688\u0627\u0644\u06d2 \u0628\u063a\u06cc\u0631 Git \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0645\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0648\u0631\u0698\u0646 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>\u0628\u06cc\u06a9\u0627\u0631 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u0633\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0633\u06d2 \u0631\u06a9\u06be\u06cc\u06ba\u060c \u0636\u0631\u0648\u0631\u062a \u067e\u0691\u0646\u06d2 \u067e\u0631 \u0627\u0633\u06d2 \u062c\u06af\u0627\u0626\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062d\u062a\u0645\u06cc \u0627\u06cc\u067e \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06cc\u06c1 \u06a9\u0686\u06be \u062c\u062f\u06cc\u062f \u062a\u0635\u0648\u0631\u0627\u062a \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0631\u0627\u0633\u062a\u06d2 \u0645\u06cc\u06ba \u0628\u06c1\u062a \u06a9\u0686\u06be \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4 \u0627\u0633\u06d2 \u0628\u0646\u0627\u062a\u06d2 \u0648\u0642\u062a \u06cc\u0642\u06cc\u0646\u0627\u064b \u0627\u06cc\u0633\u0627 \u06c1\u06cc \u062a\u06be\u0627\u06d4 <\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-whats-the-plan-the-architecture\">\u0645\u0646\u0635\u0648\u0628\u06d2 \u06a9\u06cc\u0627 \u06c1\u06cc\u06ba (\u0641\u0646 \u062a\u0639\u0645\u06cc\u0631)<\/h2>\n<p>\u06a9\u0648\u0688 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u06c1 \u0633\u0645\u062c\u06be\u0646\u0627 \u0645\u062f\u062f\u06af\u0627\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u06a9\u06cc\u0633\u06d2 \u0641\u0679 \u0628\u06cc\u0679\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u067e\u06c1\u0644\u06d2 \u0633\u0645\u062c\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0628\u06c1\u062a \u0633\u0627\u0631\u06d2 \u062a\u0635\u0648\u0631\u0627\u062a \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u067e \u06a9\u0648 \u062a\u06cc\u0646 \u0639\u0645\u0644\u0648\u06ba \u0627\u0648\u0631 \u062f\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u0645\u06cc\u06ba \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0686\u06cc\u0632 \u062c\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0645\u06cc\u06ba \u0634\u0631\u0648\u0639 \u0633\u06d2 \u06c1\u06cc \u0633\u062e\u062a \u062a\u06be\u0627 \u0648\u06c1 \u06cc\u06c1 \u062a\u06be\u0627 \u06a9\u06c1 \u0648\u06cc\u0628 \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u062e\u0648\u062f AI \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2\u06d4 \u0622\u067e \u062a\u06be\u0648\u0691\u06cc \u062f\u06cc\u0631 \u0628\u0639\u062f \u062f\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u06cc\u0648\u06ba \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0634\u0631\u0648\u0639 \u0633\u06d2 \u0627\u062e\u062a\u062a\u0627\u0645 \u062a\u06a9 \u0628\u06c1\u0627\u0624 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<h3 id=\"heading-sending-a-prompt\">\u067e\u0631\u0627\u0645\u067e\u0679 \u0628\u06be\u06cc\u062c\u06cc\u06ba\u06d4<\/h3>\n<p>\u062c\u0628 \u0635\u0627\u0631\u0641 \u067e\u0631\u0627\u0645\u067e\u0679 \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0648\u06cc\u0628 \u0627\u06cc\u067e (Next.js) \u0627\u0633\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c Postgres \u0645\u06cc\u06ba \u0627\u06cc\u06a9 &quot;Execut&#8221; \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u060c \u06a9\u0627\u0645 \u06a9\u0648 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0644\u06af\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0641\u0648\u0631\u0627\u064b \u0648\u0627\u067e\u0633 \u0622\u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u06a9\u0686\u06be HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0628 \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u0627\u067e\u0646\u0627 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-running-the-agent\">\u0627\u06cc\u062c\u0646\u0679 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f<\/h3>\n<p>\u0627\u06cc\u06a9 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0627 \u0639\u0645\u0644 \u06a9\u0627\u0645 \u06a9\u0648 \u0627\u0679\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06d2 \u06c1\u0645 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 LLM \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0679\u0648\u0644 \u06a9\u0627\u0644\u0632 \u062c\u0648 \u0627\u0633\u06d2 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba (\u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0646\u0627\u060c \u06a9\u0645\u0627\u0646\u0688\u0632 \u0686\u0644\u0627\u0646\u0627\u060c \u067e\u06cc\u06a9\u062c\u0632 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0648\u063a\u06cc\u0631\u06c1) \u062f\u0631\u0627\u0635\u0644 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06c1\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0631 \u0627\u06cc\u06a9 \u0642\u062f\u0645 \u06a9\u0648 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u06cc\u0648\u0646\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062d\u0641\u0648\u0638 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633 \u0637\u0631\u062d \u0628\u0631\u0627\u0624\u0632\u0631 \u0627\u0633\u06d2 \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-showing-the-preview\">\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062f\u06a9\u06be\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u067e \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u067e\u0646\u06d2 \u0648\u0627\u0626\u0679 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u067e\u0631 \u0686\u0644\u062a\u06cc \u06c1\u06d2\u06d4 \u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u06af\u06cc\u0679 \u0648\u06d2 \u0633\u0631\u0648\u0633 \u06c1\u06d2 \u062c\u0648 \u067e\u0631\u0627\u06a9\u0633\u06cc\u0646\u06af \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>http:\/\/<project-id>.preview.localhost:4000<\/project-id><\/code> \u0627\u0633 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u067e\u0631\u060c \u0628\u0634\u0645\u0648\u0644 WebSocket \u062c\u0648 Vite \u06af\u0631\u0645 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u0648\u0688 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06c1\u0630\u0627 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0633\u06cc \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u067e \u0688\u06cc\u0679 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u062c\u0628 \u0628\u06be\u06cc \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u0648\u06ba \u0627\u06cc\u0645\u0627\u0646\u062f\u0627\u0631\u06cc \u0633\u06d2 \u06cc\u06c1 \u0627\u0628 \u0628\u06be\u06cc \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u0645\u062d\u0633\u0648\u0633 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-saving-and-publishing\">\u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06a9\u0627\u0631\u06a9\u0646 \u0646\u0626\u06d2 \u0648\u0631\u0698\u0646 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u0631\u062a\u06a9\u0627\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u062c\u0628 \u0635\u0627\u0631\u0641 \u067e\u0628\u0644\u0634 \u067e\u0631 \u06a9\u0644\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0627\u06cc\u067e \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0679\u06cc\u0679\u06a9 \u0641\u0627\u0626\u0644\u0632 S3 \u067e\u0631 \u0627\u067e \u0644\u0648\u0688 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0634\u0627\u0626\u0639 \u0634\u062f\u06c1 \u0633\u0627\u0626\u0679 \u0627\u0633 \u0648\u0642\u062a \u0628\u06be\u06cc \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u0631\u06c1\u062a\u06cc \u06c1\u06d2 \u062c\u0628 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0633\u0644\u06cc\u067e \u0645\u0648\u0688 \u0645\u06cc\u06ba \u06c1\u0648\u06d4<\/p>\n<p>\u06cc\u06c1 \u06c1\u0645\u0627\u0631\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u0627\u0639\u0644\u06cc\u0670 \u0633\u0637\u062d\u06cc \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06c1\u06d2\u06d4 \u0633\u06cc\u062f\u06be\u06d2 \u0627\u0644\u0641\u0627\u0638 \u0645\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><strong>Next.js:<\/strong> UI \u0627\u0648\u0631 API \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0627\u0631\u06a9\u0646(Node.js +<\/strong> <code>pg-boss<\/code><strong>):<\/strong> \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u06af\u06cc\u0679 \u0648\u06d2 (Node.js \u067e\u0631\u0627\u06a9\u0633\u06cc):<\/strong> \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633:<\/strong> \u062d\u06cc\u062b\u06cc\u062a \u0627\u0648\u0631 \u06a9\u0627\u0645 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06cc \u067e\u0631\u062a\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0644\u0627\u0624\u0688 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633:<\/strong> \u067e\u06be\u0627\u0646\u0633\u06cc \u06a9\u06cc \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>S3 (\u0645\u0642\u0627\u0645\u06cc MinIO):<\/strong> \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u067e\u0631\u062a<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0637\u0644\u0648\u0628\u06c1 \u0627\u06cc\u0644 \u0627\u06cc\u0644 \u0627\u06cc\u0645 (\u0627\u0633 \u0645\u0639\u0627\u0645\u0644\u06d2 \u0645\u06cc\u06ba \u06a9\u0644\u0627\u0688 \u06cc\u0627 \u062c\u06cc \u067e\u06cc \u0679\u06cc):<\/strong> \u062a\u062e\u0645\u06cc\u0646\u06c1 \u067e\u0631\u062a<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"heading-why-do-we-need-a-sandbox\">\u0622\u067e \u06a9\u0648 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06cc\u0648\u06ba \u06c1\u06d2\u061f<\/h2>\n<p>\u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0633\u0648\u0686\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c \u067e\u0648\u0631\u06cc \u0645\u0635\u0646\u0648\u0639\u0627\u062a \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 &quot;\u0686\u0644\u0627\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06a9\u0648\u0688 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u06a9\u0633\u06cc \u0646\u06d2 \u062c\u0627\u0626\u0632\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06cc\u0627 \u06c1\u06d2\u06d4&#8221; \u0627\u06cc\u06a9 \u0645\u0634\u06cc\u0631 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c <code>npm install<\/code> \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0627\u0646\u0633\u0679\u0627\u0644\u06cc\u0634\u0646 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0627\u0646 \u067e\u06cc\u06a9\u062c\u0632 \u06a9\u0648 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631 \u0644\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u06a9\u0686\u06be \u0628\u06be\u06cc \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u0627\u0646 \u0633\u0628 \u06a9\u0648 \u0686\u0644\u0627\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u0633\u0627 \u06a9\u0648\u0626\u06cc \u0637\u0631\u06cc\u0642\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u0627\u067e\u0646\u06d2 \u0633\u0631\u0648\u0631 \u067e\u0631 \u0686\u0644\u0627\u0648\u06ba \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u0622\u067e \u06a9\u0648\u06d4<\/p>\n<p>\u0644\u06c1\u0630\u0627 \u06c1\u0631 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0644\u0627\u0624\u0688 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 VM \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0648 \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0622\u067e \u06a9\u0648 \u0648\u0627\u0642\u0639\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p><strong>\u0645\u0639\u0637\u0644 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba:<\/strong> \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0645\u0646\u0635\u0648\u0628\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0648\u0642\u062a \u0628\u06cc\u06a9\u0627\u0631 \u0631\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0627\u0646 \u06a9\u0648 \u0633\u0648\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u062a\u06be\u0627 \u0627\u0648\u0631 \u0633\u06cc\u06a9\u0646\u0688\u0648\u06ba \u0645\u06cc\u06ba \u0627\u0646 \u06a9\u06cc \u06cc\u0627\u062f\u0648\u06ba \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u062c\u06af\u0627\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0641\u0627\u0626\u0644\u06cc\u06ba\u060c \u06a9\u0645\u0627\u0646\u0688\u0632\u060c \u0627\u0648\u0631 \u0679\u0631\u0645\u06cc\u0646\u0644:<\/strong> \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u0627\u0648\u0631 \u0644\u06a9\u06be\u0646\u06d2 \u0627\u0648\u0631 \u06a9\u0645\u0627\u0646\u0688 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0627\u0635\u0644\u06cc \u0634\u06cc\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u0627 \u0627\u0686\u06be\u0627 \u062e\u06cc\u0627\u0644 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p> \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0627\u0633 \u0637\u0631\u062d \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u0686\u06cc\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0648\u0631 \u0628\u06be\u06cc \u0628\u06c1\u062a \u0633\u06cc \u0686\u06cc\u0632\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0645\u06cc\u0631\u06d2 \u0644\u06cc\u06d2 \u0635\u0631\u0641 \u06cc\u06c1\u06cc \u0686\u06cc\u0644\u0646\u062c\u0646\u06af \u062a\u0642\u0627\u0636\u06d2 \u062a\u06be\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0645 Tensorlake sandbox \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631\u060c \u0627\u0633 \u0645\u062e\u0635\u0648\u0635 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u062e\u0627\u0635 \u0648\u062c\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 E2B\u060c \u0688\u06cc\u0679\u0648\u0646\u0627\u060c \u0645\u0648\u0688\u0644 \u06cc\u0627 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u06c1\u0645\u0627\u0631\u0627 \u0627\u067e\u0646\u0627 \u0641\u0627\u0626\u0631 \u06a9\u0631\u06cc\u06a9\u0631 \u0633\u06cc\u0679 \u0627\u067e \u0633\u0628 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u0622\u067e \u0627\u067e\u0646\u06cc \u067e\u0633\u0646\u062f \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u0632\u0627\u062f \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u06a9\u0686\u06be \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679\u0633 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0628\u0627\u0644\u06a9\u0644 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u06c1\u0645\u0627\u0631\u06d2 \u062c\u06cc\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u0633\u062a \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u062a\u0645\u0627\u0645 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648\u0688 \u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u06cc\u06a9\u062c \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06c1\u06d2 (<code>packages\/sandbox<\/code>)\u06d4 \u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u0622\u067e \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06cc\u06c1 \u0648\u0627\u062d\u062f \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u0631\u0627\u0628\u0637\u06c1 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4 \u0628\u0627\u0642\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u06cc\u06c1 \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0645\u0639\u0644\u0648\u0645 \u06a9\u06c1 \u0648\u06c1 \u06a9\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0633\u06d2 \u0628\u0627\u062a \u06a9\u0631 \u0631\u06c1\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-set-up-the-project\">\u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc\u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0627\u0646\u0633\u0679\u0627\u0644 \u06c1\u06cc\u06ba:<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u0648\u0631 LLM (\u06cc\u0627 \u062a\u0648 \u0627\u0646\u062a\u06be\u0631\u0648\u067e\u06a9 \u06cc\u0627 \u0627\u0648\u067e\u0646 \u0627\u06d2 \u0622\u0626\u06cc\u060c \u062c\u0648 \u0628\u06be\u06cc \u0622\u067e \u0686\u0627\u06c1\u06cc\u06ba) \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 API \u06a9\u0644\u06cc\u062f \u06a9\u06cc \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<p>\u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0648 \u06a9\u0644\u0648\u0646 \u06a9\u0631\u06a9\u06d2 \u0627\u0648\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06a9\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/shricodev\/lovable-build-tensorlake-aws.git\ncd lovable-build-tensorlake-aws\npnpm install\n<\/code><\/pre>\n<p>\u0627\u06af\u0644\u0627\u060c \u0627\u06cc\u06a9 \u0645\u0627\u062d\u0648\u0644 \u0641\u0627\u0626\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u06a9\u0644\u06cc\u062f \u062f\u0631\u062c \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">cp .env.example .env\n# Add your sandbox and LLM keys, and generate AUTH_SECRET with:\nopenssl rand -base64 32\n<\/code><\/pre>\n<p>\u0627\u0628 \u0622\u0626\u06cc\u06d2 \u0645\u0642\u0627\u0645\u06cc \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u060c \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0679\u06cc\u0628\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0633\u0679\u0648\u0631\u06cc\u062c \u06a9\u06cc \u0628\u0627\u0644\u0679\u06cc\u0627\u06ba \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\"># Start Postgres and MinIO\npnpm infra:up\n\n# Create the database tables\npnpm db:migrate\n\n# Create the bucket and lock it down\npnpm s3:setup\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0645 \u0627\u06cc\u06a9 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u0633\u06d2 \u062a\u0645\u0627\u0645 \u0646\u0626\u06d2 \u0645\u0646\u0635\u0648\u0628\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba (\u0627\u0633 \u067e\u0631 \u0645\u0632\u06cc\u062f \u0628\u0639\u062f \u0645\u06cc\u06ba)\u06d4 \u0627\u0633 \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 45 \u0633\u06cc\u06a9\u0646\u0688 \u0644\u06af\u06cc\u06ba \u06af\u06d2:<\/p>\n<pre><code class=\"language-bash\">pnpm sandbox:build-base\n<\/code><\/pre>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0633\u0628 \u06a9\u0686\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba.<\/p>\n<pre><code class=\"language-bash\"># web on :3000, preview gateway on :4000\npnpm dev\n<\/code><\/pre>\n<p>\u06a9\u06be\u0644\u0627 <code>http:\/\/localhost:3000<\/code>\u0644\u0627\u06af \u0627\u0646 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u067e\u0646\u06cc \u0627\u06cc\u067e \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u06cc\u06ba\u06d4 \u0628\u0633! <\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u0627\u06cc\u067e GitHub \u0644\u0627\u06af \u0627\u0646 \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0644\u0627\u06af \u0627\u0646 \u0628\u06be\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0622\u067e \u0627\u067e\u0646\u06cc GitHub OAuth \u0627\u06cc\u067e \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06d2 \u0622\u0632\u0645\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0641\u06a9\u0631 \u0646\u06c1 \u06a9\u0631\u0648\u06d4 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0644\u0627\u06af \u0627\u0646 \u06c1\u0645\u06cc\u0634\u06c1 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-core-components-in-the-application\">\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u062c\u0632\u0627\u0621<\/h2>\n<p>\u06cc\u06c1 \u0645\u0646\u0635\u0648\u0628\u06c1 \u0628\u06c1\u062a \u0628\u0691\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0644\u0627\u0626\u0646 \u0628\u06c1 \u0644\u0627\u0626\u0646 \u067e\u0691\u06be\u0646\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1 \u0644\u06af\u06d2 \u06af\u0627\u060c \u0644\u06c1\u0630\u0627 \u0645\u06cc\u06ba \u0627\u0646 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0627\u062c\u0632\u0627\u0621 \u067e\u0631 \u062a\u0648\u062c\u06c1 \u062f\u0648\u06ba \u06af\u0627 \u062c\u0648 \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0688\u06cc\u0634 \u0628\u0648\u0631\u0688\u060c \u0644\u0627\u06af \u0627\u0646\u060c \u06a9\u0648\u0688 \u0627\u06cc\u0688\u06cc\u0679\u0631 \u0648\u063a\u06cc\u0631\u06c1 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u0648\u06ba \u06af\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0628\u06c1\u062a \u0639\u0627\u0645 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0630\u06cc\u0644 \u0645\u06cc\u06ba \u06a9\u0648\u0688 \u06a9\u0627 \u0679\u06a9\u0691\u0627 \u0627\u0633 \u06a9\u06d2 \u0627\u06c1\u0645 \u062d\u0635\u0648\u06ba \u0645\u06cc\u06ba \u0686\u06be\u0648\u0679\u0627 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u0645\u06cc\u06ba \u0645\u06a9\u0645\u0644 \u06a9\u0648\u0688 \u0645\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-starting-a-sandbox-fast\">\u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0644\u062f\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u062a\u0645\u0627\u0645 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u067e\u0633 \u0627\u06cc\u06a9 \u06c1\u06cc \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba: Vite\u060c React\u060c TypeScript\u060c Tailwind\u060c \u0627\u0648\u0631 \u0686\u0646\u062f \u0639\u0627\u0645 \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0627\u06ba\u06d4 \u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0633\u0627\u062f\u06c1 \u0637\u0631\u06cc\u0642\u06c1 \u06c1\u0631 \u0646\u0626\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p>\u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0628\u0646\u0627\u0626\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>\u0633\u0627\u0646\u0686\u06c1 \u0627\u067e \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0686\u0644\u0627\u0626\u06cc\u06ba <code>npm install<\/code><\/p>\n<\/li>\n<li>\n<p>\u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0627\u0633 \u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc\u0627\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0648\u0642\u062a \u0644\u06af\u0627\u06d4 <strong>33.4 \u0633\u06cc\u06a9\u0646\u0688<\/strong> \u0645\u06cc\u0631\u06d2 \u0679\u06cc\u0633\u0679\u0648\u06ba \u0645\u06cc\u06ba\u060c \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06d2\u06d4 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 (\u062a\u0642\u0631\u06cc\u0628\u0627\u064b 23 \u0633\u06cc\u06a9\u0646\u0688) <code>npm install<\/code> \u0627\u06cc\u06a9 \u0648\u06cc \u0633\u06cc \u067e\u06cc \u06cc\u0648 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627\u060c \u0644\u06cc\u06a9\u0646 \u062c\u0628 \u0628\u06be\u06cc \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0646\u06cc\u0627 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba\u060c \u0645\u06cc\u06ba \u062e\u0648\u062f \u06a9\u0648 \u0632\u06cc\u0627\u062f\u06c1 \u062f\u06cc\u0631 \u062a\u06a9 \u0627\u0633\u067e\u0646\u0631 \u06a9\u0648 \u06af\u06be\u0648\u0631\u062a\u0627 \u06c1\u0648\u0627 \u0646\u06c1\u06cc\u06ba \u067e\u0627\u062a\u0627\u06d4<\/p>\n<p>\u062d\u0644 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0633\u0628 \u06a9\u0686\u06be \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4 <strong>\u0627\u06cc\u06a9 \u0628\u0627\u0631<\/strong>\u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0627\u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba\u06d4 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0633\u0646\u06cc\u067e \u0634\u0627\u0679\u0633 \u0641\u0627\u0626\u0644\u0648\u06ba\u060c RAM\u060c \u0627\u0648\u0631 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0639\u0645\u0644 \u06a9\u0648 \u067e\u06a9\u0691\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627 \u062c\u0628 \u0622\u067e \u0628\u062d\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0622\u067e \u06a9\u0627 \u062a\u0631\u0642\u06cc\u0627\u062a\u06cc \u0633\u0631\u0648\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u0631\u06cc\u0628\u0648\u0679 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u0628\u0644\u0688\u0631 \u06a9\u0627 \u062c\u0648\u06c1\u0631 \u062d\u0633\u0628 \u0630\u06cc\u0644 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-ts\">export async function buildBaseSnapshot(log: Logger) {\n  \/\/ Cold path, done once: create, upload template, npm install, git init,\n  \/\/ verify it builds, start the dev server and warm up Vite's cache.\n  const { ps } = await coldCreateFromTemplate({\n    name: `base-${Date.now()}`,\n    log,\n    verify: true,\n  });\n\n  try {\n    \/\/ Memory checkpoint: files + RAM + running processes.\n    const snapshotId = await ps.checkpoint();\n    writeBaseSnapshot({ snapshotId, createdAt: new Date().toISOString() });\n  } finally {\n    await ps.terminate();\n  }\n}\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u06a9\u0633\u06cc \u0646\u0626\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0628\u0646\u0627\u0646\u0627 \u0635\u0631\u0641 \u0627\u0633\u06d2 \u0628\u062d\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0644\u0627\u06a9 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-ts\">static async createFromSnapshot(opts: { snapshotId: string; name: string; log: Logger }) {\n  const sb = await Sandbox.create({ snapshotId: opts.snapshotId, name: opts.name, timeoutSecs: 600 });\n  const ps = new ProjectSandbox(sb, opts.log);\n\n  await sb.update({\n    exposedPorts: [5173],              \/\/ the Vite dev server, reachable through the proxy\n    allowUnauthenticatedAccess: false, \/\/ the port URL is never public\n    network: {\n      allowInternetAccess: true,\n      allowOut: [\"registry.npmjs.org\"], \/\/ npm and nothing else\n      denyOut: [],\n    },\n  });\n  return ps;\n}\n<\/code><\/pre>\n<p>\u06cc\u06c1\u0627\u06ba \u0686\u0646\u062f \u0628\u0627\u062a\u06cc\u06ba \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><code>exposedPorts<\/code>    \u0622\u067e \u0627\u067e\u0646\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u067e\u0631\u0627\u06a9\u0633\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u067e\u0646\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u0633\u06d2 \u062c\u0691 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062c\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 API \u06a9\u0644\u06cc\u062f \u06c1\u0648\u06d4 \u06c1\u0645 \u0627\u0633\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u06af\u06cc\u0679 \u0648\u06d2 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u06c1 <code>network<\/code> \u0628\u0644\u0627\u06a9 \u0627\u06cc\u06a9 \u0648\u0627\u0626\u0679 \u0644\u0633\u0679 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0628\u0627\u0631 <code>allowOut<\/code> \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0622\u0626\u0679\u0645 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u062a\u0648 \u062f\u06cc\u06af\u0631 \u062a\u0645\u0627\u0645 \u0622\u0626\u0679\u0645\u0632 \u06a9\u0648 \u0645\u0633\u062f\u0648\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4  <\/p>\n<p> \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u06cc\u0627\u06d4 <code>example.com<\/code>\u060c <code>github.com<\/code>\u06a9\u0644\u0627\u0624\u0688 \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 \u0622\u0626\u06cc \u067e\u06cc \u0648\u063a\u06cc\u0631\u06c1 \u0633\u0628\u06be\u06cc \u06a9\u0648 \u0628\u0644\u0627\u06a9 \u06a9\u0631\u062f\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627 \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u0646 \u067e\u06cc \u0627\u06cc\u0645 \u0646\u06d2 \u067e\u06be\u0631 \u0628\u06be\u06cc \u0679\u06be\u06cc\u06a9 \u06a9\u0627\u0645 \u06a9\u06cc\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0631\u0627\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06a9\u0648\u0626\u06cc LLM \u06a9\u0644\u06cc\u062f \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 URL \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc AWS \u06a9\u0644\u06cc\u062f \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0627\u06af\u0631 \u0627\u06cc\u06a9 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u067e \u06cc\u0627 \u0641\u0648\u0631\u06cc \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u06a9\u0686\u06be \u0686\u0648\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0648\u06c1\u0627\u06ba \u0686\u0648\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06d2 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634\u06cc\u06ba \u06cc\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0633\u0691\u06a9<\/th>\n<th>\u06af\u06be\u0646\u0679\u06c1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u06a9\u0648\u0644\u0688 (\u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba)<\/td>\n<td>33.4 \u0633\u06cc\u06a9\u0646\u0688<\/td>\n<\/tr>\n<tr>\n<td>\u0645\u06cc\u0645\u0648\u0631\u06cc \u0627\u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u0633\u06d2 \u0628\u062d\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<td>4.0 \u0633\u06cc\u06a9\u0646\u0688<\/td>\n<\/tr>\n<tr>\n<td>\u0633\u0648\u0626\u06d2 \u06c1\u0648\u0626\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u062c\u06af\u0627\u0626\u06cc\u06ba\u06d4<\/td>\n<td>2.4 \u0633\u06cc\u06a9\u0646\u0688<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u06cc\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 8 \u06af\u0646\u0627 \u062a\u06cc\u0632 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u062a\u0646\u0627 \u0679\u06be\u0646\u0688\u0627 \u06c1\u06d2\u061f <\/p>\n<h3 id=\"heading-the-agent-loop\">\u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0644\u0648\u067e \u067e\u0648\u0631\u06d2 \u0646\u0638\u0627\u0645 \u06a9\u0627 \u062f\u0645\u0627\u063a \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06c1\u0631 \u0628\u0627\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0635\u0627\u0631\u0641 \u06a9\u0648\u0626\u06cc \u067e\u0631\u0627\u0645\u067e\u0679 \u0628\u06be\u06cc\u062c\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062e\u06cc\u0627\u0644\u060c \u0686\u0627\u06c1\u06d2 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0646\u06c1 \u06c1\u0648\u060c \u0633\u0627\u062f\u06c1 \u06c1\u06d2\u06d4 \u0627\u067e\u0646\u06d2 LLM \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u0642\u0635\u062f \u0627\u0648\u0631 \u06a9\u0686\u06be \u0679\u0648\u0644\u0632 \u062f\u06cc\u06ba\u060c \u0627\u0633\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0641\u06cc\u0688 \u0628\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 \u0627\u0639\u0627\u062f\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0634\u06cc\u0631\u0648\u06ba \u06a9\u0648 \u0645\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u0648\u0644\u0632 \u06cc\u06c1 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><code>list_files<\/code>\u060c <code>read_file<\/code>\u060c <code>write_file<\/code>\u060c <code>edit_file<\/code>\u0627\u0648\u0631 <code>delete_file<\/code><\/p>\n<\/li>\n<li>\n<p><code>run_command<\/code>    \u0627\u0633 \u0637\u0631\u062d \u0641\u0648\u0631\u06cc \u0686\u06cc\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2: <code>npx tsc --noEmit<\/code><\/p>\n<\/li>\n<li>\n<p><code>install_packages<\/code>    \u0627\u06cc\u0646 \u067e\u06cc \u0627\u06cc\u0645 \u067e\u06cc\u06a9\u06cc\u062c \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><code>get_dev_server_logs<\/code>    \u0627\u0648\u0631 <code>get_browser_errors<\/code> \u0688\u06cc\u0628\u06af\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2<\/p>\n<\/li>\n<li>\n<p><code>finish<\/code>\u0627\u06cc\u062c\u0646\u0679 \u0627\u0633\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u0627\u0633\u06d2 \u0644\u06af\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u06c1\u0648 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06c1\u0631 \u0679\u0648\u0644 \u0632\u0648\u0688 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u062a\u0627 \u06c1\u06d2\u06d4 <code>run<\/code> \u0641\u0646\u06a9\u0634\u0646 \u06cc\u06c1\u0627\u06ba <code>edit_file<\/code> \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631:<\/p>\n<pre><code class=\"language-ts\">export const editFile = defineTool({\n  name: \"edit_file\",\n  description:\n    \"Replace one exact snippet in a file. `search` must match exactly and occur exactly once.\",\n  schema: z.object({\n    path: z.string(),\n    search: z.string().min(1),\n    replace: z.string(),\n  }),\n  async run({ path, search, replace }, { sandbox }) {\n    const text = await sandbox.readFile(path);\n    const count = text.split(search).length - 1;\n    if (count !== 1) {\n      return {\n        isError: true,\n        content: `search text occurs ${count} times in ${path}`,\n      };\n    }\n    await sandbox.writeFile(\n      path,\n      text.replace(search, () => replace),\n    );\n    return { content: `Edited ${path}`, changedFiles: [path] };\n  },\n});\n<\/code><\/pre>\n<p>Zod \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06cc\u06c1\u0627\u06ba \u062f\u0648 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: LLM \u06a9\u06d2 \u0644\u06cc\u06d2 JSON \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 ( <code>z.toJSONSchema<\/code>) \u06cc\u06c1 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0633\u06d2 \u0679\u06a9\u0631\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0627\u0688\u0644 \u06a9\u06cc \u0628\u06be\u06cc\u062c\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u06cc \u062a\u0648\u062b\u06cc\u0642 \u0628\u06be\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0627\u0646 \u067e\u0679 \u063a\u0644\u0637 \u06c1\u06d2 \u062a\u0648\u060c \u067e\u0648\u0631\u06d2 \u0639\u0645\u0644 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u0627\u0688\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062e\u0631\u0627\u0628\u06cc \u0648\u0627\u067e\u0633 \u0622 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0627\u0635\u0644 \u0644\u0648\u067e \u0686\u0644\u062a\u0627 \u06c1\u06d2.<\/p>\n<pre><code class=\"language-ts\">while (true) {\n  if (signal.aborted) return result(\"cancelled\");\n\n  const res = await llm.chat({\n    system: SYSTEM_PROMPT,\n    messages,\n    tools,\n    signal,\n    onText,\n  });\n  messages.push(res.message);\n\n  const results = [];\n  for (const call of res.message.toolCalls) {\n    const out = await executeTool(call.name, call.input, ctx); \/\/ validate + run\n    results.push({\n      type: \"tool_result\",\n      toolCallId: call.id,\n      content: out.content,\n      isError: out.isError,\n    });\n    if (out.finish) finishCalled = true;\n  }\n\n  if (!finishCalled) {\n    messages.push({ role: \"user\", content: results });\n    continue;\n  }\n\n  \/\/ The agent says it's done. Now we check. (next section)\n}\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>llm.chat<\/code> \u06a9\u0627\u0644 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0631\u06cc\u067e\u0631 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u0646\u062a\u06be\u0631\u0648\u067e\u06a9 \u0627\u0648\u0631 \u0627\u0648\u067e\u0646 \u0627\u06d2 \u0622\u0626\u06cc \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633 \u0633\u06d2 \u0622\u067e UI \u0645\u06cc\u06ba \u0688\u0631\u0627\u067e \u0688\u0627\u0624\u0646 \u0633\u06d2 \u0645\u0627\u0688\u0644\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0646\u062a\u06be\u0631\u0648\u067e\u06a9 \u0633\u0627\u0626\u06cc\u0688 \u067e\u0631\u060c \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u06a9\u06cc\u0634\u0646\u06af \u06a9\u0648 \u0641\u0639\u0627\u0644 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631\u060c \u06cc\u06c1 \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0628\u0648\u062c\u06be \u06a9\u0648 \u0628\u0686\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0645\u0648\u0691 120,000 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0679\u0648\u06a9\u0646 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0633\u0628\u06be\u06cc \u0633\u06cc\u062f\u06be\u06d2 \u06a9\u06cc\u0634\u06d2 \u0633\u06d2 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h4 id=\"heading-keeping-file-paths-safe\">\u0641\u0627\u0626\u0644 \u06a9\u06d2 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u0646\u0627<\/h4>\n<p>\u0627\u0628 \u06cc\u06c1 \u062a\u06be\u0648\u0691\u0627 \u0633\u0627 \u0688\u0631\u067e\u0648\u06a9 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0645\u062c\u06be\u06d2 \u06cc\u06c1 \u0627\u0633 \u0644\u06cc\u06d2 \u0645\u0644\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u0631\u062f \u06af\u0631\u062f \u06a9\u0686\u06be \u06a9\u06be\u062f\u0627\u0626\u06cc \u06a9\u06cc \u062a\u06be\u06cc\u06d4 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0641\u0627\u0626\u0644 API \u062f\u0631\u062c \u0630\u06cc\u0644 \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <code>..<\/code> \u0644\u06cc\u06a9\u0646 \u062e\u0648\u0634\u06cc \u0633\u06d2 <strong>\u0639\u0644\u0627\u0645\u062a\u06cc \u0644\u0646\u06a9\u0633 \u067e\u0631 \u0639\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong>. \u062a\u0648 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u06c1 \u06a9\u0648\u0688 \u06c1\u06d2\u06d4 <code>leak.txt<\/code> \u0627\u0633 \u0633\u06d2 \u0645\u0631\u0627\u062f \u06c1\u06d2\u06d4 <code>\/etc\/passwd<\/code>\u067e\u0691\u06be\u0646\u0627 <code>leak.txt<\/code> \u06c1\u0645 \u0622\u067e \u06a9\u06cc \u067e\u0627\u0633 \u0648\u0631\u0688 \u0641\u0627\u0626\u0644 \u0648\u0627\u067e\u0633 \u06a9\u0631 \u062f\u06cc\u06ba \u06af\u06d2\u06d4 \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06c1\u0630\u0627 \u062a\u0645\u0627\u0645 \u0641\u0627\u0626\u0644 \u0679\u0648\u0644\u0632 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u0686\u06be\u0648\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0627\u0635\u0644 \u0631\u0627\u0633\u062a\u06c1 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-ts\">async safePath(relPath: string) {\n  const abs = resolveProjectPath(relPath); \/\/ rejects \"..\", absolute paths, NUL bytes\n  const r = await this.sb.run(\"realpath\", { args: [\"-m\", \"--\", abs] });\n  const real = r.stdout.trim();\n  if (!isInsideApp(real)) throw new SandboxPathError(relPath, \"resolves outside the project\");\n  return real;\n}\n<\/code><\/pre>\n<p><code>realpath -m<\/code>    \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u0639\u0644\u0627\u0645\u062a\u06cc \u0631\u0648\u0627\u0628\u0637 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0631\u0627\u0633\u062a\u06c1 \u062f\u0631\u0627\u0635\u0644 \u06a9\u06c1\u0627\u06ba \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0627\u0644 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc \u0627\u06af\u0631 \u067e\u0631\u0627\u062c\u06cc\u06a9\u0679 \u0641\u0648\u0644\u0688\u0631 \u06a9\u06d2 \u0628\u0627\u06c1\u0631 \u062e\u062a\u0645 \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<h4 id=\"heading-keeping-the-context-small\">\u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u06a9\u0648 \u0686\u06be\u0648\u0679\u0627 \u0631\u06a9\u06be\u06cc\u06ba<\/h4>\n<p>\u06c1\u0631 \u0646\u0626\u06d2 \u067e\u0631\u0627\u0645\u067e\u0679 \u067e\u0631 \u062a\u0645\u0627\u0645 \u067e\u0686\u06be\u0644\u06cc \u0679\u0648\u0644 \u06a9\u0627\u0644\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u06c1\u0631 \u0645\u0648\u0691 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0688\u0627\u0626\u06cc\u0644\u0627\u06af \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p>\u06c1\u0631 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0648\u0691 \u06a9\u0627 \u0627\u06cc\u06a9 \u0633\u0637\u0631\u06cc \u062e\u0644\u0627\u0635\u06c1 (\u0635\u0627\u0631\u0641 \u0646\u06d2 \u06a9\u06cc\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06cc \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679 \u0646\u06d2 \u06a9\u06cc\u0627 \u06a9\u06cc\u0627)<\/p>\n<\/li>\n<li>\n<p>\u0641\u0627\u0626\u0644 \u0679\u0631\u06cc \u0627\u0648\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u0634\u062f\u06c1 \u067e\u06cc\u06a9\u062c\u0648\u06ba \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a<\/p>\n<\/li>\n<li>\n<p>\u0622\u062c <code>src\/App.tsx<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0627\u0633 \u0622\u0644\u06d2 \u06a9\u0648 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0627\u0633\u06d2 \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba 20 \u067e\u0631\u0627\u0645\u067e\u0679\u0633 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0628\u06be\u06cc \u06cc\u06c1 \u06af\u0631\u062f\u0634 \u06a9\u06cc \u0644\u0627\u06af\u062a \u06a9\u0648 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0641\u0644\u06cc\u0679 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-letting-the-agent-check-its-own-work\">\u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0627\u0646 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0627\u0639\u0645\u0627\u0644 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>LLM \u0648\u0627\u0642\u0639\u06cc \u0627\u0639\u062a\u0645\u0627\u062f \u0633\u06d2 \u0645\u062a\u0627\u062b\u0631 \u06a9\u0646 \u06c1\u06d2\u06d4 \u0648\u06c1 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u0628\u062a\u0627\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062e\u0648\u0634 \u06c1\u0648\u06ba \u06af\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u062a\u0639\u0645\u06cc\u0631 \u0688\u06cc\u0641\u0627\u0644\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0633\u0628 \u06a9\u0686\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0648 \u062c\u0628 \u0627\u06cc\u062c\u0646\u0679 \u0628\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>finish<\/code>\u06c1\u0645 \u0635\u0631\u0641 \u0627\u0633 \u06a9\u06d2 \u0644\u0626\u06d2 \u0627\u0646 \u06a9\u06d2 \u0627\u0644\u0641\u0627\u0638 \u0646\u06c1\u06cc\u06ba \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631\u060c \u06c1\u0645 \u062a\u06cc\u0646 \u0686\u06cc\u06a9 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-ts\">export async function runChecks(sandbox: ProjectSandbox) {\n  const tsc = await sandbox.exec(\"npx tsc --noEmit -p . 2>&1\", {\n    timeoutSecs: 120,\n  });\n  const build = await sandbox.exec(\n    \"npx vite build --outDir \/tmp\/build --emptyOutDir --logLevel error 2>&1\",\n    { timeoutSecs: 180 },\n  );\n  const render = await renderCheck(sandbox); \/\/ renders the app once in a fake DOM\n\n  return {\n    ok: tsc.exitCode === 0 && build.exitCode === 0 && render.ok,\n    typecheck: { ok: tsc.exitCode === 0, output: tsc.stdout },\n    build: { ok: build.exitCode === 0, output: build.stdout },\n    render,\n  };\n}\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06d2 \u062f\u0648 \u06a9\u0627\u0641\u06cc \u0648\u0627\u0636\u062d \u06c1\u06cc\u06ba\u06d4 \u062a\u06cc\u0633\u0631\u0627 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u06cc\u06c1 \u062f\u0644\u0686\u0633\u067e \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u06c1\u062a \u0633\u06d2 \u06a9\u06cc\u0691\u06d2 \u0635\u0631\u0641 \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>Cannot read properties of undefined (reading 'map')<\/code>. \u0627\u0633 \u06a9\u0627 \u0645\u0639\u0645\u0648\u0644 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u06c1\u06cc\u0688 \u0644\u06cc\u0633 \u0628\u0631\u0627\u0624\u0632\u0631 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0645\u06cc\u06ba \u0648\u0627\u0642\u0639\u062a\u0627 \u0627\u0633 \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u062a\u06be\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u0628\u06be\u0627\u0631\u06cc \u0627\u0648\u0631 \u0633\u0633\u062a \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<p>\u0644\u06c1\u0630\u0627 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0637\u0631\u062d: <code>happy-dom<\/code> (Node.js \u0645\u06cc\u06ba \u062c\u0639\u0644\u06cc DOM) \u0627\u0648\u0631 \u0648\u0627\u0626\u0679 <code>ssrLoadModule<\/code>:<\/p>\n<pre><code class=\"language-js\">GlobalRegistrator.register({ url: \"http:\/\/localhost:5173\/\" });\ndocument.body.innerHTML = '';\nconsole.error = (...args) => errors.push(args.join(\" \"));\n\nawait server.ssrLoadModule(\"\/src\/main.tsx\"); \/\/ runs the real app entry\nawait new Promise((r) => setTimeout(r, 1500)); \/\/ let React render\n\nconst rendered = document.getElementById(\"root\").innerHTML.trim().length > 0;\nconsole.log(\n  JSON.stringify({ ok: rendered && errors.length === 0, rendered, errors }),\n);\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 2 \u0633\u06cc\u06a9\u0646\u0688 \u0644\u06cc\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2\u06d4 <code>undefined.map<\/code> \u0635\u062d\u06cc\u062d \u0644\u0627\u0626\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0635\u0627\u062f\u0645 <code>App.tsx<\/code>. \u0679\u06be\u06cc\u06a9 \u06c1\u06d2<\/p>\n<p>\u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0686\u06cc\u06a9 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u063a\u0644\u0637\u06cc \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06be\u06cc\u062c \u062f\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679 \u0627\u0633\u06d2 \u0679\u06be\u06cc\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0633\u0631\u0627 \u0686\u06a9\u0631 \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-ts\">lastCheck = await runChecks(sandbox);\nif (lastCheck.ok) return result(\"succeeded\");\nif (healRounds >= maxHeal)\n  return result(\"failed\", { error: describeFailures(lastCheck) });\n\nhealRounds++;\nmessages.push({\n  role: \"user\",\n  content: [\n    ...results,\n    {\n      type: \"text\",\n      text: `Verification failed. Fix these problems, then call finish again.nn${describeFailures(lastCheck)}`,\n    },\n  ],\n});\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u06cc\u06c1 3 \u0631\u0627\u0624\u0646\u0688 \u06a9\u06d2 \u0628\u0639\u062f \u0631\u06a9 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0628\u06be\u06cc \u06cc\u06c1 \u0679\u0648\u0679 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0627\u0635\u0644 \u063a\u0644\u0637\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u062f\u0648 \u0679\u0648\u06a9 &quot;\u06cc\u06c1 \u0622\u067e\u0631\u06cc\u0634\u0646 \u0645\u06a9\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627&#8221; \u06a9\u0627 \u067e\u06cc\u063a\u0627\u0645 \u0645\u0644\u06d2 \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-streaming-progress-to-the-browser\">\u0627\u067e\u0646\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u0633\u0679\u0631\u06cc\u0645 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u06a9\u0627\u0631\u06a9\u0646 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0635\u0627\u0631\u0641 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u06cc \u0637\u0631\u0641 \u062f\u06cc\u06a9\u06be \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u062a\u0648 \u06a9\u0633\u06cc \u0646\u06c1 \u06a9\u0633\u06cc \u0637\u0631\u062d \u0645\u06cc\u06ba \u0646\u06d2 \u06c1\u0631 \u0642\u062f\u0645 \u0644\u06a9\u06be\u0627 (&#8221; <code>src\/App.tsx<\/code>&quot;\u060c&#8221; <code>npx tsc --noEmit<\/code>&quot;\u060c&#8221; \u067e\u0627\u0633 \u0634\u062f\u06c1 \u0645\u0639\u0627\u0626\u0646\u06c1&#8221; \u0648\u063a\u06cc\u0631\u06c1)\u060c \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u0633\u06d2 \u062f\u0648\u0633\u0631\u06cc \u062c\u06af\u06c1 \u062c\u0627\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0627\u0631\u06a9\u0646 \u06c1\u0631 \u0642\u062f\u0645 \u06a9\u0648 \u0627\u06cc\u06a9 \u0642\u0637\u0627\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>run_events<\/code> \u0679\u06cc\u0628\u0644 \u0686\u0644\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4 <code>NOTIFY<\/code>:<\/p>\n<pre><code class=\"language-ts\">export async function appendEvent(\n  db: Db,\n  e: { projectId: string; runId?: string; type: string; payload: unknown },\n) {\n  const [row] = await db\n    .insert(runEvents)\n    .values(e)\n    .returning({ id: runEvents.id });\n  await db.$client.notify(\n    \"events\",\n    JSON.stringify({ projectId: e.projectId, id: row.id }),\n  );\n  return row.id;\n}\n<\/code><\/pre>\n<p>\u0648\u06cc\u0628 \u0633\u0627\u0626\u0688 \u067e\u0631\u060c Next.js \u0631\u0648\u0679 \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0627\u0646 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0648 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u0633\u0679\u0631\u06cc\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0631\u0648\u0631 \u06a9\u06d2 \u0628\u06be\u06cc\u062c\u06d2 \u06af\u0626\u06d2 \u0627\u06cc\u0648\u0646\u0679\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0628\u0631\u0627\u0624\u0632\u0631 \u062c\u0691\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9\u0679\u0648 \u0631\u0646 \u0645\u06cc\u06ba \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0646\u0626\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba \u0648\u0635\u0648\u0644 \u06a9\u0631\u0646\u0627 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-ts\">const pump = async () => {\n  const rows = await db\n    .select()\n    .from(runEvents)\n    .where(and(eq(runEvents.projectId, project.id), gt(runEvents.id, cursor)))\n    .orderBy(asc(runEvents.id));\n\n  for (const r of rows) {\n    cursor = r.id;\n    send(`id: ${r.id}ndata: ${JSON.stringify(r)}nn`);\n  }\n};\n\nbus.on(project.id, pump); \/\/ fired by a single LISTEN connection per process\npump(); \/\/ replay first\n<\/code><\/pre>\n<p>\u062a\u0645\u0627\u0645 \u0648\u0627\u0642\u0639\u0627\u062a \u0688\u06cc\u0679\u0627\u0628\u06cc\u0633 \u0645\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 \u0627\u06af\u0631 \u0622\u067e \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0635\u0641\u062d\u06c1 \u06a9\u0648 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0622\u067e \u06a9\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0646\u0642\u0635\u0627\u0646 \u067e\u06c1\u0646\u0686\u06d2 \u06af\u0627\u06d4 \u0628\u0631\u0627\u0624\u0632\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062c\u0648\u0691\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0628 \u062a\u06a9 \u0631\u0646 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u06c1\u0627\u06ba \u0686\u06be\u0648\u0691\u0627 \u062a\u06be\u0627 \u0648\u06c1\u06cc\u06ba \u0633\u06d2 \u062c\u0627\u0631\u06cc \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0679\u0627\u067e \u0628\u0679\u0646 \u0627\u0633\u06cc \u0637\u0631\u062d \u0645\u062e\u0627\u0644\u0641 \u0633\u0645\u062a \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06cc\u0628 \u0627\u06cc\u067e \u0628\u06be\u06cc\u062c\u062a\u06cc \u06c1\u06d2: <code>NOTIFY<\/code> \u0648\u06c1 \u06a9\u0627\u0631\u06a9\u0646 \u062c\u0648 \u067e\u06be\u0627\u0646\u0633\u06cc \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0648 \u0631\u0648\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> LLM \u0645\u06cc\u06ba \u0633\u0679\u0631\u06cc\u0645 \u0634\u062f\u06c1 \u0679\u06cc\u06a9\u0633\u0679 \u0679\u0648\u06a9\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u067e\u06cc\u0634 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06c1\u0631 \u0645\u0648\u0691 \u067e\u0631 \u0633\u06cc\u0646\u06a9\u0691\u0648\u06ba \u0642\u0637\u0627\u0631\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u0633\u06d2 \u0628\u0641\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06c1\u0631 250ms \u067e\u0631 \u0627\u06cc\u06a9 \u0642\u0637\u0627\u0631 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0633\u0627 \u0628\u06af \u0628\u06be\u06cc \u062a\u06be\u0627 \u062c\u06c1\u0627\u06ba \u0648\u0627\u0642\u0639\u0627\u062a \u062a\u0631\u062a\u06cc\u0628 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06c1\u0631 \u062a\u062d\u0631\u06cc\u0631 \u0627\u0633 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u0648\u0639\u062f\u06c1 \u062a\u06be\u0627\u06d4 \u062a\u0645\u0627\u0645 \u062a\u062d\u0631\u06cc\u0631\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0639\u062f\u06d2 \u06a9\u06cc \u0632\u0646\u062c\u06cc\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u0646\u06d2 \u0633\u06d2 \u0645\u0633\u0626\u0644\u06c1 \u062d\u0644 \u06c1\u0648\u06af\u06cc\u0627\u06d4<\/p>\n<h3 id=\"heading-the-live-preview-gateway\">\u0644\u0627\u0626\u06cc\u0648 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06af\u06cc\u0679 \u0648\u06d2<\/h3>\n<p>\u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u067e \u06a9\u0627 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u067e\u0648\u0631\u0679 5173 \u067e\u0631 \u0627\u06cc\u06a9 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u0633\u06d2 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u067e\u0631 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>https:\/\/5173-<sandbox-id>.sandbox.example<\/sandbox-id><\/code>. \u0627\u0628 \u0622\u067e \u0627\u0633 URL \u06a9\u0648 iframe \u0645\u06cc\u06ba \u0688\u0627\u0644 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u062f\u0646 \u06a9\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u0645\u06cc\u06ba \u062f\u0648 \u0645\u0633\u0627\u0626\u0644 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ol>\n<li>\n<p>\u0622\u067e \u06a9\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u0648 \u0644\u0648\u0688 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 API \u06a9\u0644\u06cc\u062f \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4 \u06c1\u0627\u06ba\u060c \u0638\u0627\u06c1\u0631 \u06c1\u06d2 \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0648\u0631 \u0627\u06af\u0631 \u06c1\u0645 \u0627\u0633 URL \u06a9\u0648 \u0639\u0648\u0627\u0645\u06cc \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u062c\u0648 \u0628\u06be\u06cc \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u0627 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 \u0627\u0633\u06d2 \u06a9\u06be\u0648\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06c1\u0645\u0627\u0631\u0627 \u0627\u0633 \u067e\u0631 \u06a9\u0648\u0626\u06cc \u0627\u062e\u062a\u06cc\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u06a9\u06cc\u0627 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0644\u06c1\u0630\u0627 \u06c1\u0645 \u0646\u06d2 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u0645\u0646\u06d2 \u0627\u067e\u0646\u0627 \u0686\u06be\u0648\u0679\u0627 \u06af\u06cc\u0679 \u0648\u06d2 \u0628\u0646\u0627\u06cc\u0627\u06d4 \u0644\u06cc\u0688 <code><project-id>.preview.localhost:4000<\/project-id><\/code> \u0627\u0633\u06d2 \u062f\u0627\u0626\u06cc\u06ba \u0637\u0631\u0641 \u06a9\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0633\u0631\u0648\u0631 \u06a9\u06cc \u0637\u0631\u0641 API \u06a9\u0644\u06cc\u062f \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-ts\">const proxy = createProxyServer({ changeOrigin: true, secure: true, ws: true });\n\nconst server = http.createServer(async (req, res) => {\n  const projectId = HOST_RE.exec(req.headers.host ?? \"\")?.[1];\n  const target = await resolve(projectId); \/\/ project -> sandbox, cached for a few seconds\n  if (!target.sandboxId) return send(res, noPreviewPage());\n\n  delete req.headers.cookie; \/\/ never forward the visitor's credentials\n  delete req.headers.authorization;\n  proxy.web(req, res, {\n    target: previewUrlFor(target.sandboxId),\n    headers: { authorization: `Bearer ${API_KEY}` },\n  });\n});\n\n\/\/ Vite's hot reload runs over a WebSocket, so upgrades get proxied too.\nserver.on(\"upgrade\", async (req, socket, head) => {\n  const target = await resolve(HOST_RE.exec(req.headers.host ?? \"\")?.[1]);\n  proxy.ws(req, socket, head, {\n    target: previewUrlFor(target.sandboxId).replace(\/^https\/, \"wss\"),\n    headers: { authorization: `Bearer ${API_KEY}` },\n  });\n});\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>upgrade<\/code> \u06c1\u06cc\u0646\u0688\u0644\u0631 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0648 \u0632\u0646\u062f\u06c1 \u0645\u062d\u0633\u0648\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0628\u06be\u06cc \u06a9\u0648\u0626\u06cc \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0633\u06cc \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c Vite \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0648 WebSocket \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u0648\u0688 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u067e \u0688\u06cc\u0679 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0648\u062c\u06c1 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06af\u06cc\u0679 \u0648\u06cc\u0632 \u0622\u0633\u0627\u0646\u06cc \u0633\u06d2 \u0686\u06be\u0648\u0679 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0627\u0633 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2: <strong>\u0645\u062e\u062a\u0644\u0641 \u0627\u0635\u0644<\/strong> (<code>*.preview.localhost<\/code>) \u0645\u06cc\u0646 \u0627\u06cc\u067e (<code>localhost:3000<\/code>)\u06d4 \u0644\u06c1\u0630\u0627\u060c \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0627\u06cc\u067e \u0645\u0642\u0627\u0645\u06cc \u0627\u06cc\u067e \u06a9\u06cc \u06a9\u0648\u06a9\u06cc\u0632 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be \u0633\u06a9\u062a\u06cc \u06c1\u06d2 \u06cc\u0627 \u0644\u0627\u06af \u0627\u0646 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0628\u0637\u0648\u0631 \u0627\u0633 \u06a9\u06d2 API \u06a9\u0648 \u06a9\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u062a\u0628 \u0633\u06d2 <code>*.localhost<\/code> \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u06cc\u06ba <code>127.0.0.1<\/code> \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u0624\u0632\u0631\u0632 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0686\u06be\u0648\u0646\u06d2 \u06a9\u06cc \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u0645\u0632\u06cc\u062f \u0628\u0631\u0622\u06ba\u060c \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0627\u0633\u06a9\u0631\u067e\u0679 \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0633\u0646\u062a\u0627 \u06c1\u06d2: <code>window.onerror<\/code>\u067e\u06cc\u0631\u0646\u0679 \u0648\u0646\u0688\u0648 \u067e\u0631 \u067e\u0648\u0633\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u0648\u0631\u06a9 \u0627\u0633\u067e\u06cc\u0633 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688 \u067e\u0631 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u06c1\u0627\u06ba \u0627\u06cc\u062c\u0646\u0679 <code>get_browser_errors<\/code> \u0679\u0648\u0644 \u06a9\u0648 \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06cc \u0627\u0635\u0644 \u062e\u0631\u0627\u0628\u06cc \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-versions-with-git\">Git \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0648\u0631\u0698\u0646<\/h3>\n<p>\u06c1\u0631 \u0645\u06a9\u0645\u0644 \u067e\u0631\u0627\u0645\u067e\u0679 \u0627\u06cc\u06a9 \u0648\u0631\u0698\u0646 \u0628\u0646 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u062a\u0642\u0631\u06cc\u0628\u0627 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 &quot;\u067e\u0631\u0627\u0645\u067e\u0679&#8221; \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u06cc\u0633\u06d2: <code>git reset<\/code>.<\/p>\n<p>\u0627\u0633 \u0645\u0642\u0635\u062f \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0631\u0648\u0627\u06cc\u062a\u06cc \u06af\u0679 \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0627\u0633\u0646\u06cc\u067e \u0634\u0627\u0679 \u0645\u06cc\u06ba \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u067e\u06c1\u0644\u06cc \u06a9\u0645\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06c1\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u0645\u0648\u0691 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0631\u06a9\u0646 \u0633\u0628 \u06a9\u0686\u06be \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-ts\">export async function commitAll(ps: ProjectSandbox, message: string) {\n  const out = await git(\n    ps,\n    `git add -A\nif git diff --cached --quiet; then\n  echo NOCHANGE\nelse\n  git commit -q -m \"$MSG\"\n  git rev-parse HEAD\n  git show --name-only --format= HEAD\nfi`,\n    { MSG: message },\n  );\n  if (out.trim() === \"NOCHANGE\") return null;\n  const [sha, ...files] = out.trim().split(\"n\");\n  return { sha, files };\n}\n<\/code><\/pre>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u0622\u067e \u0633\u0648\u0686 \u0631\u06c1\u06d2 \u06c1\u0648\u06ba \u06af\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u06a9\u06cc\u0648\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>exit 0<\/code> \u0648\u06c1\u0627\u06ba\u06d4 \u0633\u06d2 \u0627\u062d\u06a9\u0627\u0645 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>bash -l<\/code>\u0627\u0648\u0631 \u0648\u0627\u0636\u062d <code>exit<\/code> \u0644\u0627\u06af \u0627\u0646 \u0634\u06cc\u0644 \u0633\u06d2 \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4 <code>~\/.bash_logout<\/code>\u0627\u0633 \u062a\u0635\u0648\u06cc\u0631 \u0645\u06cc\u06ba\u060c \u0622\u062e\u0631\u06cc \u06a9\u0645\u0627\u0646\u0688 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u06af\u0626\u06cc\u060c \u0627\u06cc\u06af\u0632\u0679 \u06a9\u0648\u0688 \u06a9\u0648 \u0646\u0627\u06a9\u0627\u0645 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627\u06d4 \u0627\u06cc\u0645\u0627\u0646\u062f\u0627\u0631\u06cc \u0633\u06d2 \u06cc\u06c1 \u0645\u0639\u0644\u0648\u0645 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062c\u06be\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0642\u062a \u0644\u06af\u0627\u06d4 <\/p>\n<p>\u0628\u062d\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u062f\u0648\u0628\u0627\u0631\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06a9\u06be\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u067e\u0686\u06be\u0644\u06cc \u06a9\u0645\u0679 \u06a9\u06cc \u0637\u0631\u062d \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u067e\u06be\u0631 \u0627\u0633\u06d2 \u0646\u0626\u06d2 \u0648\u0631\u0698\u0646 \u06a9\u06cc \u0637\u0631\u062d \u06a9\u0645\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627 &quot;\u0631\u06cc\u0633\u0679\u0648\u0631 \u0648\u0631\u0698\u0646 1&#8221; \u0648\u0631\u0698\u0646 5 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0622\u067e \u062c\u0628 \u0686\u0627\u06c1\u06cc\u06ba \u0648\u0631\u0698\u0646 4 \u067e\u0631 \u0648\u0627\u067e\u0633 \u062c\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u06be\u0648\u062a\u06d2\u06d4<\/p>\n<h4 id=\"heading-keeping-the-history-durable-without-tokens-in-the-sandbox\">\u062a\u0627\u0631\u06cc\u062e \u06a9\u06cc \u0627\u0633\u062a\u0642\u0627\u0645\u062a \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u06cc\u06ba (\u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0679\u0648\u06a9\u0646 \u0646\u06c1\u06cc\u06ba)<\/h4>\n<p>\u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06af\u0679 \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0635\u0631\u0641 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u0648\u06d4 \u0644\u06c1\u0630\u0627\u060c \u06c1\u0631 \u0648\u0631\u0698\u0646 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u062a\u0627\u0631\u06cc\u062e \u06a9\u0648 \u0645\u06cc\u0632\u0628\u0627\u0646 Git \u0630\u062e\u06cc\u0631\u06c1 \u0645\u06cc\u06ba \u0628\u06be\u06cc \u062f\u06be\u06a9\u06cc\u0644 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u0633\u0627 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0622\u0633\u0627\u0646 \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u06af\u0679 \u0679\u0648\u06a9\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba: <code>git push<\/code>. \u0644\u06cc\u06a9\u0646 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u06cc \u062c\u0633 \u062d\u062f \u062a\u06a9 \u0645\u06cc\u0631\u06cc \u0631\u0633\u0627\u0626\u06cc \u06c1\u06d2 \u0648\u06c1 \u06cc\u06c1 \u06c1\u06d2: <strong>\u067e\u0648\u0631\u06d2 \u0645\u0646\u0635\u0648\u0628\u06d2<\/strong>\u06cc\u06c1 \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06a9\u06cc\u0627 \u0622\u067e \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06a9\u0648 \u0646\u0627\u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u06a9\u0648\u0688 \u0633\u06d2 \u0628\u06be\u0631\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u0688\u0627\u0644\u06cc\u06ba \u06af\u06d2\u061f \u06c1\u0627\u06ba\u060c \u0646\u06c1\u06cc\u06ba\u06d4 \u0634\u06a9\u0631\u06cc\u06c1<\/p>\n<p>\u0644\u06c1\u0630\u0627 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u062f\u06be\u06a9\u06cc\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06c1 <code>git bundle<\/code> (\u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 \u0641\u0627\u0626\u0644 \u06a9\u0627 \u067e\u0648\u0631\u0627 \u0630\u062e\u06cc\u0631\u06c1) \u06a9\u0627\u0631\u06a9\u0646 \u0627\u0633 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0631\u06a9\u0646 \u062e\u0648\u062f \u06c1\u06cc \u062f\u06be\u06a9\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-ts\">export async function pushToHostedGit(\n  ps: ProjectSandbox,\n  repo: string,\n  dataDir: string,\n) {\n  await git(ps, \"git bundle create -q \/tmp\/repo.bundle main\");\n  const bundle = await ps.sb.readFile(\"\/tmp\/repo.bundle\");\n\n  const mirror = join(dataDir, \"git\", `${repo}.git`); \/\/ a bare repo on the worker\n  writeFileSync(join(mirror, \"incoming.bundle\"), bundle);\n  await run(\"git\", [\n    \"-C\",\n    mirror,\n    \"fetch\",\n    \"-q\",\n    \"--force\",\n    \"incoming.bundle\",\n    \"+refs\/heads\/main:refs\/heads\/main\",\n  ]);\n\n  const cred = await repos.credential(repo); \/\/ short lived token, only on the worker\n  await run(\"git\", [\n    \"-C\",\n    mirror,\n    \"-c\",\n    `http.extraHeader=Authorization: Basic ${basic(cred)}`,\n    \"push\",\n    \"-q\",\n    \"--force\",\n    url,\n    \"main\",\n  ]);\n}\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u0627 \u0627\u06cc\u06a9 \u0627\u0686\u06be\u0627 \u0636\u0645\u0646\u06cc \u0627\u062b\u0631 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0637\u0627\u0642\u062a \u0628\u06be\u06cc \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 <strong>\u0631\u06cc\u0645\u06a9\u0633<\/strong>. \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0645\u0634\u062a\u0631\u06a9\u06c1 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u06a9\u06d2 \u0630\u062e\u06cc\u0631\u06d2 \u0633\u06d2 \u0633\u0648\u0631\u0633 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0688\u0644 \u06a9\u0648 \u0646\u0626\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0635\u0644 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u062c\u06af\u0627\u0646\u06d2 \u06a9\u06cc \u0628\u06be\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-sleeping-waking-and-sharing-the-sandboxes\">\u0633\u0648\u0626\u06cc\u06ba\u060c \u062c\u0627\u06af\u06cc\u06ba \u0627\u0648\u0631 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u067e\u0631 \u067e\u06cc\u0633\u06d2 \u062e\u0631\u0686 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0627\u0633 \u067e\u0631 \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627 \u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0633\u0627 \u06a9\u0627\u0645 \u06c1\u06d2 \u062c\u0648 \u06c1\u0631 \u0645\u0646\u0679 \u0686\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06af\u0631 \u0627\u06cc\u062c\u0646\u0679 10 \u0645\u0646\u0679 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u0686\u0644\u0627 \u062a\u0648 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u0645\u0639\u0637\u0644 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0639\u0637\u0644\u06cc \u0645\u06cc\u0645\u0648\u0631\u06cc \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0622\u067e \u06a9\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0645\u0646\u0679 \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633\u06cc \u0637\u0631\u062d \u0648\u0627\u067e\u0633 \u0644\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u0628\u06cc\u062f\u0627\u0631\u06cc \u06af\u06cc\u0679 \u0648\u06d2 \u067e\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u06a9\u0633\u06cc \u0646\u06cc\u0646\u062f \u06a9\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u06be\u0648\u0644\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u06af\u06cc\u0679 \u0648\u06d2 \u062a\u06be\u0648\u0691\u0627 \u0633\u0627 &quot;\u0648\u06cc\u06a9 \u0627\u067e \u0627\u06cc\u067e&#8230;&#8221; \u0635\u0641\u062d\u06c1 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u067e\u0633 \u0645\u0646\u0638\u0631 \u0645\u06cc\u06ba \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u0645\u0633\u0644\u0633\u0644 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-ts\">if (isPage && target.status === \"suspended\") {\n  const outcome = wake(projectId, target, log); \/\/ deduplicated per project\n  const done = await Promise.race([outcome, timeout(4000, \"pending\")]);\n  if (done === \"busy\") return send(res, busyPage());\n  if (done !== \"running\") return send(res, wakingPage()); \/\/ auto refreshes\n}\n<\/code><\/pre>\n<p>\u0645\u06cc\u0631\u06cc \u062c\u0627\u0646\u0686 \u0645\u06cc\u06ba\u060c \u0633\u0648\u0626\u06d2 \u06c1\u0648\u0626\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 3 \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba \u0628\u06cc\u062f\u0627\u0631 \u06c1\u0648 \u06af\u0626\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u067e \u0641\u0648\u0631\u0627\u064b \u0644\u0648\u0688 \u06c1\u0648 \u06af\u0626\u06cc\u06d4 <\/p>\n<h4 id=\"heading-sharing-a-limited-number-of-sandboxes\">\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633\u0632 \u06a9\u06cc \u0645\u062d\u062f\u0648\u062f \u062a\u0639\u062f\u0627\u062f<\/h4>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2\u060c \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u0645\u0641\u062a \u067e\u0644\u0627\u0646\u0632 \u067e\u0631\u060c \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633\u0632 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f \u06a9\u0648 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0622\u067e \u0628\u06cc\u06a9 \u0648\u0642\u062a \u0686\u0644\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u06c1\u0630\u0627 \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u06a9\u0646\u06a9\u0631\u0646\u0633\u06cc \u0686\u06cc\u06a9\u0631 \u0634\u0627\u0645\u0644 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u06cc\u06c1 \u0633\u0628 \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u0688\u0648\u0627\u0626\u0632\u0631\u06cc \u0644\u0627\u06a9\u0646\u06af \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0644\u06c1\u0630\u0627 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u062f\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u0627\u06cc\u06a9 \u06c1\u06cc \u0648\u0642\u062a \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u06c1\u06cc \u0641\u06cc\u0635\u0644\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-ts\">async function decide(db: Db, projectId: string) {\n  return db.transaction(async (tx) => {\n    await tx.execute(sql`select pg_advisory_xact_lock(${LOCK_KEY})`);\n\n    const live = await runningSandboxesOldestFirst(tx);\n    if (live.some((s) => s.projectId === projectId)) return { kind: \"ok\" };\n    if (live.length < concurrencyLimit()) return { kind: \"ok\" };\n\n    \/\/ Full. Free a slot by suspending the least recently used idle sandbox.\n    const victim = live.find((s) => !busyProjects.has(s.projectId));\n    if (victim) return { kind: \"evict\", sandboxId: victim.sandboxId };\n\n    return { kind: \"wait\", position }; \/\/ everything is busy, just wait...\n  });\n}\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06c1\u0645 \u0646\u06d2 \u062d\u062f \u06a9\u0648 1 \u067e\u0631 \u0633\u06cc\u0679 \u06a9\u06cc\u0627 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u06cc\u0627 \u062c\u0628 \u06a9\u06c1 \u062f\u0648\u0633\u0631\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0627 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0628\u06cc\u06a9\u0627\u0631 \u062a\u06be\u0627\u06d4 \u0628\u06cc\u06a9\u0627\u0631 \u062d\u0627\u0644\u062a \u0646\u06cc\u0646\u062f \u0645\u06cc\u06ba \u0686\u0644\u06cc \u06af\u0626\u06cc \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0646\u0626\u06cc \u0686\u06cc\u0632 \u0646\u06d2 \u0627\u0633 \u0633\u0644\u0627\u0679 \u06a9\u0648 \u0644\u06d2 \u0644\u06cc\u0627\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u0627\u06cc\u06a9 \u067e\u0631\u0627\u0645\u067e\u0679 \u0628\u06be\u06cc\u062c\u0627 \u062c\u0628\u06a9\u06c1 \u062f\u0648\u0633\u0631\u0627 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0627\u0628\u06be\u06cc \u0628\u06be\u06cc \u06a9\u0627\u0645 \u06a9\u0631 \u0631\u06c1\u0627 \u062a\u06be\u0627\u060c \u0627\u0648\u0631 UI \u0646\u06d2 \u0633\u0644\u0627\u0679 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u062a\u06a9 &quot;\u0645\u0641\u062a \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631\u060c #1 \u0644\u0627\u0626\u0646 \u0645\u06cc\u06ba&#8221; \u062f\u06a9\u06be\u0627\u06cc\u0627\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u0628\u0691\u06d2 \u0645\u0646\u0635\u0648\u0628\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u0635\u0631\u0641 \u062d\u062f \u0628\u0691\u06be\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>.env<\/code> \u0627\u0633 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0628\u062f\u0644\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-publishing-the-app\">\u0627\u067e\u0646\u06cc \u0627\u06cc\u067e \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u06a9\u0631\u0646\u0627 \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u062a\u0627 \u06a9\u06c1 \u0645\u06cc\u0631\u06cc \u0634\u0627\u0626\u0639 \u0634\u062f\u06c1 \u0627\u06cc\u067e \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u067e\u0631 \u0627\u0646\u062d\u0635\u0627\u0631 \u06a9\u0631\u06d2 \u062c\u0648 \u06c1\u0631 10 \u0645\u0646\u0679 \u0628\u0639\u062f \u0633\u0644\u06cc\u067e \u0645\u0648\u0688 \u0645\u06cc\u06ba \u0686\u0644\u0627 \u062c\u0627\u0626\u06d2\u06d4 <\/p>\n<p>\u0644\u06c1\u0630\u0627 \u0627\u0634\u0627\u0639\u062a \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0628\u0646\u0627\u0626\u06d2 \u06af\u06cc \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u062c\u0627\u0645\u062f \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062f\u06d2 \u06af\u06cc\u06d4<\/p>\n<pre><code class=\"language-ts\">export async function publish(project: Project) {\n  const ps = await projectSandbox(project.id); \/\/ wakes it if needed\n  const build = await ps.exec(\n    \"rm -rf dist && npx vite build --outDir dist --emptyOutDir 2>&1\",\n    { timeoutSecs: 180 },\n  );\n  if (build.exitCode !== 0)\n    throw new HttpError(422, `The build failed:n${build.stdout.slice(-1500)}`);\n\n  const files = await listFiles(ps, \"dist\");\n  const prefix = `published\/${slug}\/${versionId}\/`;\n\n  for (const f of files) {\n    const bytes = await ps.readBytes(`dist\/${f}`);\n    await storage.put(prefix + f, bytes, contentTypeFor(f), cacheControlFor(f));\n  }\n\n  await savePublishedSite({ projectId: project.id, slug, s3Prefix: prefix });\n  return { url: publishedUrl(slug) };\n}\n<\/code><\/pre>\n<p>\u06af\u06cc\u0679 \u0648\u06d2 \u067e\u06be\u0631 S3 \u0633\u06d2 \u0627\u0646 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u06cc \u062e\u062f\u0645\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 <code>http:\/\/<slug>.app.localhost:4000<\/slug><\/code>. \u0641\u0627\u0626\u0644\u06cc\u06ba \u062c\u0648 Vite \u06c1\u06cc\u0634 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062c\u06cc\u0633\u06d2 <code>assets\/index-CScgwd68.js<\/code>) \u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0634 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 <code>index.html<\/code> \u0627\u0633 \u06a9\u06cc \u06c1\u0645\u06cc\u0634\u06c1 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0622\u067e \u06a9\u0648 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u067e \u0688\u06cc\u0679\u0633 \u0646\u0638\u0631 \u0622\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0641\u0627\u0626\u0644 \u0627\u06cc\u06a9\u0633\u0679\u06cc\u0646\u0634\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u0645\u0627\u0645 \u0631\u0627\u0633\u062a\u06d2 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062f\u06cc\u0626\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba: <code>index.html<\/code>\u0644\u06c1\u0630\u0627 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0633\u0627\u0626\u06cc\u0688 \u0631\u0648\u0679\u0646\u06af \u0628\u06be\u06cc \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0648\u0631 \u0634\u0627\u0626\u0639 \u0634\u062f\u06c1 \u0633\u0627\u0626\u0679 \u06a9\u0627 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0627\u067e\u0646\u0627 \u0630\u06cc\u0644\u06cc \u0688\u0648\u0645\u06cc\u0646 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u0645\u0631\u06a9\u0632\u06cc \u0627\u06cc\u067e \u06a9\u06d2 \u0688\u0648\u0645\u06cc\u0646 \u06a9\u06d2 \u062a\u062d\u062a \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u06a9\u06cc \u0634\u0627\u0626\u0639 \u0634\u062f\u06c1 \u0627\u06cc\u067e \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f JavaScript \u0627\u0633\u06d2 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0634\u062e\u0635 \u06a9\u06cc \u06a9\u0648\u06a9\u06cc\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0622\u067e \u06a9\u06d2 API \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0622\u067e \u0648\u0627\u0642\u0639\u06cc \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <\/p>\n<p>\u0645\u06cc\u0631\u06cc \u062c\u0627\u0646\u0686 \u0645\u06cc\u06ba\u060c \u0627\u0634\u0627\u0639\u062a \u0645\u06cc\u06ba \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 6 \u0633\u06cc\u06a9\u0646\u0688 \u0644\u06af\u06d2 \u0627\u0648\u0631 \u0634\u0627\u0626\u0639 \u0634\u062f\u06c1 \u0633\u0627\u0626\u0679 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0644\u0627\u06a9 \u06a9\u06d2 \u0633\u0627\u062a\u06be 4ms \u0645\u06cc\u06ba \u0644\u0648\u0688 \u06c1\u0648 \u06af\u0626\u06cc \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633 \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0648 \u06c1\u0627\u062a\u06be \u0646\u06c1\u06cc\u06ba \u0644\u06af\u0627\u06cc\u0627\u06d4<\/p>\n<h2 id=\"heading-app-builder-in-action\">\u0627\u06cc\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0627\u06cc\u067e \u0628\u0644\u0688\u0631<\/h2>\n<p>\u0639\u0645\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u067e \u0628\u0644\u0688\u0631 \u06a9\u0627 \u0627\u06cc\u06a9 \u0641\u0648\u0631\u06cc \u0688\u06cc\u0645\u0648 \u06cc\u06c1 \u06c1\u06d2:<\/p>\n<p><div class=\"ast-oembed-container \" style=\"height: 100%;\"><iframe loading=\"lazy\" title=\"App Builder like Lovable | Project Demo | freeCodeCamp\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/hE96nLJo_fc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/p>\n<p>\u0645\u06cc\u06ba \u0646\u06d2 \u062a\u062c\u0633\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06cc \u0633\u06cc \u062a\u0634\u062e\u06cc\u0635 \u0628\u06be\u06cc \u06a9\u06cc\u06d4 \u0646\u0626\u06d2 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u0645\u06cc\u06ba \u0648\u06c1\u06cc \u062a\u06cc\u0646 \u067e\u0631\u0627\u0645\u067e\u0679\u0633 (\u06c1\u06cc\u0628\u06cc\u0679 \u0679\u0631\u06cc\u06a9\u0631\u060c \u06a9\u0646\u0628\u0646 \u0628\u0648\u0631\u0688\u060c \u0627\u0648\u0631 \u0686\u0627\u0631\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0644\u0627\u06af\u062a \u06a9\u0627 \u0688\u06cc\u0634 \u0628\u0648\u0631\u0688) \u06c1\u0631 \u062f\u0648 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0628\u06be\u06cc\u062c\u06cc\u06ba\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0645\u0627\u0688\u0644<\/th>\n<th>\u067e\u0627\u0633 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 (\u062a\u0639\u0645\u06cc\u0631 + \u0631\u06cc\u0646\u0688\u0631)<\/th>\n<th>\u0627\u0648\u0633\u0637 \u0648\u0642\u062a<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u06a9\u0644\u0627\u0688 \u0633\u0648\u0646\u06cc\u0679 5<\/td>\n<td>3\/3<\/td>\n<td>135 \u0633\u06cc\u06a9\u0646\u0688<\/td>\n<\/tr>\n<tr>\n<td>GPT 5.5<\/td>\n<td>3\/3<\/td>\n<td>92 \u06a9\u06cc \u062f\u06c1\u0627\u0626\u06cc<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u062a\u0645\u0627\u0645 \u0686\u06be \u0627\u06cc\u067e\u0633 \u0646\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u0639\u0627\u0626\u0646\u06c1 \u067e\u0631 \u0628\u0646\u0627\u06cc\u0627 \u0627\u0648\u0631 \u067e\u06cc\u0634 \u06a9\u06cc\u0627\u060c \u062c\u0633 \u0646\u06d2 \u0627\u06cc\u0645\u0627\u0646\u062f\u0627\u0631\u06cc \u0633\u06d2 \u0645\u062c\u06be\u06d2 \u062a\u06be\u0648\u0691\u0627 \u0633\u0627 \u062d\u06cc\u0631\u0627\u0646 \u06a9\u0631\u062f\u06cc\u0627\u06d4 \u06a9\u0644\u0627\u0688 \u067e\u0631\u060c \u06c1\u0631 \u0627\u06cc\u067e \u06a9\u06cc \u0642\u06cc\u0645\u062a \u062a\u0642\u0631\u06cc\u0628\u0627\u064b $0.15 \u0633\u06d2 $0.20 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u062a\u0648 \u0622\u067e \u0627\u0633 \u0645\u0646\u0635\u0648\u0628\u06d2 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u0633\u0648\u0686\u062a\u06d2 \u06c1\u06cc\u06ba\u061f AI \u0646\u06d2 \u062e\u0627\u0645 \u06a9\u0648\u0688\u0646\u06af \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06cc\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0633\u06d2 \u06cc\u06c1 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0641\u0631\u06cc\u062d\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0631\u06c1\u0627 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u0645\u06cc\u06ba \u0646\u06d2 \u062a\u06be\u0648\u0691\u06cc \u062f\u06cc\u0631 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 <\/p>\n<p>Lovable \u062c\u06cc\u0633\u06d2 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u06cc\u06c1 \u0633\u0648\u0686\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0634\u0627\u0631\u06d2 \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u06c1\u06cc \u0633\u0628 \u06a9\u0686\u06be \u06c1\u06cc\u06ba\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0627\u0633\u06d2 \u062e\u0648\u062f \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0627\u062d\u0633\u0627\u0633 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0627\u0645 \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06c1\u0648\u062a\u0627 \u06c1\u06d2: \u06a9\u0648\u0688 \u06a9\u06c1\u0627\u06ba \u0633\u06d2 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u06a9\u062a\u0646\u06cc \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u06cc\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0627\u06cc\u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u0631\u0648\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc\u06ba \u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0686\u06cc\u0632 \u067e\u0631 \u0632\u0648\u0631 \u062f\u06cc\u0646\u0627 \u0686\u0627\u06c1\u062a\u0627 \u06c1\u0648\u06ba \u062a\u0648 \u0648\u06c1 \u0633\u06cc\u0646\u0688 \u0628\u0627\u06a9\u0633 \u06a9\u0627 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 AI \u0633\u06d2 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u06a9\u0648\u0688 \u06a9\u0648 \u0646\u0627\u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0633\u0645\u062c\u06be\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u0633 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u06a9\u0645\u067e\u06cc\u06a9\u0679 \u0633\u0633\u0679\u0645 \u062f\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0631\u0627\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u06cc\u0679 \u0648\u0631\u06a9 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u0645 \u06c1\u06d2\u06d4 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0627\u0633\u0646\u06cc\u067e \u0634\u0627\u0679\u0633 \u0627\u0648\u0631 \u0645\u0639\u0637\u0644\/\u0631\u06cc\u0632\u06cc\u0648\u0645 \u062a\u06cc\u0632 \u0627\u0648\u0631 \u0633\u0633\u062a\u06cc \u067e\u0631\u0648\u0633\u06cc\u0633\u0646\u06af \u06a9\u0648 \u0642\u0627\u0628\u0644 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0628 \u0628\u06be\u06cc \u062a\u0648\u0633\u06cc\u0639 \u06a9\u06cc \u0628\u06c1\u062a \u06af\u0646\u062c\u0627\u0626\u0634 \u06c1\u06d2\u06d4 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u0645\u06cc\u06ba \u0686\u06be\u0648\u0679\u06d2 \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688\u0632 (\u062c\u06cc\u0633\u06d2 Hono \u0627\u0648\u0631 SQLite) \u0634\u0627\u0645\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0627\u06a9\u06c1 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0627\u0633\u0679\u06cc\u06a9 \u0627\u06cc\u067e\u0633 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc \u062c\u0627 \u0633\u06a9\u06d2\u060c \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0627\u0646 \u0627\u062c\u0632\u0627\u0621 \u06a9\u0648 \u062f\u0631\u0633\u062a \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u06cc\u0634 \u0646\u0638\u0627\u0631\u06c1 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u0639\u0646\u0627\u0635\u0631 \u067e\u0631 \u06a9\u0644\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06ba\u060c \u06cc\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u0631\u0627\u0645\u067e\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u06a9\u0626\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc \u0645\u062e\u062a\u0644\u0641 \u062d\u0627\u0644\u062a\u06cc\u06ba \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4 \u0645\u06cc\u06ba \u0627\u0628 \u0627\u0633\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u0628\u06c1\u062a \u062a\u06be\u06a9 \u06af\u06cc\u0627 \u06c1\u0648\u06ba. \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u062a\u0645 \u067e\u0631 \u0686\u06be\u0648\u0691 \u062f\u0648\u06ba \u06af\u0627\u06d4 <\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f \u0648\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0628\u0627\u0642\u06cc \u0635\u0631\u0641 \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2.<\/p>\n<p>\u0622\u067e \u06a9\u0648 \u0645\u06a9\u0645\u0644 \u0633\u0648\u0631\u0633 \u06a9\u0648\u0688 \u06cc\u06c1\u0627\u06ba \u0645\u0644 \u0633\u06a9\u062a\u0627 \u06c1\u06d2: shricodev\/lovable-build-tensorlake-aws<\/p>\n<p>\u0627\u0633 \u0645\u0636\u0645\u0648\u0646 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06cc\u06c1\u06cc \u06c1\u06d2\u06d4 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u0627 \u0628\u06c1\u062a \u0634\u06a9\u0631\u06cc\u06c1! \u0627\u06af\u0644\u06cc \u0628\u0627\u0631 \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Lovable\u060c Bolt\u060c \u0627\u0648\u0631 v0 \u062c\u06cc\u0633\u06d2 \u0679\u0648\u0644\u0632 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u062c\u0627\u062f\u0648 \u06a9\u06cc \u0637\u0631\u062d \u0645\u062d\u0633\u0648\u0633 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u0686 \u0645\u06cc\u06ba\u060c \u0645\u06cc\u06ba \u0646\u06d2 \u067e\u06c1\u0644\u06cc \u0628\u0627\u0631 \u0627\u06cc\u0633\u0627 \u06a9\u0686\u06be \u062f\u06cc\u06a9\u06be\u0627 \u062a\u0648 \u0645\u06cc\u06ba \u062d\u06cc\u0631\u0627\u0646 \u0631\u06c1 \u06af\u06cc\u0627 \u062a\u06be\u0627&#8230; \u0627\u0648\u0631 \u0622\u067e \u06cc\u06c1 \u0633\u0628 \u0686\u06cc\u0679 \u0645\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba! \u06cc\u06c1 \u0635\u0631\u0641 \u062c\u0646\u06af\u0644\u06cc \u062a\u06be\u0627\u06d4 \u0645\u062c\u06be\u06d2 \u06cc\u06c1 \u067e\u0648\u0631\u0627 \u0648\u062c\u0648\u062f\u06cc \u0628\u062d\u0631\u0627\u0646 \u0627\u0633 \u0648\u0642\u062a \u067e\u0691\u0627 \u062c\u0628 \u0645\u06cc\u06ba [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":30296,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-30295","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/30295","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=30295"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/30295\/revisions"}],"predecessor-version":[{"id":30297,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/30295\/revisions\/30297"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media\/30296"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=30295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=30295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=30295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}