Compare commits
24 commits
feature/pw
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb5f4abb36 | ||
|
|
617707984d | ||
|
|
bd79f273e3 | ||
|
|
f45cd53bc4 | ||
|
|
f8675d9aa2 | ||
|
|
628217c4df | ||
|
|
4e473c4965 | ||
|
|
7088bbab29 | ||
|
|
74cb1ac2ee | ||
|
|
c2ddf2996b | ||
|
|
5c7f18f0f3 | ||
|
|
f499ac39da | ||
|
|
dfc8492b22 | ||
|
|
96de7e36ae | ||
|
|
72fb78aef7 | ||
|
|
8d4f734f04 | ||
|
|
bbbc0a2b2a | ||
|
|
26a7ac60d8 | ||
|
|
c96cae501c | ||
|
|
8af5e8050f | ||
|
|
3fcf06d41f | ||
|
|
a18ad930ed | ||
|
|
1fa02b34f4 | ||
|
|
ae4f30d4b6 |
7
.do/deploy.template.yaml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
spec:
|
||||
name: chatpad
|
||||
services:
|
||||
- name: chatpad
|
||||
git:
|
||||
branch: main
|
||||
repo_clone_url: https://github.com/deiucanta/chatpad.git
|
||||
11
.idea/.gitignore
vendored
|
|
@ -1,11 +0,0 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
#ide
|
||||
.vscode
|
||||
.idea
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="WEB_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/chatpad.iml" filepath="$PROJECT_DIR$/.idea/chatpad.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
# [Looking for maintainers!](https://github.com/deiucanta/chatpad/issues/106)
|
||||
|
||||

