()
| 819 | async function loadPuterJS() { |
| 820 | if (!isPuterJsSupportedHere()) { |
| 821 | throw new Error('Puter.com AI is unavailable in this view (file:// protocol). Restart the desktop app or use Server Mode in a browser.'); |
| 822 | } |
| 823 | |
| 824 | // If already loaded, return immediately |
| 825 | if (typeof puter !== 'undefined' && puter && puter.ai) { |
| 826 | console.log('[Puter] Puter.js already loaded'); |
| 827 | return Promise.resolve(); |
| 828 | } |
| 829 | |
| 830 | // If already loading, return the existing promise |
| 831 | if (puterLoadingPromise) { |
| 832 | console.log('[Puter] Puter.js already loading, waiting...'); |
| 833 | return puterLoadingPromise; |
| 834 | } |
| 835 | |
| 836 | // Check if script tag already exists |
| 837 | const existingScript = document.querySelector('script[src="https://js.puter.com/v2/"]'); |
| 838 | if (existingScript) { |
| 839 | console.log('[Puter] Puter.js script tag already exists, waiting for load...'); |
| 840 | puterLoadingPromise = new Promise((resolve, reject) => { |
no outgoing calls
no test coverage detected