@kudoai/chatgpt.js 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +153 -87
  3. package/chatgpt.js +67 -56
  4. package/dist/chatgpt.min.js +4 -4
  5. package/docs/README.md +153 -87
  6. package/docs/SECURITY.md +15 -15
  7. package/docs/USERGUIDE.md +19 -5
  8. package/package.json +9 -6
  9. package/starters/chrome/LICENSE.md +3 -3
  10. package/starters/chrome/docs/README.md +5 -5
  11. package/starters/chrome/docs/SECURITY.md +3 -5
  12. package/starters/chrome/extension/components/modals.js +12 -6
  13. package/starters/chrome/extension/content.js +16 -9
  14. package/starters/chrome/extension/icons/faded/icon128.png +0 -0
  15. package/starters/chrome/extension/icons/faded/icon16.png +0 -0
  16. package/starters/chrome/extension/icons/faded/icon32.png +0 -0
  17. package/starters/chrome/extension/icons/faded/icon64.png +0 -0
  18. package/starters/chrome/extension/lib/chatgpt.js +67 -56
  19. package/starters/chrome/extension/lib/dom.js +65 -13
  20. package/starters/chrome/extension/lib/settings.js +7 -8
  21. package/starters/chrome/extension/manifest.json +1 -1
  22. package/starters/chrome/extension/popup/controller.js +6 -6
  23. package/starters/chrome/extension/popup/index.html +1 -1
  24. package/starters/chrome/extension/popup/style.css +3 -4
  25. package/starters/chrome/extension/service-worker.js +1 -1
  26. package/starters/chrome/images/icons/question-mark/icon16.png +0 -0
  27. package/starters/chrome/images/icons/question-mark/icon512.png +0 -0
  28. package/starters/docs/LICENSE.md +21 -1
  29. package/starters/docs/README.md +19 -6
  30. package/starters/greasemonkey/LICENSE.md +3 -3
  31. package/starters/greasemonkey/chatgpt.js-greasemonkey-starter.user.js +5 -6
  32. package/starters/greasemonkey/docs/README.md +1 -1
  33. package/starters/greasemonkey/docs/SECURITY.md +3 -5
  34. /package/starters/greasemonkey/{media → assets}/images/icons/robot/icon48.png +0 -0
  35. /package/starters/greasemonkey/{media → assets}/images/icons/robot/icon64.png +0 -0
  36. /package/starters/greasemonkey/{media → assets}/images/screenshots/chatgpt-userscript-on.png +0 -0