|
||||
|
||||
<h1 align="center">Chatpad AI</h1>
|
||||
|
|
@ -49,7 +47,7 @@ docker run --name chatpad -d -v `pwd`/config.json:/usr/share/nginx/html/config.j
|
|||
<!-- Railway -->
|
||||
[](https://railway.app/template/Ak6DUw?referralCode=9M8r62)
|
||||
|
||||
|
||||
[](https://cloud.digitalocean.com/apps/new?repo=https://github.com/deiucanta/chatpad/tree/main)
|
||||
|
||||
|
||||
## Give Feedback
|
||||
|
|
|
|||
239
package-lock.json
generated
|
|
@ -8,10 +8,11 @@
|
|||
"dependencies": {
|
||||
"@emotion/react": "^11.10.6",
|
||||
"@emotion/server": "^11.10.0",
|
||||
"@mantine/core": "^6.0.1",
|
||||
"@mantine/hooks": "^6.0.1",
|
||||
"@mantine/next": "^6.0.1",
|
||||
"@mantine/notifications": "^6.0.1",
|
||||
"@mantine/core": "^6.0.17",
|
||||
"@mantine/hooks": "^6.0.17",
|
||||
"@mantine/next": "^6.0.17",
|
||||
"@mantine/notifications": "^6.0.17",
|
||||
"@mantine/prism": "^6.0.17",
|
||||
"@tabler/icons-react": "^2.9.0",
|
||||
"@tanstack/react-location": "^3.7.4",
|
||||
"@types/node": "18.15.0",
|
||||
|
|
@ -29,6 +30,8 @@
|
|||
"next": "13.2.4",
|
||||
"openai": "^3.2.1",
|
||||
"openai-ext": "^1.2.6",
|
||||
"prism-react-renderer": "^1.3.1",
|
||||
"prismjs": "^1.29.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-icons": "^4.8.0",
|
||||
|
|
@ -37,9 +40,7 @@
|
|||
"typescript": "4.9.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@parcel/packager-raw-url": "^2.8.3",
|
||||
"@parcel/transformer-sass": "^2.8.3",
|
||||
"@parcel/transformer-webmanifest": "^2.8.3",
|
||||
"@types/downloadjs": "^1.4.3",
|
||||
"@types/lodash": "^4.14.191",
|
||||
"@types/react": "^18.0.28",
|
||||
|
|
@ -585,38 +586,38 @@
|
|||
]
|
||||
},
|
||||
"node_modules/@mantine/core": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.2.tgz",
|
||||
"integrity": "sha512-FP/qaMBzh2dDrZIFSAJB3vogWK3U8+nnwImKa+/ceo7EJLeauLNAssaoWn2TVnA6x5mIZnlPwkDtVqI8Q+K9Ww==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.17.tgz",
|
||||
"integrity": "sha512-g3EDxcTJKisvEGTsGJPCGXiDumwr4O0nGNXwoGLnrg19nh3FAMfEIq18sJJLtRrBuarSbrvgMVYvKx1R6rTOWg==",
|
||||
"dependencies": {
|
||||
"@floating-ui/react": "^0.19.1",
|
||||
"@mantine/styles": "6.0.2",
|
||||
"@mantine/utils": "6.0.2",
|
||||
"@mantine/styles": "6.0.17",
|
||||
"@mantine/utils": "6.0.17",
|
||||
"@radix-ui/react-scroll-area": "1.0.2",
|
||||
"react-remove-scroll": "^2.5.5",
|
||||
"react-textarea-autosize": "8.3.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@mantine/hooks": "6.0.2",
|
||||
"@mantine/hooks": "6.0.17",
|
||||
"react": ">=16.8.0",
|
||||
"react-dom": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@mantine/hooks": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.2.tgz",
|
||||
"integrity": "sha512-wLSkp0NRe4XN7JujIUvkKghIBJC9YZ33CJlrFbcBFLD6LiSLX7lWyWOsiFzXrPND0Hpgn3AjckFQGblA8n34XA==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.17.tgz",
|
||||
"integrity": "sha512-7vf2w1NlzKlUynSuyI2DAIKoEOYKYC8k+tlSsk3BRdbzhbJAiWxcYzJy5seg5dFW1WIpKAZ0wiVdHXf/WRlRgg==",
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@mantine/next": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/next/-/next-6.0.2.tgz",
|
||||
"integrity": "sha512-yQrsqu19r9aLU8/q0hhsUjuTV8MRf3vTQz2Lv6Fvm+dGIef+ZvMVaTrRodvX/qepF5YWAmyRUg5jgwENsyDSXQ==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/next/-/next-6.0.17.tgz",
|
||||
"integrity": "sha512-/JmKysJ0blftAU8+YtWZ4m3MIXUtiyaPXamEYCkcv+V+8oAa9x4EquX/eK6gOVbEEhUoHGCbIZ3nt54NQiC2dQ==",
|
||||
"dependencies": {
|
||||
"@mantine/ssr": "6.0.2",
|
||||
"@mantine/styles": "6.0.2"
|
||||
"@mantine/ssr": "6.0.17",
|
||||
"@mantine/styles": "6.0.17"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"next": "*",
|
||||
|
|
@ -625,26 +626,41 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@mantine/notifications": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-6.0.2.tgz",
|
||||
"integrity": "sha512-EpQgTl5j925N88WY05etFe5ov71UnJRep6nGwv+CVATXmNV8E8z4b+2R6B5ofg4bW9VkS2BJKT2TgKRzaCMLeg==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-6.0.17.tgz",
|
||||
"integrity": "sha512-iY8hdRG4RcrsA7U06AOWLbKrQJAzEhKi2mESOnGE4s7RBWJjLTXJf+gTKi+QtVa3XNIF0I/adpEh8MEFD5zGWw==",
|
||||
"dependencies": {
|
||||
"@mantine/utils": "6.0.2",
|
||||
"@mantine/utils": "6.0.17",
|
||||
"react-transition-group": "4.4.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@mantine/core": "6.0.2",
|
||||
"@mantine/hooks": "6.0.2",
|
||||
"@mantine/core": "6.0.17",
|
||||
"@mantine/hooks": "6.0.17",
|
||||
"react": ">=16.8.0",
|
||||
"react-dom": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@mantine/prism": {
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/prism/-/prism-6.0.17.tgz",
|
||||
"integrity": "sha512-oUnvLIU/ERvGqYVDasVIQH5pJpmi4DooGB5tucef1uS7u/rt68iAaNKCpPK4ghYZekCC8VO/cXdB9BzZACj5EA==",
|
||||
"dependencies": {
|
||||
"@mantine/utils": "6.0.17",
|
||||
"prism-react-renderer": "^1.2.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@mantine/core": "6.0.17",
|
||||
"@mantine/hooks": "6.0.17",
|
||||
"react": ">=16.8.0",
|
||||
"react-dom": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@mantine/ssr": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/ssr/-/ssr-6.0.2.tgz",
|
||||
"integrity": "sha512-s7F0LtKVdGflbV/2ofCUcdoEQlCpnspBIOPW2IORk7Ysab/XE/Ea2nphtfStNZcYZXk9haOVp50Yi8yAxzBOVg==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/ssr/-/ssr-6.0.17.tgz",
|
||||
"integrity": "sha512-l4G0GROr/1w96uWmEMrczwxLF5BSR0b2uK/ErTrq6+ozmrFSl+LvU/JKoYnyoo+bgbfhVn8dpNOxpkOYF5fTDg==",
|
||||
"dependencies": {
|
||||
"@mantine/styles": "6.0.2",
|
||||
"@mantine/styles": "6.0.17",
|
||||
"html-react-parser": "1.4.12"
|
||||
},
|
||||
"peerDependencies": {
|
||||
|
|
@ -655,9 +671,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@mantine/styles": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.2.tgz",
|
||||
"integrity": "sha512-py5yWzCPSYAv/4NwQ+dHaei0Rmk8kQ/ls5i3u28y6U+fCoutRhlCPJKjPfOWQzFpSRS0oGPdChFdg6zn4r8YIA==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.17.tgz",
|
||||
"integrity": "sha512-utNwQJgKHguNS0iPyyeFRJy4nbt280XMbmfUf4GCxXlyl/mQxq+JoaKP/OmU7+8kfbtLS9kHeuBSghrC65Nt1g==",
|
||||
"dependencies": {
|
||||
"clsx": "1.1.1",
|
||||
"csstype": "3.0.9"
|
||||
|
|
@ -674,9 +690,9 @@
|
|||
"integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw=="
|
||||
},
|
||||
"node_modules/@mantine/utils": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.2.tgz",
|
||||
"integrity": "sha512-fx+cmkb8PMpkr65nUs8YgaXFJbtNY+ybSXDfBxwFAWMTLAocbNo7vjkSvPWZVS1O2szPK/s4Rqdw0W76dyG4+w==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.17.tgz",
|
||||
"integrity": "sha512-U6SWV/asYE6NhiHx4ltmVZdQR3HwGVqJxVulhOylMcV1tX/P1LMQUCbGV2Oe4O9jbX4/YW5B/CBb4BbEhENQFQ==",
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0"
|
||||
}
|
||||
|
|
@ -1587,24 +1603,6 @@
|
|||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/packager-raw-url": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/packager-raw-url/-/packager-raw-url-2.8.3.tgz",
|
||||
"integrity": "sha512-v8k/x2pnR3DDiIJrPTUcBd+MjH9ocpac0dsdJ02yeyGIQTecqL6nuCtu6W4m75CC7vFjjh/aCK9TJsOHOFnCFQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@parcel/plugin": "2.8.3",
|
||||
"@parcel/utils": "2.8.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.0.0",
|
||||
"parcel": "^2.8.3"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/packager-svg": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.8.3.tgz",
|
||||
|
|
@ -2105,25 +2103,6 @@
|
|||
"semver": "bin/semver"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/transformer-webmanifest": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/transformer-webmanifest/-/transformer-webmanifest-2.8.3.tgz",
|
||||
"integrity": "sha512-v3NuQc1K1AMfD1+hvh/YYpxBEin52CvEX94MnjwYK6bDmJ35rNuttIs7T6DZxAOopRbGwoTchCShIbv15gTcvg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@mischnic/json-sourcemap": "^0.1.0",
|
||||
"@parcel/diagnostic": "2.8.3",
|
||||
"@parcel/plugin": "2.8.3",
|
||||
"@parcel/utils": "2.8.3"
|
||||
},
|
||||
"engines": {
|
||||
"parcel": "^2.8.3"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/types": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.8.3.tgz",
|
||||
|
|
@ -7012,6 +6991,22 @@
|
|||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/prism-react-renderer": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz",
|
||||
"integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==",
|
||||
"peerDependencies": {
|
||||
"react": ">=0.14.9"
|
||||
}
|
||||
},
|
||||
"node_modules/prismjs": {
|
||||
"version": "1.29.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
||||
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/process": {
|
||||
"version": "0.11.10",
|
||||
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
|
||||
|
|
@ -8863,55 +8858,64 @@
|
|||
"optional": true
|
||||
},
|
||||
"@mantine/core": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.2.tgz",
|
||||
"integrity": "sha512-FP/qaMBzh2dDrZIFSAJB3vogWK3U8+nnwImKa+/ceo7EJLeauLNAssaoWn2TVnA6x5mIZnlPwkDtVqI8Q+K9Ww==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.17.tgz",
|
||||
"integrity": "sha512-g3EDxcTJKisvEGTsGJPCGXiDumwr4O0nGNXwoGLnrg19nh3FAMfEIq18sJJLtRrBuarSbrvgMVYvKx1R6rTOWg==",
|
||||
"requires": {
|
||||
"@floating-ui/react": "^0.19.1",
|
||||
"@mantine/styles": "6.0.2",
|
||||
"@mantine/utils": "6.0.2",
|
||||
"@mantine/styles": "6.0.17",
|
||||
"@mantine/utils": "6.0.17",
|
||||
"@radix-ui/react-scroll-area": "1.0.2",
|
||||
"react-remove-scroll": "^2.5.5",
|
||||
"react-textarea-autosize": "8.3.4"
|
||||
}
|
||||
},
|
||||
"@mantine/hooks": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.2.tgz",
|
||||
"integrity": "sha512-wLSkp0NRe4XN7JujIUvkKghIBJC9YZ33CJlrFbcBFLD6LiSLX7lWyWOsiFzXrPND0Hpgn3AjckFQGblA8n34XA==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.17.tgz",
|
||||
"integrity": "sha512-7vf2w1NlzKlUynSuyI2DAIKoEOYKYC8k+tlSsk3BRdbzhbJAiWxcYzJy5seg5dFW1WIpKAZ0wiVdHXf/WRlRgg==",
|
||||
"requires": {}
|
||||
},
|
||||
"@mantine/next": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/next/-/next-6.0.2.tgz",
|
||||
"integrity": "sha512-yQrsqu19r9aLU8/q0hhsUjuTV8MRf3vTQz2Lv6Fvm+dGIef+ZvMVaTrRodvX/qepF5YWAmyRUg5jgwENsyDSXQ==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/next/-/next-6.0.17.tgz",
|
||||
"integrity": "sha512-/JmKysJ0blftAU8+YtWZ4m3MIXUtiyaPXamEYCkcv+V+8oAa9x4EquX/eK6gOVbEEhUoHGCbIZ3nt54NQiC2dQ==",
|
||||
"requires": {
|
||||
"@mantine/ssr": "6.0.2",
|
||||
"@mantine/styles": "6.0.2"
|
||||
"@mantine/ssr": "6.0.17",
|
||||
"@mantine/styles": "6.0.17"
|
||||
}
|
||||
},
|
||||
"@mantine/notifications": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-6.0.2.tgz",
|
||||
"integrity": "sha512-EpQgTl5j925N88WY05etFe5ov71UnJRep6nGwv+CVATXmNV8E8z4b+2R6B5ofg4bW9VkS2BJKT2TgKRzaCMLeg==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-6.0.17.tgz",
|
||||
"integrity": "sha512-iY8hdRG4RcrsA7U06AOWLbKrQJAzEhKi2mESOnGE4s7RBWJjLTXJf+gTKi+QtVa3XNIF0I/adpEh8MEFD5zGWw==",
|
||||
"requires": {
|
||||
"@mantine/utils": "6.0.2",
|
||||
"@mantine/utils": "6.0.17",
|
||||
"react-transition-group": "4.4.2"
|
||||
}
|
||||
},
|
||||
"@mantine/ssr": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/ssr/-/ssr-6.0.2.tgz",
|
||||
"integrity": "sha512-s7F0LtKVdGflbV/2ofCUcdoEQlCpnspBIOPW2IORk7Ysab/XE/Ea2nphtfStNZcYZXk9haOVp50Yi8yAxzBOVg==",
|
||||
"@mantine/prism": {
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/prism/-/prism-6.0.17.tgz",
|
||||
"integrity": "sha512-oUnvLIU/ERvGqYVDasVIQH5pJpmi4DooGB5tucef1uS7u/rt68iAaNKCpPK4ghYZekCC8VO/cXdB9BzZACj5EA==",
|
||||
"requires": {
|
||||
"@mantine/styles": "6.0.2",
|
||||
"@mantine/utils": "6.0.17",
|
||||
"prism-react-renderer": "^1.2.1"
|
||||
}
|
||||
},
|
||||
"@mantine/ssr": {
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/ssr/-/ssr-6.0.17.tgz",
|
||||
"integrity": "sha512-l4G0GROr/1w96uWmEMrczwxLF5BSR0b2uK/ErTrq6+ozmrFSl+LvU/JKoYnyoo+bgbfhVn8dpNOxpkOYF5fTDg==",
|
||||
"requires": {
|
||||
"@mantine/styles": "6.0.17",
|
||||
"html-react-parser": "1.4.12"
|
||||
}
|
||||
},
|
||||
"@mantine/styles": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.2.tgz",
|
||||
"integrity": "sha512-py5yWzCPSYAv/4NwQ+dHaei0Rmk8kQ/ls5i3u28y6U+fCoutRhlCPJKjPfOWQzFpSRS0oGPdChFdg6zn4r8YIA==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.17.tgz",
|
||||
"integrity": "sha512-utNwQJgKHguNS0iPyyeFRJy4nbt280XMbmfUf4GCxXlyl/mQxq+JoaKP/OmU7+8kfbtLS9kHeuBSghrC65Nt1g==",
|
||||
"requires": {
|
||||
"clsx": "1.1.1",
|
||||
"csstype": "3.0.9"
|
||||
|
|
@ -8925,9 +8929,9 @@
|
|||
}
|
||||
},
|
||||
"@mantine/utils": {
|
||||
"version": "6.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.2.tgz",
|
||||
"integrity": "sha512-fx+cmkb8PMpkr65nUs8YgaXFJbtNY+ybSXDfBxwFAWMTLAocbNo7vjkSvPWZVS1O2szPK/s4Rqdw0W76dyG4+w==",
|
||||
"version": "6.0.17",
|
||||
"resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.17.tgz",
|
||||
"integrity": "sha512-U6SWV/asYE6NhiHx4ltmVZdQR3HwGVqJxVulhOylMcV1tX/P1LMQUCbGV2Oe4O9jbX4/YW5B/CBb4BbEhENQFQ==",
|
||||
"requires": {}
|
||||
},
|
||||
"@mischnic/json-sourcemap": {
|
||||
|
|
@ -9465,16 +9469,6 @@
|
|||
"@parcel/plugin": "2.8.3"
|
||||
}
|
||||
},
|
||||
"@parcel/packager-raw-url": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/packager-raw-url/-/packager-raw-url-2.8.3.tgz",
|
||||
"integrity": "sha512-v8k/x2pnR3DDiIJrPTUcBd+MjH9ocpac0dsdJ02yeyGIQTecqL6nuCtu6W4m75CC7vFjjh/aCK9TJsOHOFnCFQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@parcel/plugin": "2.8.3",
|
||||
"@parcel/utils": "2.8.3"
|
||||
}
|
||||
},
|
||||
"@parcel/packager-svg": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.8.3.tgz",
|
||||
|
|
@ -9797,18 +9791,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@parcel/transformer-webmanifest": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/transformer-webmanifest/-/transformer-webmanifest-2.8.3.tgz",
|
||||
"integrity": "sha512-v3NuQc1K1AMfD1+hvh/YYpxBEin52CvEX94MnjwYK6bDmJ35rNuttIs7T6DZxAOopRbGwoTchCShIbv15gTcvg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@mischnic/json-sourcemap": "^0.1.0",
|
||||
"@parcel/diagnostic": "2.8.3",
|
||||
"@parcel/plugin": "2.8.3",
|
||||
"@parcel/utils": "2.8.3"
|
||||
}
|
||||
},
|
||||
"@parcel/types": {
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.8.3.tgz",
|
||||
|
|
@ -13134,6 +13116,17 @@
|
|||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
|
||||
},
|
||||
"prism-react-renderer": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz",
|
||||
"integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==",
|
||||
"requires": {}
|
||||
},
|
||||
"prismjs": {
|
||||
"version": "1.29.0",
|
||||
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
|
||||
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
|
||||
},
|
||||
"process": {
|
||||
"version": "0.11.10",
|
||||
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
|
||||
|
|
|
|||
15
package.json
|
|
@ -11,26 +11,25 @@
|
|||
"staticPath": "src/static"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@parcel/packager-raw-url": "^2.8.3",
|
||||
"@parcel/transformer-sass": "^2.8.3",
|
||||
"@parcel/transformer-webmanifest": "^2.8.3",
|
||||
"@types/downloadjs": "^1.4.3",
|
||||
"@types/lodash": "^4.14.191",
|
||||
"@types/react": "^18.0.28",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"buffer": "^5.7.1",
|
||||
"parcel": "^2.8.3",
|
||||
"parcel-reporter-static-files-copy": "^1.5.0",
|
||||
"path-browserify": "^1.0.1",
|
||||
"parcel-reporter-static-files-copy": "^1.5.0",
|
||||
"process": "^0.11.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"@emotion/react": "^11.10.6",
|
||||
"@emotion/server": "^11.10.0",
|
||||
"@mantine/core": "^6.0.1",
|
||||
"@mantine/hooks": "^6.0.1",
|
||||
"@mantine/next": "^6.0.1",
|
||||
"@mantine/notifications": "^6.0.1",
|
||||
"@mantine/core": "^6.0.17",
|
||||
"@mantine/hooks": "^6.0.17",
|
||||
"@mantine/next": "^6.0.17",
|
||||
"@mantine/notifications": "^6.0.17",
|
||||
"@mantine/prism": "^6.0.17",
|
||||
"@tabler/icons-react": "^2.9.0",
|
||||
"@tanstack/react-location": "^3.7.4",
|
||||
"@types/node": "18.15.0",
|
||||
|
|
@ -48,6 +47,8 @@
|
|||
"next": "13.2.4",
|
||||
"openai": "^3.2.1",
|
||||
"openai-ext": "^1.2.6",
|
||||
"prism-react-renderer": "^1.3.1",
|
||||
"prismjs": "^1.29.0",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-icons": "^4.8.0",
|
||||
|
|
|
|||
88
src/components/ChatItem.tsx
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
import { ActionIcon, Flex, Menu } from "@mantine/core";
|
||||
import {
|
||||
IconDotsVertical,
|
||||
IconMessages,
|
||||
IconPencil,
|
||||
IconPin,
|
||||
IconPinned,
|
||||
IconPinnedOff,
|
||||
IconTrash
|
||||
} from "@tabler/icons-react";
|
||||
import { Link } from "@tanstack/react-location";
|
||||
import { Chat, db } from "../db";
|
||||
import { DeleteChatModal } from "./DeleteChatModal";
|
||||
import { EditChatModal } from "./EditChatModal";
|
||||
import { MainLink } from "./MainLink";
|
||||
import { notifications } from "@mantine/notifications";
|
||||
|
||||
export function ChatItem({ chat, isActive }: { chat: Chat, isActive: boolean }) {
|
||||
const toggleChatPin = async (chatId: string, event: React.UIEvent) => {
|
||||
try {
|
||||
event.preventDefault();
|
||||
await db.chats.where({ id: chatId }).modify((chat) => {
|
||||
chat.pinned = !chat.pinned;
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.toJSON().message === "Network Error") {
|
||||
notifications.show({
|
||||
title: "Error",
|
||||
color: "red",
|
||||
message: "No internet connection.",
|
||||
});
|
||||
}
|
||||
const message = error.response?.data?.error?.message;
|
||||
if (message) {
|
||||
notifications.show({
|
||||
title: "Error",
|
||||
color: "red",
|
||||
message,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Flex
|
||||
key={chat.id}
|
||||
className={isActive ? "active" : undefined}
|
||||
sx={(theme) => ({
|
||||
marginTop: 1,
|
||||
"&:hover, &.active": {
|
||||
backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[6] : theme.colors.gray[1],
|
||||
},
|
||||
})}
|
||||
>
|
||||
<Link to={`/chats/${chat.id}`} style={{ flex: 1 }}>
|
||||
<MainLink
|
||||
icon={chat.pinned ? <IconPinned size="1rem" /> : <IconMessages size="1rem" />}
|
||||
color="teal"
|
||||
chat={chat}
|
||||
label={chat.description}
|
||||
/>
|
||||
</Link>
|
||||
<Menu shadow="md" width={200} keepMounted>
|
||||
<Menu.Target>
|
||||
<ActionIcon sx={{ height: "auto" }}>
|
||||
<IconDotsVertical size={20} />
|
||||
</ActionIcon>
|
||||
</Menu.Target>
|
||||
<Menu.Dropdown>
|
||||
<Menu.Item
|
||||
icon={chat.pinned ? <IconPinnedOff size="1rem" /> : <IconPin size="1rem" />}
|
||||
onClick={(event) => toggleChatPin(chat.id, event)}
|
||||
>
|
||||
{chat.pinned ? "Remove pin" : "Pin chat"}
|
||||
</Menu.Item>
|
||||
<EditChatModal chat={chat}>
|
||||
<Menu.Item icon={<IconPencil size="1rem" />}>Edit</Menu.Item>
|
||||
</EditChatModal>
|
||||
<DeleteChatModal chat={chat}>
|
||||
<Menu.Item color="red" icon={<IconTrash size="1rem" />}>
|
||||
Delete
|
||||
</Menu.Item>
|
||||
</DeleteChatModal>
|
||||
</Menu.Dropdown>
|
||||
</Menu>
|
||||
</Flex>
|
||||
)
|
||||
}
|
||||
|
|
@ -1,13 +1,9 @@
|
|||
import { ActionIcon, Flex, Menu } from "@mantine/core";
|
||||
import { IconDotsVertical, IconMessages } from "@tabler/icons-react";
|
||||
import { Link } from "@tanstack/react-location";
|
||||
import { Text } from "@mantine/core";
|
||||
import { useLiveQuery } from "dexie-react-hooks";
|
||||
import { useMemo } from "react";
|
||||
import { db } from "../db";
|
||||
import { useChatId } from "../hooks/useChatId";
|
||||
import { DeleteChatModal } from "./DeleteChatModal";
|
||||
import { EditChatModal } from "./EditChatModal";
|
||||
import { MainLink } from "./MainLink";
|
||||
import { ChatItem } from "./ChatItem";
|
||||
|
||||
export function Chats({ search }: { search: string }) {
|
||||
const chatId = useChatId();
|
||||
|
|
@ -23,47 +19,25 @@ export function Chats({ search }: { search: string }) {
|
|||
[chats, search]
|
||||
);
|
||||
|
||||
const pinnedChats = useMemo(() => filteredChats.filter((chat) => chat.pinned), [filteredChats]);
|
||||
const unpinnedChats = useMemo(() => filteredChats.filter((chat) => !chat.pinned), [filteredChats]);
|
||||
|
||||
return (
|
||||
<>
|
||||
{filteredChats.map((chat) => (
|
||||
<Flex
|
||||
key={chat.id}
|
||||
className={chatId === chat.id ? "active" : undefined}
|
||||
sx={(theme) => ({
|
||||
marginTop: 1,
|
||||
"&:hover, &.active": {
|
||||
backgroundColor:
|
||||
theme.colorScheme === "dark"
|
||||
? theme.colors.dark[6]
|
||||
: theme.colors.gray[1],
|
||||
},
|
||||
})}
|
||||
>
|
||||
<Link to={`/chats/${chat.id}`} style={{ flex: 1 }}>
|
||||
<MainLink
|
||||
icon={<IconMessages size="1rem" />}
|
||||
color="teal"
|
||||
chat={chat}
|
||||
label={chat.description}
|
||||
/>
|
||||
</Link>
|
||||
<Menu shadow="md" width={200} keepMounted>
|
||||
<Menu.Target>
|
||||
<ActionIcon sx={{ height: "auto" }}>
|
||||
<IconDotsVertical size={20} />
|
||||
</ActionIcon>
|
||||
</Menu.Target>
|
||||
<Menu.Dropdown>
|
||||
<EditChatModal chat={chat}>
|
||||
<Menu.Item>Edit</Menu.Item>
|
||||
</EditChatModal>
|
||||
<DeleteChatModal chat={chat}>
|
||||
<Menu.Item>Delete</Menu.Item>
|
||||
</DeleteChatModal>
|
||||
</Menu.Dropdown>
|
||||
</Menu>
|
||||
</Flex>
|
||||
{pinnedChats.length > 0 ? (
|
||||
<>
|
||||
<Text p="xs" fz="xs" fw={700} color="gray" children={"Pinned"} />
|
||||
{pinnedChats.map((chat) => (
|
||||
<ChatItem chat={chat} isActive={chatId === chat.id} />
|
||||
))}
|
||||
|
||||
{unpinnedChats.length > 0 ? <Text p="xs" fz="xs" fw={700} color="gray" children={"Unpinned"} /> : null}
|
||||
</>
|
||||
) : null}
|
||||
|
||||
{unpinnedChats.map((chat) => (
|
||||
<ChatItem chat={chat} isActive={chatId === chat.id} />
|
||||
))}
|
||||
</>
|
||||
);
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ export function Layout() {
|
|||
description: "New Chat",
|
||||
totalTokens: 0,
|
||||
createdAt: new Date(),
|
||||
pinned: false,
|
||||
});
|
||||
navigate({ to: `/chats/${id}` });
|
||||
}}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import {
|
|||
ThemeIcon,
|
||||
Tooltip,
|
||||
} from "@mantine/core";
|
||||
import { useClipboard } from "@mantine/hooks";
|
||||
import { Prism } from "@mantine/prism";
|
||||
import { IconCopy, IconUser } from "@tabler/icons-react";
|
||||
import { useMemo } from "react";
|
||||
import ReactMarkdown from "react-markdown";
|
||||
|
|
@ -20,9 +20,9 @@ import "../styles/markdown.scss";
|
|||
import { CreatePromptModal } from "./CreatePromptModal";
|
||||
import { LogoIcon } from "./Logo";
|
||||
import { ScrollIntoView } from "./ScrollIntoView";
|
||||
import "../utils/prisma-setup";
|
||||
|
||||
export function MessageItem({ message }: { message: Message }) {
|
||||
const clipboard = useClipboard({ timeout: 500 });
|
||||
const wordCount = useMemo(() => {
|
||||
var matches = message.content.match(/[\w\d\’\'-\(\)]+/gi);
|
||||
return matches ? matches.length : 0;
|
||||
|
|
@ -46,29 +46,21 @@ export function MessageItem({ message }: { message: Message }) {
|
|||
table: ({ node, ...props }) => (
|
||||
<Table verticalSpacing="sm" highlightOnHover {...props} />
|
||||
),
|
||||
code: ({ node, inline, ...props }) =>
|
||||
inline ? (
|
||||
code: ({ node, inline, className, lang, ...props }) => {
|
||||
const languageMatch = /language-(\w+)/.exec(className || "");
|
||||
const language = languageMatch ? languageMatch[1] : undefined;
|
||||
|
||||
return inline ? (
|
||||
<Code {...props} />
|
||||
) : (
|
||||
<Box sx={{ position: "relative" }}>
|
||||
<Code block {...props} />
|
||||
<CopyButton value={String(props.children)}>
|
||||
{({ copied, copy }) => (
|
||||
<Tooltip
|
||||
label={copied ? "Copied" : "Copy"}
|
||||
position="left"
|
||||
>
|
||||
<ActionIcon
|
||||
sx={{ position: "absolute", top: 4, right: 4 }}
|
||||
onClick={copy}
|
||||
>
|
||||
<IconCopy opacity={0.4} size={20} />
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
)}
|
||||
</CopyButton>
|
||||
<Prism
|
||||
language={language as any}
|
||||
children={`${props.children as string}`}
|
||||
/>
|
||||
</Box>
|
||||
),
|
||||
);
|
||||
},
|
||||
}}
|
||||
/>
|
||||
{message.role === "assistant" && (
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ export function Prompts({
|
|||
description: "New Chat",
|
||||
totalTokens: 0,
|
||||
createdAt: new Date(),
|
||||
pinned: false,
|
||||
});
|
||||
await db.messages.add({
|
||||
id: nanoid(),
|
||||
|
|
|
|||
|
|
@ -1,13 +1,15 @@
|
|||
import { ReactNode } from "react";
|
||||
import { ReactNode, useRef, useEffect } from "react";
|
||||
|
||||
export function ScrollIntoView({ children }: { children: ReactNode }) {
|
||||
|
||||
// Scroll into view as soon as we appear
|
||||
const myRef = useRef(null);
|
||||
useEffect(() => {
|
||||
myRef.current.scrollIntoView({ behavior: 'smooth' });
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={(node) => {
|
||||
if (!node) return;
|
||||
node.scrollIntoView({ behavior: "smooth" });
|
||||
}}
|
||||
>
|
||||
<div ref={myRef}>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ export interface Chat {
|
|||
description: string;
|
||||
totalTokens: number;
|
||||
createdAt: Date;
|
||||
pinned: boolean;
|
||||
}
|
||||
|
||||
export interface Message {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@
|
|||
content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0, interactive-widget=resizes-content"
|
||||
/>
|
||||
<link rel="icon" href="./assets/favicon.png" />
|
||||
<link rel="manifest" href="./static/manifest.json">
|
||||
<style>
|
||||
.app-region-drag {
|
||||
-webkit-app-region: drag;
|
||||
|
|
|
|||
|
|
@ -4,17 +4,19 @@ import {
|
|||
Card,
|
||||
Container,
|
||||
Flex,
|
||||
Group,
|
||||
MediaQuery,
|
||||
Select,
|
||||
SimpleGrid,
|
||||
Skeleton,
|
||||
Stack,
|
||||
SegmentedControl,
|
||||
Textarea,
|
||||
} from "@mantine/core";
|
||||
import { notifications } from "@mantine/notifications";
|
||||
import { useLiveQuery } from "dexie-react-hooks";
|
||||
import { nanoid } from "nanoid";
|
||||
import { KeyboardEvent, useState, type ChangeEvent } from "react";
|
||||
import { KeyboardEvent, useState, type ChangeEvent, useEffect } from "react";
|
||||
import { AiOutlineSend } from "react-icons/ai";
|
||||
import { MessageItem } from "../components/MessageItem";
|
||||
import { db } from "../db";
|
||||
|
|
@ -66,6 +68,16 @@ export function ChatRoute() {
|
|||
return message.join(" ");
|
||||
};
|
||||
|
||||
const settings = useLiveQuery(async () => {
|
||||
return db.settings.where({ id: "general" }).first();
|
||||
});
|
||||
const [model, setModel] = useState(config.defaultModel);
|
||||
useEffect(() => {
|
||||
if (settings?.openAiModel) {
|
||||
setModel(settings.openAiModel);
|
||||
}
|
||||
});
|
||||
|
||||
const submit = async () => {
|
||||
if (submitting) return;
|
||||
|
||||
|
|
@ -250,6 +262,53 @@ export function ChatRoute() {
|
|||
: theme.colors.gray[0],
|
||||
})}
|
||||
>
|
||||
{messages?.length === 0 &&
|
||||
<Group position="center" my={40}>
|
||||
<SegmentedControl
|
||||
value={model}
|
||||
fullWidth
|
||||
size="md"
|
||||
sx={(theme) => ({
|
||||
[`@media (min-width: ${theme.breakpoints.md})`]: {
|
||||
width: '30%',
|
||||
},
|
||||
})}
|
||||
data={[
|
||||
{ label: 'GPT-3.5', value: 'gpt-3.5-turbo' },
|
||||
{ label: 'GPT-4', value: 'gpt-4' },
|
||||
{ label: 'GPT-4o', value: 'gpt-4o' }
|
||||
]}
|
||||
onChange={async (value: 'gpt-3.5-turbo' | 'gpt-4') => {
|
||||
const model = value;
|
||||
try {
|
||||
await db.settings.update("general", {
|
||||
openAiModel: model ?? undefined,
|
||||
});
|
||||
notifications.show({
|
||||
title: "Saved",
|
||||
message: "Your OpenAI Model has been saved.",
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.toJSON().message === "Network Error") {
|
||||
notifications.show({
|
||||
title: "Error",
|
||||
color: "red",
|
||||
message: "No internet connection.",
|
||||
});
|
||||
}
|
||||
const message = error.response?.data?.error?.message;
|
||||
if (message) {
|
||||
notifications.show({
|
||||
title: "Error",
|
||||
color: "red",
|
||||
message,
|
||||
});
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</Group>
|
||||
}
|
||||
<Container>
|
||||
{messages?.length === 0 && (
|
||||
<SimpleGrid
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 4 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
|
@ -49,6 +49,18 @@
|
|||
{
|
||||
"value": "gpt-4-32k-0314",
|
||||
"label": "GPT-4-32K-0314 (Limited Beta, Legacy)"
|
||||
},
|
||||
{
|
||||
"value": "gpt-4-1106-preview",
|
||||
"label": "GPT-4-1106-Preview"
|
||||
},
|
||||
{
|
||||
"value": "gpt-4-turbo",
|
||||
"label": "GPT-4 Turbo"
|
||||
},
|
||||
{
|
||||
"value": "gpt-4o",
|
||||
"label": "GPT-4 omni"
|
||||
}
|
||||
],
|
||||
"writingCharacters": [
|
||||
|
|
@ -224,4 +236,4 @@
|
|||
"allowDatabaseModal": true,
|
||||
"showTwitterLink": true,
|
||||
"showFeedbackLink": true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 545 B |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 741 B |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 4 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
|
@ -1,467 +0,0 @@
|
|||
{
|
||||
"background_color": "#ffffff",
|
||||
"description": "A free, open-source, and slick UI for ChatGPT",
|
||||
"dir": "ltr",
|
||||
"display": "standalone",
|
||||
"name": "Chatpad AI",
|
||||
"orientation": "any",
|
||||
"scope": "/",
|
||||
"short_name": "Chatpad",
|
||||
"start_url": "/",
|
||||
"theme_color": "#27B882",
|
||||
"icons": [
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-100.png",
|
||||
"sizes": "71x71"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-125.png",
|
||||
"sizes": "89x89"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-150.png",
|
||||
"sizes": "107x107"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-200.png",
|
||||
"sizes": "142x142"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SmallTile.scale-400.png",
|
||||
"sizes": "284x284"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-100.png",
|
||||
"sizes": "150x150"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-125.png",
|
||||
"sizes": "188x188"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-150.png",
|
||||
"sizes": "225x225"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-200.png",
|
||||
"sizes": "300x300"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square150x150Logo.scale-400.png",
|
||||
"sizes": "600x600"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-100.png",
|
||||
"sizes": "310x150"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-125.png",
|
||||
"sizes": "388x188"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-150.png",
|
||||
"sizes": "465x225"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-200.png",
|
||||
"sizes": "620x300"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Wide310x150Logo.scale-400.png",
|
||||
"sizes": "1240x600"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-100.png",
|
||||
"sizes": "310x310"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-125.png",
|
||||
"sizes": "388x388"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-150.png",
|
||||
"sizes": "465x465"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-200.png",
|
||||
"sizes": "620x620"
|
||||
},
|
||||
{
|
||||
"src": "windows11/LargeTile.scale-400.png",
|
||||
"sizes": "1240x1240"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-100.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-125.png",
|
||||
"sizes": "55x55"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-150.png",
|
||||
"sizes": "66x66"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-200.png",
|
||||
"sizes": "88x88"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.scale-400.png",
|
||||
"sizes": "176x176"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-100.png",
|
||||
"sizes": "50x50"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-125.png",
|
||||
"sizes": "63x63"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-150.png",
|
||||
"sizes": "75x75"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-200.png",
|
||||
"sizes": "100x100"
|
||||
},
|
||||
{
|
||||
"src": "windows11/StoreLogo.scale-400.png",
|
||||
"sizes": "200x200"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-100.png",
|
||||
"sizes": "620x300"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-125.png",
|
||||
"sizes": "775x375"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-150.png",
|
||||
"sizes": "930x450"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-200.png",
|
||||
"sizes": "1240x600"
|
||||
},
|
||||
{
|
||||
"src": "windows11/SplashScreen.scale-400.png",
|
||||
"sizes": "2480x1200"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-24.png",
|
||||
"sizes": "24x24"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-30.png",
|
||||
"sizes": "30x30"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-36.png",
|
||||
"sizes": "36x36"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-44.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.targetsize-256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-24.png",
|
||||
"sizes": "24x24"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-30.png",
|
||||
"sizes": "30x30"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-36.png",
|
||||
"sizes": "36x36"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-44.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-unplated_targetsize-256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png",
|
||||
"sizes": "24x24"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png",
|
||||
"sizes": "30x30"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png",
|
||||
"sizes": "36x36"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png",
|
||||
"sizes": "44x44"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-512-512.png",
|
||||
"sizes": "512x512"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-192-192.png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-144-144.png",
|
||||
"sizes": "144x144"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-96-96.png",
|
||||
"sizes": "96x96"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-72-72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "android/android-launchericon-48-48.png",
|
||||
"sizes": "48x48"
|
||||
},
|
||||
{
|
||||
"src": "ios/16.png",
|
||||
"sizes": "16x16"
|
||||
},
|
||||
{
|
||||
"src": "ios/20.png",
|
||||
"sizes": "20x20"
|
||||
},
|
||||
{
|
||||
"src": "ios/29.png",
|
||||
"sizes": "29x29"
|
||||
},
|
||||
{
|
||||
"src": "ios/32.png",
|
||||
"sizes": "32x32"
|
||||
},
|
||||
{
|
||||
"src": "ios/40.png",
|
||||
"sizes": "40x40"
|
||||
},
|
||||
{
|
||||
"src": "ios/50.png",
|
||||
"sizes": "50x50"
|
||||
},
|
||||
{
|
||||
"src": "ios/57.png",
|
||||
"sizes": "57x57"
|
||||
},
|
||||
{
|
||||
"src": "ios/58.png",
|
||||
"sizes": "58x58"
|
||||
},
|
||||
{
|
||||
"src": "ios/60.png",
|
||||
"sizes": "60x60"
|
||||
},
|
||||
{
|
||||
"src": "ios/64.png",
|
||||
"sizes": "64x64"
|
||||
},
|
||||
{
|
||||
"src": "ios/72.png",
|
||||
"sizes": "72x72"
|
||||
},
|
||||
{
|
||||
"src": "ios/76.png",
|
||||
"sizes": "76x76"
|
||||
},
|
||||
{
|
||||
"src": "ios/80.png",
|
||||
"sizes": "80x80"
|
||||
},
|
||||
{
|
||||
"src": "ios/87.png",
|
||||
"sizes": "87x87"
|
||||
},
|
||||
{
|
||||
"src": "ios/100.png",
|
||||
"sizes": "100x100"
|
||||
},
|
||||
{
|
||||
"src": "ios/114.png",
|
||||
"sizes": "114x114"
|
||||
},
|
||||
{
|
||||
"src": "ios/120.png",
|
||||
"sizes": "120x120"
|
||||
},
|
||||
{
|
||||
"src": "ios/128.png",
|
||||
"sizes": "128x128"
|
||||
},
|
||||
{
|
||||
"src": "ios/144.png",
|
||||
"sizes": "144x144"
|
||||
},
|
||||
{
|
||||
"src": "ios/152.png",
|
||||
"sizes": "152x152"
|
||||
},
|
||||
{
|
||||
"src": "ios/167.png",
|
||||
"sizes": "167x167"
|
||||
},
|
||||
{
|
||||
"src": "ios/180.png",
|
||||
"sizes": "180x180"
|
||||
},
|
||||
{
|
||||
"src": "ios/192.png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "ios/256.png",
|
||||
"sizes": "256x256"
|
||||
},
|
||||
{
|
||||
"src": "ios/512.png",
|
||||
"sizes": "512x512"
|
||||
},
|
||||
{
|
||||
"src": "ios/1024.png",
|
||||
"sizes": "1024x1024"
|
||||
}
|
||||
],
|
||||
"id": "chatpadai",
|
||||
"display_override": [
|
||||
"standalone",
|
||||
"window-controls-overlay"
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 4 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 593 B |
|
Before Width: | Height: | Size: 856 B |
|
Before Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 593 B |
|
Before Width: | Height: | Size: 856 B |
|
Before Width: | Height: | Size: 1 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |