@kudoai/chatgpt.js 3.8.0 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,8 +51,8 @@
51
51
  <img src="https://img.shields.io/badge/License-MIT-fc4f2d.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
52
52
  <a href="https://www.npmjs.com/package/@kudoai/chatgpt.js/v/latest" target="_blank" rel="noopener">
53
53
  <img src="https://img.shields.io/npm/v/%40kudoai%2Fchatgpt.js?logo=npm&logoColor=white&labelColor=464646&color=blue&style=for-the-badge&label=Latest+Release"></a>
54
- <a href="https://github.com/KudoAI/chatgpt.js/tree/v3.8.0/dist/chatgpt.min.js" target="_blank" rel="noopener">
55
- <img src="https://img.shields.io/github/size/KudoAI/chatgpt.js/dist/chatgpt.min.js?branch=v3.8.0&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
54
+ <a href="https://github.com/KudoAI/chatgpt.js/tree/v3.8.1/dist/chatgpt.min.js" target="_blank" rel="noopener">
55
+ <img src="https://img.shields.io/github/size/KudoAI/chatgpt.js/dist/chatgpt.min.js?branch=v3.8.1&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
56
56
  <a href="https://www.codefactor.io/repository/github/kudoai/chatgpt.js" target="_blank" rel="noopener">
57
57
  <img src="https://img.shields.io/codefactor/grade/github/kudoai/chatgpt.js?label=Code+Quality&logo=codefactor&logoColor=white&labelColor=464646&color=1acc6c&style=for-the-badge"></a>
58
58
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=kudoai_chatgpt.js" target="_blank" rel="noopener">
@@ -118,7 +118,7 @@
118
118
 
119
119
  ```js
120
120
  (async () => {
121
- await import('https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js');
121
+ await import('https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js');
122
122
  // Your code here...
123
123
  })();
124
124
  ```
@@ -127,7 +127,7 @@
127
127
 
128
128
  ```js
129
129
  var xhr = new XMLHttpRequest();
130
- xhr.open('GET', 'https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js');
130
+ xhr.open('GET', 'https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js');
131
131
  xhr.onload = function () {
132
132
  if (xhr.status === 200) {
133
133
  var chatgptJS = document.createElement('script');
@@ -150,7 +150,7 @@ function yourCode() {
150
150
 
151
151
  ```js
152
152
  ...
153
- // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js
153
+ // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js
154
154
  // ==/UserScript==
155
155
 
156
156
  // Your code here...
@@ -220,7 +220,7 @@ chatgpt.get('reply', 'last');
220
220
 
221
221
  Each call equally fetches the last response. If you think it works, it probably will... so just type it!
222
222
 
223
- If it didn't, check out the extended [userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.0/docs/USERGUIDE.md), or simply submit an [issue](https://github.com/KudoAI/chatgpt.js/issues) or [PR](https://github.com/KudoAI/chatgpt.js/pulls) and it will be integrated, ezpz!
223
+ If it didn't, check out the extended [userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.1/docs/USERGUIDE.md), or simply submit an [issue](https://github.com/KudoAI/chatgpt.js/issues) or [PR](https://github.com/KudoAI/chatgpt.js/pulls) and it will be integrated, ezpz!
224
224
 
225
225
  <img height=8px width="100%" src="https://assets.chatgptjs.org/images/separators/gradient-aqua.png?v=e638eac">
226
226
 
@@ -476,7 +476,7 @@ This library exists thanks to code, translations, issues & ideas from the follow
476
476
  <div align="center">
477
477
 
