{"id":27588,"date":"2026-08-12T22:24:01","date_gmt":"2026-08-12T22:24:01","guid":{"rendered":"https:\/\/umang.pk\/2026\/08\/12\/%d9%81%db%8c-%d8%b5%d8%a7%d8%b1%d9%81-oauth-%d8%b1%d8%b3%d8%a7%d8%a6%db%8c-%da%a9%db%92-%d8%b3%d8%a7%d8%aa%da%be-ai-%d8%a7%db%8c%d8%ac%d9%86%d9%b9-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c\/"},"modified":"2026-08-12T22:24:03","modified_gmt":"2026-08-12T22:24:03","slug":"%d9%81%db%8c-%d8%b5%d8%a7%d8%b1%d9%81-oauth-%d8%b1%d8%b3%d8%a7%d8%a6%db%8c-%da%a9%db%92-%d8%b3%d8%a7%d8%aa%da%be-ai-%d8%a7%db%8c%d8%ac%d9%86%d9%b9-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c","status":"publish","type":"post","link":"https:\/\/umang.pk\/ur\/2026\/08\/12\/%d9%81%db%8c-%d8%b5%d8%a7%d8%b1%d9%81-oauth-%d8%b1%d8%b3%d8%a7%d8%a6%db%8c-%da%a9%db%92-%d8%b3%d8%a7%d8%aa%da%be-ai-%d8%a7%db%8c%d8%ac%d9%86%d9%b9-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c\/","title":{"rendered":"\u0641\u06cc \u0635\u0627\u0631\u0641 OAuth \u0631\u0633\u0627\u0626\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be AI \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4 [Full Handbook]"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 AI \u0627\u06cc\u062c\u0646\u0679 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0641\u0631\u0627\u062f \u06a9\u06cc \u062e\u062f\u0645\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0679\u0648\u0644 \u067e\u0631 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06c1\u0631 \u06a9\u0627\u0644 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u06a9\u0686\u06be \u0627\u0633 \u0637\u0631\u062d \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2: \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u061f \u0622\u0626\u06cc\u06d2 \u0627\u06cc\u06a9 AI \u0627\u06cc\u062c\u0646\u0679 \u0628\u0646\u0627 \u06a9\u0631 \u0627\u0633 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0645\u0639\u0644\u0648\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 Slack \u0627\u0648\u0631 GitHub \u0633\u06d2 \u062c\u0691\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u0644\u06cc\u06a9 \u0631\u06cc\u0688\u0632 \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0648\u0631\u06a9 \u0627\u0633\u067e\u06cc\u0633 \u06a9\u0648 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 GitHub \u0645\u0633\u0626\u0644\u06c1 \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0627\u0628\u0644 \u0631\u0633\u0627\u0626\u06cc \u0630\u062e\u06cc\u0631\u06c1 \u0645\u06cc\u06ba \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u063a\u0644\u0637 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0646\u06c1\u06cc\u06ba \u063a\u0644\u0637 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06d2 \u062d\u0642\u0648\u0642 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p>\u0641\u06a9\u0633 \u062f\u0648 \u062d\u0635\u0648\u06ba \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u060c \u062c\u0648 \u062f\u0648\u0646\u0648\u06ba \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u067e\u06c1\u0644\u06d2 \u0646\u0635\u0641 \u0645\u06cc\u06ba \u0646\u0638\u0631 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ol>\n<li>\n<p><strong>\u06c1\u0631 \u0635\u0627\u0631\u0641 \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0631\u0633\u0627\u0626\u06cc \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0627\u06cc\u0644\u0633 \u0646\u06d2 \u0627\u067e\u0646\u06d2 \u0644\u06cc\u06d2 \u0633\u0644\u06cc\u06a9 \u06a9\u06cc \u0645\u0646\u0638\u0648\u0631\u06cc \u062f\u06cc\u06d4 \u0628\u0627\u0628 \u062e\u0648\u062f \u0627\u0633 \u06a9\u06cc \u0645\u0646\u0638\u0648\u0631\u06cc \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0627\u06cc\u062c\u0646\u0679 \u0627\u06cc\u06a9 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u067e\u0627\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0679\u0648\u06a9\u0646 \u0646\u06c1\u06cc\u06ba\u06d4<\/strong> \u0627\u0633 \u0637\u0631\u062d \u06a9\u06cc \u062a\u0627\u0631: <code>alice@example.com<\/code> \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0633 \u06a9\u06cc \u06af\u0631\u0627\u0646\u0679 \u06a9\u06cc \u0631\u0642\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u0627\u0633\u06d2 \u06a9\u0627\u0644 \u06a9\u06d2 \u0648\u0642\u062a \u0679\u0648\u06a9\u0646 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u0679\u0648\u06a9\u0646 \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc \u0645\u0627\u0688\u0644 \u0627\u0646 \u067e\u0679\u060c \u0679\u0648\u0644 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06cc\u0627 \u0644\u0627\u06af\u0632 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0627\u06cc\u062c\u0646\u0679 \u0633\u0628\u0642 \u062f\u0648 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u06a9 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0635\u0631\u0641 API \u06a9\u0644\u06cc\u062f \u0645\u06cc\u06ba \u06c1\u0627\u062a\u06be \u0688\u0627\u0644\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u067e\u0644\u06af \u0627\u0646 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u0627\u0633\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0627\u0633 \u0648\u0642\u062a \u062a\u06a9 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0628 \u062a\u06a9 \u06a9\u06c1 \u062f\u0648\u0633\u0631\u0627 \u0634\u062e\u0635 \u0638\u0627\u06c1\u0631 \u0646\u06c1 \u06c1\u0648\u06d4<\/p>\n<p>\u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u06a9\u0646\u06a9\u0631\u06cc\u0679 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0627\u06cc\u062c\u0646\u0679 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0633\u0644\u06cc\u06a9 \u0686\u06cc\u0646\u0644 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u067e\u0646\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0635\u0644 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 GitHub \u0627\u06cc\u0634\u0648 \u062c\u0645\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u0634\u0648 \u0644\u0646\u06a9 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0633\u0644\u06cc\u06a9 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u06a9\u0627\u0644\u06cc\u06ba \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0627\u067e\u0646\u06cc OAuth \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u0633\u06d2 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>OAuth \u0628\u06c1\u0627\u0624 (\u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u060c <code>state<\/code> \u062a\u0635\u062f\u06cc\u0642\u060c \u0679\u0648\u06a9\u0646 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c\u060c \u0627\u0646\u06a9\u0631\u067e\u0679\u0688 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c\u060c \u0627\u0648\u0631 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u067e\u0627\u062a\u06be \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0644\u0645\u0628\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u06a9\u0645\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u0648 \u0627\u0646 \u062f\u0639\u0648\u0648\u06ba \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0634\u0646\u0627\u062e\u062a \u06a9\u06d2 \u062f\u0639\u0648\u0648\u06ba \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06cc\u0642\u06cc\u0646 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u06cc\u06c1\u0627\u06ba \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0645\u0627\u0688\u0644 \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u067e\u0631\u0648\u0679\u0648\u06a9\u0648\u0644 \u0633\u0631\u0648\u0631\u0632 \u06cc\u0627 \u0622\u0648\u0627\u0632 \u06cc\u0627 \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u06a9\u06d2 \u0645\u06cc\u0632\u0628\u0627\u0646\u0648\u06ba \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0634\u0646\u0627\u062e\u062a \u06a9\u06d2 \u0646\u0645\u0648\u0646\u06d2 \u062f\u0648\u0646\u0648\u06ba \u0633\u06cc\u0679\u0646\u06af\u0632 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u067e\u06cc\u0631\u06cc \u0645\u06cc\u0679\u0631 \u067e\u0644\u0645\u0628\u0646\u06af \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0642\u06cc\u0645\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-what-youll-build\">\u06a9\u06cc\u0627 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u0646\u0627 \u06c1\u06d2<\/h2>\n<p>\u0627\u06cc\u06a9 \u0646\u0645\u0627\u0626\u0646\u062f\u06c1 \u0628\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>channel-watcher-agent<\/code>. \u06c1\u0631 \u0631\u0646 \u0686\u0627\u0631 \u06a9\u0627\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p>\u0633\u0644\u06cc\u06a9 \u0686\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u062d\u0627\u0644\u06cc\u06c1 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u067e\u0691\u06be\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06c1\u0631 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u06c1\u0645 \u0645\u0627\u0688\u0644 \u0633\u06d2 \u067e\u0648\u0686\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0645\u062a\u0646 \u06a9\u0633\u06cc \u0628\u06af \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u0627\u06cc\u06a9\u0634\u0646 \u0622\u0626\u0679\u0645\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06c1\u0644 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 GitHub \u0645\u0633\u0626\u0644\u06c1 \u062c\u0645\u0639 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0646\u0626\u06d2 \u0634\u0645\u0627\u0631\u06d2 \u06a9\u06d2 \u0644\u0646\u06a9 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0635\u0644 \u0633\u0644\u06cc\u06a9 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0628\u0679\u0646 \u067e\u0631 \u06a9\u0644\u06a9 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0633\u0644\u06cc\u06a9 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u067e\u0631\u0648\u0688\u06a9\u0679 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c &quot;\u0627\u0633 \u067e\u06cc\u063a\u0627\u0645 \u0633\u06d2 \u0645\u0633\u0626\u0644\u06c1 \u0628\u0646\u0627\u0626\u06cc\u06ba&#8221; \u0627\u06cc\u06a9\u0634\u0646\u06d4 \u06cc\u06c1\u0627\u06ba\u060c \u0627\u06cc\u062c\u0646\u0679 \u0686\u06cc\u0646\u0644 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u067e\u0646\u0627 \u0641\u06cc\u0635\u0644\u06c1 \u062e\u0648\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0635\u0631\u0641 \u0648\u06c1\u06cc \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u0648\u06c1 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06d2 \u0644\u0627\u0626\u0642 \u0633\u0645\u062c\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u0679\u06cc\u06a9 \u06a9\u0648 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0686\u06be\u0648\u0679\u0627 \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0679\u06a9\u0691\u0627<\/th>\n<th>\u06a9\u0631\u062f\u0627\u0631<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Node.js\u060c \u0639\u0627\u0645 ES \u0645\u0627\u0688\u06cc\u0648\u0644<\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0648\u06cc\u0628 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0642\u0637\u0627\u0631 \u0646\u06c1\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td><code>node:http<\/code><\/td>\n<td>OAuth \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u0633\u0631\u0648\u0631<\/td>\n<\/tr>\n<tr>\n<td><code>node:crypto<\/code><\/td>\n<td>\u0679\u0648\u06a9\u0646 \u062e\u0641\u06cc\u06c1 \u06a9\u0627\u0631\u06cc<\/td>\n<\/tr>\n<tr>\n<td><code>node:sqlite<\/code><\/td>\n<td>\u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u062c\u0633 \u0645\u06cc\u06ba \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0627\u0646\u062d\u0635\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>Vercel AI SDK<\/td>\n<td>\u0645\u0627\u0688\u0644 \u06a9\u0627\u0644\u0632 \u0627\u0648\u0631 \u0679\u0648\u0644 \u0644\u0648\u067e\u0633<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>5 \u0645\u06cc\u06ba \u0633\u06d2 3 Node.js \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0635\u0631\u0641 \u067e\u06cc\u06a9\u06cc\u062c\u0632 \u062c\u0648 \u0622\u067e \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u06c1\u06cc\u06ba AI SDK \u0627\u0648\u0631 \u062f\u0648\u0633\u062a\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06c1\u0648\u06af\u0627:<\/p>\n<ul>\n<li>\n<p>Slack \u0627\u0648\u0631 GitHub \u062f\u0648 OAuth \u0627\u06cc\u067e\u0633 \u06c1\u06cc\u06ba \u062c\u0646 \u067e\u0631 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u0648\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0627\u062e\u0644 \u06a9\u0631\u062f\u06c1 \u062e\u0641\u06cc\u06c1 \u06a9\u0631\u062f\u06c1 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0627 \u0630\u062e\u06cc\u0631\u06c1\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u0627\u06cc\u062c\u0646\u0679 \u062c\u0648 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0645\u0627\u0688\u0644 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u062a\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0644\u0648\u067e \u062c\u0648 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u06a9\u0648\u0626\u06cc \u0645\u0633\u0626\u0644\u06c1 \u067e\u06cc\u0634 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0688\u06cc\u0645\u0648 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u067e\u06c1\u0644\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0688\u06cc\u0679\u0627 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0639\u0645\u0644 \u0631\u06a9 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0645\u06a9\u0645\u0644 \u0634\u062f\u06c1 \u06a9\u0648\u0688 github.com\/saif-shines\/channel-watcher-agent \u067e\u0631 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0637\u06cc\u06ba<\/h2>\n<p>\u0627\u06a9\u0627\u0624\u0646\u0679\u0633 \u0627\u0648\u0631 \u0679\u0648\u0644\u0632:<\/p>\n<ul>\n<li>\n<p><strong>Node.js 22.13 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1<\/strong>\u0627\u0648\u0631 \u0627\u06cc\u0646 \u067e\u06cc \u0627\u06cc\u0645\u06d4 \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>node:sqlite<\/code>\u06cc\u06c1 \u0627\u0633 \u0648\u0631\u0698\u0646 \u0633\u06d2 \u0645\u0633\u062a\u062d\u06a9\u0645 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0633\u0633\u062a \u06a9\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1<\/strong> \u0627\u06cc\u0633\u06cc \u062c\u06af\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u0622\u067e \u0627\u06cc\u067e\u0633 \u0627\u0648\u0631 \u0686\u06cc\u0646\u0644\u0632 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u0622\u067e \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0688\u0633\u067e\u0648\u0632\u0627\u06cc\u0628\u0644 \u0686\u06cc\u0646\u0644\u0632 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>GitHub \u0627\u06a9\u0627\u0624\u0646\u0679<\/strong> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0630\u062e\u06cc\u0631\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0679\u06cc\u0633\u0679 \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062c\u0630\u0628 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0627\u0688\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 API \u06a9\u0644\u06cc\u062f<\/strong> AI SDK \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u062b\u0627\u0644 \u0645\u06cc\u06ba Anthropic \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>mkcert<\/strong>\u0645\u0642\u0627\u0645\u06cc HTTPS \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631\u06cc\u06ba\u06d4 \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 Slack \u0627\u0648\u0631 GitHub OAuth \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u06cc\u0648\u06ba \u06c1\u06d2\u06d4 <code>http:\/\/localhost<\/code> \u06a9\u0648\u0626\u06cc \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06a9\u0686\u06be \u0645\u0641\u06cc\u062f \u067e\u0633 \u0645\u0646\u0638\u0631 \u06a9\u0627 \u0639\u0644\u0645 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0627\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0645\u0634\u06a9\u0644 \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p><code>async<\/code>    \u0627\u0648\u0631 <code>await<\/code>\u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0646\u0648\u0688 \u0627\u0633\u06a9\u0631\u067e\u0679 \u067e\u0691\u06be\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0639\u0644\u06cc \u0633\u0637\u062d\u06cc OAuth 2.0: \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u0637\u0631\u0641 \u0628\u06be\u06cc\u062c\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0628 \u0635\u0627\u0631\u0641 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0679\u0648\u06a9\u0646 \u0645\u0648\u0635\u0648\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0648\u0644 \u06a9\u0627\u0644\u0632\u060c \u0628\u0639\u0636 \u0627\u0648\u0642\u0627\u062a \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0627\u0644\u0632 \u0628\u06be\u06cc \u06a9\u06c1\u0644\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u062d\u0635\u06d2 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06cc\u0627 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u0627\u0646\u062a\u0628\u0627\u06c1:<\/strong> \u0627\u06cc\u062c\u0646\u0679 \u062d\u0642\u06cc\u0642\u06cc \u0646\u0638\u0627\u0645 \u06a9\u0648 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc GitHub \u0645\u0633\u0626\u0644\u06c1 \u06a9\u06be\u0648\u0644\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0633\u0644\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u067e\u0648\u0633\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1 \u0648\u06c1 \u0635\u0631\u0641 \u0622\u067e \u06a9\u06d2 \u0645\u0637\u0644\u0648\u0628\u06c1 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0679\u06cc\u0633\u0679 \u0633\u0644\u06cc\u06a9 \u0686\u06cc\u0646\u0644\u0632 \u0627\u0648\u0631 \u0688\u0633\u067e\u0648\u0632\u0627\u06cc\u0628\u0644 GitHub \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p><strong>\u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u06c1\u06d2 \u062c\u0648 \u0627\u067e\u0646\u06d2 \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0645\u0627\u0688\u0644 \u062e\u0648\u062f \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0648 \u0627\u0646\u062c\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u062f\u06d2 \u0633\u06a9\u062a\u0627\u06d4 \u06cc\u06c1 \u0635\u0631\u0641 \u067e\u0648\u0686\u06be\u0646\u06d2 \u06a9\u06cc \u0628\u0627\u062a \u06c1\u06d2: \u0641\u0648\u0646 <code>fileGithubIssue<\/code> \u0627\u0633 \u0639\u0646\u0648\u0627\u0646 \u0627\u0648\u0631 \u0627\u0633 \u062c\u0633\u0645 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u06d4 \u062c\u0628 \u0622\u067e \u06a9\u0627 \u06a9\u0648\u0688 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u062a\u06cc\u062c\u06c1 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0645\u0627\u0688\u0644 \u0627\u0633 \u0646\u062a\u06cc\u062c\u06d2 \u06a9\u0648 \u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u0627\u060c \u0639\u0645\u0644 \u06a9\u0631\u0646\u0627\u060c \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u0627\u06d4 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 \u06c1\u06d2 \u0627\u0648\u0631 &quot;\u0627\u06cc\u062c\u0646\u0679&#8221; \u06a9\u06c1\u0644\u0627\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u0627\u0633 \u06a9\u06d2 \u06af\u0631\u062f \u06af\u06be\u0648\u0645\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-how-a-tool-differs-from-an-api\">\u0679\u0648\u0644\u0632 \u0627\u0648\u0631 APIs \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642<\/h3>\n<p>\u0679\u0648\u0644\u0632 \u0627\u0648\u0631 APIs \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0627\u0644 \u06a9\u0648 \u0644\u067e\u06cc\u0679\u062a\u06d2 \u06c1\u06cc\u06ba \u0644\u06cc\u06a9\u0646 \u0645\u062e\u062a\u0644\u0641 \u0642\u0627\u0631\u0626\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06a9\u06be\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>API \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u0633\u06d2 \u0627\u0646\u062f\u0627\u0632\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u0646\u06d2 \u0645\u0636\u0645\u0648\u0646 \u067e\u0691\u06be\u0627 \u0627\u0648\u0631 \u062c\u0627\u0646\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>thread_ts<\/code> \u06cc\u06c1 \u0641\u06cc\u0644\u0688 \u0633\u0644\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u062a\u06be\u0631\u06cc\u0688 \u062c\u0648\u0627\u0628\u0627\u062a \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0644\u0626\u06d2 \u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0644\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06c1\u0630\u0627\u060c \u0622\u0644\u06c1 \u062e\u0648\u062f \u0648\u0636\u0627\u062d\u062a\u06cc \u06c1\u06d2.<\/p>\n<ul>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0646\u0627\u0645<\/strong> \u0645\u0627\u0688\u0644 \u06a9\u0627 \u0627\u0646\u062f\u0627\u0632\u06c1 \u0627\u0633 \u0637\u0631\u062d \u0644\u06af\u0627\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2: <code>fileGithubIssue<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0648\u0636\u0627\u062d\u062a<\/strong> \u06cc\u06c1 \u0633\u0627\u062f\u06c1 \u0632\u0628\u0627\u0646 \u0645\u06cc\u06ba \u0679\u0648\u0644 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0634\u0645\u0648\u0644 \u0627\u0633\u06d2 \u06a9\u0628 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u062e\u0627\u06a9\u06c1<\/strong> \u0627\u0633 \u06a9\u06d2 \u0622\u062f\u0627\u0646\u0648\u06ba \u06a9\u06d2 \u0644\u0626\u06d2\u060c \u0645\u0627\u0688\u0644 \u062c\u0627\u0646\u062a\u0627 \u06c1\u06d2: <code>title<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u0637\u0644\u0648\u0628\u06c1 \u062a\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0630\u06cc\u0644 \u0645\u06cc\u06ba \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0679\u0648\u0644\u0632 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u06c1\u06d2\u06d4 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0648\u0688 \u0645\u0646\u0637\u0642\u06cc \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0648\u0636\u0627\u062d\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">const fileGithubIssue = tool({\n  description: 'File a GitHub issue for an actionable Slack message',\n  inputSchema: z.object({\n    title: z.string(),\n    body: z.string(),\n  }),\n  execute: async ({ title, body }) => {\n    \/\/ ... the actual API call goes here\n  },\n});\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>description<\/code> \u0627\u0648\u0631 <code>inputSchema<\/code> \u06cc\u06c1 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0645\u0627\u0688\u0644 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2. \u06a9\u06c1 <code>execute<\/code> \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0635\u0631\u0641 \u0622\u067e \u06a9\u06cc \u06c1\u06cc\u06ba\u06d4 \u0634\u0646\u0627\u062e\u062a \u0627\u0646\u062f\u0631 \u06c1\u06d2\u06d4 <code>execute<\/code>\u0644\u06c1\u0630\u0627 \u0645\u0627\u0688\u0644 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646 \u0633\u06a9\u06d2 \u06af\u0627 \u06a9\u06c1 \u06a9\u0627\u0644 \u06a9\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0644\u0626\u06d2 \u062c\u0627\u0631\u06cc \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc\u06d4<\/p>\n<h3 id=\"heading-why-models-handle-tools-better-than-raw-api-calls\">\u0645\u0627\u0688\u0644\u0632 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u062e\u0627\u0645 API \u06a9\u0627\u0644\u0648\u06ba \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u06a9\u06cc\u0648\u06ba \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h3>\n<p>\u0627\u0646 \u067e\u0679 \u0645\u06cc\u06ba curl \u06a9\u0645\u0627\u0646\u0688 \u0686\u0633\u067e\u0627\u06ba \u06a9\u0631\u0646\u0627 \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u0633\u06d2 \u062e\u0627\u0644\u06cc \u062c\u06af\u06c1\u0648\u06ba \u06a9\u0648 \u067e\u064f\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1\u0646\u0627 \u0645\u0645\u06a9\u0646 \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u06cc\u06c1 \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 \u067e\u06cc\u0634\u06cc\u0646 \u06af\u0648\u0626\u06cc \u06a9\u06d2 \u0637\u0631\u06cc\u0642\u0648\u06ba \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2.<\/p>\n<p>\u0679\u0648\u0644\u0632 \u062a\u06cc\u0646 \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06cc \u0628\u0646\u0627 \u067e\u0631 \u0628\u06c1\u062a\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<ol>\n<li>\n<p>\u06a9\u0648\u0688 \u06a9\u06d2 \u0686\u0644\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u063a\u0644\u0637 \u0679\u0648\u0644 \u06a9\u0627\u0644\u0632 \u06a9\u0648 SDK \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u062e\u0631\u0627\u0628 URLs \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0646\u062a\u0627\u0626\u062c \u0645\u0627\u0688\u0644 \u067e\u0631 \u0644\u0648\u0679\u0627\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0628\u0639\u062f \u0645\u06cc\u06ba <code>fileGithubIssue<\/code> \u0648\u0627\u067e\u0633 \u0622\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0645\u0627\u0688\u0644 \u0646\u0626\u06d2 \u0634\u0645\u0627\u0631\u06d2 \u06a9\u0627 URL \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0633\u0644\u06cc\u06a9 \u062c\u0648\u0627\u0628 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u0627\u0628\u0637\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u06a9\u0648 \u0645\u0645\u06a9\u0646 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u06af\u0641\u062a\u06af\u0648 \u0633\u06d2 \u062e\u0627\u0631\u062c \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0645\u0627\u0688\u0644 \u0646\u0627\u0645 \u0633\u06d2 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u0679\u0648\u06a9\u0646 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u0648\u06a9\u0646 \u062c\u0648 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u06a9\u06be\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0646 \u06a9\u0648 \u062a\u06a9\u0645\u06cc\u0644\u060c \u0644\u0627\u06af \u0644\u0627\u0626\u0646\u0648\u06ba\u060c \u06cc\u0627 \u0641\u0648\u0631\u06cc \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u067e\u06d2 \u0644\u0648\u0688 \u0645\u06cc\u06ba \u0644\u06cc\u06a9 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u062a\u06cc\u0633\u0631\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u0627 \u0628\u0627\u0642\u06cc \u062d\u0635\u06c1 \u06a9\u06cc\u0627 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0645 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0645\u0627\u0688\u0644 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u067e\u0627\u0633 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u0648\u06a9\u0646 \u0635\u0631\u0641 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u06a9\u0627\u0644 \u06a9\u06d2 \u0648\u0642\u062a \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-most-agents-need-more-than-one-app\">\u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06cc\u067e \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/h3>\n<p>\u0686\u0646\u062f \u06a9\u0627\u0631\u0622\u0645\u062f \u0627\u06cc\u062c\u0646\u0679 \u0627\u06cc\u06a9 \u06c1\u06cc \u0627\u06cc\u067e \u0633\u06d2 \u0628\u0627\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0633\u067e\u0648\u0631\u0679 \u0646\u0645\u0627\u0626\u0646\u062f\u06d2 Zendesk \u067e\u0691\u06be\u06cc\u06ba \u0627\u0648\u0631 \u0633\u06cc\u0644\u0632 \u0641\u0648\u0631\u0633 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633\u0679\u06cc\u0646\u0688 \u0628\u0627\u0626\u06cc \u0627\u06cc\u062c\u0646\u0679 GitHub \u06a9\u0648 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 Slack \u067e\u0631 \u0634\u0627\u0626\u0639 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0634\u06cc\u0688\u0648\u0644\u0646\u06af \u0627\u06cc\u062c\u0646\u0679 \u062c\u06cc \u0645\u06cc\u0644 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06af\u0648\u06af\u0644 \u06a9\u06cc\u0644\u0646\u0688\u0631 \u06a9\u0648 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06c1\u0631 \u0627\u06cc\u067e \u0627\u067e\u0646\u06cc OAuth \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646\u060c \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u0627 \u0646\u0627\u0645\u060c \u0679\u0648\u06a9\u0646 \u0644\u0627\u0626\u0641 \u0679\u0627\u0626\u0645\u060c \u0627\u0648\u0631 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0628\u0631\u062a\u0627\u0624 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0648 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0633\u06d2 \u0636\u0631\u0628 \u062f\u06cc\u06ba \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0627\u0635\u0644 \u0645\u0633\u0626\u0644\u06c1 \u0646\u0638\u0631 \u0622\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<h2 id=\"heading-why-a-shared-token-breaks\">\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0679\u0648\u06a9\u0646 \u06a9\u06cc\u0648\u06ba \u0679\u0648\u0679\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>\u0633\u0628 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u0634\u062a\u0631\u06a9\u06c1 \u0633\u0646\u062f \u0688\u06cc\u0645\u0648 \u0645\u06cc\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u0628 \u062f\u0648\u0633\u0631\u0627 \u0634\u062e\u0635 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0627\u0641 \u0633\u0644\u06cc\u06a9 \u06a9\u06d2 \u062a\u06cc\u0632 \u062a\u0631 \u0648\u0631\u0698\u0646 \u06a9\u0627 \u062a\u0635\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0633\u0644\u06cc\u06a9 \u0627\u06cc\u067e \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0633\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>.env<\/code>\u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u062a\u0645\u0627\u0645 \u0679\u0648\u0644 \u06a9\u0627\u0644\u0632 \u0627\u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062a\u06cc\u0646 \u0645\u0633\u0627\u0626\u0644 \u0628\u06cc\u06a9 \u0648\u0642\u062a \u067e\u06cc\u062f\u0627 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u062a\u0645\u0627\u0645 \u067e\u06be\u0627\u0646\u0633\u06cc\u0627\u06ba \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06cc \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0628\u0648\u0679 \u062a\u0645\u0627\u0645 \u0645\u062f\u0639\u0648 \u0686\u06cc\u0646\u0644\u0632 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u06d2 \u06af\u0627\u060c \u0627\u0633 \u0633\u06d2 \u0642\u0637\u0639 \u0646\u0638\u0631 \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u0633 \u0646\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0633\u06cc \u0627\u06cc\u062c\u0646\u0679 \u0633\u06d2 \u06a9\u0633\u06cc \u0627\u06cc\u0633\u06d2 \u0686\u06cc\u0646\u0644 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u067e\u0648\u0686\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba \u0627\u0633 \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u062d\u0635\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06cc\u0627\u060c \u062a\u0648 \u0628\u0648\u0679 \u0627\u0633\u06d2 \u0622\u067e \u06a9\u0648 \u067e\u0691\u06be\u06d2 \u06af\u0627\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u0622\u067e \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1 \u06a9\u06d2 \u0645\u0631\u0627\u0639\u0627\u062a \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u0637\u0631\u06cc\u0642\u06c1 \u0628\u0646 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648\u0633\u0631\u0627\u060c \u0622\u0688\u0679 \u0679\u0631\u06cc\u0644 \u0628\u06be\u06cc \u063a\u0644\u0637 \u06c1\u06d2\u06d4 GitHub \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0633\u0627\u0626\u0644 \u06a9\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0648\u06c1 \u0628\u0648\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u06a9\u06be\u0648\u0644\u06d2 \u06af\u0626\u06d2 \u062a\u06be\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u0633\u0644\u06cc\u06a9 \u062c\u0648\u0627\u0628\u0627\u062a \u0628\u0648\u0679\u0633 \u0633\u06d2 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062c\u0628 \u067e\u0648\u0686\u06be\u0627 \u06af\u06cc\u0627 \u06a9\u06c1 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u06cc\u0648\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u060c \u0627\u06cc\u0645\u0627\u0646\u062f\u0627\u0631\u0627\u0646\u06c1 \u062c\u0648\u0627\u0628 \u06c1\u06d2 &quot;\u0627\u06cc\u06a9 \u0627\u06cc\u062c\u0646\u0679 \u0646\u06d2 \u06a9\u0633\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0633\u0626\u0644\u06c1 \u067e\u06cc\u0634 \u06a9\u06cc\u0627\u060c \u0644\u06cc\u06a9\u0646 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627 \u06a9\u06c1 \u06cc\u06c1 \u06a9\u0648\u0646 \u062a\u06be\u0627\u06d4&#8221;<\/p>\n<p>\u062a\u06cc\u0633\u0631\u0627\u060c \u0645\u0646\u0633\u0648\u062e\u06cc \u06a9\u0627\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u06cc\u06d4 \u0635\u0627\u0631\u0641 \u0646\u06d2 \u06a9\u0645\u067e\u0646\u06cc \u0686\u06be\u0648\u0691 \u062f\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u0627 \u0633\u0644\u06cc\u06a9 \u0627\u06a9\u0627\u0624\u0646\u0679 \u063a\u06cc\u0631 \u0641\u0639\u0627\u0644 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0627\u0633\u0646\u0627\u062f \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u06af\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0645\u062a\u0628\u0627\u062f\u0644 \u0641\u06cc \u0635\u0627\u0631\u0641 \u06af\u0631\u0627\u0646\u0679 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0635\u0627\u0631\u0641 \u0627\u067e\u0646\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u0645\u0646\u0638\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0627\u06c1\u0645\u060c \u06cc\u06c1 \u0646\u0626\u06cc \u0636\u0631\u0648\u0631\u06cc\u0627\u062a \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u0627 \u06c1\u06d2. \u06cc\u0639\u0646\u06cc \u0627\u0646 \u06af\u0631\u0627\u0646\u0679\u0633 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u062c\u06af\u06c1\u06d4<\/p>\n<h3 id=\"heading-the-distinction-is-one-field-in-one-response\">\u0627\u0645\u062a\u06cc\u0627\u0632 \u0641\u06cc \u062c\u0648\u0627\u0628 \u0627\u06cc\u06a9 \u0641\u06cc\u0644\u0688 \u06c1\u06d2\u06d4<\/h3>\n<p>\u0633\u0644\u06cc\u06a9 \u0627\u062e\u062a\u0644\u0627\u0641\u0627\u062a \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u0627 \u0628\u06c1\u062a \u0622\u0633\u0627\u0646 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0635\u0627\u0631\u0641 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u06cc \u0627\u0633\u06a9\u0631\u06cc\u0646 \u0645\u06a9\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0679\u0648\u06a9\u0646 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u0627\u06cc\u06a9 \u06c1\u06cc JSON \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0645\u06cc\u06ba \u062f\u0648\u0646\u0648\u06ba \u0642\u0633\u0645 \u06a9\u06d2 \u0679\u0648\u06a9\u0646 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-json\">{\n  \"ok\": true,\n  \"access_token\": \"xoxb-REDACTED-BOT-TOKEN\",\n  \"token_type\": \"bot\",\n  \"authed_user\": {\n    \"id\": \"U0A1B2C3D\",\n    \"scope\": \"channels:history,chat:write,users:read\",\n    \"access_token\": \"xoxp-REDACTED-USER-TOKEN\",\n    \"token_type\": \"user\"\n  }\n}\n<\/code><\/pre>\n<p>\u0633\u0628 \u0633\u06d2 \u0627\u0648\u067e\u0631 \u06a9\u06cc \u0633\u0637\u062d <code>access_token<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0628\u0648\u0679 \u06c1\u06d2\u06d4 \u06af\u06be\u0648\u06ba\u0633\u0644\u0627 <code>authed_user.access_token<\/code> \u0645\u06cc\u06ba \u0648\u06c1\u06cc \u06c1\u0648\u06ba \u062c\u0633 \u0646\u06d2 \u0627\u0628\u06be\u06cc \u0627\u062a\u0641\u0627\u0642 \u06a9\u06cc\u0627\u06d4 \u067e\u0691\u06be\u0646\u0627 <code>conversations.history<\/code> \u067e\u06c1\u0644\u0627 \u0627\u0646 \u062a\u0645\u0627\u0645 \u0686\u06cc\u0646\u0644\u0632 \u06a9\u0648 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0646 \u067e\u0631 \u0627\u06cc\u067e \u06a9\u0648 \u0645\u062f\u0639\u0648 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0633\u06cc\u06a9\u0646\u0688 \u067e\u0691\u06be\u0646\u0627 \u0635\u0631\u0641 \u0648\u06c1 \u0686\u06cc\u0646\u0644\u0632 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0635\u0627\u0631\u0641 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u06cc \u067e\u0627\u0631\u0679\u06cc\u0634\u0646 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4 <code>chat.postMessage<\/code> \u0627\u0633 \u0634\u062e\u0635 \u06a9\u06d2 \u0646\u0627\u0645 \u067e\u0631 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u0679\u0648\u06a9\u0646 \u067e\u0648\u0633\u0679 \u0634\u0627\u0626\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u062f\u0648 \u0641\u06cc\u0644\u0688\u0632 \u06c1\u06cc\u06ba\u060c \u0633\u0627\u0628\u0642\u06c1 \u200b\u200b\u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062d\u0631\u0641 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1\u060c \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06a9\u0627 \u0645\u062c\u0645\u0648\u0639\u06cc \u0645\u0627\u0688\u0644 \u0627\u0633 \u0628\u0627\u062a \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0646 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba\u060c \u06c1\u0645 \u0635\u0631\u0641 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06c1\u0630\u0627 Slack \u06a9\u0648\u0626\u06cc \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u062c\u0627\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-tokens-must-stay-out-of-the-model-and-the-logs\">\u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0645\u0627\u0688\u0644\u0632 \u0627\u0648\u0631 \u0644\u0627\u06af\u0632 \u0633\u06d2 \u062f\u0648\u0631 \u0631\u06a9\u06be\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/h3>\n<p>\u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0679\u0648\u06a9\u0646 \u0633\u0633\u0679\u0645 \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062d\u0633\u0627\u0633 \u0688\u06cc\u0679\u0627 \u0628\u0646 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062f\u0648 \u0645\u0646\u0632\u0644\u06cc\u06ba \u062d\u062f \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u06c1\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><strong>\u0645\u0627\u0688\u0644:<\/strong> \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0627\u0646 \u067e\u0679\u060c \u0679\u0648\u0644 \u0679\u067e\u0633\u060c \u0627\u0648\u0631 \u0679\u0648\u0644 \u0631\u06cc\u0679\u0631\u0646 \u0648\u06cc\u0644\u06cc\u0648\u0632 \u0633\u06d2 \u062e\u0627\u0631\u062c \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0645\u0627\u0688\u0644 \u062c\u0648 \u0679\u0648\u06a9\u0646 \u062f\u06cc\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u062f\u06c1\u0631\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062a\u06cc\u0632 \u0631\u0641\u062a\u0627\u0631 \u0627\u0646\u062c\u06cc\u06a9\u0634\u0646 \u0679\u0648\u0644 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0646\u0627\u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0627\u0646 \u067e\u0679 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0622\u067e \u06a9\u0627 \u0644\u0627\u06af:<\/strong> \u0679\u0648\u0644 \u0627\u0646 \u067e\u0679 \u0627\u0648\u0631 \u0622\u0624\u0679 \u067e\u0679 \u0648\u06c1\u06cc \u06c1\u06cc\u06ba \u062c\u0648 \u0622\u067e \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u0688\u06cc\u0628\u06af \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a \u0631\u06cc\u06a9\u0627\u0631\u0688 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u067e\u06d2 \u0644\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u0648\u06a9\u0646 \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u0644\u0627\u06af \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0645\u06cc\u06ba \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u06c1\u0645 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u062a\u0646\u06af \u0631\u0627\u0633\u062a\u06d2 \u067e\u0631 \u0631\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4 \u0622\u067e \u06a9\u0627 \u06a9\u0648\u0688 \u0627\u06cc\u06a9 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u0633\u062a\u062d\u06a9\u0645 \u062d\u0648\u0627\u0644\u06c1 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0645\u062f\u062f\u06af\u0627\u0631 \u0627\u0633 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0679\u0648\u06a9\u0646 \u0645\u06cc\u06ba \u0628\u062f\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u06c1\u0627\u06ba \u0633\u06d2 \u0679\u0648\u06a9\u0646 \u0633\u06cc\u062f\u06be\u0627 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627\u0644 \u067e\u0631 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0646\u06c1 \u06a9\u06c1 \u06a9\u06c1\u06cc\u06ba \u0627\u0648\u0631\u06d4 \u0627\u0633 \u06a9\u0627 \u0646\u0627\u0645 \u0679\u0648\u0644 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u0633\u06d2 \u0645\u0646\u0633\u0644\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0633\u06d2 \u0645\u0627\u0688\u0644 \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0679\u0648\u0644 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0648\u0627\u067e\u0633 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-why-you-own-the-oauth-apps-and-the-store\">OAuth \u0627\u06cc\u067e \u0627\u0648\u0631 \u0627\u0633\u0679\u0648\u0631 \u06a9\u06d2 \u0645\u0627\u0644\u06a9 \u06a9\u06cc\u0648\u06ba \u06c1\u06cc\u06ba\u061f<\/h3>\n<p>\u0628\u06c1\u0627\u0624 \u062e\u0648\u062f \u0644\u06a9\u06be\u0646\u06d2 \u06a9\u0627 \u0646\u0642\u0637\u06c1 \u067e\u0627\u0626\u067e\u0646\u06af \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u067e\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06a9\u0648\u0646 \u06a9\u0633 \u06a9\u06cc \u06af\u0631\u0627\u0646\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba\u060c \u0622\u067e \u0679\u06cc\u0645 \u06a9\u06d2 \u0631\u06a9\u0646 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0634\u062e\u0635 \u0627\u067e\u0646\u06d2 Slack \u0627\u0648\u0631 GitHub \u06a9\u0648 \u062c\u0648\u0691\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679 \u0627\u0633 \u0634\u062e\u0635 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0646\u06d2 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u06cc\u0627\u06d4 \u0648\u06c1\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06cc\u06c1\u0627\u06ba \u062a\u06a9 \u06a9\u06c1 \u0627\u06af\u0631 \u0648\u06c1 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0622\u067e \u06a9\u06cc \u0645\u0635\u0646\u0648\u0639\u0627\u062a \u06a9\u06d2 \u06af\u0627\u06c1\u06a9 \u06c1\u0648\u06ba\u06d4 \u06c1\u0631 \u0634\u062e\u0635 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u0628 \u0628\u06be\u06cc \u0627\u067e\u0646\u06cc \u0627\u067e\u0646\u06cc \u0627\u062c\u0627\u0632\u062a\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062e\u0631\u0627\u0628 \u0646\u0642\u0634\u06c1 \u0633\u0627\u0632\u06cc \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0634\u062e\u0635 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u06a9\u06d2 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06d2 \u062d\u0642\u0648\u0642 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u0635\u0631\u0641 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0645\u0627\u062e\u0630 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u06cc\u0645 \u06a9\u06d2 \u0627\u0631\u06a9\u0627\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06cc\u0634\u0646\u060c \u06af\u0627\u06c1\u06a9\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0631\u0627\u06cc\u06c1 \u062f\u0627\u0631 \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688\u06d4<\/p>\n<h2 id=\"heading-architecture-overview\">\u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1<\/h2>\n<p>\u062f\u0648 \u0633\u0644\u0633\u0644\u06d2 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0645\u062e\u062a\u0644\u0641 \u0627\u0648\u0642\u0627\u062a \u0645\u06cc\u06ba \u067e\u0627\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0646 \u06a9\u0648 \u0627\u0644\u06af \u0631\u06a9\u06be\u0646\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0627\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0627\u0648\u0642\u0627\u062a \u0641\u06cc \u0635\u0627\u0631\u0641\u060c \u0641\u06cc \u0627\u06cc\u067e \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0631\u0627\u0636\u06cc \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0679\u0648\u06a9\u0646 \u0622\u067e \u06a9\u06d2 \u0627\u0633\u0679\u0648\u0631 \u067e\u0631 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 \u0627\u06cc\u062c\u0646\u0679 \u0646\u06c1\u06cc\u06ba \u0686\u0644 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0631\u0646 \u0679\u0627\u0626\u0645 \u06c1\u0631 \u0628\u0627\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2. \u0627\u06cc\u062c\u0646\u0679 \u0627\u06cc\u06a9 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0645\u0648\u062c\u0648\u062f\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0639\u0645\u0644 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u0627\u0633\u06a9\u0631\u06cc\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u0628\u0631\u0627\u0624\u0632\u0631 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">CONNECTION TIME (once per user, per app)\n\n  Your user              connect.js              Slack \/ GitHub\n     |                       |                         |\n     |-- \"connect Slack\" --->|                         |\n     |<--- consent link -----|                         |\n     |----------------------- OAuth consent ---------->|\n     |                       |<--- redirect + code ----|\n     |                       |---- exchange code ----->|\n     |                       |<---- tokens ------------|\n     |                       |                         |\n     |                  [encrypt, store                |\n     |                   under (identifier,            |\n     |                   provider)]                    |\n     |                       |                         |\n\n\nRUNTIME (every agent run)\n\n  Your agent             Token store             Slack \/ GitHub\n     |                       |                         |\n  [resolve identifier        |                         |\n   from your own session]    |                         |\n     |                       |                         |\n     |-- getAccessToken( --->|                         |\n     |     identifier,       |                         |\n     |     provider )        |                         |\n     |<---- token -----------|                         |\n     |                       |                         |\n     |------------------ API call as user ------------>|\n     |<----------------- result -----------------------|\n     |                       |                         |\n  [model sees result,        |                         |\n   never a token]            |                         |\n<\/code><\/pre>\n<p>\u0634\u06a9\u0644\u0648\u06ba \u06a9\u06cc \u062a\u06cc\u0646 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06c1\u06cc\u06ba:<\/p>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u062a\u0645\u0627\u0645 \u06c1\u06cc\u0646\u0688\u0644 \u0633\u0679\u0631\u0646\u06af\u0632 \u0627\u0633 \u0637\u0631\u062d: <code>alice@example.com<\/code> \u06cc\u0627 <code>user_8f21c<\/code>. \u062a\u0627\u0631\u06cc\u06ba \u0628\u0630\u0627\u062a \u062e\u0648\u062f \u0628\u06cc\u06a9\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u0627\u0648\u0631 \u0627\u0646\u06a9\u0631\u067e\u0634\u0646 \u06a9\u0644\u06cc\u062f \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06be\u0644\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 ID \u0645\u062a\u0639\u062f\u062f \u0627\u06cc\u067e\u0633 \u067e\u0631 \u0645\u062d\u06cc\u0637 \u06c1\u06d2\u06d4 \u0648\u0627\u062d\u062f \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0633\u0644\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u0627\u06cc\u06a9 GitHub \u0644\u0627\u0626\u0646 \u06c1\u06d2\u06d4 \u062a\u06cc\u0633\u0631\u06cc \u0627\u06cc\u067e \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0633\u0631\u06cc \u0622\u0626\u06cc \u0688\u06cc \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<p>\u06a9\u0648\u0688 \u0645\u06cc\u06ba \u062a\u0648\u062b\u06cc\u0642 \u0628\u0627\u0642\u06cc \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u0648\u0631 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 \u0679\u0648\u06a9\u0646 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u06c1\u06d2\u06d4 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0648 \u0645\u0639\u0644\u0648\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06af\u0627 \u06a9\u06c1 \u0622\u06cc\u0627 \u0648\u06c1 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0627\u06c1\u0644 \u06c1\u06cc\u06ba \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0627\u0633 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0627\u0635\u0648\u0644 \u06a9\u06cc \u067e\u06cc\u0631\u0648\u06cc \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0645\u0648\u0691\u0646\u06d2 \u0633\u06d2 \u067e\u0648\u0631\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0648 \u0628\u0627\u0637\u0644 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u0639\u0646\u06cc\u060c \u06cc\u06c1 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u0633\u06cc\u0634\u0646\u0632 \u0645\u06cc\u06ba \u0633\u0631\u0648\u0631 \u0633\u0627\u0626\u06cc\u0688 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0628\u0627\u0688\u06cc\u060c \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u06d2 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632\u060c \u06cc\u0627 \u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u0642\u0628\u0648\u0644 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0642\u0628\u0648\u0644 \u06a9\u0631\u062f\u06c1 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \"\u06a9\u0633\u06cc \u0628\u06be\u06cc \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u06cc\u06ba\" \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-register-the-slack-and-github-oauth-apps\">\u0633\u0644\u06cc\u06a9 \u0627\u0648\u0631 GitHub OAuth \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u06cc\u06c1 \u0648\u0627\u06a9 \u062a\u06be\u0631\u0648 Slack \u0627\u0648\u0631 GitHub \u06a9\u0648 \u062f\u0648 \u0627\u06cc\u0646\u0688 \u0679\u0648 \u0627\u06cc\u0646\u0688 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06cc \u062a\u06cc\u0646 \u0686\u06cc\u0632\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2: \u0627\u06cc\u06a9 \u0631\u062c\u0633\u0679\u0631\u0688 \u0627\u06cc\u067e\u060c \u0627\u06cc\u06a9 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 URI\u060c \u0627\u0648\u0631 \u0627\u0633\u06a9\u0648\u067e\u0633 \u06a9\u0627 \u0627\u06cc\u06a9 \u0633\u06cc\u0679\u06d4 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0627\u062a\u0646\u06cc \u0645\u062e\u062a\u0644\u0641 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0644\u06af \u0633\u06d2 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648\u06ba\u06d4<\/p>\n<h3 id=\"heading-the-redirect-uri-has-to-use-https\">\u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 URI \u06a9\u0648 HTTPS \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/h3>\n<p>OAuth \u06a9\u0627 \u0627\u062d\u0627\u0637\u06c1 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u0633\u0628\u0642 \u0622\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06cc\u06ba\u06d4 <code>http:\/\/localhost:3000\/callback<\/code> \u0627\u0648\u0631 \u0686\u0644\u062a\u06d2 \u0631\u06c1\u06cc\u06ba\u06d4 \u0633\u0644\u06cc\u06a9 \u0627\u0633 \u06a9\u06cc \u062a\u0631\u062f\u06cc\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0633\u0644\u06cc\u06a9 \u06a9\u06cc \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u0645\u06cc\u06ba \u06a9\u06c1\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u06a9\u06c1 \"\u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 URLs \u06a9\u0648 HTTPS \u0628\u06be\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c\" \u0627\u0648\u0631 \u0627\u0633 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>localhost<\/code>. GitHub \u0632\u06cc\u0627\u062f\u06c1 \u0622\u0631\u0627\u0645 \u062f\u06c1 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc HTTPS \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u0637\u0645\u0626\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0642\u0648\u0627\u0639\u062f \u0648 \u0636\u0648\u0627\u0628\u0637 \u067e\u06cc\u0688\u06cc\u0646\u0679\u06a9 \u0644\u06af\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>localhost<\/code> \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0622\u067e \u06a9\u06d2 \u06a9\u0645\u067e\u06cc\u0648\u0679\u0631 \u06a9\u0648 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0686\u06be\u0648\u0691\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0644\u0627\u0626\u0646 \u067e\u0631 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u0631\u0648\u06a9\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 Slack \u0628\u06c1\u0631\u062d\u0627\u0644 \u0627\u0633 \u06a9\u0648 \u06cc\u06a9\u0633\u0627\u06ba \u0637\u0648\u0631 \u067e\u0631 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0645\u0633\u062a\u062b\u0646\u06cc\u0627\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06cc\u06a9\u0633\u0627\u06ba \u0642\u0648\u0627\u0646\u06cc\u0646 \u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0642\u0627\u0628\u0644 \u062f\u0641\u0627\u0639 \u0627\u0646\u062a\u062e\u0627\u0628 \u06c1\u06cc\u06ba\u06d4 \u06c1\u0631 \u0627\u0633\u062a\u062b\u0646\u06cc\u0670 \u0627\u06cc\u06a9 \u0628\u0631\u0627\u0646\u0686 \u06c1\u06d2 \u062c\u0633\u06d2 \u06a9\u0633\u06cc \u06a9\u0648 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0633\u0648\u0627\u0644 \"\u06a9\u06cc\u0627 \u06cc\u06c1 \u0648\u0627\u0642\u0639\u06cc \u0644\u0648\u06a9\u0644 \u06c1\u0648\u0633\u0679 \u06c1\u06d2\" \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0633\u0648\u0627\u0644 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u067e\u06c1\u0644\u06d2 \u063a\u0644\u0637 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>mkcert \u0627\u06cc\u06a9 \u0645\u0642\u0627\u0645\u06cc \u0627\u062a\u06be\u0627\u0631\u0679\u06cc \u06a9\u06d2 \u062f\u0633\u062a\u062e\u0637 \u0634\u062f\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0633\u0633\u0679\u0645 \u0679\u0631\u0633\u0679 \u0627\u0633\u0679\u0648\u0631 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0628\u0631\u0627\u0624\u0632\u0631 \u0627\u0633\u06d2 \u0628\u063a\u06cc\u0631 \u0648\u0627\u0631\u0646\u0646\u06af \u06a9\u06d2 \u0642\u0628\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">mkcert -install\nmkcert localhost\n<\/code><\/pre>\n<p>\u06cc\u06c1 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2 <code>localhost.pem<\/code> \u0627\u0648\u0631 <code>localhost-key.pem<\/code> \u0645\u0648\u062c\u0648\u062f\u06c1 \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679\u0631\u06cc \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba\u06d4 \u0627\u06cc\u0646\u06af\u0631\u0648\u06a9 \u062c\u06cc\u0633\u06cc \u0679\u0646\u0644\u0646\u06af \u0633\u0631\u0648\u0633\u0632 \u0628\u06be\u06cc \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0686\u0648\u0646\u06a9\u06c1 \u0645\u0641\u062a \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06af\u06be\u0648\u0645\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0622\u067e \u06a9\u0648 \u06c1\u0631 \u0633\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u062f\u0648\u0646\u0648\u06ba \u0627\u06cc\u067e \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<h3 id=\"heading-the-slack-app-and-the-one-setting-that-matters\">\u0633\u0644\u06cc\u06a9 \u0627\u06cc\u067e \u0627\u0648\u0631 \u0627\u06c1\u0645 \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/h3>\n<p>api.slack.com\/apps \u067e\u0631 \u0627\u067e\u0646\u06d2 \u0648\u0631\u06a9 \u0627\u0633\u067e\u06cc\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u06cc\u067e \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u06a9\u06be\u0648\u0644\u06cc\u06ba <strong>OAuth \u0627\u0648\u0631 \u0627\u062c\u0627\u0632\u062a\u06cc\u06ba\u06d4<\/strong> \u0627\u0648\u0631 \u062f\u0648 \u0686\u06cc\u0632\u06cc\u06ba \u0645\u0642\u0631\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<p>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba <code>https:\/\/localhost:3000\/callback<\/code> \u0646\u06cc\u0686\u06d2 <strong>\u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 URL<\/strong>.<\/p>\n<p>\u067e\u06be\u0631 \u0631\u06cc\u0646\u062c \u062a\u0644\u0627\u0634 \u06a9\u0631\u06cc\u06ba\u06d4 \u0635\u0641\u062d\u06c1 \u067e\u0631 \u062f\u0648 \u062d\u0635\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0622\u067e \u063a\u0644\u0637 \u0633\u06cc\u06a9\u0634\u0646 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0634\u06cc\u0626\u0631\u0646\u06af \u0628\u0648\u0679 \u0688\u06cc\u0632\u0627\u0626\u0646 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u067e\u0627\u0631\u0679 \u0679\u0627\u0626\u0645 \u0646\u0648\u06a9\u0631\u06cc<\/th>\n<th>\u06a9\u06cc\u0627 \u062f\u06cc\u062a\u0627 \u06c1\u06d2<\/th>\n<th>\u06a9\u06cc\u0627 \u0622\u067e \u0627\u0633\u06d2 \u06cc\u06c1\u0627\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06ba \u06af\u06d2\u061f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u0631\u06cc\u0646\u062c<\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>xoxb-<\/code> \u0679\u0648\u06a9\u0646 \u062c\u0648 \u0627\u06cc\u06a9 \u0627\u06cc\u067e \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u0646\u06c1\u06cc\u06ba<\/td>\n<\/tr>\n<tr>\n<td>\u06cc\u0648\u0632\u0631 \u0679\u0648\u06a9\u0646 \u0631\u06cc\u0646\u062c<\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <code>xoxp-<\/code> \u0679\u0648\u06a9\u0646 \u0627\u06cc\u06a9 \u0634\u062e\u0635 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u0627<\/td>\n<td>\u06c1\u0627\u06ba<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0646\u06cc\u0686\u06d2 <strong>\u06cc\u0648\u0632\u0631 \u0679\u0648\u06a9\u0646 \u0631\u06cc\u0646\u062c<\/strong>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<ul>\n<li>\n<p><code>channels:history<\/code>: \u0639\u0648\u0627\u0645\u06cc \u0686\u06cc\u0646\u0644\u0632 \u06a9\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u067e\u0691\u06be\u06cc\u06ba \u062c\u0646 \u0633\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u062a\u0639\u0644\u0642 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>chat:write<\/code>: \u0628\u0637\u0648\u0631 \u0635\u0627\u0631\u0641 \u067e\u0648\u0633\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p><code>users:read<\/code>: \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0648 \u0646\u0627\u0645 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u0631\u06cc\u0646\u062c \u06a9\u0648 \u062e\u0627\u0644\u06cc \u0686\u06be\u0648\u0691 \u062f\u06cc\u06ba\u06d4 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0622\u0626\u06cc \u0688\u06cc \u0627\u0648\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0633\u06cc\u06a9\u0631\u0679 \u06a9\u0627\u067e\u06cc \u06a9\u0631\u06cc\u06ba\u06d4 <strong>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0645\u0639\u0644\u0648\u0645\u0627\u062a<\/strong>.<\/p>\n<h3 id=\"heading-the-github-oauth-app\">GitHub OAuth \u0627\u06cc\u067e<\/h3>\n<p>\u062a\u0635\u062f\u06cc\u0642\u06cc \u06a9\u0627\u0644 \u0628\u06cc\u06a9 URL \u06a9\u0648 \u0633\u06cc\u0679\u0646\u06af\u0632 \u2192 \u0688\u06cc\u0648\u0644\u067e\u0631 \u0633\u06cc\u0679\u0646\u06af\u0632 \u2192 OAuth \u0627\u06cc\u067e \u2192 \u0646\u0626\u06cc OAuth \u0627\u06cc\u067e \u0645\u06cc\u06ba \u0627\u0633\u06cc \u067e\u0631 \u0633\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 <code>https:\/\/localhost:3000\/callback<\/code>\u06a9\u0644\u06a9 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0627 \u0631\u0627\u0632 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u067e\u0631\u062f\u06cc\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c GitHub \u0648\u06cc\u0628 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u067e\u0648\u0631\u06d2 \u0628\u06c1\u0627\u0624 \u06a9\u0648 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>GitHub \u0645\u06cc\u06ba \u0627\u06cc\u0634\u0648 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u0627 \u062f\u0627\u0626\u0631\u06c1 \u0645\u062e\u0632\u0646 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p><code>repo<\/code>    \u06cc\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0631\u0627\u0626\u06cc\u0648\u06cc\u0679 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u0648 \u0633\u0646\u0628\u06be\u0627\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u067e\u0646\u06d2 \u06a9\u0648\u0688 \u062a\u06a9 \u067e\u0691\u06be\u0646\u06d2 \u0627\u0648\u0631 \u0644\u06a9\u06be\u0646\u06d2 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>public_repo<\/code>    \u0627\u0646\u062a\u062e\u0627\u0628 \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0646\u06af \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 \u0679\u06cc\u0633\u0679 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0639\u0648\u0627\u0645\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u06cc\u06c1 \u06a9\u0627\u0641\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0645\u0645\u06a9\u0646 \u06c1\u0648 \u062a\u0648\u060c \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u0627 \u0633\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u06cc\u06ba\u06d4 \u0648\u06c1 \u062d\u062f\u0648\u062f \u062c\u0646 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0648\u06c1 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u0628\u0639\u062f \u0645\u06cc\u06ba \u06a9\u0631\u0646\u06cc \u06c1\u0648\u06af\u06cc\u06d4<\/p>\n<h3 id=\"heading-the-environment-file\">\u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0641\u0627\u0626\u0644<\/h3>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0627\u06cc\u067e\u0633 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0622\u0626\u06cc \u0688\u06cc \u0627\u0648\u0631 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0633\u06cc\u06a9\u0631\u06cc\u0679 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0648 \u0627\u06cc\u06a9 \u0627\u0646\u06a9\u0631\u067e\u0634\u0646 \u06a9\u0644\u06cc\u062f \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06d2 \u0627\u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">node -e \"console.log(require('node:crypto').randomBytes(32).toString('base64'))\"\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u0627\u0633\u06d2 \u0644\u06a9\u06be\u06cc\u06ba\u06d4 <code>.env<\/code>:<\/p>\n<pre><code class=\"language-bash\">OAUTH_REDIRECT_URI=https:\/\/localhost:3000\/callback\nTLS_CERT_PATH=.\/localhost.pem\nTLS_KEY_PATH=.\/localhost-key.pem\n\nSLACK_CLIENT_ID=\nSLACK_CLIENT_SECRET=\nGITHUB_CLIENT_ID=\nGITHUB_CLIENT_SECRET=\n\nTOKEN_ENCRYPTION_KEY=\n\nSLACK_CHANNEL_ID=C0XXXXXXXXX\nGITHUB_REPO=your-name\/your-test-repo\n<\/code><\/pre>\n<p>\u0645\u062a\u0639\u0644\u0642\u06c1 \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u0627 \u0631\u0627\u0632 \u062a\u0635\u062f\u06cc\u0642 \u0634\u062f\u06c1 \u06c1\u06d2\u06d4 <strong>\u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a<\/strong> \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648\u06d4 \u06cc\u06c1 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0627\u0633\u0646\u0627\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u06a9\u0627 \u062a\u0639\u0644\u0642 \u0628\u0631\u0627\u0624\u0632\u0631 \u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-run-the-consent-flow\">\u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u0627 \u0628\u06c1\u0627\u0624 \u06a9\u06cc\u0633\u06d2 \u0686\u0644\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/h2>\n<p>\u0641\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0627 \u062a\u0639\u0644\u0642 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u067e\u0631 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0628\u0639\u062f \u0645\u06cc\u06ba \u062a\u06cc\u0633\u0631\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u0628\u0631\u0627\u0646\u0686 \u0622\u0626\u0679\u0645 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<h3 id=\"heading-step-1-describe-each-provider-once\">\u0645\u0631\u062d\u0644\u06c1 1: \u06c1\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-javascript\">const REDIRECT_URI = process.env.OAUTH_REDIRECT_URI;\n\nexport const providers = {\n  slack: {\n    label: 'Slack',\n    authorizeUrl: 'https:\/\/slack.com\/oauth\/v2\/authorize',\n    tokenUrl: 'https:\/\/slack.com\/api\/oauth.v2.access',\n\n    \/\/ These go in `user_scope`, not `scope`. Scopes listed under `scope` grant\n    \/\/ a bot token, and a bot token is what this project exists to avoid.\n    userScopes: ['channels:history', 'chat:write', 'users:read'],\n\n    buildAuthorizeUrl(state) {\n      const url = new URL(this.authorizeUrl);\n      url.searchParams.set('client_id', process.env.SLACK_CLIENT_ID);\n      url.searchParams.set('user_scope', this.userScopes.join(','));\n      url.searchParams.set('redirect_uri', REDIRECT_URI);\n      url.searchParams.set('state', state);\n      return url.toString();\n    },\n    \/\/ exchangeCode and refresh follow below\n  },\n};\n<\/code><\/pre>\n<p><strong>\u06a9\u06c1<\/strong> <code>user_scope<\/code> <strong>\u0627\u06cc\u06a9 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631 \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u067e\u0631 \u067e\u0648\u0631\u06cc \u062f\u0644\u06cc\u0644 \u06c1\u06d2\u06d4<\/strong> \u0633\u0644\u06cc\u06a9 \u067e\u0691\u06be\u06cc\u06ba <code>scope<\/code> \u0628\u0648\u0679 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u0627\u0648\u0631 <code>user_scope<\/code> \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0635\u0631\u0641 \u062f\u0648\u0633\u0631\u0627 \u0633\u06cc\u0679 \u0627\u067e \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06cc\u06c1 \u0627\u06cc\u0633\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u0628\u0627\u0644\u06a9\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06c1 <code>state<\/code> \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0628\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062a\u0627\u0631 \u06c1\u06d2 \u062c\u0648 \u062a\u06cc\u0627\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0633\u067e\u0644\u0627\u0626\u0631 \u06a9\u0648 \u0628\u06be\u06cc\u062c\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0648\u0627\u067e\u0633\u06cc \u067e\u0631 \u0686\u06cc\u06a9 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0627\u0646\u0679\u0631\u0646\u06cc\u0679 \u067e\u0631 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0635\u0641\u062d\u06c1 \u0622\u067e \u06a9\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u06a9\u0648 \u062d\u0645\u0644\u06c1 \u0622\u0648\u0631 \u06a9\u06d2 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 URL \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <code>code<\/code> \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0645\u0646\u0633\u0644\u06a9 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0633\u0631\u0648\u0631 \u0627\u0633 \u06a9\u0627 \u062a\u0628\u0627\u062f\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u062e\u0648\u0634 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062d\u0645\u0644\u06c1 \u0622\u0648\u0631 \u06a9\u06d2 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-2-exchange-the-code-and-take-the-right-token\">\u0645\u0631\u062d\u0644\u06c1 2: \u0627\u067e\u0646\u0627 \u06a9\u0648\u0688 \u0686\u06be\u0691\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0635\u062d\u06cc\u062d \u0679\u0648\u06a9\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-javascript\">async exchangeCode(code) {\n  const response = await fetch(this.tokenUrl, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\n    body: new URLSearchParams({\n      code,\n      client_id: process.env.SLACK_CLIENT_ID,\n      client_secret: process.env.SLACK_CLIENT_SECRET,\n      redirect_uri: REDIRECT_URI,\n    }),\n  });\n\n  const json = await response.json();\n\n  \/\/ Slack answers HTTP 200 even when the exchange failed. The `ok` field\n  \/\/ is the real status.\n  if (!json.ok) {\n    throw new Error(`Slack token exchange failed: ${json.error}`);\n  }\n\n  return normalizeSlackTokens(json.authed_user);\n}\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u0627\u0633 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06cc\u0627\u062f \u0622\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0627\u0633 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u0688\u06cc\u0628\u06af \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u062d\u0642\u06cc\u0642\u06cc \u0648\u0642\u062a \u0644\u06af\u06d2 \u06af\u0627\u06d4<\/p>\n<p><strong>\u0633\u0644\u06cc\u06a9 \u0646\u0627\u06a9\u0627\u0645\u06cc \u067e\u0631 HTTP 200 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0686\u06cc\u06a9 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>response.ok<\/code> \u06cc\u06c1 \u0622\u067e \u06a9\u0648 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 HTTP \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062a\u06be\u06cc\u06d4 \u06a9\u06c1 <code>json.ok<\/code> \u0641\u06cc\u0644\u0688 \u0631\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 OAuth \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u0646\u06d2 \u06a9\u0627\u0645 \u06a9\u06cc\u0627\u06d4<\/p>\n<p><code>json.authed_user<\/code><strong>\u0646\u06c1\u06cc\u06ba<\/strong> <code>json<\/code><strong>.<\/strong> \u06cc\u06c1 \u0627\u0648\u067e\u0631 \u0648\u0627\u0644\u06d2 \u062d\u0635\u06d2 \u06a9\u0627 \u0627\u06cc\u06a9 \u06a9\u0627\u0646\u0679\u0627 \u06c1\u06d2\u060c \u062c\u0633 \u06a9\u0627 \u0627\u0638\u06c1\u0627\u0631 \u0627\u06cc\u06a9 \u067e\u0631\u0627\u067e\u0631\u0679\u06cc \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u067e\u0691\u06be\u0646\u0627 <code>json.access_token<\/code> \u06cc\u06c1 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0645\u0631\u062a\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0639\u0645\u0644\u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0628\u0648\u0679 ID \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0645\u0639\u0645\u0648\u0644 \u067e\u0631 \u0644\u0627\u0646\u0627 \u0628\u0627\u0642\u06cc \u06a9\u0648 \u06a9\u0648\u0688 \u0628\u06cc\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0633\u06d2 \u0622\u0632\u0627\u062f \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">function normalizeSlackTokens(authedUser) {\n  return {\n    accessToken: authedUser.access_token,\n    refreshToken: authedUser.refresh_token ?? null,\n    expiresAt: authedUser.expires_in\n      ? Date.now() + authedUser.expires_in * 1000\n      : null,\n    scope: authedUser.scope,\n  };\n}\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u0641\u0646\u06a9\u0634\u0646 \u06a9\u0627 GitHub \u0648\u0631\u0698\u0646 \u062f\u0648 \u0642\u0627\u0628\u0644 \u0630\u06a9\u0631 \u0637\u0631\u06cc\u0642\u0648\u06ba \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-javascript\">async exchangeCode(code) {\n  const response = await fetch(this.tokenUrl, {\n    method: 'POST',\n    \/\/ Without this header GitHub answers with a form-encoded body.\n    headers: {\n      'Content-Type': 'application\/x-www-form-urlencoded',\n      Accept: 'application\/json',\n    },\n    body: new URLSearchParams({\n      code,\n      client_id: process.env.GITHUB_CLIENT_ID,\n      client_secret: process.env.GITHUB_CLIENT_SECRET,\n      redirect_uri: REDIRECT_URI,\n    }),\n  });\n\n  const json = await response.json();\n  if (json.error) {\n    throw new Error(\n      `GitHub token exchange failed: ${json.error_description ?? json.error}`\n    );\n  }\n\n  \/\/ OAuth App tokens carry no expiry, so there is nothing to refresh.\n  return {\n    accessToken: json.access_token,\n    refreshToken: null,\n    expiresAt: null,\n    scope: json.scope,\n  };\n}\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>Accept: application\/json<\/code> \u06c1\u06cc\u0688\u0631\u0632 \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u0628\u06c1\u0645 \u063a\u0644\u0637\u06cc\u0648\u06ba \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646\u062a\u0627 \u06c1\u06d2\u06d4 <code>response.json()<\/code> \u0644\u0648\u0679\u06d2 \u06c1\u0648\u0626\u06d2 \u062c\u0633\u0645 \u067e\u0631 \u067e\u06be\u06cc\u0646\u06a9 \u062f\u06cc\u06ba\u06d4 <code>access_token=gho_...&scope=repo<\/code>.<\/p>\n<h3 id=\"heading-step-3-catch-the-redirect\">\u0645\u0631\u062d\u0644\u06c1 3: \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 \u06a9\u0648 \u067e\u06a9\u0691\u06cc\u06ba\u06d4<\/h3>\n<p>OAuth \u06a9\u0648 \u0627\u062a\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u06af\u06c1 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4 \u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0627\u06cc\u06a9 \u0633\u0631\u0648\u0631 \u062c\u0648 \u0634\u0631\u0648\u0639 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0641\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u06a9 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u067e\u0631 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0628\u0627\u06c1\u0631 \u0646\u06a9\u0644\u0646\u0627 \u06a9\u0627\u0641\u06cc \u06c1\u06d2\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0633\u0644\u06cc\u06a9 \u06a9\u0648 HTTPS \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 <code>OAUTH_REDIRECT_URI<\/code> \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u0633 \u0642\u0633\u0645 \u06a9\u0627 \u0633\u0631\u0648\u0631 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-javascript\">function createCallbackServer(handler) {\n  if (redirect.protocol !== 'https:') {\n    return createHttpServer(handler);\n  }\n\n  try {\n    return createHttpsServer(\n      {\n        cert: readFileSync(process.env.TLS_CERT_PATH),\n        key: readFileSync(process.env.TLS_KEY_PATH),\n      },\n      handler\n    );\n  } catch (err) {\n    throw new Error(\n      `Could not read the TLS certificate (${err.code ?? err.message}).n` +\n        'Generate a locally-trusted one with mkcert:n' +\n        '  mkcert -installn' +\n        '  mkcert localhostn' +\n        'then point TLS_CERT_PATH and TLS_KEY_PATH at the two files it writes.'\n    );\n  }\n}\n<\/code><\/pre>\n<p>\u06af\u0645\u0634\u062f\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679\u0633 \u06a9\u0633\u06cc \u06a9\u06d2 \u067e\u0627\u0633 \u06c1\u0648\u06ba \u06af\u06d2\u06d4 <code>ENOENT<\/code> \u06cc\u06c1 \u0627\u067e\u0646\u06d2 \u0622\u067e \u0645\u06cc\u06ba OAuth \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u06cc\u0686 \u0628\u0644\u0627\u06a9 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0686\u0627\u0631 \u0644\u0627\u0626\u0646\u06cc\u06ba \u0644\u06cc\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062e\u0648\u062f \u06c1\u06cc\u0646\u0688\u0644\u0631 \u06a9\u06c1\u0627\u06ba \u06c1\u06d2\u061f <code>state<\/code> \u0679\u06cc\u0633\u0679 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-javascript\">const pending = new Map();\n\nfunction handleCallback(request, response) {\n  const url = new URL(request.url, redirect.origin);\n\n  if (url.pathname !== redirect.pathname) {\n    response.writeHead(404).end('Not found');\n    return;\n  }\n\n  const state = url.searchParams.get('state');\n  const entry = pending.get(state);\n\n  if (!entry) {\n    response.writeHead(400).end('State mismatch. Start the flow again.');\n    return;\n  }\n\n  pending.delete(state);\n\n  const error = url.searchParams.get('error');\n  if (error) {\n    response.writeHead(400).end(`Authorization denied: ${error}`);\n    entry.reject(new Error(`[${entry.provider}] authorization denied: ${error}`));\n    return;\n  }\n\n  entry.finish(url.searchParams.get('code'), response);\n}\n<\/code><\/pre>\n<p><strong>\u06a9\u06c1<\/strong> <code>pending<\/code> <strong>\u0646\u0642\u0634\u06c1 \u06c1\u06d2<\/strong> <code>state<\/code> <strong>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba<\/strong> \u0631\u06cc\u0627\u0633\u062a\u06cc \u0627\u0642\u062f\u0627\u0631 \u0646\u0642\u0634\u06c1 \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0627\u0633 \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba \u062f\u0627\u062e\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0628 \u0648\u06c1 \u0627\u0633 \u0639\u0645\u0644 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062a\u062e\u0644\u06cc\u0642 \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u0648\u06ba \u0627\u0648\u0631 \u0627\u0646 \u06a9\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0648\u0642\u062a \u062d\u0630\u0641 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u062a\u0633\u0644\u06cc\u0645 \u0634\u062f\u06c1 \u062d\u0627\u0644\u062a \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u0627\u0633 \u0628\u06c1\u0627\u0624 \u0633\u06d2 \u0646\u06c1\u06cc\u06ba \u0622\u06cc\u0627 \u062c\u0633 \u0646\u06d2 \u0627\u0633\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u062a\u06be\u0627\u060c \u0627\u0648\u0631 \u062c\u0648 \u0631\u06cc\u0627\u0633\u062a \u062f\u0648 \u0628\u0627\u0631 \u0622\u062a\u06cc \u06c1\u06d2 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0646\u0648\u06ba \u0627\u06cc\u06a9 \u0633\u06d2 \u06af\u06be\u0679\u0627\u0626\u06cc\u06ba <code>Map<\/code> \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba<\/p>\n<p>\u0631\u06cc\u0627\u0633\u062a \u0628\u0646\u0627\u0646\u0627 \u0627\u0648\u0631 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u0627:<\/p>\n<pre><code class=\"language-javascript\">function connect(providerName) {\n  const provider = providers[providerName];\n  const state = randomBytes(16).toString('hex');\n\n  console.log(`n[${providerName}] authorize as \"${IDENTIFIER}\":`);\n  console.log(provider.buildAuthorizeUrl(state));\n\n  return new Promise((resolve, reject) => {\n    pending.set(state, {\n      provider: providerName,\n      reject,\n      async finish(code, response) {\n        const tokens = await provider.exchangeCode(code);\n        saveGrant(IDENTIFIER, providerName, tokens);\n        response\n          .writeHead(200, { 'Content-Type': 'text\/html' })\n          .end(`<p>${provider.label} connected. You can close this tab.<\/p>`);\n        resolve();\n      },\n    });\n  });\n}\n<\/code><\/pre>\n<p><code>randomBytes(16)<\/code>    \u0627\u0648\u0631 \u067e\u06be\u0631 \u0646\u06c1\u06cc\u06ba\u06d4 <code>Math.random()<\/code>. \u0642\u0627\u0628\u0644 \u067e\u06cc\u0634\u0646 \u06af\u0648\u0626\u06cc \u0631\u06cc\u0627\u0633\u062a \u06a9\u06d2 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0631\u06cc\u0627\u0633\u062a\u06cc \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06a9\u06d2 \u0628\u0631\u0627\u0628\u0631 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u0633 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06c1\u0631 \u0645\u0646\u0642\u0637\u0639 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u062f\u0644\u06d2 \u0645\u06cc\u06ba \u0644\u06d2 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<pre><code class=\"language-text\">[slack] authorize as \"alice@example.com\":\nhttps:\/\/slack.com\/oauth\/v2\/authorize?client_id=123.456&user_scope=channels%3Ahistory%2Cchat%3Awrite%2Cusers%3Aread&redirect_uri=https%3A%2F%2Flocalhost%3A3000%2Fcallback&state=1159699dbf1a808fd33ba31c7b643505\n<\/code><\/pre>\n<p>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0627\u0633 URL \u0645\u06cc\u06ba \u06a9\u06cc\u0627 \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 <code>scope<\/code> \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u0633\u0644\u06cc\u06a9 \u06a9\u0648 \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u062c\u0627\u0631\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u06c1\u062f\u0627\u06cc\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u06af\u0626\u06cc \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06c1\u0645 \u0627\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-store-tokens-encrypted-keyed-by-user\">\u0627\u06cc\u06a9 \u062e\u0641\u06cc\u06c1 \u06a9\u0631\u062f\u06c1 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0633 \u0637\u0631\u062d \u0627\u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062f\u0627\u062e\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u0633\u0679\u0648\u0631 \u0627\u06cc\u06a9 \u0633\u0648\u0627\u0644 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2: \u0627\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u06a9\u0648\u0646 \u0633\u06d2 \u0679\u0648\u06a9\u0646\u0632 \u06c1\u06cc\u06ba\u061f \u0627\u0633 \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0628\u0627\u0642\u06cc \u0633\u0628 \u06a9\u0686\u06be \u0627\u0646 \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u0648 \u0645\u062d\u0641\u0648\u0638 \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u0622\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>node:sqlite<\/code>    \u0627\u0633\u06d2 \u0646\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be v22.5 \u0633\u06d2 \u0628\u06be\u06cc\u062c \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 v22.13 \u0645\u06cc\u06ba \u062c\u06be\u0646\u0688\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u067e\u06be\u0631 \u0622\u067e \u0627\u067e\u0646\u06d2 \u0627\u0635\u0644 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u0648 \u0628\u063a\u06cc\u0631 \u06a9\u0686\u06be \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-javascript\">import { DatabaseSync } from 'node:sqlite';\nimport { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\n\nconst KEY = Buffer.from(process.env.TOKEN_ENCRYPTION_KEY ?? '', 'base64');\n\nif (KEY.length !== 32) {\n  throw new Error(\n    'TOKEN_ENCRYPTION_KEY must be 32 bytes, base64-encoded. ' +\n      `Got ${KEY.length} bytes.`\n  );\n}\n\nconst db = new DatabaseSync(\n  process.env.TOKEN_DB_PATH ?? new URL('..\/tokens.db', import.meta.url).pathname\n);\n\n\/\/ One row per user, per provider. expires_at stays outside the ciphertext so\n\/\/ a token's freshness can be checked without decrypting it.\ndb.exec(`\n  CREATE TABLE IF NOT EXISTS grants (\n    identifier TEXT    NOT NULL,\n    provider   TEXT    NOT NULL,\n    ciphertext BLOB    NOT NULL,\n    iv         BLOB    NOT NULL,\n    auth_tag   BLOB    NOT NULL,\n    expires_at INTEGER,\n    PRIMARY KEY (identifier, provider)\n  )\n`);\n<\/code><\/pre>\n<p><strong>\u0627\u06cc\u06a9 \u062c\u0627\u0645\u0639 \u0628\u0646\u06cc\u0627\u062f\u06cc \u06a9\u0644\u06cc\u062f \u0627\u06cc\u06a9 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0634\u062f\u06c1 \u062a\u0646\u06c1\u0627\u0626\u06cc \u06a9\u06cc \u0636\u0645\u0627\u0646\u062a \u06c1\u06d2\u06d4<\/strong> <code>(identifier, provider)<\/code>    \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u0644\u0633 \u06a9\u06cc \u0633\u0644\u06cc\u06a9 \u0642\u0637\u0627\u0631 \u0627\u0648\u0631 \u0628\u0627\u0628 \u06a9\u06cc \u0633\u0644\u06cc\u06a9 \u0642\u0637\u0627\u0631 \u0645\u062a\u0635\u0627\u062f\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0633\u06a9\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u062c\u0648 \u062f\u0648\u0646\u0648\u06ba \u062d\u0635\u0648\u06ba \u06a9\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062f\u0648\u0633\u0631\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0627\u06cc\u06a9 \u0627\u0639\u062a\u0631\u0627\u0641 \u0648\u0627\u067e\u0633 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0633\u06a9\u062a\u0627\u06d4<\/p>\n<p><code>expires_at<\/code> <strong>\u06cc\u06c1 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u0633\u0627\u0626\u0641\u0631 \u0679\u06cc\u06a9\u0633\u0679 \u0633\u06d2 \u0628\u0627\u06c1\u0631 \u0631\u06a9\u06be\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/strong> \u0686\u06cc\u06a9 \u06a9\u0631\u0646\u0627 \u06a9\u06c1 \u0622\u06cc\u0627 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u062c\u0648 \u06c1\u0645 \u06c1\u0631 \u06a9\u0627\u0644 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06a9\u0631\u067e\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0645\u0633\u0644\u0633\u0644 \u0688\u06a9\u0631\u067e\u0679 \u06a9\u0631\u0646\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u063a\u06cc\u0631 \u062e\u0641\u06cc\u06c1 \u0641\u06cc\u0644\u0688 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062e\u0641\u06cc\u06c1 \u06a9\u0627\u0631\u06cc AES-256-GCM \u06c1\u06d2 \u0627\u0648\u0631 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062e\u0641\u06cc\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-javascript\">function encrypt(payload) {\n  const iv = randomBytes(12);\n  const cipher = createCipheriv('aes-256-gcm', KEY, iv);\n  const ciphertext = Buffer.concat([\n    cipher.update(JSON.stringify(payload), 'utf8'),\n    cipher.final(),\n  ]);\n  return { ciphertext, iv, authTag: cipher.getAuthTag() };\n}\n\nfunction decrypt({ ciphertext, iv, authTag }) {\n  const decipher = createDecipheriv('aes-256-gcm', KEY, iv);\n  decipher.setAuthTag(authTag);\n  const plaintext = Buffer.concat([\n    decipher.update(ciphertext),\n    decipher.final(),\n  ]);\n  return JSON.parse(plaintext.toString('utf8'));\n}\n<\/code><\/pre>\n<p>\u0648\u06c1 \u062c\u0648\u0691\u0627 \u062a\u06cc\u0646 \u0627\u0635\u0648\u0644\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0634\u0631\u0648\u0637 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u06a9\u0633\u06cc \u06a9\u0648 \u062a\u0648\u0691\u0646\u0627 \u0628\u0627\u0644\u06a9\u0644 \u0628\u06be\u06cc \u062e\u0641\u06cc\u06c1 \u0646\u06c1 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0628\u062f\u062a\u0631 \u06c1\u06d2\u06d4 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06cc \u0637\u0631\u062d \u0644\u06af\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<ol>\n<li>\n<p><strong>\u0646\u06cc\u0627 IV \u0641\u06cc \u06a9\u0631\u06cc\u067e\u0679\u0648:<\/strong> GCM \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0646\u06cc\u0634\u06cc\u0644\u0627\u0626\u0632\u06cc\u0634\u0646 \u0648\u06cc\u06a9\u0679\u0631 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u0627 \u06a9\u0648\u0626\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc \u063a\u0644\u0637\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0628\u0644\u06a9\u06c1 \u0627\u06cc\u06a9 \u0645\u06c1\u0644\u06a9 \u063a\u0644\u0637\u06cc \u06c1\u06d2\u06d4 <code>randomBytes(12)<\/code> \u06cc\u06c1 \u06c1\u0631 \u06a9\u0627\u0644 \u067e\u0631 \u0633\u0627\u0626\u0641\u0631 \u0679\u06cc\u06a9\u0633\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0627 \u0679\u06cc\u06af \u0631\u06a9\u06be\u06cc\u06ba\u06d4<\/strong> GCM \u0627\u06cc\u0633\u06d2 \u0679\u06cc\u06af\u0632 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062b\u0627\u0628\u062a \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0633\u0627\u0626\u0641\u0631 \u0679\u06cc\u06a9\u0633\u0679 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0628\u063a\u06cc\u0631 <code>setAuthTag<\/code> \u0648\u0627\u067e\u0633\u06cc \u067e\u0631\u060c \u062f\u06cc\u0627\u0646\u062a\u062f\u0627\u0631\u06cc \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062e\u0641\u06cc\u06c1 \u06a9\u0627\u0631\u06cc \u06a9\u06cc \u06af\u0626\u06cc\u06d4 <code>decipher.final()<\/code> \u0645\u06cc\u06ba \u0634\u06a9\u0627\u06cc\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0648\u06ba \u06af\u0627\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06c1\u0631 \u0641\u06cc\u0644\u0688 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u067e\u0648\u0631\u06d2 \u0679\u0648\u06a9\u0646 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u062e\u0641\u06cc\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0633\u06cc\u0641\u0631 \u0679\u06cc\u06a9\u0633\u0679 <code>{ accessToken, refreshToken, scope }<\/code> \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u0648 \u062a\u06cc\u0646 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 IV \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0679\u06cc\u06af \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0627\u0633 \u0633\u06d2 \u0644\u06a9\u06be\u0646\u0627 \u0627\u0648\u0631 \u067e\u0691\u06be\u0646\u0627 \u06a9\u0645 \u0646\u0645\u0627\u06cc\u0627\u06ba \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<pre><code class=\"language-javascript\">export function saveGrant(identifier, provider, tokens) {\n  const { ciphertext, iv, authTag } = encrypt(tokens);\n  db.prepare(\n    `INSERT INTO grants (identifier, provider, ciphertext, iv, auth_tag, expires_at)\n     VALUES (?, ?, ?, ?, ?, ?)\n     ON CONFLICT (identifier, provider) DO UPDATE SET\n       ciphertext = excluded.ciphertext,\n       iv         = excluded.iv,\n       auth_tag   = excluded.auth_tag,\n       expires_at = excluded.expires_at`\n  ).run(identifier, provider, ciphertext, iv, authTag, tokens.expiresAt ?? null);\n}\n<\/code><\/pre>\n<p>\u06a9\u06c1 <code>ON CONFLICT<\/code> \u062f\u0641\u0639\u0627\u062a \u0627\u0646 \u06a9\u06cc \u0646\u0638\u0631 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u0648 \u0627\u062c\u0627\u0632\u062a \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0633\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06cc\u0627 \u0646\u0642\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u060c \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u0628\u0627\u0644\u06a9\u0644 \u0648\u06c1\u06cc \u06c1\u06d2 \u062c\u0648 \u0635\u0627\u0631\u0641 \u0645\u0646\u0633\u0648\u062e\u06cc \u06cc\u0627 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062e\u0641\u06cc\u06c1 \u06a9\u0627\u0631\u06cc \u06a9\u06cc \u06a9\u0644\u06cc\u062f \u062e\u0648\u062f \u06c1\u06d2\u06d4 <code>.env<\/code> \u06cc\u06c1 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2 \u0646\u06c1 \u06a9\u06c1 \u0633\u06cc\u06a9\u0631\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u06cc\u0627 KMS \u06a9\u06d2 \u062d\u0635\u06d2 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u06a9\u06be\u0648 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648\u060c \u062a\u0645\u0627\u0645 \u0630\u062e\u06cc\u0631\u06c1 \u0634\u062f\u06c1 \u0627\u062c\u0627\u0632\u062a\u06cc\u06ba \u0646\u0627\u0642\u0627\u0628\u0644 \u067e\u0691\u06be\u06cc \u062c\u0627\u0626\u06cc\u06ba \u06af\u06cc \u0627\u0648\u0631 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u062f\u06cc\u0646\u0627 \u06c1\u0648\u06af\u06cc\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0628\u0646\u062f\u0634 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0686\u0648\u0631\u06cc \u0634\u062f\u06c1 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0641\u0627\u0626\u0644 \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0648\u0631\u06a9\u0646\u06af \u0679\u0648\u06a9\u0646 \u062f\u06d2 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u0631\u0646 \u0679\u0627\u0626\u0645 \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u06a9\u0627\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba: \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0679\u0648\u06a9\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u067e\u0648\u0631\u06cc \u0686\u06cc\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0645\u06cc\u06ba \u0644\u067e\u06cc\u0679\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-step-1-resolve-the-identifier-then-authorize\">\u0645\u0631\u062d\u0644\u06c1 1: \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0646\u0638\u0648\u0631\u06cc \u062f\u06cc\u06ba\u06d4<\/h3>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06cc\u06c1 \u06c1\u06cc\u06ba: <strong>\u0645\u0633\u062a\u062d\u06a9\u0645 \u062a\u0627\u0631<\/strong> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641\u060c \u0627\u06cc \u0645\u06cc\u0644 \u0627\u06cc\u0688\u0631\u06cc\u0633\u060c \u0635\u0627\u0631\u0641 ID\u060c \u0627\u0648\u0631 \u06a9\u0631\u0627\u06cc\u06c1 \u062f\u0627\u0631 \u0627\u0633\u06a9\u0648\u067e \u06a9\u0644\u06cc\u062f \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">\/\/ In a real app this comes from your authenticated session, resolved\n\/\/ server-side. Never accept it from client input.\nconst IDENTIFIER = process.argv[2] ?? 'channel-watcher-agent';\n<\/code><\/pre>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u067e\u0691\u06be\u06cc\u06ba <code>argv<\/code> \u0644\u0627\u06af \u0627\u0646 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0688\u06cc\u0645\u0648 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0631\u06a9\u06be\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u0628\u0639\u062f \u0645\u06cc\u06ba \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0679\u06cc\u0633\u0679\u0648\u06ba \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0645\u0627\u0646\u0688 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0627\u0635\u0644 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0644\u0627\u0626\u0646\u0648\u06ba \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06d2 \u06af\u06cc\u06d4<\/p>\n<pre><code class=\"language-javascript\">\/\/ Real app: resolve from your authenticated session, server-side.\nconst session = await getSession(request);                  \/\/ your auth\nconst identifier = await lookupIdentifier(session.userId);  \/\/ your database\n<\/code><\/pre>\n<p><strong>\u0627\u0646 \u062f\u0648 \u0633\u0637\u0631\u0648\u06ba \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u0627\u06c1\u0645 \u06c1\u06d2\u06d4<\/strong> \u067e\u06c1\u0644\u06d2 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u060c \u067e\u06be\u0631 \u0645\u0639\u0644\u0648\u0645 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0628\u06be\u06cc\u062c\u0646\u06d2 \u0648\u0627\u0644\u0627 \u06a9\u0633 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u0627\u06d4 \u06a9\u0644\u0627\u0626\u0646\u0679 \u0633\u06d2 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06a9\u0648 \u062a\u0645\u0627\u0645 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u0688\u0631 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-step-2-turn-the-identifier-into-a-token-late\">\u0645\u0631\u062d\u0644\u06c1 2: \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0648 \u062f\u06cc\u0631 \u0633\u06d2 \u0679\u0648\u06a9\u0646\u0632 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u0627\u0648\u0631 \u06c1\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627\u0644 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u06cc\u06a9 \u0641\u0646\u06a9\u0634\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">const REFRESH_WINDOW_MS = 60_000;\n\nexport async function getAccessToken(identifier, providerName) {\n  const grant = readGrant(identifier, providerName);\n\n  if (!grant) {\n    throw new Error(\n      `[${providerName}] no grant for \"${identifier}\".n` +\n        `Connect it first: node src\/connect.js ${identifier}`\n    );\n  }\n\n  const expiringSoon =\n    grant.expiresAt !== null &&\n    grant.expiresAt !== undefined &&\n    grant.expiresAt - Date.now() < REFRESH_WINDOW_MS;\n\n  if (!expiringSoon) {\n    return grant.accessToken;\n  }\n\n  if (!grant.refreshToken) {\n    throw new Error(\n      `[${providerName}] token for \"${identifier}\" expired and no refresh ` +\n        'token is stored. The user has to consent again.'\n    );\n  }\n\n  const refreshed = await providers[providerName].refresh(grant.refreshToken);\n  saveGrant(identifier, providerName, refreshed);\n  return refreshed.accessToken;\n}\n<\/code><\/pre>\n<p><strong>\u0627\u0633 \u06a9\u0627\u0644 \u06a9\u0648 \u0627\u067e\u0646\u06cc API \u06a9\u0627\u0644 \u0633\u06d2 \u0641\u0648\u0631\u0627\u064b \u067e\u06c1\u0644\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633 \u06a9\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0634\u0631\u0648\u0639 \u06c1\u0648\u0646\u06d2 \u067e\u0631\u06d4<\/strong> \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc \u0644\u0645\u0628\u06cc \u062f\u0648\u0691\u06cc\u06ba 12 \u06af\u06be\u0646\u0679\u06d2 \u06a9\u06d2 \u0679\u0648\u06a9\u0646 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u062f\u06cc\u0631 \u062a\u06a9 \u0686\u0644 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0648\u0642\u062a \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0646\u062a\u06c1\u0627\u0626\u06cc \u062a\u06a9\u0644\u06cc\u0641 \u062f\u06c1 \u0644\u0645\u062d\u06d2 \u0645\u06cc\u06ba \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u0646\u0627\u06d4 \u062f\u06cc\u0631 \u0633\u06d2 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0633\u062a\u0627 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u067e\u0691\u06be\u0646\u0627 \u067e\u0691\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u0648\u0631\u06cc \u06a9\u0644\u0627\u0633 \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u06be\u06cc\u060c <strong>60 \u0633\u06cc\u06a9\u0646\u0688 \u0648\u0646\u0688\u0648 \u062e\u0648\u062f \u067e\u06cc\u0688 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/strong> 4 \u0633\u06cc\u06a9\u0646\u0688 \u0628\u0627\u0642\u06cc \u0631\u06c1\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u0645\u0639\u06cc\u0627\u062f \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0645\u0639\u06cc\u0627\u062f \u0686\u06cc\u06a9 \u067e\u0627\u0633 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u067e\u0631\u0648\u0627\u0632 \u0645\u06cc\u06ba \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0648\u0646\u0688\u0648 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u0622\u0626\u0679\u0645\u0632 \u06a9\u0648 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u0644\u0648\u0679\u0627 \u06c1\u0648\u0627 \u0679\u0648\u06a9\u0646 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u06cc\u06a9 \u0645\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0686\u06be\u0627 \u0631\u06c1\u06d2 \u06af\u0627\u06d4<\/p>\n<p>\u0622\u062e\u0631 \u0645\u06cc\u06ba\u060c \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u06af\u0631\u0627\u0646\u0679 \u063a\u0627\u0626\u0628 \u06c1\u06d2\u060c \u062a\u0648 \u067e\u06cc\u0686\u06be\u06d2 \u06c1\u0679\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u06cc\u06a9 \u063a\u0644\u0637\u06cc \u0627\u0679\u06be\u0627\u0626\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u067e\u06cc\u0686\u06be\u06d2 \u06c1\u0679\u0646\u0627 \u06a9\u0648\u0626\u06cc \u0645\u0639\u0646\u06cc \u0646\u06c1\u06cc\u06ba \u0631\u06a9\u06be\u062a\u0627\u06d4 \u063a\u06cc\u0631 \u0645\u0631\u0628\u0648\u0637 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u0633\u062a \u0646\u062a\u06cc\u062c\u06c1 \u0627\u06cc\u06a9 \u0641\u0631\u06cc\u0632 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0628\u062a\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0633\u06d2 \u062c\u0691\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-3-wrap-provider-calls-as-tools\">\u0645\u0631\u062d\u0644\u06c1 3: \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627\u0644 \u06a9\u0648 \u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0633\u06d2 \u0644\u067e\u06cc\u0679\u06cc\u06ba\u06d4<\/h3>\n<p>ID \u06a9\u0648 \u0627\u06cc\u06a9 \u067e\u0631\u062a \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u0627\u0646\u062c\u06a9\u0634\u0646 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u067e\u0631 \u0645\u0627\u0688\u0644 \u0627\u062b\u0631 \u0627\u0646\u062f\u0627\u0632 \u06c1\u0648 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">export function buildTools(identifier) {\n  const [owner, repo] = process.env.GITHUB_REPO.split('\/');\n\n  const fileGithubIssue = tool({\n    description: 'File a GitHub issue for an actionable Slack message',\n    inputSchema: z.object({\n      title: z.string(),\n      body: z.string(),\n    }),\n    execute: async ({ title, body }) => {\n      const token = await getAccessToken(identifier, 'github');\n      return createIssue(token, owner, repo, { title, body });\n    },\n  });\n\n  const replyInSlackThread = tool({\n    description:\n      'Reply in the original Slack thread (e.g. with the created issue link)',\n    inputSchema: z.object({\n      text: z.string(),\n      thread_ts: z.string(),\n    }),\n    execute: async ({ text, thread_ts }) => {\n      const token = await getAccessToken(identifier, 'slack');\n      return postThreadReply(\n        token,\n        process.env.SLACK_CHANNEL_ID,\n        text,\n        thread_ts\n      );\n    },\n  });\n\n  return { fileGithubIssue, replyInSlackThread };\n}\n<\/code><\/pre>\n<p>\u0645\u0648\u0627\u0632\u0646\u06c1 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u0645\u0627\u0688\u0644 \u06a9\u06cc\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u06cc\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4 \u0645\u0627\u0688\u0644 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 <code>title<\/code>\u060c <code>body<\/code>\u0627\u0648\u0631 <code>text<\/code>. <strong>\u0645\u0627\u0688\u0644 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0645\u0646\u062a\u062e\u0628 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/strong> <code>identifier<\/code>    \u0645\u0627\u0688\u0644 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0628\u0646\u062f\u0634 \u06a9\u06d2 \u062f\u0644\u0627\u0626\u0644 \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06cc \u06af\u0626\u06cc\u060c <code>inputSchema<\/code>. \u0686\u0648\u0646\u06a9\u06c1 \u0622\u067e \u06a9\u0627 \u0627\u06a9\u0627\u0624\u0646\u0679 \u0627\u0646 \u067e\u0679\u0633 \u0645\u06cc\u06ba \u0633\u06d2 \u0627\u06cc\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u06a9\u0648\u0626\u06cc \u0627\u0646 \u067e\u0679 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u062c\u0648 \u062f\u0648\u0633\u0631\u0648\u06ba \u06a9\u06cc \u0637\u0631\u062d \u0622\u067e \u06a9\u06cc \u0645\u0627\u0688\u0644 \u0641\u0627\u0626\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0628\u0627\u0639\u062b \u0628\u0646 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06c1\u0631 \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0642\u06cc\u0645\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0622\u0688\u0679 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 <code>createIssue<\/code> \u0634\u0645\u0627\u0631\u06c1 \u0646\u0645\u0628\u0631\u060c URL \u0627\u0648\u0631 \u0639\u0646\u0648\u0627\u0646 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>postThreadReply<\/code> \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0646\u06c1 \u062a\u0648 \u06a9\u0648\u0626\u06cc \u0679\u0648\u06a9\u0646 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u06cc\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u062e\u0627\u0645 \u062c\u0648\u0627\u0628 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u0679\u0648\u06a9\u0646 \u0686\u06be\u067e\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627\u0644 \u062e\u0648\u062f \u0633\u0627\u062f\u06c1 HTTP \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">export async function createIssue(token, owner, repo, { title, body }) {\n  const response = await fetch(\n    `https:\/\/api.github.com\/repos\/${owner}\/${repo}\/issues`,\n    {\n      method: 'POST',\n      headers: {\n        Authorization: `Bearer ${token}`,\n        Accept: 'application\/vnd.github+json',\n        'X-GitHub-Api-Version': '2022-11-28',\n        'Content-Type': 'application\/json',\n      },\n      body: JSON.stringify({ title, body }),\n    }\n  );\n\n  const json = await response.json();\n\n  if (!response.ok) {\n    \/\/ 403 here usually means the grant is missing the `repo` scope.\n    throw new Error(\n      `GitHub issue creation failed (${response.status}): ${json.message}`\n    );\n  }\n\n  return { number: json.number, url: json.html_url, title: json.title };\n}\n<\/code><\/pre>\n<h3 id=\"heading-step-4-read-the-channel\">\u0645\u0631\u062d\u0644\u06c1 4: \u0686\u06cc\u0646\u0644 \u067e\u0691\u06be\u06cc\u06ba<\/h3>\n<p>\u0633\u0644\u06cc\u06a9\u0633 <code>conversations.history<\/code> \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0635\u0627\u0641 JSON \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06cc\u063a\u0627\u0645 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0627 \u0635\u0627\u0631\u0641 ID \u0634\u0627\u0645\u0644 \u06c1\u06d2\u060c \u0622\u067e \u06a9\u0627 \u0688\u0633\u067e\u0644\u06d2 \u0646\u0627\u0645 \u0646\u06c1\u06cc\u06ba\u06d4 \u0627\u0633\u06d2 \u0646\u0627\u0645 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4 <code>users.info<\/code> \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>users:read<\/code> \u06cc\u06c1 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u062a\u06be\u0627\u06d4<\/p>\n<pre><code class=\"language-javascript\">export async function readChannel(token, channelId, limit = 20) {\n  const { messages } = await slackCall(token, 'conversations.history', {\n    channel: channelId,\n    limit: String(limit),\n  });\n\n  const authors = await resolveAuthors(\n    token,\n    messages.filter((m) => m.user).map((m) => m.user)\n  );\n\n  return messages\n    .filter((message) => message.text)\n    .map((message) => ({\n      author: authors.get(message.user) ?? 'unknown',\n      userId: message.user,\n      text: message.text,\n      ts: message.ts,\n    }))\n    .reverse(); \/\/ oldest first\n}\n<\/code><\/pre>\n<p>\u0627\u0633 \u062e\u0635\u0648\u0635\u06cc\u062a \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u0686\u06be\u0648\u0679\u06d2 \u0641\u06cc\u0635\u0644\u06d2:<\/p>\n<ol>\n<li>\n<p><strong>\u0646\u0627\u0645 \u06a9\u06cc \u0642\u06cc\u0645\u062a 1\u06d4<\/strong> <code>users.info<\/code> <strong>\u0645\u0646\u0641\u0631\u062f \u0645\u0635\u0646\u0641 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0628\u0644\u0627\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/strong> \u0641\u06cc \u0631\u0646 \u06a9\u06cc\u0634\u0646\u06af \u0627\u0633 \u0628\u0627\u062a \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0634\u062e\u0635 \u06a9\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u0633\u06d2 \u0628\u06be\u0631\u0627 \u06c1\u0648\u0627 \u0686\u06cc\u0646\u0644 20 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06cc \u06c1\u0679\u0633 \u067e\u06cc\u062f\u0627 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u0646\u0627\u0642\u0627\u0628\u0644 \u062d\u0644 \u0646\u0627\u0645 \u0639\u0645\u0644 \u06a9\u0648 \u062a\u0631\u06a9 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0648\u062c\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0646\u0627\u06a9\u0627\u0645 \u062a\u0644\u0627\u0634 \u067e\u06cc\u062f\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 ID \u067e\u0631 \u0648\u0627\u067e\u0633 \u0646\u06c1\u06cc\u06ba \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0648\u0626\u06cc \u067e\u06cc\u063a\u0627\u0645 \u0646\u06c1\u06cc\u06ba<\/strong> <code>text<\/code> <strong>\u0627\u062a\u0631 \u062c\u0627\u0624<\/strong> \u0686\u06cc\u0646\u0644 \u062c\u0648\u0627\u0626\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0645\u06cc\u0633\u062c \u0622\u0628\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0628\u0627\u0688\u06cc \u06a9\u06d2 \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646 \u06a9\u06cc \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><code>.reverse()<\/code> <strong>\u06cc\u06c1 \u06a9\u0627\u0633\u0645\u06cc\u0679\u06a9 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/strong> \u0633\u0644\u06cc\u06a9 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0622\u0626\u0679\u0645\u0632 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0648\u06c1 \u0645\u0627\u0688\u0644 \u062c\u0648 \u06af\u0641\u062a\u06af\u0648 \u06a9\u0648 \u067e\u06cc\u0686\u06be\u06d2 \u06a9\u06cc \u0637\u0631\u0641 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u063a\u0644\u0637 \u067e\u0691\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0633 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u06a9\u06c1 <code>ts<\/code> \u0641\u06cc\u0644\u0688 \u0688\u0628\u0644 \u0688\u06cc\u0648\u0679\u06cc \u06a9\u06be\u06cc\u0646\u0686\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u0648\u0627\u0628\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u0627\u06cc\u0646\u06a9\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06cc\u06c1 \u06cc\u0627\u062f \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u06a9\u0627 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06a9\u06cc\u0627 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">const state = await loadState();\nconst processed = new Set(state[IDENTIFIER]?.processedTs ?? []);\nconst newMessages = messages.filter((m) => !processed.has(m.ts));\n<\/code><\/pre>\n<p><strong>\u0627\u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062c\u0648 \u0631\u06cc\u0627\u0633\u062a \u06a9\u06cc \u0628\u0637\u0648\u0631 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/strong>\u0628\u0627\u0644\u06a9\u0644 \u0679\u06a9\u0691\u0627 \u06a9\u06cc \u0637\u0631\u062d\u06d4 \u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0641\u06c1\u0631\u0633\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u067e\u0631\u0648\u0633\u06cc\u0633 \u0634\u062f\u06c1 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u062f\u0648\u0633\u0631\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u0648 \u0686\u06be\u067e\u0627\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u067e\u0631 \u062e\u0648\u0646 \u0628\u06c1\u0646\u06d2 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633\u06d2 \u0631\u0648\u06a9\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0648\u0631\u0627 \u0688\u06cc\u0632\u0627\u0626\u0646 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-step-5-run-the-tool-loop\">\u0645\u0631\u062d\u0644\u06c1 5: \u0679\u0648\u0644 \u0644\u0648\u067e \u0686\u0644\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0679\u0648\u0644\u0632 \u06a9\u0648 \u0645\u0627\u0688\u0644 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u062f\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-javascript\">const { text } = await generateText({\n  model: anthropic(process.env.MODEL),\n  tools,\n  stopWhen: stepCountIs(5),\n  prompt: `You triage messages from a dev team's Slack channel.\n\nMessage from ${message.author}: \"${message.text}\"\nMessage timestamp (thread_ts): ${message.ts}\n\nDecide if this message is actionable (a bug report or concrete action item) or just noise (chit-chat, join notices, already-resolved chatter).\n\nIf actionable: file a GitHub issue with a clear title and body drafted from the message, then reply in the original Slack thread (use the exact thread_ts above) with a short note and the created issue's URL.\n\nIf not actionable: do nothing and briefly say why.`,\n});\n<\/code><\/pre>\n<p>\u06a9\u06c1 <strong>\u0627\u0646\u06af\u0648\u0679\u06be\u06cc<\/strong> \u06cc\u06c1\u06cc \u0648\u06c1 \u0686\u06cc\u0632 \u06c1\u06d2 \u062c\u0648 \u062f\u0648\u0633\u0631\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0645\u0645\u06a9\u0646 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0645\u0627\u0688\u0644 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u067e\u0691\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u06a9\u0627\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 <code>fileGithubIssue<\/code>. AI SDK \u0679\u0648\u0644 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0646\u062a\u0627\u0626\u062c \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0645\u0633\u0626\u0644\u06d2 \u0648\u0627\u0644\u06d2 URL \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u06cc\u0627\u0642 \u0648 \u0633\u0628\u0627\u0642 \u0645\u06cc\u06ba \u0641\u06cc\u0688 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0645\u0627\u0688\u0644 \u0627\u0628 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06d2 URL \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u062a\u06be\u0631\u06cc\u0688 \u0645\u06cc\u06ba \u062c\u0648\u0627\u0628 \u062f\u06d2 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u067e\u06c1\u0644\u06d2 \u0645\u0631\u062d\u0644\u06d2 \u0645\u06cc\u06ba \u0646\u0627\u0645\u0639\u0644\u0648\u0645 \u062a\u06be\u0627\u06d4 \u067e\u06be\u0631 \u0631\u06a9 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><code>stopWhen: stepCountIs(5)<\/code>    \u0631\u0627\u0624\u0646\u0688 \u0628\u0646\u062f \u06a9\u0631\u06cc\u06ba\u06d4 \u062d\u062f\u0648\u062f \u06a9\u06d2 \u0628\u063a\u06cc\u0631\u060c \u0627\u06cc\u06a9 \u0627\u0641\u0631\u0627\u062a\u0641\u0631\u06cc \u0648\u0627\u0644\u0627 \u0645\u0627\u0688\u0644 \u0627\u06cc\u06a9 \u0646\u0627\u06a9\u0627\u0645 \u0679\u0648\u0644 \u06a9\u0648 \u063a\u06cc\u0631 \u0645\u0639\u06cc\u0646\u06c1 \u0645\u062f\u062a \u062a\u06a9 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0633\u0628\u0628 \u0628\u0646 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0627\u0646\u0686 \u0686\u06a9\u0631 \u06a9\u0627\u0641\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>deterministic \u0648\u0631\u0698\u0646 \u0628\u06be\u06cc \u0645\u0639\u0642\u0648\u0644 \u06c1\u06d2\u06d4 \u06c1\u0645 \u0627\u0633\u06d2 \u0633\u0679\u0631\u06a9\u0686\u0631\u0688 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0627\u0644\u0632 \u0645\u06cc\u06ba \u062a\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u062f\u0648\u0646\u0648\u06ba \u0679\u0648\u0644\u0632 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u06a9\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0628 \u067e\u06cc\u063a\u0627\u0645 \u0633\u0645\u062c\u06be \u0645\u06cc\u06ba \u0622\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0641\u06a9\u0633\u0688 \u062a\u0633\u0644\u0633\u0644 \u06a9\u0648 \u062c\u0627\u0646\u0686\u0646\u0627 \u0627\u0648\u0631 \u062d\u0642\u06cc\u0642\u06cc \u0644\u0686\u06a9 \u06a9\u0648 \u062a\u0631\u06a9 \u06a9\u0631\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u0648\u067e\u0633 \u0645\u0627\u0688\u0644 \u06a9\u0648 \u062c\u0648\u0627\u0628 \u0686\u06be\u0648\u0691\u0646\u06d2 \u06cc\u0627 \u062c\u0648\u0627\u0628 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0641\u0627\u0626\u0644 \u062c\u0645\u0639 \u06a9\u0631\u0627\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062a\u06cc\u0633\u0631\u06d2 \u0679\u0648\u0644 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0646\u0626\u06cc \u0628\u0631\u0627\u0646\u0686 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u062e\u062a\u0645 \u06c1\u0648\u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0633\u06cc\u0679 \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0644\u062d\u0627\u0638 \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0627\u06cc\u06a9 \u0644\u0648\u067e \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u06cc\u06ba\u06d4 \u062f\u0648\u0633\u0631\u06cc \u0635\u0648\u0631\u062a \u0645\u06cc\u06ba\u060c \u0627\u06cc\u06a9 \u0645\u0642\u0631\u0631\u06c1 \u0622\u0631\u0688\u0631 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0631\u06cc\u06ba.<\/p>\n<p>\u067e\u06be\u0627\u0646\u0633\u06cc \u06a9\u06cc \u0627\u0634\u06cc\u0627\u0621 \u06a9\u06cc \u062f\u0631\u0633\u062a\u06af\u06cc \u06a9\u0648 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u067e\u0644\u0627\u0626\u0631 \u0644\u0627\u0626\u0646\u0648\u06ba \u067e\u0631 \u0646\u0648\u0679\u0633\u06d4 \u0627\u0648\u067e\u0631 \u06a9\u0627 \u0679\u06a9\u0691\u0627 \u06c1\u06d2\u06d4 <code>@ai-sdk\/anthropic<\/code>\u06cc\u06c1 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a Anthropic API \u06a9\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0648\u0632\u0648\u06ba \u06c1\u06d2\u06d4 \u0645\u06cc\u0631\u06cc \u062c\u0627\u0646\u0686 \u0627\u06cc\u06a9 OpenAI \u06c1\u0645 \u0622\u06c1\u0646\u06af \u06af\u06cc\u0679 \u0648\u06d2 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc \u062c\u0648 \u0635\u0631\u0641 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">import { createOpenAICompatible } from '@ai-sdk\/openai-compatible';\n\nconst gateway = createOpenAICompatible({\n  name: 'gateway',\n  baseURL: `${process.env.GATEWAY_BASE_URL}\/v1`,\n  apiKey: process.env.GATEWAY_API_KEY,\n});\n\/\/ then: model: gateway(process.env.MODEL)\n<\/code><\/pre>\n<p>\u0679\u0648\u0644\u0632\u060c \u0644\u0648\u067e\u0633\u060c \u0627\u0648\u0631 \u0679\u0648\u06a9\u0646 \u06c1\u06cc\u0646\u0688\u0644\u0646\u06af \u062f\u0648\u0646\u0648\u06ba \u0637\u0631\u062d \u0633\u06d2 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0635\u0631\u0641 <code>model<\/code> \u062f\u0644\u06cc\u0644 \u0628\u062f\u0644 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-handle-refresh-and-revocation\">\u0631\u06cc\u0641\u0631\u06cc\u0634\u0632 \u0627\u0648\u0631 \u0679\u0631\u0645\u06cc\u0646\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p><strong>\u0679\u0648\u06a9\u0646 \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0637\u0631\u06cc\u0642\u0648\u06ba \u0633\u06d2 \u062e\u062a\u0645 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba:<\/strong> \u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06a9\u0648\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2**.** \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648\u0646\u0627 \u0645\u0639\u0645\u0648\u0644 \u06c1\u06d2 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06c1\u06d2\u06d4 \u062f\u0633\u062a\u0628\u0631\u062f\u0627\u0631\u06cc \u0627\u06cc\u06a9 \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u06d2 \u062c\u0648 \u06a9\u0633\u06cc \u0646\u06d2 \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062f\u0631\u0633\u062a \u062c\u0648\u0627\u0628 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u062d\u0627\u0635\u0644 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u062f\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0633\u067e\u06cc\u06a9\u0679\u0631\u0645 \u06a9\u06d2 \u0645\u062e\u0627\u0644\u0641 \u0633\u0631\u0648\u06ba \u067e\u0631 \u06c1\u06cc\u06ba\u060c \u0627\u0646\u06c1\u06cc\u06ba \u0627\u06cc\u06a9 \u0645\u0641\u06cc\u062f \u062c\u0648\u0691\u0627 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-github-tokens-that-dont-expire-until-they-do\">GitHub: \u0679\u0648\u06a9\u0646 \u062c\u0648 \u06a9\u0628\u06be\u06cc \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>OAuth \u0627\u06cc\u067e \u0635\u0627\u0631\u0641 \u0679\u0648\u06a9\u0646 \u0645\u06cc\u06ba \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u0627 \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0627\u0644\u0632 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2\u06d4 <code>github.refresh()<\/code> \u06cc\u06c1 \u0645\u0646\u0635\u0648\u0628\u06c1 \u0635\u0631\u0641 \u062e\u0648\u062f \u0648\u0636\u0627\u062d\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">async refresh() {\n  throw new Error(\n    'GitHub OAuth App tokens do not expire. A failure here means the ' +\n      'grant was revoked \u2014 send the user through consent again.'\n  );\n}\n<\/code><\/pre>\n<p>\"\u06a9\u0628\u06be\u06cc \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627\" \"\u06c1\u0645\u06cc\u0634\u06c1 \u06a9\u06d2 \u0644\u0626\u06d2 \u0631\u06c1\u062a\u0627 \u06c1\u06d2\" \u062c\u06cc\u0633\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u060c \u0627\u0648\u0631 GitHub \u0686\u0646\u062f \u0648\u062c\u0648\u06c1\u0627\u062a \u06a9\u06cc \u0628\u0646\u0627 \u067e\u0631 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0645\u0646\u0633\u0648\u062e \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p>\u0635\u0627\u0631\u0641 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a \u0645\u06cc\u06ba \u0627\u062c\u0627\u0632\u062a \u0645\u0646\u0633\u0648\u062e \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0648\u06a9\u0646 \u0627\u06cc\u06a9 \u0633\u0627\u0644 \u062a\u06a9 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u06d2 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0679\u0648\u06a9\u0646 \u06a9\u0648 \u067e\u0628\u0644\u06a9 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06cc\u0627 Gist \u06a9\u06cc \u0637\u0631\u0641 \u062f\u06be\u06a9\u06cc\u0644 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0633 \u0645\u0642\u0627\u0645 \u067e\u0631 GitHub \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0645\u0646\u0633\u0648\u062e \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u067e \u0627\u06cc\u06a9 \u06c1\u06cc \u0635\u0627\u0631\u0641 \u0627\u0648\u0631 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06d2 \u0627\u0645\u062a\u0632\u0627\u062c \u06a9\u06d2 \u0644\u06cc\u06d2 10 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0679\u0648\u06a9\u0646 \u062c\u0645\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0633\u0628 \u0633\u06d2 \u067e\u0631\u0627\u0646\u0627 \u0679\u0648\u06a9\u0646 \u0645\u0646\u0633\u0648\u062e \u06a9\u0631 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u062a\u06cc\u0633\u0631\u0627 \u0627\u06cc\u06a9 \u0644\u0645\u062d\u06c1 \u06af\u0632\u0627\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06d2\u06d4 GitHub \u0627\u067e\u0646\u06d2 \u0679\u0648\u06a9\u0646 \u0641\u0627\u0631\u0645\u06cc\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0639\u0648\u0627\u0645\u06cc \u062f\u0628\u0627\u0624 \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u062c\u0648 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0645\u0644\u062a\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u062e\u062a\u0645 \u06a9\u0631 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u062d\u0641\u0627\u0638\u062a\u06cc \u062c\u0627\u0644 \u06c1\u06d2\u060c \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u0646\u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0686\u06cc\u0632 \u062c\u0633 \u06a9\u06cc \u062d\u0641\u0627\u0638\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u0648\u06c1 \u06c1\u06d2 \u0646\u062c\u06cc \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u06cc\u0627 \u0644\u0627\u06af \u0641\u0627\u0626\u0644\u0648\u06ba \u0645\u06cc\u06ba \u0679\u0648\u06a9\u0646\u06d4<\/p>\n<p><strong>GitHub \u0627\u06cc\u067e\u0633 OAuth \u0627\u06cc\u067e\u0633 \u0633\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0628\u0631\u062a\u0627\u0624 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/strong>GitHub \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u06a9\u0648 \u067e\u0691\u06be\u062a\u06d2 \u0648\u0642\u062a \u06cc\u06c1 \u0627\u0644\u062c\u06be\u0646 \u06a9\u0627 \u0627\u06cc\u06a9 \u0639\u0627\u0645 \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u06d2\u06d4 GitHub \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0635\u0627\u0631\u0641 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06d2 \u0679\u0648\u06a9\u0646 8 \u06af\u06be\u0646\u0679\u06d2 \u0628\u0639\u062f \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 6 \u0645\u0627\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u0633\u062a \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 GitHub \u0627\u06cc\u067e\u0633 \u0645\u06cc\u06ba \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0646\u06cc\u0686\u06d2 \u0633\u0644\u06cc\u06a9 \u06a9\u06cc \u0634\u06a9\u0644 \u06a9\u0627 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u067e\u0627\u062a\u06be \u0648\u06c1 \u0631\u0627\u0633\u062a\u06c1 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-slack-rotation-is-opt-in-and-permanent\">\u0633\u0644\u06cc\u06a9: \u062a\u0628\u062f\u06cc\u0644\u06cc \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0627\u0648\u0631 \u0645\u0633\u062a\u0642\u0644 \u06c1\u06d2\u06d4<\/h3>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0637\u0648\u0631 \u067e\u0631\u060c \u0633\u0644\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u0679\u0648\u06a9\u0646 \u0628\u06be\u06cc \u06a9\u0628\u06be\u06cc \u062e\u062a\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u06af\u0631\u062f\u0634 \u0627\u0633 \u0635\u0648\u0631\u062a \u062d\u0627\u0644 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u062f\u06c1\u0631\u0627\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0627\u06cc\u06a9 \u0627\u0646\u062a\u0628\u0627\u06c1 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <strong>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0622\u0646 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u06af\u0631\u062f\u0634 \u06a9\u0648 \u0628\u0646\u062f \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627\u06d4<\/strong> \u067e\u06c1\u0644\u06d2 \u0627\u0633\u06d2 \u0627\u067e\u0646\u06cc \u0679\u06cc\u0633\u0679 \u0627\u06cc\u067e \u0645\u06cc\u06ba \u0686\u0627\u0644\u0648 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u06af\u06be\u0648\u0645\u0646\u06d2 \u06a9\u06d2 \u0641\u0639\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0679\u0648\u06a9\u0646\u0632 12 \u06af\u06be\u0646\u0679\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u06a9\u06be\u06d2 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2 \u0627\u0648\u0631 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0627\u0644 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0627\u062c\u0627\u0632\u062a \u06a9\u06cc \u0642\u0633\u0645 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2\u060c \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u06cc \u0627\u062e\u062a\u062a\u0627\u0645\u06cc \u0646\u0642\u0637\u06c1 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">async refresh(refreshToken) {\n  const response = await fetch(this.tokenUrl, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\n    body: new URLSearchParams({\n      grant_type: 'refresh_token',\n      refresh_token: refreshToken,\n      client_id: process.env.SLACK_CLIENT_ID,\n      client_secret: process.env.SLACK_CLIENT_SECRET,\n    }),\n  });\n\n  const json = await response.json();\n  if (!json.ok) {\n    throw new Error(`Slack token refresh failed: ${json.error}`);\n  }\n\n  return normalizeSlackTokens(json.authed_user ?? json);\n}\n<\/code><\/pre>\n<p><strong>\u0646\u0626\u06d2 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u0627\u062a\u06be \u0646\u0626\u06d2 \u0631\u0633\u0627\u0626\u06cc \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0628\u06be\u06cc \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u06cc\u06ba\u06d4<\/strong> \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u0628\u06be\u06cc \u06af\u06be\u0645\u0627\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0635\u0631\u0641 \u0631\u0633\u0627\u0626\u06cc \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062e\u0631\u0686 \u0634\u062f\u06c1 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u0631\u06c1 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u0627\u0648\u0631 \u06cc\u06c1 12 \u06af\u06be\u0646\u0679\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u0686\u06be \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0646\u062a\u0638\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0648\u0642\u062a \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0644\u06cc\u06d2 \u0645\u06cc\u06ba \u06cc\u06c1 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06a9\u06be \u0631\u06c1\u0627 \u06c1\u0648\u06ba\u06d4 <code>getAccessToken<\/code> \u0641\u0648\u0646 \u06a9\u0627\u0644 <code>saveGrant<\/code> \u0679\u0648\u06a9\u0646 \u0648\u0627\u067e\u0633 \u06a9\u0631\u0646\u06d2 \u0627\u0648\u0631 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u06d4<\/p>\n<h3 id=\"heading-treat-a-dead-grant-as-a-normal-state\">\u0688\u06cc\u0688 \u06af\u0631\u0627\u0646\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u0627\u0631\u0645\u0644 \u0633\u0644\u0648\u06a9 \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/h3>\n<p>\u0645\u0646\u0633\u0648\u062e \u0634\u062f\u06c1 \u06af\u0631\u0627\u0646\u0679 \u063a\u06cc\u0631 \u0645\u0639\u0645\u0648\u0644\u06cc \u0645\u0639\u0646\u0648\u06ba \u0645\u06cc\u06ba \u0645\u0633\u062a\u062b\u0646\u06cc\u0670 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0686\u0644\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0645\u0646\u062a\u0638\u0645\u06cc\u0646 \u0627\u067e\u0646\u0627 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0645 \u06a9\u0631 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0644\u0648\u06af \u0627\u067e\u0646\u0627 \u0630\u06c1\u0646 \u0628\u062f\u0644 \u0644\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u06cc\u0627 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u0639\u0645\u0644 \u0645\u06cc\u06ba \u06a9\u06cc\u0633\u0627 \u0644\u06af\u062a\u0627 \u06c1\u06d2: <code>getAccessToken<\/code> \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u06c1\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0645\u06cc\u06ba \u06c1\u06d2: \u063a\u0644\u0637\u06cc\u0627\u06ba \u067e\u06a9\u0691\u06cc\u06ba \u200b\u200b\u0627\u0648\u0631 \u0627\u0633\u0679\u06cc\u06a9 \u0679\u0631\u06cc\u0633 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0646\u06cc\u0627 \u062a\u0635\u062f\u06cc\u0642\u06cc \u0644\u0646\u06a9 \u062f\u06a9\u06be\u0627\u0626\u06cc\u06ba\u06d4 <code>connect.js<\/code> \u0627\u06cc\u06a9 \u06c1\u06cc \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0622\u067e\u0679 \u0627\u0646 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06d2 \u06af\u0627\u06d4 <code>ON CONFLICT<\/code> \u0645\u0631\u062f\u06c1 \u0642\u0637\u0627\u0631\u06cc\u06ba \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0679 \u06c1\u0648 \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0627\u0648\u0631 \u0686\u06cc\u0632 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-add-a-second-provider\">\u062f\u0648\u0633\u0631\u0627 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc\u0633\u06d2 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p><strong>\u062f\u0648\u0633\u0631\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u0642\u06cc\u0645\u062a 1 OAuth \u0627\u06cc\u067e\u060c 1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0622\u0626\u0679\u0645\u060c \u0627\u0648\u0631 1 \u0679\u0648\u0644 \u06c1\u06d2\u06d4<\/strong> ID \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u0627\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u0622\u067e \u06a9\u0648 \u0631\u0639\u0627\u06cc\u062a \u0645\u0644\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u062c\u0646\u0679 \u0646\u06d2 \u062f\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0627\u06d4 \u0642\u0627\u0628\u0644 \u0630\u06a9\u0631 \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u062f\u0648\u0633\u0631\u06cc ID \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u062a\u06be\u06cc\u060c \u062f\u0648\u0633\u0631\u06d2 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u06d2 \u0633\u0631\u0648\u0631 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u062a\u06be\u06cc\u060c \u0627\u0648\u0631 \u06a9\u0648\u0626\u06cc \u062f\u0648\u0633\u0631\u0627 \u0679\u0648\u06a9\u0646 \u0679\u06cc\u0628\u0644 \u0646\u06c1\u06cc\u06ba \u062a\u06be\u0627\u06d4<\/p>\n<pre><code class=\"language-javascript\">export const providers = {\n  slack: { \/* ... *\/ },\n  github: { \/* ... *\/ },\n};\n<\/code><\/pre>\n<p>\u062a\u06cc\u0633\u0631\u0627\u060c \u06af\u0648\u06af\u0644 \u06a9\u06cc\u0644\u0646\u0688\u0631 \u0627\u0633 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u0627\u06cc\u06a9 \u062a\u06c1\u0627\u0626\u06cc \u062d\u0635\u06c1 \u06c1\u06d2\u06d4 <code>authorizeUrl<\/code>\u060c <code>tokenUrl<\/code>\u0631\u06cc\u0646\u062c \u0627\u0648\u0631 <code>exchangeCode<\/code>. \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u0627 \u0633\u0631\u0648\u0631 \u062e\u062a\u0645 \u06c1\u0648 \u06af\u06cc\u0627\u06d4 <code>Object.keys(providers)<\/code>\u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06d2 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0622\u0626\u0679\u0645 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633\u0679\u0648\u0631 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0641\u0639\u0627\u0644 \u06c1\u06d2\u06d4 <code>(identifier, provider)<\/code>\u0627\u0633 \u0644\u06cc\u06d2 \u06c1\u062c\u0631\u062a \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u06c1\u0645\u0627\u0631\u06d2 \u067e\u0627\u0633 \u0627\u06cc\u06a9 \u0627\u0648\u0631 \u0679\u0648\u0644 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-javascript\">const createCalendarEvent = tool({\n  description: 'Create a calendar event',\n  inputSchema: z.object({ summary: z.string(), start: z.string() }),\n  execute: async ({ summary, start }) => {\n    const token = await getAccessToken(identifier, 'google-calendar');\n    \/\/ ...one more provider call\n  },\n});\n<\/code><\/pre>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0645\u06cc\u0632\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0645\u0627\u0688\u0644 \u06a9\u0627 \u0648\u0631\u0644\u0688 \u0648\u06cc\u0648 \u0628\u0627\u0644\u06a9\u0644 \u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0633\u06d2 \u0628\u0691\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0648\u06c1 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u062c\u0646 \u06a9\u0648 \u06a9\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 <strong>\u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0639\u0644\u0645\u06d4<\/strong> \u06c1\u0631 \u0646\u0626\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u0627\u067e\u0646\u0627 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631\u060c \u0627\u0633 \u06a9\u06cc \u0627\u067e\u0646\u06cc \u063a\u0644\u0637\u06cc \u06a9\u06cc \u0627\u0642\u0633\u0627\u0645\u060c \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u062c\u0648\u0627\u0628\u0627\u062a \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u0645\u06cc\u0639\u0627\u062f \u062e\u062a\u0645 \u06c1\u0648 \u06af\u0626\u06cc \u06c1\u06d2\u06d4 \u0633\u0644\u06cc\u06a9 \u0627\u0648\u0631 \u06af\u0679 \u06c1\u0628 \u062a\u06cc\u0646\u0648\u06ba \u067e\u0631 \u0645\u062a\u0641\u0642 \u0646\u06c1\u06cc\u06ba \u062a\u06be\u06d2\u060c \u0627\u0648\u0631 \u0634\u0627\u06cc\u062f \u06a9\u0633\u06cc \u062a\u06cc\u0633\u0631\u06d2 \u067e\u0631 \u0645\u062a\u0641\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u06ba \u06af\u06d2\u06d4 \u0631\u062c\u0633\u0679\u0631\u06cc \u067e\u06cc\u0679\u0631\u0646 \u0627\u0633 \u0639\u0644\u0645 \u06a9\u0648 \u0627\u06cc\u062c\u0646\u0679\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u067e\u06be\u06cc\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0641\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0627\u06cc\u06a9 \u0634\u06d2 \u0645\u06cc\u06ba \u0633\u0631\u0627\u06cc\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u0639\u0644\u0645 \u06a9\u0648 \u063a\u06cc\u0631 \u0636\u0631\u0648\u0631\u06cc \u0646\u06c1\u06cc\u06ba \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0627\u0646\u062a\u0628\u0627\u06c1:<\/strong> \u0633\u0628\u0633\u0688\u06cc\u0632 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0627\u0648\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u0644\u0633 \u0633\u0644\u06cc\u06a9 \u06a9\u0648 \u062c\u0648\u0691 \u0631\u06c1\u06cc \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u06a9\u06cc\u0644\u0646\u0688\u0631 \u0646\u06c1\u06cc\u06ba \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u06cc\u0644\u0646\u0688\u0631 \u0679\u0648\u0644 \u067e\u0631 \u0627\u0633 \u06a9\u06cc \u06a9\u0627\u0644 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u06af\u0626\u06cc\u060c \u0627\u0648\u0631 \u0686\u0648\u0646\u06a9\u06c1 \u0627\u0633 \u0646\u06d2 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0646\u0627\u06a9\u0627\u0645\u06cc \u06cc\u06c1\u0627\u06ba \u062f\u0631\u0633\u062a \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u067e\u06cc\u063a\u0627\u0645 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0633\u0645\u062c\u06be\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u063a\u0644\u0637\u06cc \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0631\u0627\u0628\u0637\u06c1 \u0642\u0627\u0626\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u06c1\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u0631\u0631 \u0645\u0648\u0688 \u0633\u06cc\u06a9\u0634\u0646 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-full-walkthrough\">\u0645\u06a9\u0645\u0644 \u0648\u0627\u06a9 \u062a\u06be\u0631\u0648<\/h2>\n<p>\u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0644\u0648\u0646 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0631\u062c \u06a9\u0631\u06cc\u06ba\u06d4 <code>.env<\/code>:<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/saif-shines\/channel-watcher-agent.git\ncd channel-watcher-agent\nnpm install\ncp .env.example .env\n# fill in both client IDs and secrets, the encryption key, channel ID, repo\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u062c\u0691\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u0633\u0631\u0648\u0631 \u06a9\u0648 \u0634\u0631\u0648\u0639 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u0646\u0633\u0644\u06a9 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0644\u0646\u06a9 \u067e\u0631\u0646\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">npm run connect\n<\/code><\/pre>\n<pre><code class=\"language-text\">[slack] authorize as \"channel-watcher-agent\":\nhttps:\/\/slack.com\/oauth\/v2\/authorize?client_id=123.456&user_scope=channels%3Ahistory%2Cchat%3Awrite%2Cusers%3Aread&redirect_uri=https%3A%2F%2Flocalhost%3A3000%2Fcallback&state=1159699dbf1a808fd33ba31c7b643505\n[slack] connected.\n\n[github] authorize as \"channel-watcher-agent\":\nhttps:\/\/github.com\/login\/oauth\/authorize?client_id=Iv1.abc&scope=repo&redirect_uri=https%3A%2F%2Flocalhost%3A3000%2Fcallback&state=e6d13461099c391367266235f8313630\n[github] connected.\n\nAll providers connected. Run: node src\/index.js channel-watcher-agent\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0644\u0646\u06a9 \u06a9\u0648 \u06a9\u06be\u0648\u0644\u06cc\u06ba \u0627\u0648\u0631 \u0679\u06cc\u0628 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u06d2 \u0642\u0628\u0648\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 \u0648\u0627\u067e\u0633\u06cc \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u0645\u06cc\u06ba \u0627\u0633 URL \u06a9\u06d2 \u0627\u0633\u0679\u06cc\u0679\u0633 \u067e\u06cc\u0631\u0627\u0645\u06cc\u0679\u0631\u0632 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0686\u06cc\u0632 \u0633\u06d2 \u06af\u0632\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u06a9\u0648 400 \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0679\u0648\u06a9\u0646 \u06a9\u0627 \u062a\u0628\u0627\u062f\u0644\u06c1 \u06a9\u0628\u06be\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06be\u0631 \u0627\u0633 \u0686\u06cc\u0646\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u0686\u0644\u0627\u0626\u06cc\u06ba \u062c\u0633 \u0645\u06cc\u06ba \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0686\u06cc\u0679 \u06c1\u0648\u06d4<\/p>\n<pre><code class=\"language-bash\">node src\/index.js\n<\/code><\/pre>\n<p>\u0627\u0633 \u06a9\u0627 \u0622\u0624\u0679 \u067e\u0679 \u062a\u06cc\u0646 \u063a\u06cc\u0631 \u0648\u0627\u0636\u062d \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u0648\u0627\u0644\u06d2 \u0686\u06cc\u0646\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0686\u0644\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-text\">[channel-watcher-agent] 3 messages fetched, 3 new.\n\n--- Alex: \"Sending draft message\" ---\nThe message \"Sending draft message\" is noise \u2014 it appears to be a test or\naccidental send, not a bug report or concrete action item.\n\n...\n<\/code><\/pre>\n<p><strong>\u06a9\u0648\u0626\u06cc \u0627\u0648\u0632\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u0628\u0644\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u0627\u0648\u0631 \u0646\u06c1 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u0645\u0633\u0626\u0644\u06c1 \u0627\u0679\u06be\u0627\u06cc\u0627 \u06af\u06cc\u0627\u06d4<\/strong> \u0645\u0646\u0641\u06cc \u0645\u062b\u0627\u0644\u06cc\u06ba \u0627\u0646 \u06a9\u06cc \u0646\u0638\u0631 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0627\u06c1\u0645 \u06c1\u06cc\u06ba\u06d4 \u0644\u06a9\u06be\u0646\u06d2 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0648\u0627\u0644\u06d2 \u0627\u06cc\u062c\u0646\u0679 \u062c\u0648 \u0646\u06c1\u06cc\u06ba \u06a9\u06c1\u06c1 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u0648\u06c1 \u0630\u0645\u06c1 \u062f\u0627\u0631 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0628\u0627\u0642\u0627\u0639\u062f\u06c1 \u0686\u06cc\u0679 \u06a9\u06d2 \u0639\u0644\u0627\u0648\u06c1 \u06a9\u0686\u06be \u0628\u06be\u06cc \u0633\u0628 \u0633\u06d2 \u0633\u0633\u062a\u0627 \u062d\u062f \u0679\u06cc\u0633\u0679 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0628 \u0628\u0631\u0627\u06c1 \u06a9\u0631\u0645 \u0627\u067e\u0646\u06d2 \u0686\u06cc\u0646\u0644 \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u0628\u06af \u0631\u067e\u0648\u0631\u0679 \u067e\u0648\u0633\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<blockquote>\n<p>\u06c1\u06cc\u0644\u0648\u060c \/export endpoint 50MB \u0633\u06d2 \u0628\u0691\u06cc \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0641\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0679\u0627\u0626\u0645 \u0622\u0624\u0679 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u06a9\u0644 \u06a9\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u0633\u06d2 \u0645\u0633\u0644\u0633\u0644 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/blockquote>\n<p>\u062c\u0628 \u0622\u067e \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0686\u0644\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u067e\u0631\u0627\u0646\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u06cc \u0627\u0633\u0679\u06cc\u0679 \u0641\u0627\u0626\u0644 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0648 \u0628\u0627\u0631 \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<p><strong>\u06a9\u0627\u067e\u06cc \u0631\u0627\u0626\u0679 \u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062d\u0635\u06c1 \u06c1\u06d2\u06d4<\/strong> \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u067e\u06cc\u0686\u06be\u06d2 GitHub \u0627\u06a9\u0627\u0624\u0646\u0679 \u0627\u0633 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0627\u067e\u0646\u06cc OAuth \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u06be\u0648\u0644\u062a\u0627 \u06c1\u06d2\u060c \u0646\u06c1 \u06a9\u06c1 \u0634\u06cc\u0626\u0631\u0646\u06af \u0628\u0648\u0679\u06d4 \u0627\u0633 \u0634\u062e\u0635 \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0628\u06be\u06cc \u0633\u0633\u062a \u062c\u0648\u0627\u0628\u0627\u062a \u0622\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0631\u0633\u0627\u0626\u06cc \u0645\u0646\u0633\u0648\u062e \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0627\u06af\u0644\u06cc \u0631\u0646 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 <code>getAccessToken<\/code>\u06cc\u06c1 \u0635\u062d\u06cc\u062d \u0646\u062a\u06cc\u062c\u06c1 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-what-changes-for-a-second-user\">\u062f\u0648\u0633\u0631\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba<\/h3>\n<p>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0645\u0627\u0646\u0688 \u0644\u0627\u0626\u0646 \u067e\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u0622\u067e \u06a9\u0648 \u067e\u06c1\u0644\u06d2 \u0644\u0627\u06af \u0627\u0646 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u0646\u06c1\u0627\u0626\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">node src\/index.js                     # the identifier you already authorized\nnode src\/index.js alice@example.com   # a different user entirely\n<\/code><\/pre>\n<p>\u062f\u0648\u0633\u0631\u06cc \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0633\u06cc \u0686\u06cc\u0646\u0644 \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be\u062a\u06cc \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0631\u06a9 \u062c\u0627\u0626\u06d2 \u06af\u0627:<\/p>\n<pre><code class=\"language-text\">[slack] no grant for \"alice@example.com\".\nConnect it first: node src\/connect.js alice@example.com\n<\/code><\/pre>\n<p><strong>\u0631\u062f \u06c1\u06cc \u0646\u0642\u0637\u06c1 \u06c1\u06d2\u06d4<\/strong> \u062f\u0648 \u062d\u06a9\u0645\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0627\u06cc\u062c\u0646\u0679 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646\u060c \u0679\u0648\u0644\u0632 \u0627\u0648\u0631 \u06a9\u0648\u0688\u06d4 \u0686\u0648\u0646\u06a9\u06c1 \u0635\u0631\u0641 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u0645\u062e\u062a\u0644\u0641 \u062a\u06be\u06d2 \u0627\u0648\u0631 \u0627\u06cc\u0644\u0633 \u0645\u062a\u0641\u0642 \u0646\u06c1\u06cc\u06ba \u062a\u06be\u06cc\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u0688\u06a9\u0631\u067e\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0642\u0637\u0627\u0631\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u06c1 \u0622\u067e Slack \u06a9\u0648 \u0686\u06be\u0648\u0626\u06cc\u06ba \u0627\u0633 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0631\u06a9 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u0634\u062a\u0631\u06a9\u06c1 \u0628\u0648\u0679 \u0648\u0631\u0698\u0646 \u0645\u062e\u062a\u0644\u0641 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u0628\u0631\u062a\u0627\u0624 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062f\u0648\u0633\u0631\u06cc \u06a9\u0645\u0627\u0646\u0688 \u0686\u06cc\u0646\u0644 \u06a9\u0648 \u067e\u0691\u06be\u062a\u06cc \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u0628\u0648\u0679 \u06a9\u0648 \u062c\u0645\u0639 \u06a9\u0631\u0627\u062a\u06cc \u06c1\u06d2\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633 \u0645\u06cc\u06ba \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0627\u062c\u0627\u0632\u062a \u0634\u0627\u0645\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u0644\u0633 \u0631\u0627\u0636\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2 \u062a\u0648 \u0646\u06cc\u0686\u06d2 \u06a9\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u0627\u06cc\u0644\u0633 \u06a9\u06cc \u0645\u0646\u0638\u0648\u0631\u06cc \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 <code>readGrant<\/code> \u0627\u0633 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>getAccessToken<\/code> \u0627\u0633 \u06a9\u06d2 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0688\u06a9\u0631\u067e\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0633\u0644\u06cc\u06a9 \u0631\u06cc\u0688 \u0648\u06c1 \u0686\u06cc\u0646\u0644\u0632 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u062c\u0648 \u0648\u06c1 \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633 \u06a9\u0627 GitHub \u0627\u06a9\u0627\u0624\u0646\u0679 \u0645\u0633\u0627\u0626\u0644 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u062a\u0628\u0627\u062f\u0644 <code>argv<\/code> \u0633\u06cc\u0634\u0646 \u062a\u0644\u0627\u0634 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2:<\/p>\n<pre><code class=\"language-javascript\">const identifier = await lookupIdentifier(session.userId);\n<\/code><\/pre>\n<h3 id=\"heading-testing-the-isolation-without-credentials\">\u0627\u0633\u0646\u0627\u062f \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u0646\u06c1\u0627\u0626\u06cc \u06a9\u06cc \u062c\u0627\u0646\u0686<\/h3>\n<p>\u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0627\u06cc\u06a9 \u0679\u06cc\u0633\u0679 \u0633\u0648\u0679 \u06c1\u06d2 \u062c\u0648 \u0628\u062f\u0644\u062a\u0627 \u06c1\u06d2: <code>fetch<\/code> \u0628\u0644\u0679 \u0627\u0646 Slack \u0627\u0648\u0631 GitHub \u0627\u06cc\u0646\u0688 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u0627\u060c \u062c\u0648\u0627\u0628\u06cc \u062a\u062c\u0632\u06cc\u06c1 \u06a9\u0631\u0646\u0627\u060c \u0645\u062d\u0641\u0648\u0638 \u06a9\u0631\u0646\u0627\u060c \u0627\u0648\u0631 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0644\u0627\u062c\u06a9 \u0633\u0628\u06be\u06cc OAuth \u0627\u06cc\u067e \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0686\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">npm test\n<\/code><\/pre>\n<p>\u0627\u0646 \u0645\u06cc\u06ba \u0633\u06d2 \u062a\u06cc\u0646 \u0679\u06cc\u0633\u0679 \u0646\u0627\u0645 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0648\u06c1 \u06a9\u0648\u0688 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u06a9\u06d2 \u062f\u0639\u0648\u0648\u06ba \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ul>\n<li>\n<p><strong>\u0633\u0644\u06cc\u06a9 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0641\u06a9\u0633\u0686\u0631 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u06cc\u0633\u0679 \u06a9\u0627 \u062f\u0639\u0648\u06cc\u0670 \u06c1\u06d2 \u06a9\u06c1 \u0630\u062e\u06cc\u0631\u06c1 \u0634\u062f\u06c1 \u0642\u062f\u0631 \u06c1\u06d2: <code>xoxp-<\/code> \u0627\u06cc\u06a9<\/p>\n<\/li>\n<li>\n<p><strong>\u062f\u0648 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0679\u0648\u0644 \u0627\u0646 \u067e\u0679 \u0633\u06d2 \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0679\u0648\u06a9\u0646 \u0645\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/strong> \u0627\u06cc\u06a9 \u06c1\u06cc <code>text<\/code>\u0627\u06cc\u06a9 \u06c1\u06cc <code>thread_ts<\/code>\u062f\u0648 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646\u060c \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 <code>Authorization<\/code> \u06c1\u06cc\u0688\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0646\u0642\u0637\u0639 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0679\u0648\u0644\u0632 \u0628\u062f\u0644\u06d2 \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4<\/strong> \u0627\u0633 \u06a9\u0627 \u06cc\u06c1 \u0628\u06be\u06cc \u062f\u0639\u0648\u06cc\u0670 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627\u0644 \u06a9\u06cc \u06a9\u0648\u0634\u0634 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc \u06af\u0626\u06cc\u060c \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0644\u06cc\u06a9 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u0646\u0627 \u06a9\u0648\u0626\u06cc \u0628\u0691\u06cc \u0646\u0627\u06a9\u0627\u0645\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u067e\u06c1\u0644\u06d2 \u0631\u0646 \u067e\u0631 \u06af\u0632\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u06cc\u0633\u0679 \u0646\u0627\u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0628\u0627\u0631 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06c1\u0645 \u0646\u06d2 \u062c\u0627\u0646 \u0628\u0648\u062c\u06be \u06a9\u0631 \u062c\u0627\u0646\u0686\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0688 \u062a\u0648\u0691 \u062f\u06cc\u0627\u06d4 \u0635\u0627\u0631\u0641 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u0633\u06d2 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u06cc\u06ba\u06d4 <code>buildTools<\/code>\u0627\u0648\u0631 \u0646\u0645\u0627\u0626\u0634 <code>identifier<\/code> \u0645\u0627\u0688\u0644 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u06d2 \u0627\u0633\u06a9\u06cc\u0645\u0627 \u0645\u06cc\u06ba\u060c \u06c1\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u06a9 \u06cc\u0627 \u0632\u06cc\u0627\u062f\u06c1 \u0679\u06cc\u0633\u0679\u0648\u06ba \u0645\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-how-to-apply-the-pattern-to-other-use-cases\">\u062f\u0648\u0633\u0631\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u0627\u062a \u0645\u06cc\u06ba \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p><strong>\u067e\u06cc\u0679\u0631\u0646 \u06a9\u0627 \u0633\u0644\u06cc\u06a9 \u06a9\u06cc \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u0633\u06d2 \u06a9\u0648\u0626\u06cc \u062a\u0639\u0644\u0642 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/strong> \u0641\u0627\u0631\u0645 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06d2: \u0627\u06cc\u06a9 \u0627\u06cc\u067e \u0633\u06d2 \u067e\u0691\u06be\u06cc\u06ba\u060c \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0641\u06cc\u0635\u0644\u06d2 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062f\u0648\u0633\u0631\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0644\u06a9\u06be\u06cc\u06ba\u060c \u06cc\u06c1 \u0633\u0628 \u0627\u06cc\u06a9 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06c1\u06d2\u06d4<\/p>\n<p>\u0633\u067e\u0644\u0627\u0626\u0631\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0646\u062a\u06cc\u062c\u06c1 \u0645\u062e\u062a\u0644\u0641 \u0645\u0635\u0646\u0648\u0639\u0627\u062a \u0645\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0627\u06af\u0644\u0627 \u067e\u0691\u06be\u06cc\u06ba<\/th>\n<th>\u067e\u0631 \u0644\u06a9\u06be\u06cc\u06ba<\/th>\n<th>\u0646\u062a\u06cc\u062c\u06c1<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0688\u06be\u06cc\u0644\u06d2 \u0633\u06d2<\/td>\n<td>\u06af\u0679 \u06c1\u0628<\/td>\n<td>\u0679\u0631\u0627\u0626\u06cc\u062c \u0686\u06cc\u0646\u0644 \u06a9\u06cc \u06af\u0641\u062a\u06af\u0648 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u06cc\u06ba\u060c \u062c\u06cc\u0633\u0627 \u06a9\u06c1 \u0627\u0633 \u0679\u06cc\u0648\u0679\u0648\u0631\u06cc\u0644 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>Gmail<\/td>\n<td>\u0644\u06a9\u06cc\u0631\u06cc<\/td>\n<td>\u0633\u067e\u0648\u0631\u0679 \u0627\u06cc \u0645\u06cc\u0644\u0632 \u06a9\u0648 \u0679\u0631\u06cc\u06a9 \u06a9\u0631\u062f\u06c1 \u06a9\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u06af\u0648\u06af\u0644 \u06a9\u06cc\u0644\u0646\u0688\u0631<\/td>\n<td>\u062a\u0635\u0648\u0631<\/td>\n<td>\u0645\u06cc\u0679\u0646\u06af \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0645\u06cc\u0679\u0646\u06af \u06a9\u06cc \u062a\u06cc\u0627\u0631\u06cc \u06a9\u06d2 \u0646\u0648\u0679\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0632\u06cc\u0646\u0688\u06cc\u0633\u06a9<\/td>\n<td>\u0633\u06cc\u0644\u0632 \u0641\u0648\u0631\u0633<\/td>\n<td>\u062f\u0631\u0633\u062a \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u067e\u0648\u0631\u0679 \u0633\u06af\u0646\u0644 \u06a9\u0648 \u0646\u0648\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u06af\u0679 \u06c1\u0628<\/td>\n<td>\u0688\u06be\u06cc\u0644\u06d2 \u0633\u06d2<\/td>\n<td>\u0627\u0646 \u0686\u06cc\u0646\u0644\u0632 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u062c\u0646 \u06a9\u0627 \u0622\u067e \u062e\u06cc\u0627\u0644 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u06c1\u0631 \u0642\u0637\u0627\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u062a\u06cc\u0646 \u062d\u0635\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2: \u0633\u067e\u0644\u0627\u0626\u0631 \u0627\u0646\u062f\u0631\u0627\u062c\u060c \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0679\u0648\u06a9\u0646 \u062a\u0644\u0627\u0634\u060c \u0627\u0648\u0631 \u0679\u0648\u0644\u06d4 \u0635\u0631\u0641 \u062a\u06cc\u0646 \u0686\u06cc\u0632\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba: OAuth \u0627\u06cc\u067e \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646\u060c \u0627\u0646\u062f\u0631\u0648\u0646\u06cc API \u06a9\u0627\u0644\u0632\u06d4 <code>execute<\/code>\u0627\u0648\u0631 \u06cc\u06c1 \u0648\u06c1 \u0627\u0646 \u067e\u0679 \u06c1\u06d2 \u062c\u0648 \u0645\u06cc\u06ba \u0646\u06d2 \u0645\u0627\u0688\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u06a9\u06be\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p><strong>\u0627\u0646 \u067e\u0679 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u067e\u0631\u0648\u0688\u06a9\u0679 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/strong> OAuth \u067e\u0644\u0645\u0628\u0646\u06af \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u0627 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0627\u0645\u06a9\u0627\u0646 \u06c1\u06d2 \u0627\u0648\u0631 \u0645\u0633\u0626\u0644\u06c1 \u06a9\u0648 \u06a9\u06cc\u0627 \u06a9\u06c1\u0646\u0627 \u06c1\u06d2 \u0627\u06cc\u06a9 \u0641\u06cc\u0635\u0644\u06c1 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0626\u06cc \u06c1\u0641\u062a\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u0642\u06cc\u0645\u062a\u06cc \u062d\u0635\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u06c1\u06cc \u06a9\u0648\u0688 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06cc \u062f\u0648\u0646\u0648\u06ba \u0634\u06a9\u0644\u0648\u06ba \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<ul>\n<li>\n<p><strong>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0679\u06cc\u0645 \u0627\u06cc\u062c\u0646\u0679:<\/strong> \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u0679\u06cc\u0645 \u06a9\u0627 \u0648\u06c1 \u0631\u06a9\u0646 \u06c1\u06d2 \u062c\u0633 \u0646\u06d2 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0648 \u0645\u062a\u062d\u0631\u06a9 \u06a9\u06cc\u0627\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0634\u06cc\u0688\u0648\u0644 \u06cc\u0627 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06af\u0627\u06c1\u06a9 \u06a9\u0627 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u06cc\u062c\u0646\u0679\u0633:<\/strong> \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u0631\u0627\u06cc\u06c1 \u062f\u0627\u0631 \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0631\u06cc\u06a9\u0627\u0631\u0688 \u0633\u06d2 \u0644\u06cc\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06cc\u06c1 \u06a9\u0633\u0679\u0645\u0631 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u06a9\u0633\u0679\u0645\u0631 \u0688\u06cc\u0679\u0627 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u06a9\u0648\u0688 \u0627\u06cc\u06a9 \u06c1\u06cc \u0631\u06c1\u062a\u0627 \u06c1\u06d2\u06d4 \u063a\u0644\u0637 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0646\u062a\u0627\u0626\u062c \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-what-went-wrong-when-i-built-this\">\u062c\u0628 \u0645\u06cc\u06ba \u0646\u06d2 \u0627\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062a\u0648 \u06a9\u06cc\u0627 \u063a\u0644\u0637 \u06c1\u0648\u0627\u061f<\/h2>\n<p>\u06cc\u06c1 \u0648\u06c1 \u0645\u0633\u0627\u0626\u0644 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0627 \u0645\u062c\u06be\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0633\u0627\u0645\u0646\u0627 \u06a9\u0631\u0646\u0627 \u067e\u0691\u0627\u06d4 \u06cc\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u06c1\u06d2 \u062c\u0633 \u0637\u0631\u062d \u0648\u06c1 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0645\u0633\u0626\u0644\u06c1 \u062f\u0631\u067e\u06cc\u0634 \u06c1\u06d2\u060c \u062a\u0648 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0645 \u0627\u0635\u0644\u0627\u062d\u0627\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-slack-wont-save-the-redirect-url\">\u0633\u0644\u06cc\u06a9 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u06a9\u0648\u0688 \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0639\u0644\u0627\u0645\u062a \u0638\u0627\u06c1\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0633\u0644\u06cc\u06a9 \u0627\u06cc\u067e \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u067e\u06cc\u062c \u067e\u0631 \u0642\u0628\u0648\u0644\u06cc\u062a \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u06cc\u06ba\u06d4 <code>http:\/\/localhost:3000\/callback<\/code>.<\/p>\n<p>\u0633\u0644\u06cc\u06a9 \u06a9\u0648 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 URLs \u0645\u06cc\u06ba HTTPS \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u0633\u06cc \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u06a9\u06d2: <code>localhost<\/code>. \u0645\u0642\u0627\u0645\u06cc \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u062c\u0627\u0631\u06cc \u06a9\u0631\u06cc\u06ba\u06d4 <code>mkcert<\/code>\u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646 <code>https:\/\/<\/code> \u0634\u06a9\u0644\u06cc\u06ba \u0627\u0648\u0631 \u067e\u0648\u0627\u0626\u0646\u0679\u0633 <code>TLS_CERT_PATH<\/code> \u0627\u0648\u0631 <code>TLS_KEY_PATH<\/code> \u0641\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0644\u06a9\u06be\u0627 \u062a\u06be\u0627\u06d4 GitHub \u06a9\u0633\u06cc \u0628\u06be\u06cc \u0627\u0633\u06a9\u06cc\u0645 \u06a9\u0648 \u0642\u0628\u0648\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u06cc\u06a9 \u06c1\u06cc HTTPS URL \u062f\u0648\u0646\u0648\u06ba \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u06d2 \u06af\u0627\u06d4<\/p>\n<h3 id=\"heading-the-browser-warns-that-the-certificate-isnt-trusted\">\u0622\u067e \u06a9\u0627 \u0628\u0631\u0627\u0624\u0632\u0631 \u0622\u067e \u06a9\u0648 \u062e\u0628\u0631\u062f\u0627\u0631 \u06a9\u0631\u06d2 \u06af\u0627 \u06a9\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0642\u0627\u0628\u0644 \u0628\u06be\u0631\u0648\u0633\u06c1 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/h3>\n<p><code>mkcert -install<\/code>    \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0645\u0631\u062d\u0644\u06c1 \u06c1\u06d2 \u062c\u0648 mkcert \u06a9\u06cc \u0645\u0642\u0627\u0645\u06cc \u0627\u062c\u0627\u0632\u062a \u06a9\u0648 \u0633\u0633\u0679\u0645 \u0679\u0631\u0633\u0679 \u0627\u0633\u0679\u0648\u0631 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0686\u06be\u0648\u0691 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba \u062a\u0648 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u0686\u06be\u0648\u0691 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 \u062c\u0633\u06d2 \u0628\u0631\u0627\u0624\u0632\u0631 \u062a\u0633\u0644\u06cc\u0645 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633\u06d2 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0686\u0644\u0627\u0646\u06d2 \u0633\u06d2 \u0645\u0633\u062a\u0642\u0628\u0644 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 mkcert \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u062d\u0644 \u06c1\u0648 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u06d4 \u0627\u06cc\u06a9 \u062e\u0648\u062f \u062f\u0633\u062a\u062e\u0637 \u0634\u062f\u06c1 \u0633\u0631\u0679\u06cc\u0641\u06a9\u06cc\u0679 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 <code>openssl<\/code> \u06c1\u0645\u06cc\u0634\u06c1 \u0686\u0648\u06a9\u0633 \u0631\u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u0633 \u067e\u0631 \u0628\u06be\u0631\u0648\u0633\u06c1 \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-the-redirect-uri-doesnt-match\">\u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 URI \u0645\u0645\u0627\u062b\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/h3>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 <code>redirect_uri<\/code> \u0627\u06af\u0631 \u0622\u067e \u0627\u0633\u06d2 \u0627\u06cc\u067e \u0645\u06cc\u06ba \u0631\u062c\u0633\u0679\u0631\u0688 \u06a9\u06d2 \u0645\u0642\u0627\u0628\u0644\u06d2 \u0628\u06be\u06cc\u062c\u06cc\u06ba \u06af\u06d2 \u062a\u0648 \u0645\u0648\u0627\u0632\u0646\u06c1 \u062f\u0631\u0633\u062a \u06c1\u0648\u06af\u0627\u06d4 \u0679\u0631\u06cc\u0644\u0646\u06af \u0633\u0644\u06cc\u0634\u060c <code>127.0.0.1<\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>localhost<\/code>\u060c <code>http<\/code> \u062c\u06c1\u0627\u06ba \u0622\u067e \u0646\u06d2 \u0627\u0646\u062f\u0631\u0627\u062c \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4 <code>https<\/code>\u06cc\u0627 \u062f\u06cc\u06af\u0631 \u062a\u0645\u0627\u0645 \u0628\u0646\u062f\u0631\u06af\u0627\u06c1\u06cc\u06ba \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648\u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u063a\u0644\u0637\u06cc \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0627\u067e\u0646\u06d2 \u0635\u0641\u062d\u06d2 \u067e\u0631 \u067e\u06c1\u0646\u0686 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c \u0627\u0633 \u0644\u06cc\u06d2 \u06a9\u0645 \u0627\u0632 \u06a9\u0645 \u0627\u0633 \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u0646\u0627 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0646\u0627 <code>OAUTH_REDIRECT_URI<\/code> \u0627\u0633\u06d2 \u0633\u0686\u0627\u0626\u06cc \u06a9\u06d2 \u0648\u0627\u062d\u062f \u0630\u0631\u06cc\u0639\u06c1 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u06cc \u0637\u0631\u062d \u0627\u062c\u0627\u0632\u062a \u06a9\u06d2 URL \u0627\u0648\u0631 \u0679\u0648\u06a9\u0646 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-the-callback-port-is-already-in-use\">\u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u067e\u0648\u0631\u0679 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0645\u06cc\u06ba \u06c1\u06d2\u06d4<\/h3>\n<p><code>connect.js<\/code>    \u0628\u0646\u062f\u0631\u06af\u0627\u06c1 \u06a9\u0648 \u0628\u0627\u0646\u062f\u06be\u0646\u0627\u06d4 <code>OAUTH_REDIRECT_URI<\/code>\u067e\u0648\u0631\u0679 3000 \u0628\u0691\u06d2 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u063a\u06cc\u0631 \u0639\u0645\u0644 \u0634\u062f\u06c1 <code>EADDRINUSE<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u06a9 \u0679\u0631\u06cc\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0648 OAuth \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u06a9\u0686\u06be \u0646\u06c1\u06cc\u06ba \u06a9\u06c1\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0627\u0633\u06d2 \u067e\u06a9\u0691\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0628\u062a\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06a9\u06cc\u0627 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u062f\u0631\u06af\u0627\u06c1 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0628\u0646\u062f\u0631\u06af\u0627\u06c1 \u06a9\u0648 \u062a\u06cc\u0646 \u062c\u06af\u06c1\u0648\u06ba \u067e\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u0627: <code>.env<\/code>Slack \u0627\u06cc\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 URL \u0627\u0648\u0631 GitHub \u0627\u06cc\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 URL \u06a9\u0648 \u0631\u06cc \u0688\u0627\u0626\u0631\u06cc\u06a9\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u06af\u0631 \u06a9\u0648\u0626\u06cc \u063a\u0627\u0626\u0628 \u06c1\u06d2 \u062a\u0648 \u0622\u067e \u06a9\u0648 \u067e\u0686\u06be\u0644\u06cc \u063a\u0644\u0637\u06cc \u0645\u0644 \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4<\/p>\n<h3 id=\"heading-the-state-check-rejects-a-legitimate-callback\">\u0635\u062d\u062a \u06a9\u06cc \u062c\u0627\u0646\u0686 \u062c\u0627\u0626\u0632 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u06a9\u0648 \u0645\u0633\u062a\u0631\u062f \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/h3>\n<p>\u0631\u06cc\u0627\u0633\u062a\u06cc \u0627\u0642\u062f\u0627\u0631 \u0645\u06cc\u0645\u0648\u0631\u06cc \u0645\u06cc\u06ba \u0631\u06c1\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u062d\u0630\u0641 \u06c1\u0648\u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4 <code>connect.js<\/code> \u0644\u0646\u06a9 \u06a9\u0648 \u06a9\u06be\u0648\u0644\u0646\u06d2 \u06cc\u0627 \u06a9\u0627\u0644 \u0628\u06cc\u06a9 \u0679\u06cc\u0628 \u06a9\u0648 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u062f\u0648\u0646\u0648\u06ba \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u06cc \u062d\u0627\u0644\u062a \u0628\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 \u0627\u0628 \u0646\u0642\u0634\u06d2 \u0645\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0635\u062d\u06cc\u062d \u0631\u062f \u06c1\u06cc\u06ba\u06d4 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0644\u0646\u06a9 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-tool-calls-return-permission-errors-or-empty-results\">\u0679\u0648\u0644 \u06a9\u0627\u0644 \u0627\u062c\u0627\u0632\u062a \u06a9\u06cc \u063a\u0644\u0637\u06cc \u06cc\u0627 \u062e\u0627\u0644\u06cc \u0646\u062a\u06cc\u062c\u06c1 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0644\u0627\u067e\u062a\u06c1 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06cc\u0627 \u0645\u0646\u0633\u0648\u062e \u0634\u062f\u06c1 \u06af\u0631\u0627\u0646\u0679\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>GitHub \u062c\u0648\u0627\u0628\u0627\u062a <code>403<\/code> \u0627\u06af\u0631 \u0622\u067e \u06a9\u06cc \u06af\u0631\u0627\u0646\u0679 \u0646\u0627\u06a9\u0627\u0641\u06cc \u06c1\u06d2 \u062a\u0648 \"\u0622\u067e \u06a9\u0648 \u0648\u0633\u0627\u0626\u0644 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\"\u06d4 <code>repo<\/code>. \u0633\u0633\u062a \u062c\u0648\u0627\u0628\u0627\u062a <code>200<\/code> \u06a9\u06d2 \u0633\u0627\u062a\u06be <code>ok: false<\/code> \u0627\u0648\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u063a\u0644\u0637\u06cc <code>missing_scope<\/code>. \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u0645\u06cc\u06ba \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u067e\u06be\u0631 \u0627\u0633\u06d2 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0635\u0627\u0631\u0641 \u06a9\u0648 \u0648\u0627\u067e\u0633 \u0628\u06be\u06cc\u062c\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0645\u0648\u062c\u0648\u062f\u06c1 \u06af\u0631\u0627\u0646\u0679\u0633 \u06a9\u0648 \u0633\u0627\u0628\u0642\u06c1 \u200b\u200b\u0637\u0648\u0631 \u067e\u0631 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p><strong>\u062c\u0632\u0648\u06cc \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06af\u0631\u0627\u0646\u0679 \u06a9\u0646\u06a9\u0634\u0646 \u06a9\u06d2 \u0648\u0642\u062a \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0648\u0642\u062a \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/strong>\u06cc\u06c1\u06cc \u0648\u062c\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0639\u0644\u0627\u0645\u0627\u062a \u067e\u0631\u0627\u0633\u0631\u0627\u0631 \u0644\u06af\u062a\u06cc \u06c1\u06cc\u06ba\u06d4 \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u06a9\u06cc \u0633\u06a9\u0631\u06cc\u0646 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u06af\u0626\u06cc\u060c \u0679\u0648\u06a9\u0646 \u0628\u0627\u0644\u06a9\u0644 \u0679\u06be\u06cc\u06a9 \u0645\u062d\u0641\u0648\u0638 \u06c1\u0648 \u06af\u06cc\u0627\u060c \u0627\u0648\u0631 \u0686\u0646\u062f \u06af\u06be\u0646\u0679\u0648\u06ba \u0628\u0639\u062f \u0679\u0648\u0644 \u06a9\u0627\u0644 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0646\u0627\u06a9\u0627\u0645\u06cc \u0648\u0627\u0642\u0639 \u06c1\u0648 \u06af\u0626\u06cc\u06d4<\/p>\n<h3 id=\"heading-the-agent-reads-channels-it-shouldnt\">\u0627\u06cc\u062c\u0646\u0679 \u0627\u06cc\u0633\u06d2 \u0686\u06cc\u0646\u0644\u0632 \u067e\u0691\u06be \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u067e\u0691\u06be\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/h3>\n<p>\u0648\u0627\u062d\u062f \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0645\u0645\u06a9\u0646\u06c1 \u0648\u062c\u06c1 \u0627\u0633\u0679\u0648\u0631\u06cc\u062c \u06c1\u06d2\u06d4 <code>json.access_token<\/code> \u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>json.authed_user.access_token<\/code> \u0633\u0644\u06cc\u06a9 \u0627\u06cc\u06a9\u0633\u0686\u06cc\u0646\u062c\u06d4 \u062f\u0648\u0646\u0648\u06ba \u062a\u0627\u0631 \u06c1\u06cc\u06ba\u060c \u062f\u0648\u0646\u0648\u06ba \u0633\u0686\u0627\u0626\u06cc\u0627\u06ba \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba (\u0627\u06cc\u06a9 \u0627\u06cc\u067e \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0634\u062e\u0635 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u06c1\u06cc\u06ba)\u06d4<\/p>\n<p>\u062c\u0648 \u0648\u0627\u067e\u0633 \u0622\u062a\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u062d\u062f \u0628\u062a\u0627\u0624\u06d4 \u0635\u0627\u0631\u0641 \u06a9\u0627 \u0679\u0648\u06a9\u0646 \u0635\u0631\u0641 \u0627\u0633 \u0634\u062e\u0635 \u06a9\u0627 \u0686\u06cc\u0646\u0644 \u0648\u0627\u067e\u0633 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 <code>conversations.history<\/code> \u0648\u06c1 \u0686\u06cc\u0646\u0644 \u0644\u0648\u0679\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f\u06c1 \u0635\u0627\u0631\u0641 \u0646\u06d2 \u06a9\u0628\u06be\u06cc \u062d\u0635\u06c1 \u0646\u06c1\u06cc\u06ba \u0644\u06cc\u0627 \u0627\u0648\u0631 \u0628\u0648\u0679 \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-a-tool-call-runs-as-the-wrong-user\">\u0679\u0648\u0644 \u06a9\u0627\u0644 \u06a9\u0648 \u063a\u0644\u0637 \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u0679\u0648\u06a9\u0646 \u06cc\u0627 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u067e\u0627\u0633 \u06a9\u0631\u0646\u0627 \u062c\u0648 \u06a9\u0633\u06cc \u0627\u0648\u0631 \u0633\u06d2 \u062a\u0639\u0644\u0642 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u063a\u0644\u0637 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648 \u0639\u0627\u062f\u0627\u062a \u0627\u0633 \u06a9\u0648 \u0631\u0648\u06a9\u062a\u06cc \u06c1\u06cc\u06ba: \u06a9\u0644\u0627\u0626\u0646\u0679 \u0627\u0646 \u067e\u0679 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u06a9\u0627\u0644\u0631 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0633\u0631\u0648\u0631 \u0633\u0627\u0626\u06cc\u0688 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06af\u0627\u0646 \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u06c1\u0645 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0628\u0646\u062f \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u062f\u0644\u06cc\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>buildTools<\/code> \u0627\u0648\u0631 \u06c1\u0631 \u0627\u06cc\u06a9 <code>execute<\/code> \u0627\u0633\u06d2 \u0627\u067e\u0646\u0627 \u0679\u0648\u06a9\u0646 \u0645\u0644 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06a9\u0648\u0626\u06cc \u06a9\u0648\u0688 \u067e\u0627\u062a\u06be \u0622\u0648\u0627\u0631\u06c1 \u0627\u0633\u0646\u0627\u062f \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0646\u06c1\u06cc\u06ba \u06af\u0632\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<h3 id=\"heading-refresh-works-once-and-then-stops\">\u0631\u06cc\u0641\u0631\u06cc\u0634 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u06be\u0631 \u0631\u06a9 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/h3>\n<p>\u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646\u0632 \u06a9\u0648 \u06af\u06be\u0645\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u062c\u0648 \u0627\u06cc\u06a9 \u0646\u06cc\u0627 \u0631\u0633\u0627\u0626\u06cc \u0679\u0648\u06a9\u0646 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u067e\u0631\u0627\u0646\u06d2 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0679\u0648\u06a9\u0646 \u06a9\u0648 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u062a\u0627 \u06c1\u06d2 \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u06af\u0644\u06d2 \u0633\u0627\u0626\u06cc\u06a9\u0644 \u067e\u0631 \u0646\u0627\u06a9\u0627\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0628\u06af \u0627\u0648\u0631 \u0639\u0644\u0627\u0645\u0627\u062a \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 12 \u06af\u06be\u0646\u0679\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p><code>saveGrant<\/code>    \u0627\u0633 \u0648\u062c\u06c1 \u0633\u06d2\u060c \u06c1\u0645 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0627\u06c1\u0644 \u0679\u0648\u06a9\u0646 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0631\u06cc\u0641\u0631\u06cc\u0634 \u0633\u06d2 \u0644\u0648\u0679\u06cc \u06c1\u0648\u0626\u06cc \u06c1\u0631 \u0686\u06cc\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-the-agent-files-duplicate-issues\">\u0627\u06cc\u062c\u0646\u0679 \u0641\u0627\u0626\u0644 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1<\/h3>\n<p>\u062f\u0648 \u0648\u062c\u0648\u06c1\u0627\u062a\u06d4 \u0644\u0627\u067e\u062a\u06c1 \u06cc\u0627 \u063a\u06cc\u0631 \u0644\u0627\u06af \u0634\u062f\u06c1 \u0627\u0633\u0679\u06cc\u0679 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u06cc \u0648\u062c\u06c1 \u0633\u06d2 \u062a\u0645\u0627\u0645 \u0631\u0646\u0632 \u06a9\u06cc \u062f\u0648\u0628\u0627\u0631\u06c1 \u062f\u0631\u062c\u06c1 \u0628\u0646\u062f\u06cc \u06a9\u06cc \u062c\u0627\u0626\u06d2 \u06af\u06cc\u06d4 \u06cc\u0627 <code>stopWhen<\/code> \u0627\u0644\u062c\u06be\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0627\u0688\u0644\u0632 \u06a9\u0648 \u067e\u06c1\u0644\u06d2 \u06c1\u06cc \u06a9\u0627\u0645\u06cc\u0627\u0628 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u0648\u0644\u0632 \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0622\u0632\u0645\u0627\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u0631\u0627\u0624\u0646\u0688\u0632 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2 \u0627\u0633\u0679\u06cc\u0679\u0633 \u0641\u0627\u0626\u0644 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba\u06d4 \u067e\u06be\u0631 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0679\u0648\u0644 \u06a9\u06cc \u0648\u0627\u067e\u0633\u06cc \u06a9\u06cc \u0642\u062f\u0631 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645\u06cc\u0627\u0628\u06cc \u06a9\u06cc \u0646\u0634\u0627\u0646\u062f\u06c1\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u06cc \u0648\u062c\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06cc\u06a9 \u0645\u0628\u06c1\u0645 \u0646\u062a\u06cc\u062c\u06c1 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0648\u0628\u0627\u0631\u06c1 \u06a9\u0648\u0634\u0634 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-conclusion\">\u0646\u062a\u06cc\u062c\u06c1<\/h2>\n<p>\u06c1\u0645 \u0646\u06d2 \u0627\u06cc\u06a9 \u0627\u06cc\u062c\u0646\u0679 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2 \u062c\u0648 \u0633\u0644\u06cc\u06a9 \u0686\u06cc\u0646\u0644\u0632 \u06a9\u0648 \u067e\u0691\u06be\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06d2 \u067e\u06cc\u063a\u0627\u0645\u0627\u062a \u0627\u0635\u0644 \u06a9\u0627\u0631\u0631\u0648\u0627\u0626\u06cc \u06a9\u0648 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 GitHub \u0645\u0633\u0626\u0644\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062a\u06be\u0631\u06cc\u0688 \u06a9\u06d2 \u062c\u0648\u0627\u0628 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0644\u0648\u067e \u06a9\u0648 \u0628\u0646\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062a\u0645\u0627\u0645 \u06a9\u0627\u0644\u0632 \u0645\u062e\u0635\u0648\u0635 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0627\u067e\u0646\u06cc OAuth \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be OAuth \u0641\u0644\u0648 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u06cc \u06af\u0626\u06cc \u062a\u06be\u06cc\u06ba \u062c\u0633\u06d2 \u06c1\u0645 \u0646\u06d2 \u062e\u0648\u062f \u0644\u06a9\u06be\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u067e\u0627\u0646\u0686 \u062e\u06cc\u0627\u0644\u0627\u062a \u062a\u0645\u0627\u0645 \u0634\u0631\u0627\u06a9\u062a \u062f\u0627\u0631\u0648\u06ba \u0633\u06d2 \u062e\u0637\u0627\u0628 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba.<\/p>\n<ul>\n<li>\n<p><strong>\u0679\u0648\u0644\u0632 API \u06a9\u0627\u0644\u0632 \u0627\u0648\u0631 \u0645\u0627\u0688\u0644\u0632 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644 \u06c1\u06cc\u06ba\u06d4<\/strong>\u0648\u0636\u0627\u062d\u062a \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0627\u0645 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u0679\u0648\u06a9\u0646 \u06a9\u06cc \u062c\u06af\u06c1 \u0644\u06d2 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/strong> \u0645\u0646\u062f\u0631\u062c\u06c1 \u0628\u0627\u0644\u0627 \u0633\u0628\u06be\u06cc \u0627\u06cc\u06a9 \u0686\u06be\u0648\u0679\u06d2 \u0641\u0646\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u0635\u0627\u0631\u0641 \u06a9\u0627 \u062d\u0648\u0627\u0644\u06c1 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0646\u06c1 \u06a9\u06c1 \u0627\u0633\u0646\u0627\u062f \u06a9\u0648\u060c \u0644\u06c1\u0630\u0627 \u0679\u0648\u06a9\u0646 \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc \u0645\u0627\u0688\u0644 \u0627\u0646 \u067e\u0679 \u06cc\u0627 \u0644\u0627\u06af\u0632 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0646\u06a9\u0634\u0646 \u06a9\u0627 \u0648\u0642\u062a \u0627\u0648\u0631 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0627\u0644\u06af \u0627\u0644\u06af \u0628\u06c1\u0627\u0624 \u06c1\u06cc\u06ba\u06d4<\/strong> \u0631\u0636\u0627\u0645\u0646\u062f\u06cc \u0641\u06cc \u0635\u0627\u0631\u0641\u060c \u0641\u06cc \u0627\u06cc\u067e \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0631\u0646 \u0679\u0627\u0626\u0645 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0648 \u0686\u06cc\u06a9 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0633\u0633\u062a\u06cc \u0633\u06d2 \u0679\u0648\u06a9\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0646\u0638\u0648\u0631\u06cc \u0622\u067e \u06a9\u06cc \u06c1\u06d2\u06d4<\/strong> \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u062c\u0648\u0627\u0628 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 \u0679\u0648\u06a9\u0646 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u0627 \u06c1\u06d2\u06d4 \u0622\u06cc\u0627 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0627\u0633 \u0634\u0646\u0627\u062e\u062a \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0633\u0648\u0627\u0644 \u06c1\u06d2 \u062c\u0633 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u0635\u0631\u0641 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u062f\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0645\u0644\u0679\u06cc \u067e\u0631\u0648\u0648\u0627\u0626\u06cc\u0688\u0631 \u0633\u067e\u0648\u0631\u0679 \u0631\u062c\u0633\u0679\u0631\u06cc \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u060c \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0627 \u0645\u0633\u0626\u0644\u06c1 \u0646\u06c1\u06cc\u06ba\u06d4<\/strong>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 IDs \u0627\u06cc\u06a9 \u0633\u0679\u0631\u0646\u06af \u0645\u06cc\u06ba \u06c1\u0648\u06ba\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0648\u06c1 \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u062c\u0648 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0632\u0646 \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06cc\u06ba \u0648\u06c1 \u0628\u06be\u06cc \u0633\u0628 \u0633\u06d2 \u0686\u06be\u0648\u0679\u06cc \u06c1\u06cc\u06ba\u06d4 <code>authed_user.access_token<\/code> \u0628\u0644\u06a9\u06c1 <code>access_token<\/code>. \u0627\u06cc\u06a9 \u0627\u0646\u062a\u0633\u0627\u0628 \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u06cc \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0627\u06cc\u062c\u0646\u0679 \u0648\u0631\u06a9 \u0627\u0633\u067e\u06cc\u0633 \u0645\u06cc\u06ba \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0645\u0648\u062c\u0648\u062f \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u06a9\u0627 \u0627\u062d\u062a\u0631\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06cc\u0627 \u062e\u0627\u0645\u0648\u0634\u06cc \u0633\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba \u0622\u067e \u0627\u067e\u0646\u06cc \u0634\u06a9\u0644 \u0631\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0633\u067e\u0644\u0627\u0626\u0631\u0632 \u06a9\u0648 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u0691\u06be\u0646\u06d2 \u06a9\u0627 \u0622\u062f\u06be\u0627 \u067e\u0648\u0627\u0626\u0646\u0679 \u062c\u06cc \u0645\u06cc\u0644 \u06a9\u06cc \u0637\u0631\u0641\u060c \u0622\u062f\u06be\u0627 \u0644\u06a9\u06be\u0646\u0627 \u0644\u06a9\u06cc\u0631\u06cc \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u067e\u06be\u0631 \u06c1\u0645 \u0627\u0646 \u067e\u0679 \u06a9\u0648 \u0645\u0627\u0688\u0644 \u067e\u0631 \u062f\u0648\u0628\u0627\u0631\u06c1 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0634\u0646\u0627\u062e\u062a\u06cc \u067e\u0644\u0645\u0628\u0646\u06af \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u06a9\u0645\u0644 \u0645\u0627\u062e\u0630 github.com\/saif-shines\/channel-watcher-agent \u067e\u0631 \u06c1\u06d2\u06d4<\/p>\n<p><em>\u06cc\u06c1 \u0645\u0636\u0645\u0648\u0646 \u062c\u0648 \u06a9\u0686\u06be \u06c1\u0645 \u0646\u06d2 \u0633\u06cc\u06a9\u06be\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u062a\u0634\u06a9\u06cc\u0644 \u0646\u0648 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/em> <em>\u067e\u06cc\u0645\u0627\u0646\u06d2 \u06a9\u06cc \u06a9\u0679<\/em><em>\u06cc\u06c1 \u0679\u0648\u06a9\u0646 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0627 \u0645\u06cc\u0632\u0628\u0627\u0646 \u0648\u0631\u0698\u0646 \u06c1\u06d2 \u062c\u0633\u06d2 \u06c1\u0645 \u0646\u06d2 \u0627\u0628\u06be\u06cc \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2\u06d4<\/em><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0627 AI \u0627\u06cc\u062c\u0646\u0679 \u0627\u06cc\u06a9 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0641\u0631\u0627\u062f \u06a9\u06cc \u062e\u062f\u0645\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0679\u0648\u0644 \u067e\u0631 \u0622\u0646\u06d2 \u0648\u0627\u0644\u06cc \u06c1\u0631 \u06a9\u0627\u0644 \u06a9\u0627 \u062c\u0648\u0627\u0628 \u06a9\u0686\u06be \u0627\u0633 \u0637\u0631\u062d \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2: \u0627\u06cc\u062c\u0646\u0679 \u06a9\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u061f \u0622\u0626\u06cc\u06d2 \u0627\u06cc\u06a9 AI \u0627\u06cc\u062c\u0646\u0679 \u0628\u0646\u0627 \u06a9\u0631 \u0627\u0633 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1 \u0645\u0639\u0644\u0648\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0648 Slack \u0627\u0648\u0631 GitHub \u0633\u06d2 \u062c\u0691\u062a\u0627 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":27589,"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-27588","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/27588","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/comments?post=27588"}],"version-history":[{"count":1,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/27588\/revisions"}],"predecessor-version":[{"id":27590,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/27588\/revisions\/27590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media\/27589"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media?parent=27588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/categories?post=27588"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/tags?post=27588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}