@@ -1,17 +1,51 @@
1
1
  window.dom = {
2
2
 
3
3
  imports: {
4
- import(deps) { // { env) }
4
+ import(deps) { // { config, env }
5
5
  for (const depName in deps) this[depName] = deps[depName] }
6
6
  },
7
7
 
8
+ addRisingParticles(targetNode, { lightScheme = 'gray', darkScheme = 'white' } = {}) {
9
+ // Requires https://assets.aiwebextensions.com/styles/rising-particles/dist/<lightScheme|darkScheme>.min.css
10
+
11
+ if (targetNode.querySelector('[id*=particles]')) return
12
+ const particlesDivsWrapper = document.createElement('div')
13
+ particlesDivsWrapper.style.cssText = (
14
+ 'position: absolute ; top: 0 ; left: 0 ;' // hug targetNode's top-left corner
15
+ + 'height: 100% ; width: 100% ; border-radius: 15px ; overflow: clip ;' // bound innards exactly by targetNode
16
+ + 'z-index: -1' ); // allow interactive elems to be clicked
17
+ ['sm', 'med', 'lg'].forEach(particleSize => {
18
+ const particlesDiv = document.createElement('div')
19
+ particlesDiv.id = this.imports.config?.bgAnimationsDisabled ? `particles-${particleSize}-off`
20
+ : `${( this.imports.env?.ui?.scheme || this.imports.env?.ui?.app?.scheme ) == 'dark' ? darkScheme
21
+ : lightScheme }-particles-${particleSize}`
22
+ particlesDivsWrapper.append(particlesDiv)
23
+ })
24
+ targetNode.prepend(particlesDivsWrapper)
25
+ },
26
+
8
27
  create: {
28
+ anchor(linkHref, displayContent, attrs = {}) {
29
+ const anchor = document.createElement('a'),
30
+ defaultAttrs = { href: linkHref, target: '_blank', rel: 'noopener' },
31
+ finalAttrs = { ...defaultAttrs, ...attrs }
32
+ Object.entries(finalAttrs).forEach(([attr, value]) => anchor.setAttribute(attr, value))
33
+ if (displayContent) anchor.append(displayContent)
34
+ return anchor
35
+ },
36
+
9
37
  elem(elemType, attrs = {}) {
10
38
  const elem = document.createElement(elemType)
11
39
  for (const attr in attrs) elem.setAttribute(attr, attrs[attr])
12
40
  return elem
13
41
  },
14
42
 
43
+ style(content) {
44
+ const style = document.createElement('style')
45
+ if (content) style.innerText = content
46
+ return style
47
+ },
48
+
15
49
  svgElem(type, attrs) {
16
50
  const elem = document.createElementNS('http://www.w3.org/2000/svg', type)
17
51
  for (const attr in attrs) elem.setAttributeNS(null, attr, attrs[attr])
@@ -19,17 +53,35 @@ window.dom = {
19
53
  }
20
54
  },
21
55
 
22
- fillStarryBG(targetNode) { // requires https://assets.aiwebextensions.com/styles/rising-stars/css/<black|white>.min.css
23
- if (targetNode.querySelector('[id*=stars]')) return
24
- const starsDivsContainer = document.createElement('div')
25
- starsDivsContainer.style.cssText = 'position: absolute ; top: 0 ; left: 0 ;' // hug targetNode's top-left corner
26
- + 'height: 100% ; width: 100% ; border-radius: 15px ; overflow: clip ;' // bound innards exactly by targetNode
27
- + 'z-index: -1'; // allow interactive elems to be clicked
28
- ['sm', 'med', 'lg'].forEach(starSize => {
29
- const starsDiv = document.createElement('div')
30
- starsDiv.id = `${ this.imports.env.ui.scheme == 'dark' ? 'white' : 'black' }-stars-${starSize}`
31
- starsDivsContainer.append(starsDiv)
32
- })
33
- targetNode.prepend(starsDivsContainer)
56
+ cssSelectorize(classList) {
57
+ return classList.toString()
58
+ .replace(/([:[\]\\])/g, '\\$1') // escape special chars :[]\
59
+ .replace(/^| /g, '.') // prefix w/ dot, convert spaces to dots
60
+ },
61
+
62
+ get: {
63
+ computedWidth(...elems) { // including margins
64
+ let totalWidth = 0
65
+ elems.map(arg => arg instanceof NodeList ? [...arg] : arg).flat().forEach(elem => {
66
+ if (!(elem instanceof Element)) return
67
+ const elemStyle = getComputedStyle(elem) ; if (elemStyle.display == 'none') return
68
+ totalWidth += elem.getBoundingClientRect().width + parseFloat(elemStyle.marginLeft)
69
+ + parseFloat(elemStyle.marginRight)
70
+ })
71
+ return totalWidth
72
+ },
73
+
74
+ loadedElem(selector, timeout = null) {
75
+ const timeoutPromise = timeout ? new Promise(resolve => setTimeout(() => resolve(null), timeout)) : null
76
+ const isLoadedPromise = new Promise(resolve => {
77
+ const elem = document.querySelector(selector)
78
+ if (elem) resolve(elem)
79
+ else new MutationObserver((_, obs) => {
80
+ const elem = document.querySelector(selector)
81
+ if (elem) { obs.disconnect() ; resolve(elem) }
82
+ }).observe(document.documentElement, { childList: true, subtree: true })
83
+ })
84
+ return ( timeoutPromise ? Promise.race([isLoadedPromise, timeoutPromise]) : isLoadedPromise )
85
+ }
34
86
  }
35
87
  };
@@ -6,6 +6,7 @@ window.settings = {
6
6
  // Add settings options as keys, with each key's value being an object that includes:
7
7
  // - 'type': the control type (e.g. 'toggle' or 'prompt')
8
8
  // - 'label': a descriptive label
9
+ // - 'defaultVal' (optional): default value of setting (true for toggles if unspecified, false otherwise)
9
10
  // - 'symbol' (optional): for icon display (e.g. ⌚)
10
11
  // NOTE: Toggles are disabled by default unless key name contains 'disabled' or 'hidden' (case insensitive)
11
12
  // NOTE: Controls are displayed in top-to-bottom order
@@ -14,14 +15,12 @@ window.settings = {
14
15
  // replyLanguage: { type: 'prompt', symbol: '🌐', label: 'Reply Language' }
15
16
  },
16
17
 
17
- load() {
18
- const keys = ( // original array if array, else new array from multiple args
19
- Array.isArray(arguments[0]) ? arguments[0] : Array.from(arguments))
20
- return Promise.all(keys.map(key => // resolve promise when all keys load
21
- new Promise(resolve => // resolve promise when single key value loads
22
- chrome.storage.sync.get(key, result => { // load from Chrome extension storage
23
- window.config[key] = result[key] || false ; resolve()
24
- }))))},
18
+ load(...keys) {
19
+ return Promise.all(keys.flat().map(async key => // resolve promise when all keys load
20
+ window.config[key] = (await chrome.storage.sync.get(key))[key]
21
+ ?? this.controls[key]?.defaultVal ?? this.controls[key]?.type == 'toggle'
22
+ ))
23
+ },
25
24
 
26
25
  save(key, val) {
27
26
  chrome.storage.sync.set({ [key]: val }) // save to Chrome extension storage
@@ -3,7 +3,7 @@
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": "2024.12.29",
6
+ "version": "2025.2.1",
7
7
  "author": "KudoAI",
8
8
  "homepage_url": "https://github.com/KudoAI/chatgpt.js-chrome-starter",
9
9
  "icons": {
@@ -25,10 +25,10 @@
25
25
  fade() {
26
26
 
27
27
  // Update toolbar icon
28
- const iconDimensions = [16, 32, 64, 128], iconPaths = {}
29
- iconDimensions.forEach(dimension => iconPaths[dimension] = `../icons/${
30
- config.extensionDisabled ? 'faded/' : '' }icon${dimension}.png` )
31
- chrome.action.setIcon({ path: iconPaths })
28
+ chrome.action.setIcon({ path: Object.fromEntries(
29
+ Object.keys(chrome.runtime.getManifest().icons).map(dimension =>
30
+ [dimension, `../icons/${ config.extensionDisabled ? 'faded/' : '' }icon${dimension}.png`]
31
+ ))})
32
32
 
33
33
  // Update menu contents
34
34
  document.querySelectorAll('div.logo, div.menu-title, div.menu')
@@ -111,9 +111,9 @@
111
111
  const cjsDiv = dom.create.elem('div', { class: 'chatgpt-js' })
112
112
  const cjsLogo = dom.create.elem('img', {
113
113
  title: 'Powered by chatgpt.js',
114
- src: `${app.urls.cjsMediaHost}/images/badges/powered-by-chatgpt.js-faded.png?b2a1975` })
114
+ src: `${app.urls.cjsAssetHost}/images/badges/powered-by-chatgpt.js-faded.png?b2a1975` })
115
115
  cjsLogo.onmouseover = cjsLogo.onmouseout = event => cjsLogo.src = `${
116
- app.urls.cjsMediaHost}/images/badges/powered-by-chatgpt.js${
116
+ app.urls.cjsAssetHost}/images/badges/powered-by-chatgpt.js${
117
117
  event.type == 'mouseover' ? '' : '-faded' }.png?b2a1975`
118
118
  cjsLogo.onclick = () => chrome.tabs.create({ url: app.urls.chatgptJS })
119
119
  cjsDiv.append(cjsLogo) ; footer.append(cjsDiv)
@@ -10,7 +10,7 @@
10
10
  </div>
11
11
  <div class="menu-header">
12
12
  <div class="logo">
13
- <img width=26 src="https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@f0cdfc9/starters/chrome/extension/icons/icon32.png">
13
+ <img alt="" width=26 src="https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@f0cdfc9/starters/chrome/extension/icons/icon32.png">
14
14
  </div>
15
15
  <div class="menu-title">ChatGPT Extension</div>
16
16
  <div class="main-toggle">
@@ -1,5 +1,5 @@
1
1
  /* General size */
2
- html { height: fit-content ; min-height: 50px }
2
+ html { height: fit-content ; min-height: 89px }
3
3
  body { width: max-content ; margin: 0 ; overflow: clip }
4
4
 
5
5
  /* General font */
@@ -17,7 +17,7 @@ a:focus, a:hover { text-decoration: underline ; color: inherit }
17
17
  display: inline-grid ; align-content: center ; justify-content: center /* center spinner */
18
18
  }
19
19
  .loading-spinner {
20
- width: 11px ; aspect-ratio: 1 ; border-radius: 50% ; border: 5px solid #000 ;
20
+ width: 19px ; aspect-ratio: 1 ; border-radius: 50% ; border: 3px solid #000 ;
21
21
  animation: loader-move-head-tail 0.8s infinite linear alternate, loader-rotate 1.6s infinite linear
22
22
  }
23
23
  @keyframes loader-move-head-tail {
@@ -49,8 +49,7 @@ a:focus, a:hover { text-decoration: underline ; color: inherit }
49
49
  display: flex ; min-height: 2rem ; padding-right: 14px ; white-space: nowrap ; font-size: 91%
50
50
  }
51
51
  .menu-icon { padding: 8px }
52
- .menu-area:focus, .menu-area:hover { /* add hover color/cursor */
53
- color: var(--bg) ; background: rgb(100, 149, 237) ; cursor: pointer }
52
+ .menu-area:focus, .menu-area:hover { background: rgb(100,149,237) ; cursor: pointer } /* add hover color/cursor */
54
53
  .menu-item:hover span:not(.slider) { filter: invert(1) } /* invert setting labels on hover */
55
54
  .menu-item > label > .slider { transform: scale(0.95) ; top: 1px } /* make child toggles smaller */
56
55
  .menu-prompt { margin-left: 2px } /* align non-toggle items */
@@ -5,7 +5,7 @@ const app = {
5
5
  urls: {
6
6
  assetHost: 'https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js-chrome-starter',
7
7
  chatgptJS: 'https://chatgptjs.org',
8
- cjsMediaHost: 'https://media.chatgptjs.org',
8
+ cjsAssetHost: 'https://assets.chatgptjs.org',
9
9
  contributors: 'https://docs.chatgptjs.org/#-contributors',
10
10
  gitHub: 'https://github.com/KudoAI/chatgpt.js-chrome-starter',
11
11
  relatedExtensions: 'https://aiwebextensions.com',
@@ -1,5 +1,25 @@
1
1
  <div align="center">
2
- <h6><a href="./"><img height=15 style="margin: 0 3px -2px" src="https://raw.githubusercontent.com/KudoAI/chatgpt.js/6fa1659feadaf70853996dc7d7f6e1ab5a1e6301/media/images/icons/earth-americas.svg"></a> English | <a href="zh-cn/LICENSE.md">简体中文</a> | <a href="zh-tw/LICENSE.md">繁體中文</a> | <a href="ja/LICENSE.md">日本</a> | <a href="ko/LICENSE.md">한국인</a> | <a href="hi/LICENSE.md">हिंदी</a> | <a href="de/LICENSE.md">Deutsch</a> | <a href="es/LICENSE.md">Español</a> | <a href="fr/LICENSE.md">Français</a> | <a href="it/LICENSE.md">Italiano</a> | <a href="nl/LICENSE.md">Nederlands</a> | <a href="pt/LICENSE.md">Português</a> | <a href="vi/LICENSE.md">Việt</a></h6>
2
+ <h6>
3
+ <a href="./">
4
+ <picture>
5
+ <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://assets.chatgptjs.org/images/icons/earth/white/icon32.svg?v=e638eac">
6
+ <img height=14 src="https://assets.chatgptjs.org/images/icons/earth/black/icon32.svg?v=e638eac">
7
+ </picture>
8
+ </a>
9
+ English |
10
+ <a href="zh-cn/LICENSE.md">简体中文</a> |
11
+ <a href="zh-tw/LICENSE.md">繁體中文</a> |
12
+ <a href="ja/LICENSE.md">日本</a> |
13
+ <a href="ko/LICENSE.md">한국인</a> |
14
+ <a href="hi/LICENSE.md">हिंदी</a> |
15
+ <a href="de/LICENSE.md">Deutsch</a> |
16
+ <a href="es/LICENSE.md">Español</a> |
17
+ <a href="fr/LICENSE.md">Français</a> |
18
+ <a href="it/LICENSE.md">Italiano</a> |
19
+ <a href="nl/LICENSE.md">Nederlands</a> |
20
+ <a href="pt/LICENSE.md">Português</a> |
21
+ <a href="vi/LICENSE.md">Việt</a>
22
+ </h6>
3
23
  </div>
4
24
 
5
25
  # MIT License
@@ -4,10 +4,23 @@
4
4
  <h6>
5
5
  <a href="https://github.com/KudoAI/chatgpt.js/tree/main/starters/docs">
6
6
  <picture>
7
- <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://media.chatgptjs.org/images/icons/earth-americas-white-padded-icon17x15.svg?714b6a1">
8
- <img src="https://media.chatgptjs.org/images/icons/earth-americas-padded-icon17x15.svg?714b6a1">
7
+ <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://assets.chatgptjs.org/images/icons/earth/white/icon32.svg?v=e638eac">
8
+ <img height=14 src="https://assets.chatgptjs.org/images/icons/earth/black/icon32.svg?v=e638eac">
9
9
  </picture>
10
- </a> English | <a href="zh-cn#readme">简体中文</a> | <a href="zh-tw#readme">繁體中文</a> | <a href="ja#readme">日本</a> | <a href="ko#readme">한국인</a> | <a href="hi#readme">हिंदी</a> | <a href="de#readme">Deutsch</a> | <a href="es#readme">Español</a> | <a href="fr#readme">Français</a> | <a href="it#readme">Italiano</a> | <a href="nl#readme">Nederlands</a> | <a href="pt#readme">Português</a> | <a href="vi#readme">Việt</a>
10
+ </a>
11
+ English |
12
+ <a href="zh-cn#readme">简体中文</a> |
13
+ <a href="zh-tw#readme">繁體中文</a> |
14
+ <a href="ja#readme">日本</a> |
15
+ <a href="ko#readme">한국인</a> |
16
+ <a href="hi#readme">हिंदी</a> |
17
+ <a href="de#readme">Deutsch</a> |
18
+ <a href="es#readme">Español</a> |
19
+ <a href="fr#readme">Français</a> |
20
+ <a href="it#readme">Italiano</a> |
21
+ <a href="nl#readme">Nederlands</a> |
22
+ <a href="pt#readme">Português</a> |
23
+ <a href="vi#readme">Việt</a>
11
24
  </h6>
12
25
  </div>
13
26
 
@@ -17,15 +30,15 @@
17
30
 
18
31
  <br>
19
32
 
20
- <img src="../chrome/media/images/screenshots/extension-loaded.png">
33
+ <img src="../chrome/images/screenshots/extension-loaded.png">
21
34
 
22
- <h2><a href="../chrome"><img style="margin: 0 2px -1px 0" height=18 src="https://media.chatgptjs.org/images/icons/platforms/chrome/icon32.png?8c852fa5"></a> <a href="../chrome">Chrome starter</a></h2>
35
+ <h2><a href="../chrome"><img style="margin: 0 2px -1px 0" height=18 src="https://assets.chatgptjs.org/images/icons/platforms/chrome/icon32.png?v=e638eac"></a> <a href="../chrome">Chrome starter</a></h2>
23
36
 
24
37
  Template for creating a Chrome extension using chatgpt.js (including pop-up menu + settings management)
25
38
 
26
39
  [Repo](https://github.com/KudoAI/chatgpt.js-chrome-starter) / [Readme](../chrome#readme) / [Get help](https://github.com/KudoAI/chatgpt.js-chrome-starter/issues)
27
40
 
28
- <h2><a href="../greasemonkey"><img style="margin: 0 2px -0.065rem 0" height=19 src="https://media.chatgptjs.org/images/icons/platforms/tampermonkey/icon28.png?a3e53bf7"><img style="margin: 0 2px -0.035rem 1px" height=19.5 src="https://media.chatgptjs.org/images/icons/platforms/violentmonkey/icon25.png?a3e53bf7"></a> <a href="../greasemonkey">Greasemonkey starter</a></h2>
41
+ <h2><a href="../greasemonkey"><img style="margin: 0 2px -0.065rem 0" height=19 src="https://assets.chatgptjs.org/images/icons/platforms/tampermonkey/icon28.png?v=e638eac"><img style="margin: 0 2px -0.035rem 1px" height=19.5 src="https://assets.chatgptjs.org/images/icons/platforms/violentmonkey/icon25.png?v=e638eac"></a> <a href="../greasemonkey">Greasemonkey starter</a></h2>
29
42
 
30
43
  Template for creating a Greasemonkey userscript using chatgpt.js
31
44
 
@@ -1,8 +1,8 @@
1
1
  <div align="center">
2
2
  <h6>
3
3
  <picture>
4
- <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://media.chatgptjs.org/images/icons/earth-americas-white-icon32.svg?main">
5
- <img height=14 src="https://media.chatgptjs.org/images/icons/earth-americas-icon32.svg?main">
4
+ <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://assets.chatgptjs.org/images/icons/earth/white/icon32.svg?v=e638eac">
5
+ <img height=14 src="https://assets.chatgptjs.org/images/icons/earth/black/icon32.svg?v=e638eac">
6
6
  </picture>
7
7
  &nbsp;English |
8
8
  <a href="docs/zh-cn/LICENSE.md">简体中文</a> |
@@ -22,7 +22,7 @@
22
22
 
23
23
  # 🏛️ MIT License
24
24
 
25
- **Copyright © 2023–2024 [KudoAI](https://github.com/KudoAI) & contributors**
25
+ **Copyright © 2023–2025 [KudoAI](https://github.com/KudoAI) & contributors**
26
26
 
27
27
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
28
28
 
@@ -3,13 +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 2024.12.29
6
+ // @version 2025.2.1
7
7
  // @license MIT
8
- // @icon https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@3.5.0/starters/greasemonkey/media/images/icons/robot/icon48.png
9
- // @icon64 https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@3.5.0/starters/greasemonkey/media/images/icons/robot/icon64.png
8
+ // @icon https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@1fc50da/starters/greasemonkey/assets/images/icons/robot/icon48.png
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
- // @match *://chat.openai.com/*
12
- // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.5.0/dist/chatgpt.min.js
11
+ // @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.6.0/dist/chatgpt.min.js
13
12
  // @grant GM_getValue
14
13
  // @grant GM_setValue
15
14
  // @noframes
@@ -17,7 +16,7 @@
17
16
  // @supportURL https://github.com/KudoAI/chatgpt.js-greasemonkey-starter/issues
18
17
  // ==/UserScript==
19
18
 
20
- // NOTE: This script relies on the powerful chatgpt.js library @ https://chatgpt.js.org © 2023–2024 KudoAI & contributors under the MIT license
19
+ // NOTE: This script relies on the powerful chatgpt.js library @ https://chatgpt.js.org © 2023–2025 KudoAI & contributors under the MIT license
21
20
 
22
21
  (async () => {
23
22
 
@@ -4,6 +4,6 @@
4
4
 
5
5
  <br>
6
6
 
7
- <img src="../media/images/screenshots/chatgpt-userscript-on.png">
7
+ <img src="../assets/images/screenshots/chatgpt-userscript-on.png">
8
8
 
9
9
  _For advanced Greasemonkey API methods, see: https://wiki.greasespot.net/Greasemonkey_Manual:API_
@@ -1,8 +1,8 @@
1
1
  <div align="right">
2
2
  <h6>
3
3
  <picture>
4
- <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://media.chatgptjs.org/images/icons/earth-americas-white-icon32.svg?main">
5
- <img height=14 src="https://media.chatgptjs.org/images/icons/earth-americas-icon32.svg?main">
4
+ <source type="image/svg+xml" media="(prefers-color-scheme: dark)" srcset="https://assets.chatgptjs.org/images/icons/earth/white/icon32.svg?v=e638eac">
5
+ <img height=14 src="https://assets.chatgptjs.org/images/icons/earth/black/icon32.svg?v=e638eac">
6
6
  </picture>
7
7
  &nbsp;English |
8
8
  <a href="https://github.com/KudoAI/chatgpt.js-greasemonkey-starter/blob/main/docs/zh-cn/SECURITY.md">简体中文</a> |
@@ -12,6 +12,4 @@
12
12
 
13
13
  # 🛡️ Security Policy
14
14
 
15
- If you find a vulnerability, please open a [draft security advisory](https://github.com/KudoAI/chatgpt.js-greasemonkey-starter/security/advisories/new).
16
-
17
- Pull requests are also welcome, but for safety reasons, send an email to <security@kudoai.com> and wait for a response before making it public.
15
+ If you find a vulnerability, please follow the reporting instructions @ https://tidelift.com/security