478
478
  **[Releases](https://github.com/KudoAI/chatgpt.js/releases)** /
479
- [Userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.0/docs/USERGUIDE.md) /
479
+ [Userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.1/docs/USERGUIDE.md) /
480
480
  [Discuss](https://github.com/KudoAI/chatgpt.js/discussions) /
481
481
  [Back to top ↑](#top)
482
482
 
package/chatgpt.js CHANGED
@@ -51,7 +51,7 @@ const chatgpt = {
51
51
  footer: 'div#thread-bottom-container > div:last-of-type > div, span.text-sm.leading-none',
52
52
  header: 'div#page-header, main div.sticky:first-of-type',
53
53
  links: { newChat: 'nav a[href="/"]', sidebarItem: 'nav a' },
54
- sidebar: 'div[class*=sidebar]:has(nav > div#sidebar-header)',
54
+ sidebar: 'div.bg-token-sidebar-surface-primary',
55
55
  ssgManifest: 'script[src*="_ssgManifest.js"]'
56
56
  },
57
57
 
@@ -128,15 +128,16 @@ const chatgpt = {
128
128
  drag: {
129
129
  mousedown(event) { // find modal, update styles, attach listeners, init XY offsets
130
130
  if (event.button != 0) return // prevent non-left-click drag
131
- if (getComputedStyle(event.target).cursor == 'pointer') return // prevent drag on interactive elems
131
+ if (!/auto|default/.test(getComputedStyle(event.target).cursor))
132
+ return // prevent drag on interactive elems
132
133
  chatgpt.draggingModal = event.currentTarget
133
134
  event.preventDefault() // prevent sub-elems like icons being draggable
134
135
  Object.assign(chatgpt.draggingModal.style, {
135
136
  transition: '0.1s', willChange: 'transform', transform: 'scale(1.05)' })
136
- document.body.style.cursor = 'grabbing'; // update cursor
137
- [...chatgpt.draggingModal.children] // prevent hover FX if drag lags behind cursor
138
- .forEach(child => child.style.pointerEvents = 'none');
139
- ['mousemove', 'mouseup'].forEach(eventType => // add listeners
137
+ document.body.style.cursor = 'grabbing' // update cursor
138
+ ;[...chatgpt.draggingModal.children] // prevent hover FX if drag lags behind cursor
139
+ .forEach(child => child.style.pointerEvents = 'none')
140
+ ;['mousemove', 'mouseup'].forEach(eventType => // add listeners
140
141
  document.addEventListener(eventType, handlers.drag[eventType]))
141
142
  const draggingModalRect = chatgpt.draggingModal.getBoundingClientRect()
142
143
  handlers.drag.offsetX = event.clientX - draggingModalRect.left +21
@@ -153,10 +154,10 @@ const chatgpt = {
153
154
  mouseup() { // restore styles/pointer events, remove listeners, reset chatgpt.draggingModal
154
155
  Object.assign(chatgpt.draggingModal.style, { // restore styles
155
156
  cursor: 'inherit', transition: 'inherit', willChange: 'auto', transform: 'scale(1)' })
156
- document.body.style.cursor = ''; // restore cursor
157
- [...chatgpt.draggingModal.children] // restore pointer events
158
- .forEach(child => child.style.pointerEvents = '');
159
- ['mousemove', 'mouseup'].forEach(eventType => // remove listeners
157
+ document.body.style.cursor = '' // restore cursor
158
+ ;[...chatgpt.draggingModal.children] // restore pointer events
159
+ .forEach(child => child.style.pointerEvents = '')
160
+ ;['mousemove', 'mouseup'].forEach(eventType => // remove listeners
160
161
  document.removeEventListener(eventType, handlers.drag[eventType]))
161
162
  chatgpt.draggingModal = null
162
163
  }
@@ -180,7 +181,7 @@ const chatgpt = {
180
181
  modalStyle.setAttribute('last-updated', thisUpdated.toString())
181
182
  document.head.append(modalStyle)
182
183
  }
183
- modalStyle.innerText = ( // update prev/new style contents
184
+ modalStyle.textContent = ( // update prev/new style contents
184
185
  `.chatgpt-modal { /* vars */
185
186
  --transition: opacity 0.65s cubic-bezier(.165,.84,.44,1), /* for fade-in */
186
187
  transform 0.55s cubic-bezier(.165,.84,.44,1) ; /* for move-in */
@@ -232,7 +233,7 @@ const chatgpt = {
232
233
  display: flex ; justify-content: flex-end ; margin: 20px -5px -3px 0 ;
233
234
  ${ isMobile ? 'flex-direction: column-reverse' : '' }}
234
235
  .chatgpt-modal button {
235
- font-size: 14px ; text-transform: uppercase ;
236
+ font-size: 14px ; text-transform: uppercase ; cursor: crosshair ;
236
237
  margin-left: ${ isMobile ? 0 : 10 }px ; padding: ${ isMobile ? 15 : 8 }px 18px ;
237
238
  ${ isMobile ? 'margin-top: 5px ; margin-bottom: 3px ;' : '' }
238
239
  border-radius: 0 ; border: 1px solid ${ scheme == 'dark' ? 'white' : 'black' };
@@ -270,7 +271,7 @@ const chatgpt = {
270
271
  }
271
272
 
272
273
  // Insert text into elems
273
- modalTitle.innerText = title || '' ; modalMessage.innerText = msg || '' ; chatgpt.renderHTML(modalMessage)
274
+ modalTitle.textContent = title || '' ; modalMessage.innerText = msg || '' ; chatgpt.renderHTML(modalMessage)
274
275
 
275
276
  // Create/append buttons (if provided) to buttons div
276
277
  const modalButtons = document.createElement('div')
@@ -1299,7 +1300,7 @@ const chatgpt = {
1299
1300
  const notificationDiv = document.createElement('div') // make div
1300
1301
  notificationDiv.id = Math.floor(chatgpt.randomFloat() * 1000000) + Date.now()
1301
1302
  notificationDiv.classList.add('chatgpt-notif')
1302
- notificationDiv.innerText = msg // insert msg
1303
+ notificationDiv.textContent = msg // insert msg
1303
1304
  document.body.append(notificationDiv) // insert into DOM
1304
1305
 
1305
1306
  // Create/append close button
@@ -1332,7 +1333,7 @@ const chatgpt = {
1332
1333
  notifStyle.setAttribute('last-updated', thisUpdated.toString())
1333
1334
  document.head.append(notifStyle)
1334
1335
  }
1335
- notifStyle.innerText = ( // update prev/new style contents
1336
+ notifStyle.textContent = ( // update prev/new style contents
1336
1337
  '.chatgpt-notif {'
1337
1338
  + 'font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC",'
1338
1339
  + '"Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif ;'
@@ -1368,7 +1369,7 @@ const chatgpt = {
1368
1369
  notificationDiv.style.right = notificationDiv.isRight ? vpXoffset.toString() + 'px' : ''
1369
1370
  notificationDiv.style.left = !notificationDiv.isRight ? vpXoffset.toString() + 'px' : ''
1370
1371
 
1371
- // Reposition old notifications
1372
+ // Re-position old notifications
1372
1373
  const thisQuadrantQueue = notifyProps.queue[notificationDiv.quadrant]
1373
1374
  if (thisQuadrantQueue.length > 1) {
1374
1375
  try { // to move old notifications
@@ -1378,7 +1379,7 @@ const chatgpt = {
1378
1379
  vOffset = +parseInt(oldDiv.style[offsetProp]) +5 + oldDiv.getBoundingClientRect().height
1379
1380
  oldDiv.style[offsetProp] = `${ vOffset }px` // change prop
1380
1381
  }
1381
- } catch (err) {}
1382
+ } catch (err) { console.warn('Failed to re-position notification:', err) }
1382
1383
  }
1383
1384
 
1384
1385
  // Show notification
@@ -1762,8 +1763,7 @@ const chatgpt = {
1762
1763
  activateObserver() {
1763
1764
 
1764
1765
  // Stop the previous observer to preserve resources
1765
- if (this.observer instanceof MutationObserver)
1766
- try { this.observer.disconnect() } catch (e) {}
1766
+ if (this.observer instanceof MutationObserver) this.observer.disconnect()
1767
1767
 
1768
1768
  if (!this.elems.length) return console.error('🤖 chatgpt.js >> No elems to append!')
1769
1769
 
@@ -4,7 +4,7 @@
4
4
  * User guide: https://chatgptjs.org/userguide
5
5
  * Latest minified release: https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js/chatgpt.min.js
6
6
  */
7
- localStorage.alertQueue=JSON.stringify([]),localStorage.notifyProps=JSON.stringify({queue:{topRight:[],bottomRight:[],bottomLeft:[],topLeft:[]}});let chatgpt={endpoints:{assets:"https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@91109d9090c303cd8940fff42ca5e534f8a2324e",openAI:{session:"https://chatgpt.com/api/auth/session",chats:"https://chatgpt.com/backend-api/conversations",chat:"https://chatgpt.com/backend-api/conversation",share_create:"https://chatgpt.com/backend-api/share/create",share:"https://chatgpt.com/backend-api/share",instructions:"https://chatgpt.com/backend-api/user_system_messages"}},selectors:{btns:{continue:'button:has(svg[class*=rotate] > path[d^="M4.47189"])',createImage:'button[data-testid="composer-create-image"]',deepResearch:'button[data-testid="composer-deep-research"]',login:"button[data-testid*=login]",newChat:'a[href="/"]:has(svg),button:has([d^="M3.06957"])',regen:'button[data-testid*=regenerate],div[role=menuitem] div:has(svg):has(path[d^="M3.06957"])',scroll:'button:has(> svg > path[d^="M12 21C11.7348"])',search:'button[data-testid="composer-button-search"]',reason:'button[data-testid="composer-button-reason"]',send:"button[data-testid=send-button]",sidebar:"button[data-testid*=sidebar-button]",stop:"button[data-testid=stop-button]",upload:'button:has(> svg > path[d^="M12 3C12.5523"])',voice:"button[data-testid*=composer-speech-button]"},chatDivs:{convo:"div[class*=thread]",msg:"div[data-message-author-role]",reply:"div[data-message-author-role=assistant]"},chatHistory:"div#history",errors:{toast:"div.toast-root",txt:"div[class*=text-error]"},footer:"div#thread-bottom-container > div:last-of-type > div, span.text-sm.leading-none",header:"div#page-header, main div.sticky:first-of-type",links:{newChat:'nav a[href="/"]',sidebarItem:"nav a"},sidebar:"div[class*=sidebar]:has(nav > div#sidebar-header)",ssgManifest:'script[src*="_ssgManifest.js"]'},actAs(s){return new Promise((r,a)=>{let n=new XMLHttpRequest;n.open("GET","https://cdn.jsdelivr.net/gh/KudoAI/chat-prompts@91109d9090c303cd8940fff42ca5e534f8a2324e/dist/personas.min.json",!0),n.send(),n.onload=()=>{if(200!=n.status)return a("🤖 chatgpt.js >> Request failed. Cannot retrieve prompts data.");var e=JSON.parse(n.responseText).personas;if(s){var t=e.find(e=>e.title.toLowerCase()==s.toLowerCase());if(!t)return a(`🤖 chatgpt.js >> Persona '${s}' was not found!`);chatgpt.send(t.prompt,"click"),console.info(`Loading ${s} persona...`),chatgpt.isIdle().then(()=>console.info("Persona activated!"))}else{console.log("\n%c🤖 chatgpt.js personas\n","font-family: sans-serif ; font-size: xxx-large ; font-weight: bold");for(var o of e)console.log("%c"+o.title,"font-family: monospace ; font-size: larger ;")}return r()}})},activateDarkMode(){document.documentElement.classList.replace("light","dark"),document.documentElement.style.colorScheme=localStorage.theme="dark"},activateLightMode(){document.documentElement.classList.replace("dark","light"),document.documentElement.style.colorScheme=localStorage.theme="light"},alert(o,r,e,a,t){let n=chatgpt.isDarkMode()?"dark":"light",s=chatgpt.browser.isMobile(),i={dismiss:{click(e){e.target!=e.currentTarget&&!e.target.closest("[class*=-close-btn]")||f()},key(e){if(/^(?: |Space|Enter|Return|Esc)/.test(e.key)&&[32,13,27].includes(e.keyCode))for(var t of m){var t=document.getElementById(t);if(!t||"none"==t.style.display)return;e.key.startsWith("Esc")||27==e.keyCode?f():(t=t.querySelector(".modal-buttons").lastChild)&&(t.click(),e.preventDefault())}}},drag:{mousedown(e){var t;0==e.button&&"pointer"!=getComputedStyle(e.target).cursor&&(chatgpt.draggingModal=e.currentTarget,e.preventDefault(),Object.assign(chatgpt.draggingModal.style,{transition:"0.1s",willChange:"transform",transform:"scale(1.05)"}),document.body.style.cursor="grabbing",[...chatgpt.draggingModal.children].forEach(e=>e.style.pointerEvents="none"),["mousemove","mouseup"].forEach(e=>document.addEventListener(e,i.drag[e])),t=chatgpt.draggingModal.getBoundingClientRect(),i.drag.offsetX=e.clientX-t.left+21,i.drag.offsetY=e.clientY-t.top+12)},mousemove(e){var t;chatgpt.draggingModal&&(t=e.clientX-i.drag.offsetX,e=e.clientY-i.drag.offsetY,Object.assign(chatgpt.draggingModal.style,{left:t+"px",top:e+"px"}))},mouseup(){Object.assign(chatgpt.draggingModal.style,{cursor:"inherit",transition:"inherit",willChange:"auto",transform:"scale(1)"}),document.body.style.cursor="",[...chatgpt.draggingModal.children].forEach(e=>e.style.pointerEvents=""),["mousemove","mouseup"].forEach(e=>document.removeEventListener(e,i.drag[e])),chatgpt.draggingModal=null}}},c=document.createElement("div"),l=(c.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),c.classList.add("chatgpt-modal"),document.createElement("div")),d=document.createElement("h2"),g=document.createElement("p");var u=1739338889852;let h=document.querySelector("#chatgpt-modal-style"),p=((!h||parseInt(h.getAttribute("last-updated"),10)<u)&&(h||((h=document.createElement("style")).id="chatgpt-modal-style",h.setAttribute("last-updated",u.toString()),document.head.append(h)),h.innerText=`.chatgpt-modal { /* vars */
7
+ localStorage.alertQueue=JSON.stringify([]),localStorage.notifyProps=JSON.stringify({queue:{topRight:[],bottomRight:[],bottomLeft:[],topLeft:[]}});let chatgpt={endpoints:{assets:"https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@1222ad6b5e6b81fcfb4345011c6d9d8396986450",openAI:{session:"https://chatgpt.com/api/auth/session",chats:"https://chatgpt.com/backend-api/conversations",chat:"https://chatgpt.com/backend-api/conversation",share_create:"https://chatgpt.com/backend-api/share/create",share:"https://chatgpt.com/backend-api/share",instructions:"https://chatgpt.com/backend-api/user_system_messages"}},selectors:{btns:{continue:'button:has(svg[class*=rotate] > path[d^="M4.47189"])',createImage:'button[data-testid="composer-create-image"]',deepResearch:'button[data-testid="composer-deep-research"]',login:"button[data-testid*=login]",newChat:'a[href="/"]:has(svg),button:has([d^="M3.06957"])',regen:'button[data-testid*=regenerate],div[role=menuitem] div:has(svg):has(path[d^="M3.06957"])',scroll:'button:has(> svg > path[d^="M12 21C11.7348"])',search:'button[data-testid="composer-button-search"]',reason:'button[data-testid="composer-button-reason"]',send:"button[data-testid=send-button]",sidebar:"button[data-testid*=sidebar-button]",stop:"button[data-testid=stop-button]",upload:'button:has(> svg > path[d^="M12 3C12.5523"])',voice:"button[data-testid*=composer-speech-button]"},chatDivs:{convo:"div[class*=thread]",msg:"div[data-message-author-role]",reply:"div[data-message-author-role=assistant]"},chatHistory:"div#history",errors:{toast:"div.toast-root",txt:"div[class*=text-error]"},footer:"div#thread-bottom-container > div:last-of-type > div, span.text-sm.leading-none",header:"div#page-header, main div.sticky:first-of-type",links:{newChat:'nav a[href="/"]',sidebarItem:"nav a"},sidebar:"div.bg-token-sidebar-surface-primary",ssgManifest:'script[src*="_ssgManifest.js"]'},actAs(s){return new Promise((r,a)=>{let n=new XMLHttpRequest;n.open("GET","https://cdn.jsdelivr.net/gh/KudoAI/chat-prompts@1222ad6b5e6b81fcfb4345011c6d9d8396986450/dist/personas.min.json",!0),n.send(),n.onload=()=>{if(200!=n.status)return a("🤖 chatgpt.js >> Request failed. Cannot retrieve prompts data.");var e=JSON.parse(n.responseText).personas;if(s){var t=e.find(e=>e.title.toLowerCase()==s.toLowerCase());if(!t)return a(`🤖 chatgpt.js >> Persona '${s}' was not found!`);chatgpt.send(t.prompt,"click"),console.info(`Loading ${s} persona...`),chatgpt.isIdle().then(()=>console.info("Persona activated!"))}else{console.log("\n%c🤖 chatgpt.js personas\n","font-family: sans-serif ; font-size: xxx-large ; font-weight: bold");for(var o of e)console.log("%c"+o.title,"font-family: monospace ; font-size: larger ;")}return r()}})},activateDarkMode(){document.documentElement.classList.replace("light","dark"),document.documentElement.style.colorScheme=localStorage.theme="dark"},activateLightMode(){document.documentElement.classList.replace("dark","light"),document.documentElement.style.colorScheme=localStorage.theme="light"},alert(o,r,e,a,t){let n=chatgpt.isDarkMode()?"dark":"light",s=chatgpt.browser.isMobile(),i={dismiss:{click(e){e.target!=e.currentTarget&&!e.target.closest("[class*=-close-btn]")||f()},key(e){if(/^(?: |Space|Enter|Return|Esc)/.test(e.key)&&[32,13,27].includes(e.keyCode))for(var t of m){var t=document.getElementById(t);if(!t||"none"==t.style.display)return;e.key.startsWith("Esc")||27==e.keyCode?f():(t=t.querySelector(".modal-buttons").lastChild)&&(t.click(),e.preventDefault())}}},drag:{mousedown(e){var t;0==e.button&&/auto|default/.test(getComputedStyle(e.target).cursor)&&(chatgpt.draggingModal=e.currentTarget,e.preventDefault(),Object.assign(chatgpt.draggingModal.style,{transition:"0.1s",willChange:"transform",transform:"scale(1.05)"}),document.body.style.cursor="grabbing",[...chatgpt.draggingModal.children].forEach(e=>e.style.pointerEvents="none"),["mousemove","mouseup"].forEach(e=>document.addEventListener(e,i.drag[e])),t=chatgpt.draggingModal.getBoundingClientRect(),i.drag.offsetX=e.clientX-t.left+21,i.drag.offsetY=e.clientY-t.top+12)},mousemove(e){var t;chatgpt.draggingModal&&(t=e.clientX-i.drag.offsetX,e=e.clientY-i.drag.offsetY,Object.assign(chatgpt.draggingModal.style,{left:t+"px",top:e+"px"}))},mouseup(){Object.assign(chatgpt.draggingModal.style,{cursor:"inherit",transition:"inherit",willChange:"auto",transform:"scale(1)"}),document.body.style.cursor="",[...chatgpt.draggingModal.children].forEach(e=>e.style.pointerEvents=""),["mousemove","mouseup"].forEach(e=>document.removeEventListener(e,i.drag[e])),chatgpt.draggingModal=null}}},c=document.createElement("div"),l=(c.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),c.classList.add("chatgpt-modal"),document.createElement("div")),d=document.createElement("h2"),g=document.createElement("p");var u=1739338889852;let h=document.querySelector("#chatgpt-modal-style"),p=((!h||parseInt(h.getAttribute("last-updated"),10)<u)&&(h||((h=document.createElement("style")).id="chatgpt-modal-style",h.setAttribute("last-updated",u.toString()),document.head.append(h)),h.textContent=`.chatgpt-modal { /* vars */
8
8
  --transition: opacity 0.65s cubic-bezier(.165,.84,.44,1), /* for fade-in */
9
9
  transform 0.55s cubic-bezier(.165,.84,.44,1) ; /* for move-in */
10
10
  --bg-transition: background-color 0.25s ease ; /* for bg dim */
@@ -44,7 +44,7 @@ localStorage.alertQueue=JSON.stringify([]),localStorage.notifyProps=JSON.stringi
44
44
  display: flex ; justify-content: flex-end ; margin: 20px -5px -3px 0 ;
45
45
  ${s?"flex-direction: column-reverse":""}}
46
46
  .chatgpt-modal button {
47
- font-size: 14px ; text-transform: uppercase ;
47
+ font-size: 14px ; text-transform: uppercase ; cursor: crosshair ;
48
48
  margin-left: ${s?0:10}px ; padding: ${s?15:8}px 18px ;
49
49
  ${s?"margin-top: 5px ; margin-bottom: 3px ;":""}
50
50
  border-radius: 0 ; border: 1px solid ${"dark"==n?"white":"black"};
@@ -74,7 +74,7 @@ localStorage.alertQueue=JSON.stringify([]),localStorage.notifyProps=JSON.stringi
74
74
  .chatgpt-modal input[type=checkbox]:focus {
75
75
  outline: none ; box-shadow: none ; -webkit-box-shadow: none ; -moz-box-shadow: none }
76
76
  .chatgpt-modal .checkbox-group label {
77
- cursor: pointer ; font-size: 14px ; color: ${"dark"==n?"#e1e1e1":"#1e1e1e"}}`),d.innerText=o||"",g.innerText=r||"",chatgpt.renderHTML(g),document.createElement("div"));p.classList.add("modal-buttons","no-mobile-tap-outline"),e&&(e=Array.isArray(e)?e:[e]).forEach(e=>{var t=document.createElement("button");t.textContent=e.name.replace(/[_-]\w/g,e=>e.slice(1).toUpperCase()).replace(/([A-Z])/g," $1").replace(/^\w/,e=>e.toUpperCase()),t.onclick=()=>{f(),e()},p.insertBefore(t,p.firstChild)});u=document.createElement("button"),u.textContent=e?"Dismiss":"OK",p.insertBefore(u,p.firstChild),p.lastChild.classList.add("primary-modal-btn"),o=document.createElement("div");if(a){o.classList.add("checkbox-group");let e=a,t=document.createElement("input");t.type="checkbox",t.onchange=e;r=document.createElement("label");r.onclick=()=>{t.checked=!t.checked,e()},r.textContent=e.name[0].toUpperCase()+e.name.slice(1).replace(/([A-Z])/g,(e,t)=>" "+t.toLowerCase()).replace(/\b(\w+)nt\b/gi,"$1n't").trim(),o.append(t),o.append(r)}e=document.createElement("div"),e.title="Close",e.classList.add("modal-close-btn","no-mobile-tap-outline"),a=document.createElementNS("http://www.w3.org/2000/svg","svg"),a.setAttribute("height","10px"),a.setAttribute("viewBox","0 0 14 14"),a.setAttribute("fill","none"),r=document.createElementNS("http://www.w3.org/2000/svg","path");r.setAttribute("fill-rule","evenodd"),r.setAttribute("clip-rule","evenodd"),r.setAttribute("fill",chatgpt.isDarkMode()?"white":"black"),r.setAttribute("d","M13.7071 1.70711C14.0976 1.31658 14.0976 0.683417 13.7071 0.292893C13.3166 -0.0976312 12.6834 -0.0976312 12.2929 0.292893L7 5.58579L1.70711 0.292893C1.31658 -0.0976312 0.683417 -0.0976312 0.292893 0.292893C-0.0976312 0.683417 -0.0976312 1.31658 0.292893 1.70711L5.58579 7L0.292893 12.2929C-0.0976312 12.6834 -0.0976312 13.3166 0.292893 13.7071C0.683417 14.0976 1.31658 14.0976 1.70711 13.7071L7 8.41421L12.2929 13.7071C12.6834 14.0976 13.3166 14.0976 13.7071 13.7071C14.0976 13.3166 14.0976 12.6834 13.7071 12.2929L8.41421 7L13.7071 1.70711Z"),a.append(r),e.append(a),l.append(e,d,g,o,p),l.style.width=`${t||458}px`,c.append(l),document.body.append(c);let m=JSON.parse(localStorage.alertQueue),f=(m.push(c.id),localStorage.alertQueue=JSON.stringify(m),c.style.display="none",1==m.length&&(c.style.display="",setTimeout(()=>{l.parentNode.style.backgroundColor=`rgba(67,70,72,${"dark"==n?.62:.33})`,l.parentNode.classList.add("animated")},100)),[c,e,a,u].forEach(e=>e.onclick=i.dismiss.click),document.addEventListener("keydown",i.dismiss.key),l.onmousedown=i.drag.mousedown,()=>{c.style.backgroundColor="transparent",l.style.animation="alert-zoom-fade-out 0.165s ease-out",l.onanimationend=()=>{if(c.remove(),(m=JSON.parse(localStorage.alertQueue)).shift(),localStorage.alertQueue=JSON.stringify(m),document.removeEventListener("keydown",i.dismiss.key),0<m.length){let e=document.getElementById(m[0]);setTimeout(()=>{e.style.display="",setTimeout(()=>e.classList.add("animated"),100)},500)}}});return c.id},async askAndGetReply(e){return chatgpt.send(e),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},autoRefresh:{activate(e){if(this.isActive)return console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh already active!`);let o=this,r=(this.toggle.refreshFrame(),t=>{var e=Math.max(2,Math.floor(21*chatgpt.randomFloat()-10));o.isActive=setTimeout(()=>{var e=document.querySelector(chatgpt.selectors.ssgManifest);e&&(document.querySelector("#refresh-frame").src=e.src+"?"+Date.now(),console.log(`↻ ChatGPT >> [${o.nowTimeStamp()}] ChatGPT session refreshed`)),r(t)},1e3*(t+e))});r(e?parseInt(e,10):30),console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh activated`),navigator.userAgent.includes("Chrome")&&void 0!==document.hidden&&document.addEventListener("visibilitychange",this.toggle.beacons)},deactivate(){this.isActive?(this.toggle.refreshFrame(),document.removeEventListener("visibilitychange",this.toggle.beacons),clearTimeout(this.isActive),this.isActive=null,console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh de-activated`)):console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh already inactive!`)},nowTimeStamp(){var e=new Date,t=e.getHours()%12||12;let o=e.getMinutes(),r=e.getSeconds();o<10&&(o="0"+o),r<10&&(r="0"+r);e=e.getHours()<12?"AM":"PM";return`${t}:${o}:${r} `+e},toggle:{beacons(){chatgpt.autoRefresh.beaconID?(clearInterval(chatgpt.autoRefresh.beaconID),chatgpt.autoRefresh.beaconID=null,console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Beacons de-activated`)):(chatgpt.autoRefresh.beaconID=setInterval(()=>{navigator.sendBeacon("https://httpbin.org/post",new Uint8Array),console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Beacon sent`)},9e4),console.log(`ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Beacons activated`))},refreshFrame(){let e=document.querySelector("#refresh-frame");e?e.remove():(e=Object.assign(document.createElement("iframe"),{id:"refresh-frame",style:"display: none"}),document.head.prepend(e))}}},browser:{isLightMode(){return window.matchMedia?.("(prefers-color-scheme: light)")?.matches},isDarkMode(){return window.matchMedia?.("(prefers-color-scheme: dark)")?.matches},isChromium(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Chromium")},isChrome(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Chrome")},isEdge(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Edge")},isBrave(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Brave")},isFirefox(){return navigator.userAgent.includes("Firefox")},isFullScreen(){var e=navigator.userAgent;return e.includes("Chrome")?window.matchMedia("(display-mode: fullscreen)").matches:e.includes("Firefox")?window.fullScreen:/MSIE|rv:/.test(e)?document.msFullscreenElement:document.webkitIsFullScreen},isMobile(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}},async clearChats(){return new Promise((o,r)=>chatgpt.getAccessToken().then(e=>{let t=new XMLHttpRequest;t.open("PATCH",chatgpt.endpoints.openAI.chats,!0),t.setRequestHeader("Content-Type","application/json"),t.setRequestHeader("Authorization","Bearer "+e),t.onload=()=>{if(200!=t.status)return r("🤖 chatgpt.js >> Request failed. Cannot clear chats.");console.info("Chats successfully cleared"),o()},t.send(JSON.stringify({is_visible:!1}))}).catch(e=>r(new Error(e.message))))},code:{async execute(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Display the output as if you were terminal:\n\n"+e),console.info("Executing code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},extract(e){var t=e.match(/(?<=```.*\n)[\s\S]*?(?=```)/g);return t?t[t.length-1]:e},async isIdle(t=null){let a={childList:!0,subtree:!0};var e=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,o=(async()=>{await new Promise(o=>{document.querySelector(chatgpt.selectors.chatDivs.msg)?o():new MutationObserver((e,t)=>{document.querySelector(chatgpt.selectors.chatDivs.msg)&&(t.disconnect(),o())}).observe(document.body,a)}),await new Promise(o=>new MutationObserver((e,t)=>{chatgpt.getStopBtn()&&(t.disconnect(),o())}).observe(document.body,{childList:!0,subtree:!0}));let e=document.querySelectorAll(chatgpt.selectors.chatDivs.reply),r=e[e.length-1];return await new Promise(o=>new MutationObserver((e,t)=>{r?.querySelector("pre")&&(t.disconnect(),o())}).observe(document.body,a)),new Promise(o=>new MutationObserver((e,t)=>{!r?.querySelector("pre")?.nextElementSibling&&chatgpt.getStopBtn()||(t.disconnect(),o(!0))}).observe(document.body,a))})();return e?Promise.race([o,e]):o},async minify(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Minify the following code:\n\n"+e),console.info("Minifying code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},async obfuscate(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Obfuscate the following code:\n\n"+e),console.info("Obfuscating code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},async refactor(e,t){if(!e)return console.error("Code (1st) argument not supplied. Pass some code!");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send(`Refactor the following code for ${t||"brevity"}:
77
+ cursor: pointer ; font-size: 14px ; color: ${"dark"==n?"#e1e1e1":"#1e1e1e"}}`),d.textContent=o||"",g.innerText=r||"",chatgpt.renderHTML(g),document.createElement("div"));p.classList.add("modal-buttons","no-mobile-tap-outline"),e&&(e=Array.isArray(e)?e:[e]).forEach(e=>{var t=document.createElement("button");t.textContent=e.name.replace(/[_-]\w/g,e=>e.slice(1).toUpperCase()).replace(/([A-Z])/g," $1").replace(/^\w/,e=>e.toUpperCase()),t.onclick=()=>{f(),e()},p.insertBefore(t,p.firstChild)});u=document.createElement("button"),u.textContent=e?"Dismiss":"OK",p.insertBefore(u,p.firstChild),p.lastChild.classList.add("primary-modal-btn"),o=document.createElement("div");if(a){o.classList.add("checkbox-group");let e=a,t=document.createElement("input");t.type="checkbox",t.onchange=e;r=document.createElement("label");r.onclick=()=>{t.checked=!t.checked,e()},r.textContent=e.name[0].toUpperCase()+e.name.slice(1).replace(/([A-Z])/g,(e,t)=>" "+t.toLowerCase()).replace(/\b(\w+)nt\b/gi,"$1n't").trim(),o.append(t),o.append(r)}e=document.createElement("div"),e.title="Close",e.classList.add("modal-close-btn","no-mobile-tap-outline"),a=document.createElementNS("http://www.w3.org/2000/svg","svg"),a.setAttribute("height","10px"),a.setAttribute("viewBox","0 0 14 14"),a.setAttribute("fill","none"),r=document.createElementNS("http://www.w3.org/2000/svg","path");r.setAttribute("fill-rule","evenodd"),r.setAttribute("clip-rule","evenodd"),r.setAttribute("fill",chatgpt.isDarkMode()?"white":"black"),r.setAttribute("d","M13.7071 1.70711C14.0976 1.31658 14.0976 0.683417 13.7071 0.292893C13.3166 -0.0976312 12.6834 -0.0976312 12.2929 0.292893L7 5.58579L1.70711 0.292893C1.31658 -0.0976312 0.683417 -0.0976312 0.292893 0.292893C-0.0976312 0.683417 -0.0976312 1.31658 0.292893 1.70711L5.58579 7L0.292893 12.2929C-0.0976312 12.6834 -0.0976312 13.3166 0.292893 13.7071C0.683417 14.0976 1.31658 14.0976 1.70711 13.7071L7 8.41421L12.2929 13.7071C12.6834 14.0976 13.3166 14.0976 13.7071 13.7071C14.0976 13.3166 14.0976 12.6834 13.7071 12.2929L8.41421 7L13.7071 1.70711Z"),a.append(r),e.append(a),l.append(e,d,g,o,p),l.style.width=`${t||458}px`,c.append(l),document.body.append(c);let m=JSON.parse(localStorage.alertQueue),f=(m.push(c.id),localStorage.alertQueue=JSON.stringify(m),c.style.display="none",1==m.length&&(c.style.display="",setTimeout(()=>{l.parentNode.style.backgroundColor=`rgba(67,70,72,${"dark"==n?.62:.33})`,l.parentNode.classList.add("animated")},100)),[c,e,a,u].forEach(e=>e.onclick=i.dismiss.click),document.addEventListener("keydown",i.dismiss.key),l.onmousedown=i.drag.mousedown,()=>{c.style.backgroundColor="transparent",l.style.animation="alert-zoom-fade-out 0.165s ease-out",l.onanimationend=()=>{if(c.remove(),(m=JSON.parse(localStorage.alertQueue)).shift(),localStorage.alertQueue=JSON.stringify(m),document.removeEventListener("keydown",i.dismiss.key),0<m.length){let e=document.getElementById(m[0]);setTimeout(()=>{e.style.display="",setTimeout(()=>e.classList.add("animated"),100)},500)}}});return c.id},async askAndGetReply(e){return chatgpt.send(e),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},autoRefresh:{activate(e){if(this.isActive)return console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh already active!`);let o=this,r=(this.toggle.refreshFrame(),t=>{var e=Math.max(2,Math.floor(21*chatgpt.randomFloat()-10));o.isActive=setTimeout(()=>{var e=document.querySelector(chatgpt.selectors.ssgManifest);e&&(document.querySelector("#refresh-frame").src=e.src+"?"+Date.now(),console.log(`↻ ChatGPT >> [${o.nowTimeStamp()}] ChatGPT session refreshed`)),r(t)},1e3*(t+e))});r(e?parseInt(e,10):30),console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh activated`),navigator.userAgent.includes("Chrome")&&void 0!==document.hidden&&document.addEventListener("visibilitychange",this.toggle.beacons)},deactivate(){this.isActive?(this.toggle.refreshFrame(),document.removeEventListener("visibilitychange",this.toggle.beacons),clearTimeout(this.isActive),this.isActive=null,console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh de-activated`)):console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Auto refresh already inactive!`)},nowTimeStamp(){var e=new Date,t=e.getHours()%12||12;let o=e.getMinutes(),r=e.getSeconds();o<10&&(o="0"+o),r<10&&(r="0"+r);e=e.getHours()<12?"AM":"PM";return`${t}:${o}:${r} `+e},toggle:{beacons(){chatgpt.autoRefresh.beaconID?(clearInterval(chatgpt.autoRefresh.beaconID),chatgpt.autoRefresh.beaconID=null,console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Beacons de-activated`)):(chatgpt.autoRefresh.beaconID=setInterval(()=>{navigator.sendBeacon("https://httpbin.org/post",new Uint8Array),console.log(`↻ ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Beacon sent`)},9e4),console.log(`ChatGPT >> [${chatgpt.autoRefresh.nowTimeStamp()}] Beacons activated`))},refreshFrame(){let e=document.querySelector("#refresh-frame");e?e.remove():(e=Object.assign(document.createElement("iframe"),{id:"refresh-frame",style:"display: none"}),document.head.prepend(e))}}},browser:{isLightMode(){return window.matchMedia?.("(prefers-color-scheme: light)")?.matches},isDarkMode(){return window.matchMedia?.("(prefers-color-scheme: dark)")?.matches},isChromium(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Chromium")},isChrome(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Chrome")},isEdge(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Edge")},isBrave(){return!!JSON.stringify(navigator.userAgentData?.brands)?.includes("Brave")},isFirefox(){return navigator.userAgent.includes("Firefox")},isFullScreen(){var e=navigator.userAgent;return e.includes("Chrome")?window.matchMedia("(display-mode: fullscreen)").matches:e.includes("Firefox")?window.fullScreen:/MSIE|rv:/.test(e)?document.msFullscreenElement:document.webkitIsFullScreen},isMobile(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}},async clearChats(){return new Promise((o,r)=>chatgpt.getAccessToken().then(e=>{let t=new XMLHttpRequest;t.open("PATCH",chatgpt.endpoints.openAI.chats,!0),t.setRequestHeader("Content-Type","application/json"),t.setRequestHeader("Authorization","Bearer "+e),t.onload=()=>{if(200!=t.status)return r("🤖 chatgpt.js >> Request failed. Cannot clear chats.");console.info("Chats successfully cleared"),o()},t.send(JSON.stringify({is_visible:!1}))}).catch(e=>r(new Error(e.message))))},code:{async execute(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Display the output as if you were terminal:\n\n"+e),console.info("Executing code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},extract(e){var t=e.match(/(?<=```.*\n)[\s\S]*?(?=```)/g);return t?t[t.length-1]:e},async isIdle(t=null){let a={childList:!0,subtree:!0};var e=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,o=(async()=>{await new Promise(o=>{document.querySelector(chatgpt.selectors.chatDivs.msg)?o():new MutationObserver((e,t)=>{document.querySelector(chatgpt.selectors.chatDivs.msg)&&(t.disconnect(),o())}).observe(document.body,a)}),await new Promise(o=>new MutationObserver((e,t)=>{chatgpt.getStopBtn()&&(t.disconnect(),o())}).observe(document.body,{childList:!0,subtree:!0}));let e=document.querySelectorAll(chatgpt.selectors.chatDivs.reply),r=e[e.length-1];return await new Promise(o=>new MutationObserver((e,t)=>{r?.querySelector("pre")&&(t.disconnect(),o())}).observe(document.body,a)),new Promise(o=>new MutationObserver((e,t)=>{!r?.querySelector("pre")?.nextElementSibling&&chatgpt.getStopBtn()||(t.disconnect(),o(!0))}).observe(document.body,a))})();return e?Promise.race([o,e]):o},async minify(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Minify the following code:\n\n"+e),console.info("Minifying code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},async obfuscate(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Obfuscate the following code:\n\n"+e),console.info("Obfuscating code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},async refactor(e,t){if(!e)return console.error("Code (1st) argument not supplied. Pass some code!");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send(`Refactor the following code for ${t||"brevity"}:
78
78
 
79
79
  `+e),console.info("Refactoring code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))},async review(e){return e?"string"==typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Review the following code for me:\n\n"+e),console.info("Reviewing code..."),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")):console.error("Code argument not supplied. Pass some code!")},async unminify(e){return e?"string"!=typeof e?console.error("Code argument must be a string!"):(chatgpt.send("Unminify the following code.:\n\n"+e),console.info("Unminifying code..."),await chatgpt.isIdle(),chatgpt.code.extract(await chatgpt.getChatData("active","msg","chatgpt","latest"))):console.error("Code argument not supplied. Pass some code!")},async write(e,t){if(!e)return console.error("Prompt (1st) argument not supplied. Pass a prompt!");if(!t)return console.error("outputLang (2nd) argument not supplied. Pass a language!");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send(e+`
80
80
 
@@ -88,8 +88,8 @@ CHATGPT: ${l.chatgpt}
88
88
  `+` [${t}]`);return new Promise((r,a)=>{let n=new XMLHttpRequest;n.open("GET",chatgpt.endpoints.openAI.session,!0),n.setRequestHeader("Content-Type","application/json"),n.onload=()=>{if(200!=n.status)return a("🤖 chatgpt.js >> Request failed. Cannot retrieve account details.");var e,t=JSON.parse(n.responseText).user,o={};for(e of s)o[e]=t[e];return r(o)},n.send()})},getChatBox(){return document.getElementById("prompt-textarea")},getChatData(d=1,r="all",h="all",p="all"){var e,t=["all","id","title","create_time","update_time","msg"],o=["all","both","user","chatgpt"];d=d?Number.isInteger(d)||/^\d+$/.test(d)?0==parseInt(d,10)?0:parseInt(d,10)-1:d:"active",r=["all",""].includes(r)?t.filter(e=>/^(?!all$|msg$).*/.test(e)):Array.isArray(r)?r:[r],h=h?o.includes(h)?h:"invalid":"all",p=Number.isInteger(p)||/^\d+$/.test(p)?0==parseInt(p,10)?0:parseInt(p,10)-1:["all","latest"].includes(p.toLowerCase())?p.toLowerCase():p?"invalid":"all";for(e of r)if(!t.includes(e))return console.error(`Invalid detail arg '${e}' passed. Valid details are:
89
89
  `+` [${t}]`);if("invalid"==h)return console.error("Invalid sender arg passed. Valid senders are:\n"+` [${o}]`);if("invalid"==p)return console.error("Invalid msgToGet arg passed. Valid msg's to get are:\n [ 'all' | 'latest' | index of msg to get ]");let a=(e,c)=>{let l=/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/;return new Promise((t,s)=>{let i=new XMLHttpRequest;i.open("GET",chatgpt.endpoints.openAI.chats,!0),i.setRequestHeader("Content-Type","application/json"),i.setRequestHeader("Authorization","Bearer "+e),i.onload=()=>{if(200!=i.status)return s("🤖 chatgpt.js >> Request failed. Cannot retrieve chat details.");var o=JSON.parse(i.responseText).items;if(o.length<=0)return s("🤖 chatgpt.js >> Chat list is empty.");var r={};if(Number.isInteger(d)||"latest"==d||"active"==d&&!new RegExp(`/${l.source}$`).test(location.href)){if((d=Number.isInteger(d)?d:0)>o.length)return s("🤖 chatgpt.js >> Chat with index "+(d+1)+` is out of bounds. Only ${o.length} chats exist!`);for(var e of c)r[e]=o[d][e]}else{var a,n="active"==d||new RegExp(`^${l.source}$`).test(d)?"id":"title";"active"==d&&(d=l.exec(window.location.href)[0]);let e,t;for(e=0;e<o.length;e++)if(o[e][n]==d){t=!0;break}if(!t)return s(`🤖 chatgpt.js >> No chat with ${n} = ${d} found.`);for(a of c)r[a]=o[e][a]}return t(r)},i.send()})};return new Promise(o=>chatgpt.getAccessToken().then(e=>{return o(r.includes("msg")?(t=e,new Promise((d,g)=>{let u=new XMLHttpRequest;a(t,["id"]).then(e=>{u.open("GET",chatgpt.endpoints.openAI.chat+"/"+e.id,!0),u.setRequestHeader("Content-Type","application/json"),u.setRequestHeader("Authorization","Bearer "+t),u.onload=()=>{if(200!=u.status)return g("🤖 chatgpt.js >> Request failed. Cannot retrieve chat messages.");var e,t,o=JSON.parse(u.responseText).mapping,r=[],a=[],n=[];for(e in o)null!=o[e].message&&"user"==o[e].message.author.role&&r.push({id:o[e].id,msg:o[e].message});if(r.sort((e,t)=>e.msg.create_time-t.msg.create_time),parseInt(p,10)+1>r.length)return g("🤖 chatgpt.js >> Message/response with index "+(p+1)+` is out of bounds. Only ${r.length} messages/responses exist!`);for(t of r){let e=[];for(var s in o)null!=o[s].message&&"assistant"==o[s].message.author.role&&o[s].parent==t.id&&e.push(o[s].message);e.sort((e,t)=>e.create_time-t.create_time),e=1==(e=e.map(e=>{switch(e.content.content_type){case"code":return e.content.text;case"text":return e.content.parts[0];default:return}})).length?e[0]:e,a.push(e)}if("user"==h)for(var i in r)n.push(r[i].msg.content.parts[0]);else if("chatgpt"==h)for(var c of a)n.push("latest"==p?a[a.length-1]:c);else{let e=0;for(var l in r)n.push({user:r[l].msg.content.parts[0],chatgpt:"latest"==p?a[e][a[e].length-1]:a[e]}),e++}return d("all"==p?n:"latest"==p?n[n.length-1]:n[p])},u.send()})})):a(e,r));var t}))},getChatInput(){return chatgpt.getChatBox().firstChild.innerText},getContinueButton(){return document.querySelector(chatgpt.selectors.btns.continue)},getErrorMsg(){return document.querySelector(chatgpt.selectors.errors.txt+":last-of-type")?.innerText},getFooterDiv(){return chatgpt.footer.get()},getHeaderDiv(){return chatgpt.header.get()},getLastPrompt(){return chatgpt.getChatData("active","msg","user","latest")},getLastResponse(){return chatgpt.getChatData("active","msg","chatgpt","latest")},getLoginButton(){return document.querySelector(chatgpt.selectors.btns.login)},getNewChatButton(){return document.querySelector(chatgpt.selectors.btns.newChat)},getNewChatLink(){return document.querySelector(chatgpt.selectors.links.newChat)},getRegenerateButton(){return document.querySelector(chatgpt.selectors.btns.regen)},getResponse(){return chatgpt.response.get(...arguments)},getResponseFromAPI(e,t){return chatgpt.response.getFromAPI(e,t)},getResponseFromDOM(e){return chatgpt.response.getFromDOM(e)},getScrollToBottomButton(){return document.querySelector(chatgpt.selectors.btns.scroll)},getSendButton(){return document.querySelector(chatgpt.selectors.btns.send)},getStopButton(){return document.querySelector(chatgpt.selectors.btns.stop)},getUserLanguage(){return navigator.languages[0]||navigator.language||navigator.browserLanguage||navigator.systemLanguage||navigator.userLanguage||""},getVoiceButton(){return document.querySelector(chatgpt.selectors.btns.voice)},header:{get(){return document.querySelector(chatgpt.selectors.header)},hide(){chatgpt.header.get().style.display="none"},show(){chatgpt.header.get().style.display="flex"}},hideFooter(){chatgpt.footer.hide()},hideHeader(){chatgpt.header.hide()},history:{async isLoaded(t=null){var e=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,o=new Promise(o=>{document.querySelector(chatgpt.selectors.chatHistory)?o(!0):new MutationObserver((e,t)=>{document.querySelector(chatgpt.selectors.chatHistory)&&(t.disconnect(),o(!0))}).observe(document.documentElement,{childList:!0,subtree:!0})});return e?Promise.race([o,e]):o}},instructions:{add(r,a){var e;return r?"string"!=typeof r?console.error("Instruction must be a string"):(e=["user","chatgpt"],a?"string"!=typeof a?console.error("Target must be a string"):(a=a.toLowerCase(),e.includes(a)?(r=`
90
90
 
91
- `+r,new Promise(o=>{chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return"user"==a?t.about_user_message+=r:"chatgpt"==a&&(t.about_model_message+=r),await this.sendRequest("POST",e,t),o()})})):console.error(`Invalid target ${a}. Valid targets are [${e}]`)):console.error("Please provide a valid target!")):console.error("Please provide an instruction")},clear(r){var e=["user","chatgpt"];return r?"string"!=typeof r?console.error("Target must be a string"):(r=r.toLowerCase(),e.includes(r)?new Promise(o=>{chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return"user"==r?t.about_user_message="":"chatgpt"==r&&(t.about_model_message=""),await this.sendRequest("POST",e,t),o()})}):console.error(`Invalid target ${r}. Valid targets are [${e}]`)):console.error("Please provide a valid target!")},fetchData(){return new Promise(t=>chatgpt.getAccessToken().then(async e=>t(await this.sendRequest("GET",e))))},sendRequest(a,e,n){for(let e=0;e<arguments.length-1;e++)if("string"==typeof arguments[e])return console.error(`Argument ${e+1} must be a string`);var t=["POST","GET"];return(a=(a||"").trim().toUpperCase())&&t.includes(a)?e?n&&"object"!=typeof n?console.error(`Invalid body data type. Got ${typeof n}, expected object`):new Promise((t,o)=>{let r=new XMLHttpRequest;r.open(a,chatgpt.endpoints.openAI.instructions,!0),r.setRequestHeader("Accept-Language","en-US"),r.setRequestHeader("Authorization","Bearer "+e),"POST"==a&&r.setRequestHeader("Content-Type","application/json"),r.onload=()=>{var e=JSON.parse(r.responseText);return 422==r.status?o("🤖 chatgpt.js >> Character limit exceeded. Custom instructions can have a maximum length of 1500 characters."):403==r.status&&"content_policy"==e.detail.reason?o("🤖 chatgpt.js >> "+e.detail.description):200!=r.status?o("🤖 chatgpt.js >> Request failed. Cannot contact custom instructions endpoint."):(console.info("Custom instructions successfully contacted with method "+a),t(e||{}))},r.send(JSON.stringify(n)||"")}):console.error("Please provide a valid access token!"):console.error("Valid methods are "+t)},turnOff(){return new Promise(o=>chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return t.enabled=!1,await this.sendRequest("POST",e,t),o()}))},turnOn(){return new Promise(o=>chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return t.enabled=!0,await this.sendRequest("POST",e,t),o()}))},toggle(){return new Promise(t=>this.fetchData().then(async e=>(await(e.enabled?this.turnOff():this.turnOn()),t())))}},isDarkMode(){return document.documentElement.classList.contains("dark")},isFullScreen(){return chatgpt.browser.isFullScreen()},async isIdle(t=null){let e={childList:!0,subtree:!0};var o=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,r=(async()=>(await new Promise(o=>{document.querySelector(chatgpt.selectors.chatDivs.msg)?o():new MutationObserver((e,t)=>{document.querySelector(chatgpt.selectors.chatDivs.msg)&&(t.disconnect(),o())}).observe(document.body,e)}),await new Promise(o=>new MutationObserver((e,t)=>{chatgpt.getStopBtn()&&(t.disconnect(),o())}).observe(document.body,e)),new Promise(o=>new MutationObserver((e,t)=>{chatgpt.getStopBtn()||(t.disconnect(),o(!0))}).observe(document.body,e))))();return o?Promise.race([r,o]):r},async isLoaded(t=null){var e=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,o=new Promise(o=>{chatgpt.getNewChatBtn()?o(!0):new MutationObserver((e,t)=>{chatgpt.getNewChatBtn()&&(t.disconnect(),o(!0))}).observe(document.documentElement,{childList:!0,subtree:!0})});return e?Promise.race([o,e]):o},isLightMode(){return document.documentElement.classList.contains("light")},isTempChat(){return"?temporary-chat=true"==location.search},isTyping(){return!!this.getStopButton()},login(){window.location.href="https://chat.openai.com/auth/login"},logout(){window.location.href="https://chat.openai.com/auth/logout"},menu:{elems:[],append(e,t={}){var o=["button","dropdown"];if(!e||"string"!=typeof e)return console.error("🤖 chatgpt.js >> Please supply a valid string element name!");if(e=e.toLowerCase(),!o.includes(e))return console.error(`🤖 chatgpt.js >> Invalid element! Valid elems are [${o}]`);let r=document.createElement("dropdown"==e?"select":"button"==e?"a":e);if(r.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),"button"==e){r.textContent=t?.label&&"string"==typeof t.label?t.label:"chatgpt.js button";o=document.createElement("img");o.src=t?.icon&&"string"==typeof t.icon?t.icon:chatgpt.endpoints.assets+"/starters/chrome/extension/icons/icon128.png",o.width=18,r.firstChild.before(o),r.onclick=t?.onclick&&"function"==typeof t.onclick?t.onclick:function(){}}else if("dropdown"==e){if(t?.items&&Array.isArray(t.items)&&t.items.length||(t.items=[{text:"🤖 chatgpt.js option",value:"chatgpt.js option value"}]),!t.items.every(e=>"object"==typeof e))return console.error("'items' must be an array of objects!");r.style="background-color: #000; width: 100%; border: none;",t.items.forEach(e=>{var t=document.createElement("option");t.textContent=e?.text,t.value=e?.value,r.add(t)})}let a=()=>{var e,t=document.querySelectorAll("a[role=menuitem]");let o;for(e of t)if("Settings"==e.textContent){o=e.classList;break}let r=t[0].parentNode;chatgpt.menu.elems.forEach(e=>{if(e.setAttribute("class",o),!r.contains(e))try{r.firstChild.before(e)}catch(e){console.error(e)}})};this.elems.push(r);o=document.querySelector("nav button[id*=headless]");return this.addedEvent||(o?.addEventListener("click",()=>setTimeout(a,25)),this.addedEvent=!0),r.id},close(){try{document.querySelector("nav [id*=menu-button][aria-expanded=true]").click()}catch(e){console.error(e.message)}},open(){try{document.querySelector("nav [id*=menu-button][aria-expanded=false]").click()}catch(e){console.error(e.message)}}},minify(){chatgpt.code.minify()},notify(e,t,o,r){o=o?+o:1.75;let a=document.createElement("div");a.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),a.classList.add("chatgpt-notif"),a.innerText=e,document.body.append(a);var e=document.createElement("div"),n=(e.title="Dismiss",e.classList.add("notif-close-btn","no-mobile-tap-outline"),document.createElementNS("http://www.w3.org/2000/svg","svg")),s=(n.setAttribute("height","8px"),n.setAttribute("viewBox","0 0 14 14"),n.setAttribute("fill","none"),n.style.height=n.style.width="8px",document.createElementNS("http://www.w3.org/2000/svg","path")),s=(s.setAttribute("fill-rule","evenodd"),s.setAttribute("clip-rule","evenodd"),s.setAttribute("fill","white"),s.setAttribute("d","M13.7071 1.70711C14.0976 1.31658 14.0976 0.683417 13.7071 0.292893C13.3166 -0.0976312 12.6834 -0.0976312 12.2929 0.292893L7 5.58579L1.70711 0.292893C1.31658 -0.0976312 0.683417 -0.0976312 0.292893 0.292893C-0.0976312 0.683417 -0.0976312 1.31658 0.292893 1.70711L5.58579 7L0.292893 12.2929C-0.0976312 12.6834 -0.0976312 13.3166 0.292893 13.7071C0.683417 14.0976 1.31658 14.0976 1.70711 13.7071L7 8.41421L12.2929 13.7071C12.6834 14.0976 13.3166 14.0976 13.7071 13.7071C14.0976 13.3166 14.0976 12.6834 13.7071 12.2929L8.41421 7L13.7071 1.70711Z"),n.append(s),e.append(n),a.append(e),a.isTop=!t||!/low|bottom/i.test(t),a.isRight=!t||!/left/i.test(t),a.quadrant=(a.isTop?"top":"bottom")+(a.isRight?"Right":"Left"),1735767823541);let i=document.querySelector("#chatgpt-notif-style"),c=((!i||parseInt(i.getAttribute("last-updated"),10)<s)&&(i||((i=document.createElement("style")).id="chatgpt-notif-style",i.setAttribute("last-updated",s.toString()),document.head.append(i)),i.innerText='.chatgpt-notif {font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC","Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif ;.no-mobile-tap-outline { outline: none ; -webkit-tap-highlight-color: transparent }background-color: black ; padding: 10px 13px 10px 18px ;border-radius: 11px ; border: 1px solid #f5f5f7 ;opacity: 0 ; position: fixed ; z-index: 9999 ; font-size: 1.8rem ; color: white ;user-select: none ; -webkit-user-select: none ; -moz-user-select: none ; -o-user-select: none ;-ms-user-select: none ;'+`transform: translateX(${a.isRight?"":"-"}35px) ;`+(r?`--shadow: -8px 13px 25px 0 ${/\b(?:shadow|on)\b/i.test(r)?"gray":r};
91
+ `+r,new Promise(o=>{chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return"user"==a?t.about_user_message+=r:"chatgpt"==a&&(t.about_model_message+=r),await this.sendRequest("POST",e,t),o()})})):console.error(`Invalid target ${a}. Valid targets are [${e}]`)):console.error("Please provide a valid target!")):console.error("Please provide an instruction")},clear(r){var e=["user","chatgpt"];return r?"string"!=typeof r?console.error("Target must be a string"):(r=r.toLowerCase(),e.includes(r)?new Promise(o=>{chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return"user"==r?t.about_user_message="":"chatgpt"==r&&(t.about_model_message=""),await this.sendRequest("POST",e,t),o()})}):console.error(`Invalid target ${r}. Valid targets are [${e}]`)):console.error("Please provide a valid target!")},fetchData(){return new Promise(t=>chatgpt.getAccessToken().then(async e=>t(await this.sendRequest("GET",e))))},sendRequest(a,e,n){for(let e=0;e<arguments.length-1;e++)if("string"==typeof arguments[e])return console.error(`Argument ${e+1} must be a string`);var t=["POST","GET"];return(a=(a||"").trim().toUpperCase())&&t.includes(a)?e?n&&"object"!=typeof n?console.error(`Invalid body data type. Got ${typeof n}, expected object`):new Promise((t,o)=>{let r=new XMLHttpRequest;r.open(a,chatgpt.endpoints.openAI.instructions,!0),r.setRequestHeader("Accept-Language","en-US"),r.setRequestHeader("Authorization","Bearer "+e),"POST"==a&&r.setRequestHeader("Content-Type","application/json"),r.onload=()=>{var e=JSON.parse(r.responseText);return 422==r.status?o("🤖 chatgpt.js >> Character limit exceeded. Custom instructions can have a maximum length of 1500 characters."):403==r.status&&"content_policy"==e.detail.reason?o("🤖 chatgpt.js >> "+e.detail.description):200!=r.status?o("🤖 chatgpt.js >> Request failed. Cannot contact custom instructions endpoint."):(console.info("Custom instructions successfully contacted with method "+a),t(e||{}))},r.send(JSON.stringify(n)||"")}):console.error("Please provide a valid access token!"):console.error("Valid methods are "+t)},turnOff(){return new Promise(o=>chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return t.enabled=!1,await this.sendRequest("POST",e,t),o()}))},turnOn(){return new Promise(o=>chatgpt.getAccessToken().then(async e=>{var t=await this.fetchData();return t.enabled=!0,await this.sendRequest("POST",e,t),o()}))},toggle(){return new Promise(t=>this.fetchData().then(async e=>(await(e.enabled?this.turnOff():this.turnOn()),t())))}},isDarkMode(){return document.documentElement.classList.contains("dark")},isFullScreen(){return chatgpt.browser.isFullScreen()},async isIdle(t=null){let e={childList:!0,subtree:!0};var o=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,r=(async()=>(await new Promise(o=>{document.querySelector(chatgpt.selectors.chatDivs.msg)?o():new MutationObserver((e,t)=>{document.querySelector(chatgpt.selectors.chatDivs.msg)&&(t.disconnect(),o())}).observe(document.body,e)}),await new Promise(o=>new MutationObserver((e,t)=>{chatgpt.getStopBtn()&&(t.disconnect(),o())}).observe(document.body,e)),new Promise(o=>new MutationObserver((e,t)=>{chatgpt.getStopBtn()||(t.disconnect(),o(!0))}).observe(document.body,e))))();return o?Promise.race([r,o]):r},async isLoaded(t=null){var e=t?new Promise(e=>setTimeout(()=>e(!1),t)):null,o=new Promise(o=>{chatgpt.getNewChatBtn()?o(!0):new MutationObserver((e,t)=>{chatgpt.getNewChatBtn()&&(t.disconnect(),o(!0))}).observe(document.documentElement,{childList:!0,subtree:!0})});return e?Promise.race([o,e]):o},isLightMode(){return document.documentElement.classList.contains("light")},isTempChat(){return"?temporary-chat=true"==location.search},isTyping(){return!!this.getStopButton()},login(){window.location.href="https://chat.openai.com/auth/login"},logout(){window.location.href="https://chat.openai.com/auth/logout"},menu:{elems:[],append(e,t={}){var o=["button","dropdown"];if(!e||"string"!=typeof e)return console.error("🤖 chatgpt.js >> Please supply a valid string element name!");if(e=e.toLowerCase(),!o.includes(e))return console.error(`🤖 chatgpt.js >> Invalid element! Valid elems are [${o}]`);let r=document.createElement("dropdown"==e?"select":"button"==e?"a":e);if(r.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),"button"==e){r.textContent=t?.label&&"string"==typeof t.label?t.label:"chatgpt.js button";o=document.createElement("img");o.src=t?.icon&&"string"==typeof t.icon?t.icon:chatgpt.endpoints.assets+"/starters/chrome/extension/icons/icon128.png",o.width=18,r.firstChild.before(o),r.onclick=t?.onclick&&"function"==typeof t.onclick?t.onclick:function(){}}else if("dropdown"==e){if(t?.items&&Array.isArray(t.items)&&t.items.length||(t.items=[{text:"🤖 chatgpt.js option",value:"chatgpt.js option value"}]),!t.items.every(e=>"object"==typeof e))return console.error("'items' must be an array of objects!");r.style="background-color: #000; width: 100%; border: none;",t.items.forEach(e=>{var t=document.createElement("option");t.textContent=e?.text,t.value=e?.value,r.add(t)})}let a=()=>{var e,t=document.querySelectorAll("a[role=menuitem]");let o;for(e of t)if("Settings"==e.textContent){o=e.classList;break}let r=t[0].parentNode;chatgpt.menu.elems.forEach(e=>{if(e.setAttribute("class",o),!r.contains(e))try{r.firstChild.before(e)}catch(e){console.error(e)}})};this.elems.push(r);o=document.querySelector("nav button[id*=headless]");return this.addedEvent||(o?.addEventListener("click",()=>setTimeout(a,25)),this.addedEvent=!0),r.id},close(){try{document.querySelector("nav [id*=menu-button][aria-expanded=true]").click()}catch(e){console.error(e.message)}},open(){try{document.querySelector("nav [id*=menu-button][aria-expanded=false]").click()}catch(e){console.error(e.message)}}},minify(){chatgpt.code.minify()},notify(e,t,o,r){o=o?+o:1.75;let a=document.createElement("div");a.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),a.classList.add("chatgpt-notif"),a.textContent=e,document.body.append(a);var e=document.createElement("div"),n=(e.title="Dismiss",e.classList.add("notif-close-btn","no-mobile-tap-outline"),document.createElementNS("http://www.w3.org/2000/svg","svg")),s=(n.setAttribute("height","8px"),n.setAttribute("viewBox","0 0 14 14"),n.setAttribute("fill","none"),n.style.height=n.style.width="8px",document.createElementNS("http://www.w3.org/2000/svg","path")),s=(s.setAttribute("fill-rule","evenodd"),s.setAttribute("clip-rule","evenodd"),s.setAttribute("fill","white"),s.setAttribute("d","M13.7071 1.70711C14.0976 1.31658 14.0976 0.683417 13.7071 0.292893C13.3166 -0.0976312 12.6834 -0.0976312 12.2929 0.292893L7 5.58579L1.70711 0.292893C1.31658 -0.0976312 0.683417 -0.0976312 0.292893 0.292893C-0.0976312 0.683417 -0.0976312 1.31658 0.292893 1.70711L5.58579 7L0.292893 12.2929C-0.0976312 12.6834 -0.0976312 13.3166 0.292893 13.7071C0.683417 14.0976 1.31658 14.0976 1.70711 13.7071L7 8.41421L12.2929 13.7071C12.6834 14.0976 13.3166 14.0976 13.7071 13.7071C14.0976 13.3166 14.0976 12.6834 13.7071 12.2929L8.41421 7L13.7071 1.70711Z"),n.append(s),e.append(n),a.append(e),a.isTop=!t||!/low|bottom/i.test(t),a.isRight=!t||!/left/i.test(t),a.quadrant=(a.isTop?"top":"bottom")+(a.isRight?"Right":"Left"),1735767823541);let i=document.querySelector("#chatgpt-notif-style"),c=((!i||parseInt(i.getAttribute("last-updated"),10)<s)&&(i||((i=document.createElement("style")).id="chatgpt-notif-style",i.setAttribute("last-updated",s.toString()),document.head.append(i)),i.textContent='.chatgpt-notif {font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC","Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif ;.no-mobile-tap-outline { outline: none ; -webkit-tap-highlight-color: transparent }background-color: black ; padding: 10px 13px 10px 18px ;border-radius: 11px ; border: 1px solid #f5f5f7 ;opacity: 0 ; position: fixed ; z-index: 9999 ; font-size: 1.8rem ; color: white ;user-select: none ; -webkit-user-select: none ; -moz-user-select: none ; -o-user-select: none ;-ms-user-select: none ;'+`transform: translateX(${a.isRight?"":"-"}35px) ;`+(r?`--shadow: -8px 13px 25px 0 ${/\b(?:shadow|on)\b/i.test(r)?"gray":r};
92
92
  box-shadow: var(--shadow) ; -webkit-box-shadow: var(--shadow) ; -moz-box-shadow: var(--shadow)`:"")+"}"+`.notif-close-btn {
93
- cursor: pointer ; float: right ; position: relative ; right: -4px ; margin-left: -3px ;`+"display: grid }@keyframes notif-zoom-fade-out { 0% { opacity: 1 ; transform: scale(1) }15% { opacity: 0.35 ; transform: rotateX(-27deg) scale(1.05) }45% { opacity: 0.05 ; transform: rotateX(-81deg) }100% { opacity: 0 ; transform: rotateX(-180deg) scale(1.15) }}"),JSON.parse(localStorage.notifyProps));c.queue[a.quadrant].push(a.id),localStorage.notifyProps=JSON.stringify(c),a.style.top=a.isTop?23..toString()+"px":"",a.style.bottom=a.isTop?"":23..toString()+"px",a.style.right=a.isRight?27..toString()+"px":"",a.style.left=a.isRight?"":27..toString()+"px";e=c.queue[a.quadrant];if(1<e.length)try{for(var l of e.slice(0,-1)){var d=document.getElementById(l),g=d.style.top?"top":"bottom",u=+parseInt(d.style[g])+5+d.getBoundingClientRect().height;d.style[g]=u+"px"}}catch(e){}setTimeout(()=>{a.style.opacity=chatgpt.isDarkMode()?.8:.67,a.style.transform="translateX(0)",a.style.transition="transform 0.15s ease, opacity 0.15s ease"},10);t=()=>{a.style.animation="notif-zoom-fade-out 0.35s ease-out",clearTimeout(h)};let h=setTimeout(t,1e3*(o<.35?0:o-.35));return n.onclick=t,a.onanimationend=()=>{a.remove(),(c=JSON.parse(localStorage.notifyProps)).queue[a.quadrant].shift(),localStorage.notifyProps=JSON.stringify(c)},a},obfuscate(){chatgpt.code.obfuscate()},printAllFunctions(){let o={cmdPrompt:["#ff00ff","#00ff00"],objName:["#0611e9","#f9ee16"],methodName:["#005aff","#ffa500"],entryType:["#467e06","#b981f9"],srcMethod:["#ff0000","#00ffff"]};Object.keys(o).forEach(e=>{o[e][1]=o[e][1]||"#"+(16777215^Number("0x1"+o[e][0].replace(/^#/,""))).toString(16).substring(1).toUpperCase()});var e=[];for(let t in this)if("function"==typeof this[t]){var r=!Object.keys(this).find(e=>Object.keys(this[e]).includes(this[t].name));e.push([r?"chatgpt":"other",t])}else if("object"==typeof this[t])for(var a in this[t])"function"==typeof this[t][a]&&e.push([t,a]);e.sort((e,t)=>e[0].localeCompare(t[0])||e[1].localeCompare(t[1]));var n=window.matchMedia("(prefers-color-scheme: dark)").matches,s="font-family: monospace ; font-size: larger ; ";console.log("\n%c🤖 chatgpt.js methods\n","font-family: sans-serif ; font-size: xxx-large ; font-weight: bold");for(let t of e){var i=/chatgpt|other/.test(t[0]),c="chatgpt"==t[0]?this[t[1]].name:"other"!=t[0]?t[0]+"."+t[1]:Object.keys(this).find(e=>Object.keys(this[e]).includes(this[t[1]].name))+"."+this[t[1]].name,l="AsyncFunction"==this[t[1]]?.constructor.name;console.log("%c>> %c"+(i?"":t[0]+".%c")+t[1]+" - https://chatgptjs.org/userguide/"+/(?:.*\.)?(.*)/.exec(c)[1].toLowerCase()+(l?"-async":"")+"\n%c[%c"+("chatgpt"==t[0]&&t[1]==this[t[1]].name||!i?"Function":"Alias of")+"%c: %c"+c+"%c]",s+"font-weight: bold ; color:"+o.cmdPrompt[+n],s+"font-weight: bold ;color:"+o[i?"methodName":"objName"][+n],s+"font-weight: "+(i?"initial":"bold")+";color:"+(i?"initial":o.methodName[+n]),s+"font-weight: "+(i?"bold":"initial")+";color:"+(i?o.entryType[+n]:"initial"),s+"font-weight: "+(i?"initial":"bold")+";color:"+(i?"initial":o.entryType[+n]),s+(i?"font-style: italic":"font-weight: initial")+";color:"+(i?o.srcMethod[+n]:"initial"),s+(i?"font-weight: initial":"font-style: italic")+";color:"+(i?"initial":o.srcMethod[+n]),i?"":s+"color: initial ; font-weight: initial")}},randomFloat(){return(window.crypto||window.msCrypto)?.getRandomValues(new Uint32Array(1))[0]/4294967295||Math.random()},refactor(){chatgpt.code.refactor()},regenerate(){chatgpt.response.regenerate()},renderHTML(s){var i,e=/<([a-z\d]+)\b([^>]*)>([\s\S]*?)<\/\1>/g,c=/(\S+)=['"]?((?:.(?!['"]?\s+\S+=|[>']))+.)['"]?/g,t=s.childNodes;chatgpt.renderHTML.preWrapSet||(s.style.whiteSpace="pre-wrap",chatgpt.renderHTML.preWrapSet=!0,setTimeout(()=>chatgpt.renderHTML.preWrapSet=!1,100));for(i of t)if(i.nodeType==Node.TEXT_NODE){var l=i.nodeValue,d=[...l.matchAll(e)];if(0<d.length){let e=d[0],[t,o,r,a]=e.slice(0,4),n=document.createElement(o);n.textContent=a;[...r.matchAll(c)].forEach(e=>{var t=e[1],e=e[2].replace(/['"]/g,"");n.setAttribute(t,e)});var d=chatgpt.renderHTML(n),g=document.createTextNode(l.substring(0,e.index)),l=document.createTextNode(l.substring(e.index+t.length));s.replaceChild(g,i),s.insertBefore(d,g.nextSibling),s.insertBefore(l,d.nextSibling)}}else i.nodeType==Node.ELEMENT_NODE&&chatgpt.renderHTML(i);return s},async resend(){chatgpt.send(await chatgpt.getChatData("latest","msg","user","latest"))},response:{continue(){try{chatgpt.getContinueBtn().click()}catch(e){console.error(e.message)}},get(){return this["getFrom"+(location.href.startsWith("https://chatgpt.com/c/")?"DOM":"API")].apply(null,arguments)},getFromAPI(e,t){return e=e||"latest",t=t||"latest",chatgpt.getChatData(e,"msg","chatgpt",t)},getFromDOM(e){var t=document.querySelectorAll("div[data-message-author-role=assistant]"),o=e.toString().toLowerCase();let r="";return t.length?r=(r=(/last|final/.test(o)?t[t.length-1]:t[(Number.isInteger(e)?e:/^\d+/.test(o)?/^\d+/.exec(o)[0]:(/^(?:1|one|fir)(?:st)?$/.test(o)?1:/^(?:2|tw(?:o|en|el(?:ve|f))|seco)(?:nd|t[yi])?(?:e?th)?$/.test(o)?2:/^(?:3|th(?:ree|ir?))(?:rd|teen|t[yi])?(?:e?th)?$/.test(o)?3:/^(?:4|fou?r)(?:teen|t[yi])?(?:e?th)?$/.test(o)?4:/^(?:5|fi(?:ve|f))(?:teen|t[yi])?(?:e?th)?$/.test(o)?5:/^(?:6|six)(?:teen|t[yi])?(?:e?th)?$/.test(o)?6:/^(?:7|seven)(?:teen|t[yi])?(?:e?th)?$/.test(o)?7:/^(?:8|eight?)(?:teen|t[yi])?(?:e?th)?$/.test(o)?8:/^(?:9|nine?)(?:teen|t[yi])?(?:e?th)?$/.test(o)?9:/^(?:10|ten)(?:th)?$/.test(o)?10:1)*(/(?:ty|ieth)$/.test(o)?10:1)+(/teen(?:th)?$/.test(o)?10:0))-1]).textContent).replace(/^ChatGPT(?:ChatGPT)?/,""):console.error("No conversation found!")},getLast(){return chatgpt.getChatData("active","msg","chatgpt","latest")},regenerate(){try{chatgpt.getRegenerateBtn().click()}catch(e){console.error(e.message)}},stopGenerating(){try{chatgpt.getStopBtn().click()}catch(e){console.error(e.message)}}},reviewCode(){chatgpt.code.review()},scrollToBottom(){try{chatgpt.getScrollBtn().click()}catch(e){console.error(e.message)}},send(e,o=""){for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string!`);let r=chatgpt.getChatBox();if(!r)return console.error("Chatbar element not found!");var t=document.createElement("p");t.textContent=e,r.querySelector("p").replaceWith(t),r.dispatchEvent(new Event("input",{bubbles:!0})),setTimeout(function e(){var t=chatgpt.getSendButton();t?.hasAttribute("disabled")?setTimeout(e,222):"click"==o.toLowerCase()||chatgpt.browser.isMobile()?t.click():r.dispatchEvent(new KeyboardEvent("keydown",{key:"Enter",bubbles:!0}))},222)},sendInNewChat(e){if("string"!=typeof e)return console.error("Message must be a string!");try{chatgpt.getNewChatBtn().click()}catch(e){return console.error(e.message)}setTimeout(()=>chatgpt.send(e),500)},settings:{scheme:{isDark(){return document.documentElement.classList.contains("dark")},isLight(){return document.documentElement.classList.contains("light")},set(e){var t=["dark","light","system"];if(!e)return console.error("Please specify a scheme value!");if(!t.includes(e))return console.error(`Invalid scheme value. Valid values are [${t}]`);let o=e;"system"==e&&(o=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),localStorage.setItem("theme",e),console.info(`Scheme set to ${e.toUpperCase()}.`),document.documentElement.classList.contains(o)||this.toggle()},toggle(){var[e,t]=this.isDark()?["dark","light"]:["light","dark"];document.documentElement.classList.replace(e,t),document.documentElement.style.colorScheme=t,localStorage.setItem("theme",t)}}},async sentiment(e,t){for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send("What is the sentiment of the following text"+(t?` towards the entity ${t},`:"")+" from strongly negative to strongly positive?\n\n"+e),console.info("Analyzing sentiment..."),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},setScheme(e){chatgpt.settings.scheme.set(e)},shareChat(s,i="clipboard"){var e=["alert","notify","notification","clipboard","copy"];if(!e.includes(i))return console.error(`Invalid method '${i}' passed. Valid methods are [${e}].`);return new Promise(o=>{chatgpt.getAccessToken().then(t=>{var a;a=t,new Promise((t,o)=>{let r=new XMLHttpRequest;chatgpt.getChatData(s).then(e=>{r.open("GET",chatgpt.endpoints.openAI.chat+"/"+e.id,!0),r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+a),r.onload=()=>200!=r.status?o("🤖 chatgpt.js >> Request failed. Cannot retrieve chat node."):t(JSON.parse(r.responseText).current_node),r.send()})}).then(e=>{var a,n;a=t,n=e,new Promise((t,o)=>{let r=new XMLHttpRequest;chatgpt.getChatData(s).then(e=>{r.open("POST",chatgpt.endpoints.openAI.share_create,!0),r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+a),r.onload=()=>200!=r.status?o("🤖 chatgpt.js >> Request failed. Cannot initialize share chat."):t(JSON.parse(r.responseText)),r.send(JSON.stringify({current_node_id:n,conversation_id:e.id,is_anonymous:!0}))})}).then(e=>{var r,a;r=t,a=e,new Promise((e,t)=>{let o=new XMLHttpRequest;o.open("PATCH",chatgpt.endpoints.openAI.share+"/"+a.share_id,!0),o.setRequestHeader("Content-Type","application/json"),o.setRequestHeader("Authorization","Bearer "+r),o.onload=()=>200!=o.status?t("🤖 chatgpt.js >> Request failed. Cannot share chat."):(console.info(`Chat shared at '${a.share_url}'`),e()),o.send(JSON.stringify({share_id:a.share_id,highlighted_message_id:a.highlighted_message_id,title:a.title,is_public:!0,is_visible:a.is_visible,is_anonymous:a.is_anonymous}))}).then(()=>{["copy","clipboard"].includes(i)?navigator.clipboard.writeText(e.share_url):chatgpt.alert("🚀 Share link created!",`"${e.title}" is available at: <a target="blank" rel="noopener" href="${e.share_url}">${e.share_url}</a>`,[function(){window.open(e.share_url,"_blank","noopener")},function(){navigator.clipboard.writeText(e.share_url)}]),o(e.share_url)})})})})})},showFooter(){chatgpt.footer.show()},showHeader(){chatgpt.header.show()},sidebar:{elems:[],observer:{},activateObserver(){if(this.observer instanceof MutationObserver)try{this.observer.disconnect()}catch(e){}if(!this.elems.length)return console.error("🤖 chatgpt.js >> No elems to append!");let t;for(var e of document.querySelectorAll(chatgpt.selectors.links.sidebarItem))if(/.*chat/.exec(e.text)[0]){t=e.classList,e.parentNode.style.margin="2px 0";break}this.elems.forEach(e=>{e.setAttribute("class",t),e.style.maxHeight=e.style.minHeight="44px",e.style.margin="2px 0"});let o=document.querySelector(chatgpt.selectors.chatHistory);if(!o)return console.error("Sidebar element not found!");this.observer=new MutationObserver(e=>e.forEach(e=>{("childList"==e.type&&e.addedNodes.length||"attributes"==e.type&&"data-chatgptjs"==e.attributeName)&&this.elems.forEach(e=>{if(!o.contains(e))try{o.querySelector("a").parentNode.before(e)}catch(e){console.error(e)}})})),this.observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0})},append(e,t={}){var o=["button","dropdown"];if(!e||"string"!=typeof e)return console.error("🤖 chatgpt.js >> Please supply a valid string element name!");if(e=e.toLowerCase(),!o.includes(e))return console.error(`🤖 chatgpt.js >> Invalid element! Valid elems are [${o}]`);let r=document.createElement("dropdown"==e?"select":e);if(r.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),"button"==e){r.textContent=t?.label&&"string"==typeof t.label?t.label:"chatgpt.js button";o=document.createElement("img");o.src=t?.icon&&"string"==typeof t.icon?t.icon:chatgpt.endpoints.assets+"/starters/chrome/extension/icons/icon128.png",o.width=18,r.firstChild.before(o),r.onclick=t?.onclick&&"function"==typeof t.onclick?t.onclick:function(){}}else if("dropdown"==e){if(t?.items&&Array.isArray(t.items)&&t.items.length||(t.items=[{text:"🤖 chatgpt.js option",value:"chatgpt.js option value"}]),!t.items.every(e=>"object"==typeof e))return console.error("'items' must be an array of objects!");t.items.forEach(e=>{var t=document.createElement("option");t.textContent=e?.text,t.value=e?.value,r.add(t)})}return"dropdown"==e&&(r.style.backgroundColor="var(--gray-900, rgb(32,33,35))"),this.elems.push(r),this.activateObserver(),document.body.setAttribute("data-chatgptjs","observer-trigger"),r.id},exists(){return!!chatgpt.getNewChatLink()},hide(){this.isOn()?this.toggle():console.info("Sidebar already hidden!")},show(){this.isOff()?this.toggle():console.info("Sidebar already shown!")},isOff(){return!this.isOn()},isOn(){var e=chatgpt.sidebar.exists()?document.querySelector(chatgpt.selectors.sidebar):null;return e?chatgpt.browser.isMobile()?"hidden"==document.documentElement.style.overflow:"hidden"!=e.style.visibility&&"0px"!=e.style.width:console.error("Sidebar element not found!")||!1},toggle(){var e=document.querySelector(chatgpt.selectors.btns.sidebar);e||console.error("Sidebar toggle not found!"),e.click()},async isLoaded(t=5e3){await chatgpt.isLoaded();var e=new Promise(e=>setTimeout(()=>e(!1),t)),o=new Promise(o=>{chatgpt.getNewChatLink()?o(!0):new MutationObserver((e,t)=>{chatgpt.getNewChatLink()&&(t.disconnect(),o(!0))}).observe(document.documentElement,{childList:!0,subtree:!0})});return Promise.race([o,e])}},startNewChat(){try{chatgpt.getNewChatBtn().click()}catch(e){console.error(e.message)}},stop(){chatgpt.response.stopGenerating()},async suggest(e,t){if(!e)return console.error("ideaType (1st argument) not supplied(e.g. 'gifts', 'names', 'recipes', etc.)");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send("Suggest some names. "+(t||"")),console.info(`Creating ${e}...`),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},speak(e,{voice:t=2,pitch:o=2,speed:r=1.1,onend:a}={}){if("string"!=typeof e)return console.error("Message must be a string!");var n,s=["voice","pitch","speed","onend"];for(n in arguments[1]){if(!s.includes(n))return console.error(`Invalid option '${n}'. Valid keys are: `+s);var i=arguments[1][n];if("onend"!=n&&"number"!=typeof i&&!/^\d+$/.test(i))return console.error(`Invalid ${n} value '${i}'. Must be a number!`);if("onend"==n&&"function"!=typeof i)return console.error(`Invalid ${n} value. Must be a function!`)}try{var c=new SpeechSynthesisUtterance,l=speechSynthesis.getVoices();Object.assign(c,{text:e,voice:l[t],pitch:o,speed:r,onend:a}),speechSynthesis.speak(c)}catch(e){console.error(e)}},async summarize(e){return e?"string"!=typeof e?console.error("Text argument must be a string!"):(chatgpt.send("Summarize the following text:\n\n"+e),console.info("Summarizing text..."),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")):console.error("Text (1st) argument not supplied. Pass some text!")},toggleScheme(){chatgpt.settings.scheme.toggle()},async translate(e,t){if(!e)return console.error("Text (1st) argument not supplied. Pass some text!");if(!t)return console.error("outputLang (2nd) argument not supplied. Pass a language!");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string!`);return chatgpt.send(`Translate the following text to ${t}. Only reply with the translation.
93
+ cursor: pointer ; float: right ; position: relative ; right: -4px ; margin-left: -3px ;`+"display: grid }@keyframes notif-zoom-fade-out { 0% { opacity: 1 ; transform: scale(1) }15% { opacity: 0.35 ; transform: rotateX(-27deg) scale(1.05) }45% { opacity: 0.05 ; transform: rotateX(-81deg) }100% { opacity: 0 ; transform: rotateX(-180deg) scale(1.15) }}"),JSON.parse(localStorage.notifyProps));c.queue[a.quadrant].push(a.id),localStorage.notifyProps=JSON.stringify(c),a.style.top=a.isTop?23..toString()+"px":"",a.style.bottom=a.isTop?"":23..toString()+"px",a.style.right=a.isRight?27..toString()+"px":"",a.style.left=a.isRight?"":27..toString()+"px";e=c.queue[a.quadrant];if(1<e.length)try{for(var l of e.slice(0,-1)){var d=document.getElementById(l),g=d.style.top?"top":"bottom",u=+parseInt(d.style[g])+5+d.getBoundingClientRect().height;d.style[g]=u+"px"}}catch(e){console.warn("Failed to re-position notification:",e)}setTimeout(()=>{a.style.opacity=chatgpt.isDarkMode()?.8:.67,a.style.transform="translateX(0)",a.style.transition="transform 0.15s ease, opacity 0.15s ease"},10);t=()=>{a.style.animation="notif-zoom-fade-out 0.35s ease-out",clearTimeout(h)};let h=setTimeout(t,1e3*(o<.35?0:o-.35));return n.onclick=t,a.onanimationend=()=>{a.remove(),(c=JSON.parse(localStorage.notifyProps)).queue[a.quadrant].shift(),localStorage.notifyProps=JSON.stringify(c)},a},obfuscate(){chatgpt.code.obfuscate()},printAllFunctions(){let o={cmdPrompt:["#ff00ff","#00ff00"],objName:["#0611e9","#f9ee16"],methodName:["#005aff","#ffa500"],entryType:["#467e06","#b981f9"],srcMethod:["#ff0000","#00ffff"]};Object.keys(o).forEach(e=>{o[e][1]=o[e][1]||"#"+(16777215^Number("0x1"+o[e][0].replace(/^#/,""))).toString(16).substring(1).toUpperCase()});var e=[];for(let t in this)if("function"==typeof this[t]){var r=!Object.keys(this).find(e=>Object.keys(this[e]).includes(this[t].name));e.push([r?"chatgpt":"other",t])}else if("object"==typeof this[t])for(var a in this[t])"function"==typeof this[t][a]&&e.push([t,a]);e.sort((e,t)=>e[0].localeCompare(t[0])||e[1].localeCompare(t[1]));var n=window.matchMedia("(prefers-color-scheme: dark)").matches,s="font-family: monospace ; font-size: larger ; ";console.log("\n%c🤖 chatgpt.js methods\n","font-family: sans-serif ; font-size: xxx-large ; font-weight: bold");for(let t of e){var i=/chatgpt|other/.test(t[0]),c="chatgpt"==t[0]?this[t[1]].name:"other"!=t[0]?t[0]+"."+t[1]:Object.keys(this).find(e=>Object.keys(this[e]).includes(this[t[1]].name))+"."+this[t[1]].name,l="AsyncFunction"==this[t[1]]?.constructor.name;console.log("%c>> %c"+(i?"":t[0]+".%c")+t[1]+" - https://chatgptjs.org/userguide/"+/(?:.*\.)?(.*)/.exec(c)[1].toLowerCase()+(l?"-async":"")+"\n%c[%c"+("chatgpt"==t[0]&&t[1]==this[t[1]].name||!i?"Function":"Alias of")+"%c: %c"+c+"%c]",s+"font-weight: bold ; color:"+o.cmdPrompt[+n],s+"font-weight: bold ;color:"+o[i?"methodName":"objName"][+n],s+"font-weight: "+(i?"initial":"bold")+";color:"+(i?"initial":o.methodName[+n]),s+"font-weight: "+(i?"bold":"initial")+";color:"+(i?o.entryType[+n]:"initial"),s+"font-weight: "+(i?"initial":"bold")+";color:"+(i?"initial":o.entryType[+n]),s+(i?"font-style: italic":"font-weight: initial")+";color:"+(i?o.srcMethod[+n]:"initial"),s+(i?"font-weight: initial":"font-style: italic")+";color:"+(i?"initial":o.srcMethod[+n]),i?"":s+"color: initial ; font-weight: initial")}},randomFloat(){return(window.crypto||window.msCrypto)?.getRandomValues(new Uint32Array(1))[0]/4294967295||Math.random()},refactor(){chatgpt.code.refactor()},regenerate(){chatgpt.response.regenerate()},renderHTML(s){var i,e=/<([a-z\d]+)\b([^>]*)>([\s\S]*?)<\/\1>/g,c=/(\S+)=['"]?((?:.(?!['"]?\s+\S+=|[>']))+.)['"]?/g,t=s.childNodes;chatgpt.renderHTML.preWrapSet||(s.style.whiteSpace="pre-wrap",chatgpt.renderHTML.preWrapSet=!0,setTimeout(()=>chatgpt.renderHTML.preWrapSet=!1,100));for(i of t)if(i.nodeType==Node.TEXT_NODE){var l=i.nodeValue,d=[...l.matchAll(e)];if(0<d.length){let e=d[0],[t,o,r,a]=e.slice(0,4),n=document.createElement(o);n.textContent=a;[...r.matchAll(c)].forEach(e=>{var t=e[1],e=e[2].replace(/['"]/g,"");n.setAttribute(t,e)});var d=chatgpt.renderHTML(n),g=document.createTextNode(l.substring(0,e.index)),l=document.createTextNode(l.substring(e.index+t.length));s.replaceChild(g,i),s.insertBefore(d,g.nextSibling),s.insertBefore(l,d.nextSibling)}}else i.nodeType==Node.ELEMENT_NODE&&chatgpt.renderHTML(i);return s},async resend(){chatgpt.send(await chatgpt.getChatData("latest","msg","user","latest"))},response:{continue(){try{chatgpt.getContinueBtn().click()}catch(e){console.error(e.message)}},get(){return this["getFrom"+(location.href.startsWith("https://chatgpt.com/c/")?"DOM":"API")].apply(null,arguments)},getFromAPI(e,t){return e=e||"latest",t=t||"latest",chatgpt.getChatData(e,"msg","chatgpt",t)},getFromDOM(e){var t=document.querySelectorAll("div[data-message-author-role=assistant]"),o=e.toString().toLowerCase();let r="";return t.length?r=(r=(/last|final/.test(o)?t[t.length-1]:t[(Number.isInteger(e)?e:/^\d+/.test(o)?/^\d+/.exec(o)[0]:(/^(?:1|one|fir)(?:st)?$/.test(o)?1:/^(?:2|tw(?:o|en|el(?:ve|f))|seco)(?:nd|t[yi])?(?:e?th)?$/.test(o)?2:/^(?:3|th(?:ree|ir?))(?:rd|teen|t[yi])?(?:e?th)?$/.test(o)?3:/^(?:4|fou?r)(?:teen|t[yi])?(?:e?th)?$/.test(o)?4:/^(?:5|fi(?:ve|f))(?:teen|t[yi])?(?:e?th)?$/.test(o)?5:/^(?:6|six)(?:teen|t[yi])?(?:e?th)?$/.test(o)?6:/^(?:7|seven)(?:teen|t[yi])?(?:e?th)?$/.test(o)?7:/^(?:8|eight?)(?:teen|t[yi])?(?:e?th)?$/.test(o)?8:/^(?:9|nine?)(?:teen|t[yi])?(?:e?th)?$/.test(o)?9:/^(?:10|ten)(?:th)?$/.test(o)?10:1)*(/(?:ty|ieth)$/.test(o)?10:1)+(/teen(?:th)?$/.test(o)?10:0))-1]).textContent).replace(/^ChatGPT(?:ChatGPT)?/,""):console.error("No conversation found!")},getLast(){return chatgpt.getChatData("active","msg","chatgpt","latest")},regenerate(){try{chatgpt.getRegenerateBtn().click()}catch(e){console.error(e.message)}},stopGenerating(){try{chatgpt.getStopBtn().click()}catch(e){console.error(e.message)}}},reviewCode(){chatgpt.code.review()},scrollToBottom(){try{chatgpt.getScrollBtn().click()}catch(e){console.error(e.message)}},send(e,o=""){for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string!`);let r=chatgpt.getChatBox();if(!r)return console.error("Chatbar element not found!");var t=document.createElement("p");t.textContent=e,r.querySelector("p").replaceWith(t),r.dispatchEvent(new Event("input",{bubbles:!0})),setTimeout(function e(){var t=chatgpt.getSendButton();t?.hasAttribute("disabled")?setTimeout(e,222):"click"==o.toLowerCase()||chatgpt.browser.isMobile()?t.click():r.dispatchEvent(new KeyboardEvent("keydown",{key:"Enter",bubbles:!0}))},222)},sendInNewChat(e){if("string"!=typeof e)return console.error("Message must be a string!");try{chatgpt.getNewChatBtn().click()}catch(e){return console.error(e.message)}setTimeout(()=>chatgpt.send(e),500)},settings:{scheme:{isDark(){return document.documentElement.classList.contains("dark")},isLight(){return document.documentElement.classList.contains("light")},set(e){var t=["dark","light","system"];if(!e)return console.error("Please specify a scheme value!");if(!t.includes(e))return console.error(`Invalid scheme value. Valid values are [${t}]`);let o=e;"system"==e&&(o=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),localStorage.setItem("theme",e),console.info(`Scheme set to ${e.toUpperCase()}.`),document.documentElement.classList.contains(o)||this.toggle()},toggle(){var[e,t]=this.isDark()?["dark","light"]:["light","dark"];document.documentElement.classList.replace(e,t),document.documentElement.style.colorScheme=t,localStorage.setItem("theme",t)}}},async sentiment(e,t){for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send("What is the sentiment of the following text"+(t?` towards the entity ${t},`:"")+" from strongly negative to strongly positive?\n\n"+e),console.info("Analyzing sentiment..."),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},setScheme(e){chatgpt.settings.scheme.set(e)},shareChat(s,i="clipboard"){var e=["alert","notify","notification","clipboard","copy"];if(!e.includes(i))return console.error(`Invalid method '${i}' passed. Valid methods are [${e}].`);return new Promise(o=>{chatgpt.getAccessToken().then(t=>{var a;a=t,new Promise((t,o)=>{let r=new XMLHttpRequest;chatgpt.getChatData(s).then(e=>{r.open("GET",chatgpt.endpoints.openAI.chat+"/"+e.id,!0),r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+a),r.onload=()=>200!=r.status?o("🤖 chatgpt.js >> Request failed. Cannot retrieve chat node."):t(JSON.parse(r.responseText).current_node),r.send()})}).then(e=>{var a,n;a=t,n=e,new Promise((t,o)=>{let r=new XMLHttpRequest;chatgpt.getChatData(s).then(e=>{r.open("POST",chatgpt.endpoints.openAI.share_create,!0),r.setRequestHeader("Content-Type","application/json"),r.setRequestHeader("Authorization","Bearer "+a),r.onload=()=>200!=r.status?o("🤖 chatgpt.js >> Request failed. Cannot initialize share chat."):t(JSON.parse(r.responseText)),r.send(JSON.stringify({current_node_id:n,conversation_id:e.id,is_anonymous:!0}))})}).then(e=>{var r,a;r=t,a=e,new Promise((e,t)=>{let o=new XMLHttpRequest;o.open("PATCH",chatgpt.endpoints.openAI.share+"/"+a.share_id,!0),o.setRequestHeader("Content-Type","application/json"),o.setRequestHeader("Authorization","Bearer "+r),o.onload=()=>200!=o.status?t("🤖 chatgpt.js >> Request failed. Cannot share chat."):(console.info(`Chat shared at '${a.share_url}'`),e()),o.send(JSON.stringify({share_id:a.share_id,highlighted_message_id:a.highlighted_message_id,title:a.title,is_public:!0,is_visible:a.is_visible,is_anonymous:a.is_anonymous}))}).then(()=>{["copy","clipboard"].includes(i)?navigator.clipboard.writeText(e.share_url):chatgpt.alert("🚀 Share link created!",`"${e.title}" is available at: <a target="blank" rel="noopener" href="${e.share_url}">${e.share_url}</a>`,[function(){window.open(e.share_url,"_blank","noopener")},function(){navigator.clipboard.writeText(e.share_url)}]),o(e.share_url)})})})})})},showFooter(){chatgpt.footer.show()},showHeader(){chatgpt.header.show()},sidebar:{elems:[],observer:{},activateObserver(){if(this.observer instanceof MutationObserver&&this.observer.disconnect(),!this.elems.length)return console.error("🤖 chatgpt.js >> No elems to append!");let t;for(var e of document.querySelectorAll(chatgpt.selectors.links.sidebarItem))if(/.*chat/.exec(e.text)[0]){t=e.classList,e.parentNode.style.margin="2px 0";break}this.elems.forEach(e=>{e.setAttribute("class",t),e.style.maxHeight=e.style.minHeight="44px",e.style.margin="2px 0"});let o=document.querySelector(chatgpt.selectors.chatHistory);if(!o)return console.error("Sidebar element not found!");this.observer=new MutationObserver(e=>e.forEach(e=>{("childList"==e.type&&e.addedNodes.length||"attributes"==e.type&&"data-chatgptjs"==e.attributeName)&&this.elems.forEach(e=>{if(!o.contains(e))try{o.querySelector("a").parentNode.before(e)}catch(e){console.error(e)}})})),this.observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0})},append(e,t={}){var o=["button","dropdown"];if(!e||"string"!=typeof e)return console.error("🤖 chatgpt.js >> Please supply a valid string element name!");if(e=e.toLowerCase(),!o.includes(e))return console.error(`🤖 chatgpt.js >> Invalid element! Valid elems are [${o}]`);let r=document.createElement("dropdown"==e?"select":e);if(r.id=Math.floor(1e6*chatgpt.randomFloat())+Date.now(),"button"==e){r.textContent=t?.label&&"string"==typeof t.label?t.label:"chatgpt.js button";o=document.createElement("img");o.src=t?.icon&&"string"==typeof t.icon?t.icon:chatgpt.endpoints.assets+"/starters/chrome/extension/icons/icon128.png",o.width=18,r.firstChild.before(o),r.onclick=t?.onclick&&"function"==typeof t.onclick?t.onclick:function(){}}else if("dropdown"==e){if(t?.items&&Array.isArray(t.items)&&t.items.length||(t.items=[{text:"🤖 chatgpt.js option",value:"chatgpt.js option value"}]),!t.items.every(e=>"object"==typeof e))return console.error("'items' must be an array of objects!");t.items.forEach(e=>{var t=document.createElement("option");t.textContent=e?.text,t.value=e?.value,r.add(t)})}return"dropdown"==e&&(r.style.backgroundColor="var(--gray-900, rgb(32,33,35))"),this.elems.push(r),this.activateObserver(),document.body.setAttribute("data-chatgptjs","observer-trigger"),r.id},exists(){return!!chatgpt.getNewChatLink()},hide(){this.isOn()?this.toggle():console.info("Sidebar already hidden!")},show(){this.isOff()?this.toggle():console.info("Sidebar already shown!")},isOff(){return!this.isOn()},isOn(){var e=chatgpt.sidebar.exists()?document.querySelector(chatgpt.selectors.sidebar):null;return e?chatgpt.browser.isMobile()?"hidden"==document.documentElement.style.overflow:"hidden"!=e.style.visibility&&"0px"!=e.style.width:console.error("Sidebar element not found!")||!1},toggle(){var e=document.querySelector(chatgpt.selectors.btns.sidebar);e||console.error("Sidebar toggle not found!"),e.click()},async isLoaded(t=5e3){await chatgpt.isLoaded();var e=new Promise(e=>setTimeout(()=>e(!1),t)),o=new Promise(o=>{chatgpt.getNewChatLink()?o(!0):new MutationObserver((e,t)=>{chatgpt.getNewChatLink()&&(t.disconnect(),o(!0))}).observe(document.documentElement,{childList:!0,subtree:!0})});return Promise.race([o,e])}},startNewChat(){try{chatgpt.getNewChatBtn().click()}catch(e){console.error(e.message)}},stop(){chatgpt.response.stopGenerating()},async suggest(e,t){if(!e)return console.error("ideaType (1st argument) not supplied(e.g. 'gifts', 'names', 'recipes', etc.)");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string.`);return chatgpt.send("Suggest some names. "+(t||"")),console.info(`Creating ${e}...`),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},speak(e,{voice:t=2,pitch:o=2,speed:r=1.1,onend:a}={}){if("string"!=typeof e)return console.error("Message must be a string!");var n,s=["voice","pitch","speed","onend"];for(n in arguments[1]){if(!s.includes(n))return console.error(`Invalid option '${n}'. Valid keys are: `+s);var i=arguments[1][n];if("onend"!=n&&"number"!=typeof i&&!/^\d+$/.test(i))return console.error(`Invalid ${n} value '${i}'. Must be a number!`);if("onend"==n&&"function"!=typeof i)return console.error(`Invalid ${n} value. Must be a function!`)}try{var c=new SpeechSynthesisUtterance,l=speechSynthesis.getVoices();Object.assign(c,{text:e,voice:l[t],pitch:o,speed:r,onend:a}),speechSynthesis.speak(c)}catch(e){console.error(e)}},async summarize(e){return e?"string"!=typeof e?console.error("Text argument must be a string!"):(chatgpt.send("Summarize the following text:\n\n"+e),console.info("Summarizing text..."),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")):console.error("Text (1st) argument not supplied. Pass some text!")},toggleScheme(){chatgpt.settings.scheme.toggle()},async translate(e,t){if(!e)return console.error("Text (1st) argument not supplied. Pass some text!");if(!t)return console.error("outputLang (2nd) argument not supplied. Pass a language!");for(let e=0;e<arguments.length;e++)if("string"!=typeof arguments[e])return console.error(`Argument ${e+1} must be a string!`);return chatgpt.send(`Translate the following text to ${t}. Only reply with the translation.
94
94
 
95
95
  `+e),console.info("Translating text..."),await chatgpt.isIdle(),chatgpt.getChatData("active","msg","chatgpt","latest")},unminify(){chatgpt.code.unminify()},uuidv4(){try{return crypto.randomUUID()}catch(e){let o=(new Date).getTime();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{var t=(o+window.crypto.getRandomValues(new Uint32Array(1))[0]/(Math.pow(2,32)-1)*16)%16|0;return o=Math.floor(o/16),("x"==e?t:3&t|8).toString(16)})}},writeCode(){chatgpt.code.write()}},cjsBtnActions=(chatgpt.scheme={...chatgpt.settings.scheme},["click","get"]),cjsTargetTypes=["button","link","div","response"];for(let t of cjsBtnActions)chatgpt[t+"Button"]=function(o){var e=/^[.#]/.test(o)?document.querySelector(o):/send/i.test(o)?document.querySelector(chatgpt.selectors.btns.send):/scroll/i.test(o)?document.querySelector(chatgpt.selectors.btns.scroll):(()=>{for(var e of document.querySelectorAll("button"))if(e.textContent.toLowerCase().includes(o.toLowerCase()))return e;for(var t of document.querySelectorAll(chatgpt.selectors.links.sidebarItem))if(t.textContent.toLowerCase().includes(o.toLowerCase()))return t})();if("click"!=t)return e;e.click()};let cjsFuncAliases=[["actAs","act","become","persona","premadePrompt","preMadePrompt","prePrompt","rolePlay","rp"],["activateAutoRefresh","activateAutoRefresher","activateRefresher","activateSessionRefresher","autoRefresh","autoRefresher","autoRefreshSession","refresher","sessionRefresher"],["continue","continueChat","continueGenerating","continueResponse"],["deactivateAutoRefresh","deactivateAutoRefresher","deactivateRefresher","deactivateSessionRefresher"],["detectLanguage","getLanguage"],["executeCode","codeExecute"],["exists","isAvailable","isExistent","isPresent"],["exportChat","chatExport","export"],["getFooterDiv","getFooter"],["getHeaderDiv","getHeader"],["getLastPrompt","getLastQuery","getMyLastMessage","getMyLastQuery"],["getContinueButton","getContinueGeneratingButton"],["getScrollToBottomButton","getScrollButton"],["getStopButton","getStopGeneratingButton"],["getTextarea","getTextArea","getChatbar","getChatBar","getChatbox","getChatBox"],["getVoiceButton","getVoiceModeButton"],["isFullScreen","isFullscreen"],["isTempChat","isIncognito","isIncognitoMode","isTempChatMode"],["minify","codeMinify","minifyCode"],["new","newChat","startNewChat"],["obfuscate","codeObfuscate","obfuscateCode"],["printAllFunctions","showAllFunctions"],["refactor","codeRefactor","refactorCode"],["refreshReply","regenerate","regenerateReply"],["refreshSession","sessionRefresh"],["renderHTML","renderHtml","renderLinks","renderTags"],["reviewCode","codeReview"],["send","sendChat","sendMessage"],["sendInNewChat","sendNewChat"],["sentiment","analyzeSentiment","sentimentAnalysis"],["startNewChat","new","newChat"],["stop","stopChat","stopGenerating","stopResponse"],["suggest","suggestion","recommend"],["toggleAutoRefresh","toggleAutoRefresher","toggleRefresher","toggleSessionRefresher"],["toggleScheme","toggleMode"],["translate","translation","translator"],["unminify","unminifyCode","codeUnminify"],["writeCode","codeWrite"]],cjsFuncSynonyms=[["account","acct"],["activate","turnOn"],["analyze","check","evaluate","review"],["ask","send","submit"],["button","btn"],["continue","resume"],["chats","history"],["chat","conversation","convo"],["clear","delete","remove"],["data","details"],["deactivate","deActivate","turnOff"],["execute","interpret","interpreter","run"],["firefox","ff"],["generating","generation"],["login","logIn","logOn","signIn","signOn"],["logout","logOut","logOff","signOff","signOut"],["message","msg"],["minify","uglify"],["refactor","rewrite"],["regenerate","regen"],["render","parse"],["reply","response"],["sentiment","attitude","emotion","feeling","opinion","perception"],["speak","play","say","speech","talk","tts"],["summarize","tldr"],["temp","temporary"],["typing","generating"],["unminify","beautify","prettify","prettyPrint"]];function toCamelCase(e){return e.map((e,t)=>0==t?e:e[0].toUpperCase()+e.slice(1)).join("")}!function e(n=chatgpt){for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&"object"==typeof n[t]&&e(n[t]);let s;do{s=!1;for(let a in n)if(Object.prototype.hasOwnProperty.call(n,a)&&"function"==typeof n[a]){n[a.toLowerCase()]=n[a],cjsFuncAliases.forEach(e=>{e.includes(a)&&e.forEach(e=>{n[e]||(n[e]=n[e.toLowerCase()]=n[a],s=!0)})});let r=a.split(/(?=[A-Z])/);r.forEach(o=>{cjsFuncSynonyms.filter(e=>e.includes(o.toLowerCase())).flat().filter(e=>e!=o.toLowerCase()).forEach(t=>{var e=toCamelCase(r.map(e=>e==o?t:e));n[e]||(n[e]=n[e.toLowerCase()]=n[a],s=!0)})})}}while(s)}();let consolePrefix="🤖 chatgpt.js >> ",ogError=console.error,ogInfo=console.info;console.error=(...e)=>{e[0].startsWith(consolePrefix)?ogError(...e):ogError(consolePrefix+e[0],...e.slice(1))},console.info=e=>{e.startsWith(consolePrefix)?ogInfo(e):ogInfo(consolePrefix+e)};try{window.chatgpt=chatgpt}catch(e){}try{module.exports=chatgpt}catch(e){}
package/docs/README.md CHANGED
@@ -51,8 +51,8 @@
51
51
  <img src="https://img.shields.io/badge/License-MIT-fc4f2d.svg?logo=internetarchive&logoColor=white&labelColor=464646&style=for-the-badge"></a>
52
52
  <a href="https://www.npmjs.com/package/@kudoai/chatgpt.js/v/latest" target="_blank" rel="noopener">
53
53
  <img src="https://img.shields.io/npm/v/%40kudoai%2Fchatgpt.js?logo=npm&logoColor=white&labelColor=464646&color=blue&style=for-the-badge&label=Latest+Release"></a>
54
- <a href="https://github.com/KudoAI/chatgpt.js/tree/v3.8.0/dist/chatgpt.min.js" target="_blank" rel="noopener">
55
- <img src="https://img.shields.io/github/size/KudoAI/chatgpt.js/dist/chatgpt.min.js?branch=v3.8.0&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
54
+ <a href="https://github.com/KudoAI/chatgpt.js/tree/v3.8.1/dist/chatgpt.min.js" target="_blank" rel="noopener">
55
+ <img src="https://img.shields.io/github/size/KudoAI/chatgpt.js/dist/chatgpt.min.js?branch=v3.8.1&label=Minified%20Size&logo=databricks&logoColor=white&labelColor=464646&color=ff69b4&style=for-the-badge"></a>
56
56
  <a href="https://www.codefactor.io/repository/github/kudoai/chatgpt.js" target="_blank" rel="noopener">
57
57
  <img src="https://img.shields.io/codefactor/grade/github/kudoai/chatgpt.js?label=Code+Quality&logo=codefactor&logoColor=white&labelColor=464646&color=1acc6c&style=for-the-badge"></a>
58
58
  <a href="https://sonarcloud.io/component_measures?metric=new_vulnerabilities&id=kudoai_chatgpt.js" target="_blank" rel="noopener">
@@ -118,7 +118,7 @@
118
118
 
119
119
  ```js
120
120
  (async () => {
121
- await import('https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js');
121
+ await import('https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js');
122
122
  // Your code here...
123
123
  })();
124
124
  ```
@@ -127,7 +127,7 @@
127
127
 
128
128
  ```js
129
129
  var xhr = new XMLHttpRequest();
130
- xhr.open('GET', 'https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js');
130
+ xhr.open('GET', 'https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js');
131
131
  xhr.onload = function () {
132
132
  if (xhr.status === 200) {
133
133
  var chatgptJS = document.createElement('script');
@@ -150,7 +150,7 @@ function yourCode() {
150
150
 
151
151
  ```js
152
152
  ...
153
- // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js
153
+ // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js
154
154
  // ==/UserScript==
155
155
 
156
156
  // Your code here...
@@ -220,7 +220,7 @@ chatgpt.get('reply', 'last');
220
220
 
221
221
  Each call equally fetches the last response. If you think it works, it probably will... so just type it!
222
222
 
223
- If it didn't, check out the extended [userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.0/docs/USERGUIDE.md), or simply submit an [issue](https://github.com/KudoAI/chatgpt.js/issues) or [PR](https://github.com/KudoAI/chatgpt.js/pulls) and it will be integrated, ezpz!
223
+ If it didn't, check out the extended [userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.1/docs/USERGUIDE.md), or simply submit an [issue](https://github.com/KudoAI/chatgpt.js/issues) or [PR](https://github.com/KudoAI/chatgpt.js/pulls) and it will be integrated, ezpz!
224
224
 
225
225
  <img height=8px width="100%" src="https://assets.chatgptjs.org/images/separators/gradient-aqua.png?v=e638eac">
226
226
 
@@ -475,7 +475,7 @@ This library exists thanks to code, translations, issues & ideas from the follow
475
475
  <div align="center">
476
476
 
477
477
  **[Releases](https://github.com/KudoAI/chatgpt.js/releases)** /
478
- [Userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.0/docs/USERGUIDE.md) /
478
+ [Userguide](https://github.com/KudoAI/chatgpt.js/blob/v3.8.1/docs/USERGUIDE.md) /
479
479
  [Discuss](https://github.com/KudoAI/chatgpt.js/discussions) /
480
480
  [Back to top ↑](#top)
481
481
 
package/docs/USERGUIDE.md CHANGED
@@ -165,7 +165,7 @@
165
165
 
166
166
  ```js
167
167
  (async () => {
168
- await import('https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js');
168
+ await import('https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js');
169
169
  // Your code here...
170
170
  })();
171
171
  ```
@@ -174,7 +174,7 @@
174
174
 
175
175
  ```js
176
176
  var xhr = new XMLHttpRequest();
177
- xhr.open('GET', 'https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js');
177
+ xhr.open('GET', 'https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js');
178
178
  xhr.onload = function () {
179
179
  if (xhr.status === 200) {
180
180
  var chatgptJS = document.createElement('script');
@@ -196,7 +196,7 @@ function yourCode() {
196
196
 
197
197
  ```js
198
198
  ...
199
- // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js
199
+ // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js
200
200
  // ==/UserScript==
201
201
 
202
202
  // Your code here...
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudoai/chatgpt.js",
3
- "version": "3.8.0",
3
+ "version": "3.8.1",
4
4
  "description": "Client-side JavaScript library for ChatGPT",
5
5
  "author": {
6
6
  "name": "KudoAI & contributors",
@@ -9,10 +9,16 @@
9
9
  },
10
10
  "homepage": "https://chatgpt.js.org",
11
11
  "license": "MIT",
12
- "funding": {
13
- "type": "github",
14
- "url": "http://github.com/sponsors/KudoAI"
15
- },
12
+ "funding": [
13
+ {
14
+ "type": "github",
15
+ "url": "http://github.com/sponsors/KudoAI"
16
+ },
17
+ {
18
+ "type": "paypal",
19
+ "url": "http://paypal.biz/kudoai"
20
+ }
21
+ ],
16
22
  "browser": "chatgpt.js",
17
23
  "files": [
18
24
  "chatgpt.js",
@@ -72,11 +78,10 @@
72
78
  "@eslint/css": "^0.7.0",
73
79
  "@eslint/json": "^0.12.0",
74
80
  "@eslint/markdown": "^6.4.0",
75
- "@html-eslint/eslint-plugin": "^0.39.0",
76
- "@html-eslint/parser": "^0.39.0",
81
+ "@html-eslint/eslint-plugin": "^0.40.1",
82
+ "@html-eslint/parser": "^0.40.0",
77
83
  "@stylistic/eslint-plugin-js": "^4.2.0",
78
- "docsify-cli": "^4.4.4",
79
- "eslint": "^9.25.1",
84
+ "eslint": "^9.26.0",
80
85
  "eslint-plugin-import": "^2.31.0",
81
86
  "eslint-plugin-regexp": "^2.7.0",
82
87
  "eslint-plugin-yml": "^1.18.0",
@@ -1,7 +1,6 @@
1
1
  // Requires lib/dom.js + app
2
2
 
3
3
  window.icons = {
4
- import(deps) { Object.assign(this.imports ||= {}, deps) },
5
4
 
6
5
  create(name, { size = 16, width, height, ...additionalAttrs } = {}) {
7
6
  const iconData = icons[name],
@@ -28,7 +27,7 @@ window.icons = {
28
27
 
29
28
  questionMark: {
30
29
  type: 'png',
31
- get src() { return `${icons.imports.app.urls.assetHost.replace(
30
+ get src() { return `${app.urls.assetHost.replace(
32
31
  '@latest', '@00e245b')}/images/icons/question-mark/icon16.png` }
33
32
  }
34
33
  };
@@ -1,13 +1,12 @@
1
- // Requires lib/chatgpt.js + lib/dom.js + app + env
1
+ // Requires lib/<chatgpt|dom>.js + app + env
2
2
 
3
3
  window.modals = {
4
- import(deps) { Object.assign(this.imports ||= {}, deps) },
5
4
 
6
5
  stack: [], // of types of undismissed modals
7
- get class() { return `${this.imports.app.cssPrefix}-modal` },
6
+ get class() { return `${app.cssPrefix}-modal` },
8
7
 
9
8
  about() {
10
- const { app, env: { ui: { scheme }, browser: { isPortrait }}} = this.imports
9
+ const { ui: { scheme }, browser: { isPortrait }} = env
11
10
 
12
11
  // Show modal
13
12
  const labelStyles = 'text-transform: uppercase ; font-size: 17px ; font-weight: bold ;'
@@ -15,7 +14,7 @@ window.modals = {
15
14
  const aboutModal = this.alert(
16
15
  `${app.symbol} ${chrome.runtime.getManifest().name}`, // title
17
16
  `<span style="${labelStyles}">🧠 Author:</span> `
18
- + `<a href="${app.author.url}">${this.imports.app.author.name}</a> `
17
+ + `<a href="${app.author.url}">${app.author.name}</a> `
19
18
  + `& <a href="${app.urls.contributors}">contributors</a>\n`
20
19
  + `<span style="${labelStyles}">🏷️ Version:</span> `
21
20
  + `<span class="about-em">${app.version}</span>\n`
@@ -43,9 +42,9 @@ window.modals = {
43
42
  // Replace buttons w/ clones that don't dismiss modal
44
43
  btn.replaceWith(btn = btn.cloneNode(true))
45
44
  btn.onclick = () => this.safeWinOpen(
46
- btn.textContent == 'Get Support' ? `${modals.imports.app.urls.gitHub}/issues`
47
- : btn.textContent == 'Rate Us' ? `${modals.imports.app.urls.gitHub}/discussions`
48
- : modals.imports.app.urls.relatedExtensions
45
+ btn.textContent == 'Get Support' ? `${app.urls.gitHub}/issues`
46
+ : btn.textContent == 'Rate Us' ? `${app.urls.gitHub}/discussions`
47
+ : app.urls.relatedExtensions
49
48
  )
50
49
 
51
50
  // Prepend emoji
@@ -104,9 +103,9 @@ window.modals = {
104
103
  safeWinOpen(url) { open(url, '_blank', 'noopener') }, // to prevent backdoor vulnerabilities
105
104
 
106
105
  stylize() {
107
- const { env: { ui: { scheme }, browser: { isMobile }}} = this.imports
106
+ const { ui: { scheme }, browser: { isMobile }} = env
108
107
  if (!this.styles) document.head.append(this.styles = dom.create.elem('style'))
109
- this.styles.innerText = (
108
+ this.styles.textContent = (
110
109
  `.${this.class} {` // modals
111
110
  + 'user-select: none ; -webkit-user-select: none ; -moz-user-select: none ; -ms-user-select: none ;'
112
111
  + 'font-family: -apple-system, system-ui, BlinkMacSystemFont, Segoe UI, Roboto,'
@@ -4,19 +4,15 @@
4
4
  (async () => {
5
5
 
6
6
  // Import JS resources
7
- for (const resource of ['components/modals.js', 'lib/chatgpt.js', 'lib/dom.js', 'lib/settings.js'])
7
+ for (const resource of ['components/modals.js', 'lib/chatgpt.js', 'lib/dom.js', 'lib/settings.js', 'lib/ui.js'])
8
8
  await import(chrome.runtime.getURL(resource))
9
9
 
10
10
  // Init ENV context
11
- const env = { browser: { isMobile: chatgpt.browser.isMobile() }, ui: { scheme: getScheme() }}
11
+ window.env = { browser: { isMobile: chatgpt.browser.isMobile() }, ui: { scheme: ui.getScheme() }}
12
12
  env.browser.isPortrait = env.browser.isMobile && (window.innerWidth < window.innerHeight)
13
13
 
14
14
  // Import APP data
15
- const { app } = await chrome.storage.local.get('app')
16
-
17
- // Export DEPENDENCIES to imported resources
18
- dom.import({ env }) // for env.ui.scheme
19
- modals.import({ app, env }) // for app data + env.<browser|ui> flags
15
+ ;({ app: window.app } = await chrome.storage.local.get('app'))
20
16
 
21
17
  chrome.runtime.onMessage.addListener(({ action, options }) => { // from service-worker.js + popup/index.html
22
18
  ({
@@ -24,7 +20,7 @@
24
20
  alert: () => modals.alert(...['title', 'msg', 'btns', 'checkbox', 'width'].map(arg => options[arg])),
25
21
  showAbout: () => { config.skipAlert = true ; chatgpt.isLoaded().then(() => modals.open('about')) },
26
22
  syncConfigToUI: () => syncConfigToUI(options)
27
- }[action]?.())
23
+ }[action]?.() || console.warn(`Received unsupported action: "${action}"`))
28
24
  })
29
25
 
30
26
  // Init SETTINGS
@@ -74,21 +70,16 @@
74
70
  }
75
71
  }
76
72
 
77
- function getScheme() {
78
- return document.documentElement.className
79
- || (window.matchMedia?.('(prefers-color-scheme: dark)')?.matches ? 'dark' : 'light')
80
- }
81
-
82
73
  // Run MAIN routine
83
74
 
84
75
  chatgpt.printAllFunctions() // to console
85
76
 
86
77
  // CHILL a bit if your hacks depend on delayed DOM content
87
78
  await chatgpt.isLoaded()
88
- await new Promise(resolve => setTimeout(resolve, 500)); // sleep .5s
79
+ await new Promise(resolve => setTimeout(resolve, 500)) // sleep .5s
89
80
 
90
81
  // Add RISING PARTICLES styles for modals
91
- ['gray', 'white'].forEach(color => document.head.append(
82
+ ;['gray', 'white'].forEach(color => document.head.append(
92
83
  dom.create.elem('link', { rel: 'stylesheet',
93
84
  href: `https://cdn.jsdelivr.net/gh/adamlui/ai-web-extensions@727feff/assets/styles/rising-particles/dist/${
94
85
  color}.min.css`
@@ -111,7 +102,7 @@
111
102
  window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes
112
103
  'change', () => requestAnimationFrame(handleSchemePrefChange))
113
104
  function handleSchemePrefChange() {
114
- const displayedScheme = getScheme()
105
+ const displayedScheme = ui.getScheme()
115
106
  if (env.ui.scheme != displayedScheme) { env.ui.scheme = displayedScheme ; modals.stylize() }
116
107
  }
117
108
 
@@ -51,7 +51,7 @@ const chatgpt = {
51
51
  footer: 'div#thread-bottom-container > div:last-of-type > div, span.text-sm.leading-none',
52
52
  header: 'div#page-header, main div.sticky:first-of-type',
53
53
  links: { newChat: 'nav a[href="/"]', sidebarItem: 'nav a' },
54
- sidebar: 'div[class*=sidebar]:has(nav > div#sidebar-header)',
54
+ sidebar: 'div.bg-token-sidebar-surface-primary',
55
55
  ssgManifest: 'script[src*="_ssgManifest.js"]'
56
56
  },
57
57
 
@@ -128,15 +128,16 @@ const chatgpt = {
128
128
  drag: {
129
129
  mousedown(event) { // find modal, update styles, attach listeners, init XY offsets
130
130
  if (event.button != 0) return // prevent non-left-click drag
131
- if (getComputedStyle(event.target).cursor == 'pointer') return // prevent drag on interactive elems
131
+ if (!/auto|default/.test(getComputedStyle(event.target).cursor))
132
+ return // prevent drag on interactive elems
132
133
  chatgpt.draggingModal = event.currentTarget
133
134
  event.preventDefault() // prevent sub-elems like icons being draggable
134
135
  Object.assign(chatgpt.draggingModal.style, {
135
136
  transition: '0.1s', willChange: 'transform', transform: 'scale(1.05)' })
136
- document.body.style.cursor = 'grabbing'; // update cursor
137
- [...chatgpt.draggingModal.children] // prevent hover FX if drag lags behind cursor
138
- .forEach(child => child.style.pointerEvents = 'none');
139
- ['mousemove', 'mouseup'].forEach(eventType => // add listeners
137
+ document.body.style.cursor = 'grabbing' // update cursor
138
+ ;[...chatgpt.draggingModal.children] // prevent hover FX if drag lags behind cursor
139
+ .forEach(child => child.style.pointerEvents = 'none')
140
+ ;['mousemove', 'mouseup'].forEach(eventType => // add listeners
140
141
  document.addEventListener(eventType, handlers.drag[eventType]))
141
142
  const draggingModalRect = chatgpt.draggingModal.getBoundingClientRect()
142
143
  handlers.drag.offsetX = event.clientX - draggingModalRect.left +21
@@ -153,10 +154,10 @@ const chatgpt = {
153
154
  mouseup() { // restore styles/pointer events, remove listeners, reset chatgpt.draggingModal
154
155
  Object.assign(chatgpt.draggingModal.style, { // restore styles
155
156
  cursor: 'inherit', transition: 'inherit', willChange: 'auto', transform: 'scale(1)' })
156
- document.body.style.cursor = ''; // restore cursor
157
- [...chatgpt.draggingModal.children] // restore pointer events
158
- .forEach(child => child.style.pointerEvents = '');
159
- ['mousemove', 'mouseup'].forEach(eventType => // remove listeners
157
+ document.body.style.cursor = '' // restore cursor
158
+ ;[...chatgpt.draggingModal.children] // restore pointer events
159
+ .forEach(child => child.style.pointerEvents = '')
160
+ ;['mousemove', 'mouseup'].forEach(eventType => // remove listeners
160
161
  document.removeEventListener(eventType, handlers.drag[eventType]))
161
162
  chatgpt.draggingModal = null
162
163
  }
@@ -180,7 +181,7 @@ const chatgpt = {
180
181
  modalStyle.setAttribute('last-updated', thisUpdated.toString())
181
182
  document.head.append(modalStyle)
182
183
  }
183
- modalStyle.innerText = ( // update prev/new style contents
184
+ modalStyle.textContent = ( // update prev/new style contents
184
185
  `.chatgpt-modal { /* vars */
185
186
  --transition: opacity 0.65s cubic-bezier(.165,.84,.44,1), /* for fade-in */
186
187
  transform 0.55s cubic-bezier(.165,.84,.44,1) ; /* for move-in */
@@ -232,7 +233,7 @@ const chatgpt = {
232
233
  display: flex ; justify-content: flex-end ; margin: 20px -5px -3px 0 ;
233
234
  ${ isMobile ? 'flex-direction: column-reverse' : '' }}
234
235
  .chatgpt-modal button {
235
- font-size: 14px ; text-transform: uppercase ;
236
+ font-size: 14px ; text-transform: uppercase ; cursor: crosshair ;
236
237
  margin-left: ${ isMobile ? 0 : 10 }px ; padding: ${ isMobile ? 15 : 8 }px 18px ;
237
238
  ${ isMobile ? 'margin-top: 5px ; margin-bottom: 3px ;' : '' }
238
239
  border-radius: 0 ; border: 1px solid ${ scheme == 'dark' ? 'white' : 'black' };
@@ -270,7 +271,7 @@ const chatgpt = {
270
271
  }
271
272
 
272
273
  // Insert text into elems
273
- modalTitle.innerText = title || '' ; modalMessage.innerText = msg || '' ; chatgpt.renderHTML(modalMessage)
274
+ modalTitle.textContent = title || '' ; modalMessage.innerText = msg || '' ; chatgpt.renderHTML(modalMessage)
274
275
 
275
276
  // Create/append buttons (if provided) to buttons div
276
277
  const modalButtons = document.createElement('div')
@@ -1299,7 +1300,7 @@ const chatgpt = {
1299
1300
  const notificationDiv = document.createElement('div') // make div
1300
1301
  notificationDiv.id = Math.floor(chatgpt.randomFloat() * 1000000) + Date.now()
1301
1302
  notificationDiv.classList.add('chatgpt-notif')
1302
- notificationDiv.innerText = msg // insert msg
1303
+ notificationDiv.textContent = msg // insert msg
1303
1304
  document.body.append(notificationDiv) // insert into DOM
1304
1305
 
1305
1306
  // Create/append close button
@@ -1332,7 +1333,7 @@ const chatgpt = {
1332
1333
  notifStyle.setAttribute('last-updated', thisUpdated.toString())
1333
1334
  document.head.append(notifStyle)
1334
1335
  }
1335
- notifStyle.innerText = ( // update prev/new style contents
1336
+ notifStyle.textContent = ( // update prev/new style contents
1336
1337
  '.chatgpt-notif {'
1337
1338
  + 'font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC",'
1338
1339
  + '"Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif ;'
@@ -1368,7 +1369,7 @@ const chatgpt = {
1368
1369
  notificationDiv.style.right = notificationDiv.isRight ? vpXoffset.toString() + 'px' : ''
1369
1370
  notificationDiv.style.left = !notificationDiv.isRight ? vpXoffset.toString() + 'px' : ''
1370
1371
 
1371
- // Reposition old notifications
1372
+ // Re-position old notifications
1372
1373
  const thisQuadrantQueue = notifyProps.queue[notificationDiv.quadrant]
1373
1374
  if (thisQuadrantQueue.length > 1) {
1374
1375
  try { // to move old notifications
@@ -1378,7 +1379,7 @@ const chatgpt = {
1378
1379
  vOffset = +parseInt(oldDiv.style[offsetProp]) +5 + oldDiv.getBoundingClientRect().height
1379
1380
  oldDiv.style[offsetProp] = `${ vOffset }px` // change prop
1380
1381
  }
1381
- } catch (err) {}
1382
+ } catch (err) { console.warn('Failed to re-position notification:', err) }
1382
1383
  }
1383
1384
 
1384
1385
  // Show notification
@@ -1762,8 +1763,7 @@ const chatgpt = {
1762
1763
  activateObserver() {
1763
1764
 
1764
1765
  // Stop the previous observer to preserve resources
1765
- if (this.observer instanceof MutationObserver)
1766
- try { this.observer.disconnect() } catch (e) {}
1766
+ if (this.observer instanceof MutationObserver) this.observer.disconnect()
1767
1767
 
1768
1768
  if (!this.elems.length) return console.error('🤖 chatgpt.js >> No elems to append!')
1769
1769
 
@@ -2,7 +2,6 @@
2
2
  // Source: https://github.com/adamlui/ai-web-extensions/blob/main/assets/lib/dom.js/src/dom.js
3
3
 
4
4
  window.dom = {
5
- import(deps) { Object.assign(this.imports = this.imports || {}, deps) },
6
5
 
7
6
  addRisingParticles(targetNode, { lightScheme = 'gray', darkScheme = 'white' } = {}) {
8
7
  // * Requires https://assets.aiwebextensions.com/styles/rising-particles/dist/<lightScheme>.min.css
@@ -12,11 +11,11 @@ window.dom = {
12
11
  particlesDivsWrapper.style.cssText = (
13
12
  'position: absolute ; top: 0 ; left: 0 ;' // hug targetNode's top-left corner
14
13
  + 'height: 100% ; width: 100% ; border-radius: 15px ; overflow: clip ;' // bound innards exactly by targetNode
15
- + 'z-index: -1' ); // allow interactive elems to be clicked
16
- ['sm', 'med', 'lg'].forEach(particleSize => {
14
+ + 'z-index: -1' ) // allow interactive elems to be clicked
15
+ ;['sm', 'med', 'lg'].forEach(particleSize => {
17
16
  const particlesDiv = document.createElement('div')
18
- particlesDiv.id = this.imports.config?.bgAnimationsDisabled ? `particles-${particleSize}-off`
19
- : `${( this.imports.env?.ui?.scheme || this.imports.env?.ui?.app?.scheme ) == 'dark' ? darkScheme
17
+ particlesDiv.id = config?.bgAnimationsDisabled ? `particles-${particleSize}-off`
18
+ : `${( env?.ui?.scheme || env?.ui?.app?.scheme ) == 'dark' ? darkScheme
20
19
  : lightScheme }-particles-${particleSize}`
21
20
  particlesDivsWrapper.append(particlesDiv)
22
21
  })
@@ -41,8 +40,9 @@ window.dom = {
41
40
 
42
41
  style(content, attrs = {}) {
43
42
  const style = document.createElement('style')
43
+ style.setAttribute('type', 'text/css') // support older browsers
44
44
  for (const attr in attrs) style.setAttribute(attr, attrs[attr])
45
- if (content) style.innerText = content
45
+ if (content) style.textContent = content
46
46
  return style
47
47
  },
48
48
 
@@ -94,17 +94,18 @@ window.dom = {
94
94
  computedWidth(elems) { return this.computedSize(elems, { dimension: 'width' }) }, // including margins
95
95
 
96
96
  loadedElem(selector, { timeout = null } = {}) {
97
- const timeoutPromise = new Promise(resolve =>
98
- timeout ? setTimeout(() => resolve(null), timeout) : undefined)
99
- const isLoadedPromise = new Promise(resolve => {
100
- const elem = document.querySelector(selector)
101
- if (elem) resolve(elem)
102
- else new MutationObserver((_, obs) => {
97
+ const raceEntries = [
98
+ new Promise(resolve => { // when elem loads
103
99
  const elem = document.querySelector(selector)
104
- if (elem) { obs.disconnect() ; resolve(elem) }
105
- }).observe(document.documentElement, { childList: true, subtree: true })
106
- })
107
- return Promise.race([isLoadedPromise, timeoutPromise])
100
+ if (elem) resolve(elem)
101
+ else new MutationObserver((_, obs) => {
102
+ const elem = document.querySelector(selector)
103
+ if (elem) { obs.disconnect() ; resolve(elem) }
104
+ }).observe(document.documentElement, { childList: true, subtree: true })
105
+ })
106
+ ]
107
+ if (timeout) raceEntries.push(new Promise(resolve => setTimeout(() => resolve(null), timeout)))
108
+ return Promise.race(raceEntries)
108
109
  }
109
110
  }
110
111
  };
@@ -3,7 +3,7 @@ window.settings = {
3
3
 
4
4
  controls: {
5
5
  // Add settings options as keys, with each key's value being an object that includes:
6
- // - 'type': the control type (e.g. 'toggle' or 'prompt')
6
+ // - 'type': the control type (e.g. 'toggle', 'link' or 'prompt')
7
7
  // - 'label': a descriptive label
8
8
  // - 'defaultVal' (optional): default value of setting (true for toggles if unspecified, false otherwise)
9
9
  // - 'category' (optional): string key from this.categories to group control under
@@ -0,0 +1,6 @@
1
+ window.ui = {
2
+ getScheme() {
3
+ return /\b(light|dark)\b/.exec(document.documentElement.className)?.[1]
4
+ || ( window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' )
5
+ }
6
+ };
@@ -3,14 +3,14 @@
3
3
  "name": "ChatGPT Extension",
4
4
  "short_name": "ChatGPT 🧩",
5
5
  "description": "A Chromium extension template to start using chatgpt.js like a boss!",
6
- "version": "2025.4.28",
6
+ "version": "2025.5.11",
7
7
  "author": "KudoAI",
8
8
  "homepage_url": "https://github.com/KudoAI/chatgpt.js-chrome-starter",
9
9
  "icons": { "16": "icons/icon16.png", "32": "icons/icon32.png", "64": "icons/icon64.png", "128": "icons/icon128.png" },
10
- "permissions": [ "activeTab", "storage" ],
10
+ "permissions": ["activeTab", "storage"],
11
11
  "action": { "default_popup": "popup/index.html" },
12
- "web_accessible_resources": [{ "matches": [ "<all_urls>" ], "resources": [ "components/*", "lib/*" ]}],
13
- "content_scripts": [{ "matches": [ "https://chatgpt.com/*" ], "js": [ "content.js" ] }],
12
+ "web_accessible_resources": [{ "matches": ["<all_urls>"], "resources": ["components/*", "lib/*"] }],
13
+ "content_scripts": [{ "matches": ["https://chatgpt.com/*"], "js": ["content.js"] }],
14
14
  "background": { "service_worker": "service-worker.js" },
15
15
  "minimum_chrome_version": "88"
16
16
  }
@@ -5,14 +5,13 @@
5
5
  await import(chrome.runtime.getURL(resource))
6
6
 
7
7
  // Init ENV context
8
- const env = {
8
+ window.env = {
9
9
  site: new URL((await chrome.tabs.query({ active: true, currentWindow: true }))[0].url)
10
10
  .hostname.split('.').slice(-2, -1)[0] // extract 2nd-level domain
11
11
  }
12
12
 
13
13
  // Import DATA
14
- const { app } = await chrome.storage.local.get('app')
15
- icons.import({ app }) // for src's using app.urls.assetHost
14
+ ;({ app: window.app } = await chrome.storage.local.get('app'))
16
15
 
17
16
  // Define FUNCTIONS
18
17
 
@@ -28,7 +27,7 @@
28
27
  entry.leftElem.append(dom.create.elem('span', { class: 'track' }))
29
28
  entry.leftElem.classList.toggle('on', settings.typeIsEnabled(entryData.key))
30
29
  } else { // add symbol to left, append status to right
31
- entry.leftElem.innerText = entryData.symbol || '⚙️'
30
+ entry.leftElem.textContent = entryData.symbol || '⚙️'
32
31
  if (entryData.status) entry.label.textContent += ` — ${entryData.status}`
33
32
  }
34
33
  if (entryData.type == 'category') entry.div.append(icons.create('caretDown', { size: 11, class: 'menu-caret' }))
@@ -39,7 +38,7 @@
39
38
  settings.save(entryData.key, !config[entryData.key]) ; sync.configToUI({ updatedKey: entryData.key })
40
39
  notify(`${entryData.label} ${chrome.i18n.getMessage(`state_${
41
40
  settings.typeIsEnabled(entryData.key) ? 'on' : 'off' }`).toUpperCase()}`)
42
- }
41
+ } else if (entryData.type == 'link') { open(entryData.url) ; close() }
43
42
  }
44
43
  entry.div.append(entry.leftElem, entry.label)
45
44
  return entry.div
@@ -49,7 +48,7 @@
49
48
 
50
49
  async function sendMsgToActiveTab(action, options) {
51
50
  const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true })
52
- return await chrome.tabs.sendMessage(activeTab.id, { action: action, options: { ...options }})
51
+ return await chrome.tabs.sendMessage(activeTab.id, { action, options })
53
52
  }
54
53
 
55
54
  const sync = {
@@ -79,6 +78,7 @@
79
78
  catChildrenDiv = categoryDiv.nextSibling,
80
79
  catChild = catChildrenDiv.querySelectorAll('.menu-entry')
81
80
  if (action != 'hide' && dom.get.computedHeight(catChildrenDiv) == 0) { // show category settings
81
+ categoryDiv.classList.toggle('expanded', true)
82
82
  Object.assign(catChildrenDiv.style, { height: `${dom.get.computedHeight(catChild)}px`,
83
83
  transition: transitions ? 'height 0.25s' : '' })
84
84
  Object.assign(caret.style, { // point it down
@@ -93,6 +93,7 @@
93
93
  document.querySelectorAll(`.menu-entry:has(.menu-caret):not(#${category})`).forEach(otherCategoryDiv =>
94
94
  toggleCategorySettingsVisiblity(otherCategoryDiv.id, { action: 'hide' }))
95
95
  } else { // hide category settings
96
+ categoryDiv.classList.toggle('expanded', false)
96
97
  Object.assign(catChildrenDiv.style, { height: 0, transition: '' })
97
98
  Object.assign(caret.style, { transform: 'rotate(-90deg)', transition: '' }) // point it right
98
99
  }
@@ -55,6 +55,7 @@ header {
55
55
  border-left: 4px solid transparent ; height: 0 ; overflow: hidden ;
56
56
  border-image: linear-gradient(transparent, rgb(161 161 161)) 30 100%
57
57
  }
58
+ .expanded > span { font-weight: 500 ; transform: scale(1.05) ; margin-left: 2px }
58
59
 
59
60
  /* Toggle elements */
60
61
  .toggle .track {
@@ -70,7 +71,6 @@ header {
70
71
 
71
72
  /* Footer */
72
73
  footer { display: flex ; align-items: center ; background: #f5f5f5 ; height: 40px ; padding: 0 7px }
73
- footer > span:has(> .cjs-logo) { display: flex ; align-items: center ; flex-grow: 1 ; padding-left: 2px }
74
74
  .cjs-logo { opacity: 0.5 } .cjs-logo:hover { opacity: 1 ; transition: 0.25s }
75
75
  footer > .menu-icon {
76
76
  display: flex ; opacity: 0.7 ; align-items: center ; padding: 8px 5px ;
@@ -79,6 +79,8 @@ footer > .menu-icon {
79
79
  footer img[src*=question-mark] { position: relative ; top: 1px }
80
80
 
81
81
  /* Non-baseline features */
82
+ @supports (cursor: pointer) { .highlight-on-hover:hover, .toggle .track, .cjs-logo { cursor: pointer }}
82
83
  @supports (overflow: clip) { body { overflow: clip }}
84
+ @supports selector(:has(> .cjs-logo)) {
85
+ footer > span:has(> .cjs-logo) { display: flex ; align-items: center ; flex-grow: 1 ; padding-left: 2px }}
83
86
  @supports (user-select: none) { body, button, input, select, textarea { user-select: none }}
84
- @supports (cursor: pointer) { .highlight-on-hover:hover, .toggle .track, .cjs-logo { cursor: pointer }}
@@ -1,7 +1,7 @@
1
1
  const chatgptURL = 'https://chatgpt.com'
2
2
 
3
3
  // Init APP data
4
- const app = {
4
+ chrome.storage.local.set({ app: {
5
5
  name: chrome.runtime.getManifest().name,
6
6
  version: chrome.runtime.getManifest().version, symbol: '🤖', cssPrefix: 'chatgpt-extension',
7
7
  author: { name: 'KudoAI', url: 'https://kudoai.com' },
@@ -13,8 +13,7 @@ const app = {
13
13
  relatedExtensions: 'https://aiwebextensions.com',
14
14
  support: 'https://github.com/KudoAI/chatgpt.js-chrome-starter/issues'
15
15
  }
16
- }
17
- chrome.storage.local.set({ app }) // save to Chrome storage
16
+ }}) // save to Chrome storage
18
17
 
19
18
  // Launch CHATGPT on install
20
19
  chrome.runtime.onInstalled.addListener(details => {
@@ -3,12 +3,12 @@
3
3
  // @description A Greasemonkey template to start using chatgpt.js like a boss
4
4
  // @author chatgpt.js
5
5
  // @namespace https://chatgpt.js.org
6
- // @version 2025.4.28
6
+ // @version 2025.5.11
7
7
  // @license MIT
8
8
  // @icon https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@1fc50da/starters/greasemonkey/assets/images/icons/robot/icon48.png
9
9
  // @icon64 https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@1fc50da/starters/greasemonkey/assets/images/icons/robot/icon64.png
10
10
  // @match *://chatgpt.com/*
11
- // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.0/dist/chatgpt.min.js
11
+ // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.8.1/dist/chatgpt.min.js
12
12
  // @grant GM_getValue
13
13
  // @grant GM_setValue
14
14
  // @noframes