@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.
- package/LICENSE.md +1 -1
- package/README.md +153 -87
- package/chatgpt.js +67 -56
- package/dist/chatgpt.min.js +4 -4
- package/docs/README.md +153 -87
- package/docs/SECURITY.md +15 -15
- package/docs/USERGUIDE.md +19 -5
- package/package.json +9 -6
- package/starters/chrome/LICENSE.md +3 -3
- package/starters/chrome/docs/README.md +5 -5
- package/starters/chrome/docs/SECURITY.md +3 -5
- package/starters/chrome/extension/components/modals.js +12 -6
- package/starters/chrome/extension/content.js +16 -9
- package/starters/chrome/extension/icons/faded/icon128.png +0 -0
- package/starters/chrome/extension/icons/faded/icon16.png +0 -0
- package/starters/chrome/extension/icons/faded/icon32.png +0 -0
- package/starters/chrome/extension/icons/faded/icon64.png +0 -0
- package/starters/chrome/extension/lib/chatgpt.js +67 -56
- package/starters/chrome/extension/lib/dom.js +65 -13
- package/starters/chrome/extension/lib/settings.js +7 -8
- package/starters/chrome/extension/manifest.json +1 -1
- package/starters/chrome/extension/popup/controller.js +6 -6
- package/starters/chrome/extension/popup/index.html +1 -1
- package/starters/chrome/extension/popup/style.css +3 -4
- package/starters/chrome/extension/service-worker.js +1 -1
- package/starters/chrome/images/icons/question-mark/icon16.png +0 -0
- package/starters/chrome/images/icons/question-mark/icon512.png +0 -0
- package/starters/docs/LICENSE.md +21 -1
- package/starters/docs/README.md +19 -6
- package/starters/greasemonkey/LICENSE.md +3 -3
- package/starters/greasemonkey/chatgpt.js-greasemonkey-starter.user.js +5 -6
- package/starters/greasemonkey/docs/README.md +1 -1
- package/starters/greasemonkey/docs/SECURITY.md +3 -5
- /package/starters/greasemonkey/{media → assets}/images/icons/robot/icon48.png +0 -0
- /package/starters/greasemonkey/{media → assets}/images/icons/robot/icon64.png +0 -0
- /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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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": "
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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.
|
|
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.
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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',
|
|
Binary file
|
|
Binary file
|
package/starters/docs/LICENSE.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<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
|
package/starters/docs/README.md
CHANGED
|
@@ -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://
|
|
8
|
-
|
|
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>
|
|
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/
|
|
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://
|
|
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://
|
|
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://
|
|
5
|
-
|
|
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
|
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–
|
|
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
|
|
6
|
+
// @version 2025.2.1
|
|
7
7
|
// @license MIT
|
|
8
|
-
// @icon https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@
|
|
9
|
-
// @icon64 https://cdn.jsdelivr.net/gh/KudoAI/chatgpt.js@
|
|
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
|
-
// @
|
|
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–
|
|
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
|
|
|
@@ -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://
|
|
5
|
-
|
|
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
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
/package/starters/greasemonkey/{media → assets}/images/screenshots/chatgpt-userscript-on.png
RENAMED
|
File without changes
|