feat: AI-generated summary

This commit is contained in:
DIYgod 2023-03-02 23:41:45 +00:00
parent 5b2bf56aee
commit db7574f99b
No known key found for this signature in database
9 changed files with 732 additions and 87 deletions

View File

@ -60,6 +60,7 @@
"ioredis": "5.3.1",
"js-yaml": "4.1.0",
"jsonfeed-to-rss": "^3.0.6",
"langchain": "^0.0.20",
"lottie-react": "^2.4.0",
"mdast-util-to-string": "3.1.1",
"mdast-util-toc": "6.1.1",

View File

@ -77,6 +77,7 @@ specifiers:
ioredis: 5.3.1
js-yaml: 4.1.0
jsonfeed-to-rss: ^3.0.6
langchain: ^0.0.20
lint-staged: 13.1.2
lottie-react: ^2.4.0
mdast-util-to-string: 3.1.1
@ -177,6 +178,7 @@ dependencies:
ioredis: 5.3.1
js-yaml: 4.1.0
jsonfeed-to-rss: 3.0.6
langchain: 0.0.20
lottie-react: 2.4.0_biqbaboplfbrettd7655fr4n2y
mdast-util-to-string: 3.1.1
mdast-util-toc: 6.1.1
@ -2721,6 +2723,11 @@ packages:
- '@types/react'
dev: false
/@gar/promisify/1.1.3:
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
dev: false
optional: true
/@headlessui/react/1.7.12_biqbaboplfbrettd7655fr4n2y:
resolution: {integrity: sha512-FhSx5V+Qp0GvbTpaxyS+ymGDDNntCacClWsk/d8Upbr19g3AsPbjfPk4+m2CgJGcuCB5Dz7LpUIOAbvQTyjL2g==}
engines: {node: '>=10'}
@ -3462,6 +3469,24 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
/@npmcli/fs/1.1.1:
resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==}
dependencies:
'@gar/promisify': 1.1.3
semver: 7.3.8
dev: false
optional: true
/@npmcli/move-file/1.1.2:
resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==}
engines: {node: '>=10'}
deprecated: This functionality has been moved to @npmcli/fs
dependencies:
mkdirp: 1.0.4
rimraf: 3.0.2
dev: false
optional: true
/@pedrouid/environment/1.0.1:
resolution: {integrity: sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug==}
dev: false
@ -3958,6 +3983,12 @@ packages:
resolution: {integrity: sha512-qi2jjgO6Tn3KNPGnm6B7p6QTEPvY95NFsIAaJuwbulur8iJUEenp1OnoUfiDaC/g2WPPEFkcfXpmnu8XEMFo2A==}
dev: false
/@tootallnate/once/1.1.2:
resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
engines: {node: '>= 6'}
dev: false
optional: true
/@tsconfig/node10/1.0.9:
resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
dev: false
@ -5161,7 +5192,6 @@ packages:
dependencies:
clean-stack: 2.2.0
indent-string: 4.0.0
dev: true
/ajv-formats/2.1.1:
resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
@ -5278,6 +5308,15 @@ packages:
readable-stream: 3.6.0
dev: false
/are-we-there-yet/3.0.1:
resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
dependencies:
delegates: 1.0.0
readable-stream: 3.6.1
dev: false
optional: true
/arg/4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
dev: false
@ -5453,6 +5492,14 @@ packages:
- debug
dev: false
/axios/0.26.1:
resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
dependencies:
follow-redirects: 1.15.2
transitivePeerDependencies:
- debug
dev: false
/axios/1.2.3:
resolution: {integrity: sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==}
dependencies:
@ -5656,7 +5703,7 @@ packages:
dependencies:
buffer: 5.7.1
inherits: 2.0.4
readable-stream: 3.6.0
readable-stream: 3.6.1
dev: false
/blakejs/1.2.1:
@ -5827,6 +5874,33 @@ packages:
engines: {node: '>=8'}
dev: true
/cacache/15.3.0:
resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==}
engines: {node: '>= 10'}
dependencies:
'@npmcli/fs': 1.1.1
'@npmcli/move-file': 1.1.2
chownr: 2.0.0
fs-minipass: 2.1.0
glob: 7.2.3
infer-owner: 1.0.4
lru-cache: 6.0.0
minipass: 3.3.6
minipass-collect: 1.0.2
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
mkdirp: 1.0.4
p-map: 4.0.0
promise-inflight: 1.0.1
rimraf: 3.0.2
ssri: 8.0.1
tar: 6.1.13
unique-filename: 1.1.1
transitivePeerDependencies:
- bluebird
dev: false
optional: true
/call-bind/1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
@ -5969,7 +6043,6 @@ packages:
/clean-stack/2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
dev: true
/clean-webpack-plugin/4.0.0:
resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==}
@ -6122,7 +6195,6 @@ packages:
/commander/7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
dev: true
/commander/8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
@ -6329,6 +6401,16 @@ packages:
type: 1.2.0
dev: false
/d3-dsv/3.0.1:
resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
engines: {node: '>=12'}
hasBin: true
dependencies:
commander: 7.2.0
iconv-lite: 0.6.3
rw: 1.3.3
dev: false
/damerau-levenshtein/1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
dev: true
@ -6357,7 +6439,6 @@ packages:
optional: true
dependencies:
ms: 2.1.3
dev: true
/debug/4.3.4:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
@ -6448,6 +6529,12 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
/deepcopy/2.1.0:
resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==}
dependencies:
type-detect: 4.0.8
dev: false
/deepmerge/4.2.2:
resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
engines: {node: '>=0.10.0'}
@ -6713,6 +6800,14 @@ packages:
resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==}
dev: false
/encoding/0.1.13:
resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
requiresBuild: true
dependencies:
iconv-lite: 0.6.3
dev: false
optional: true
/end-of-stream/1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
dependencies:
@ -6727,6 +6822,17 @@ packages:
tapable: 2.2.1
dev: true
/env-paths/2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
dev: false
optional: true
/err-code/2.0.3:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
dev: false
optional: true
/err-code/3.0.1:
resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==}
dev: false
@ -7365,6 +7471,11 @@ packages:
engines: {node: '>=0.8.x'}
dev: false
/eventsource-parser/0.1.0:
resolution: {integrity: sha512-M9QjFtEIkwytUarnx113HGmgtk52LSn3jNAtnWKi3V+b9rqSfQeVdLsaD5AG/O4IrGQwmAAHBIsqbmURPTd2rA==}
engines: {node: '>=14.18'}
dev: false
/evp_bytestokey/1.0.3:
resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
dependencies:
@ -7411,6 +7522,14 @@ packages:
engines: {node: '>=6'}
dev: false
/exponential-backoff/3.1.1:
resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==}
dev: false
/expr-eval/2.0.2:
resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==}
dev: false
/ext/1.7.0:
resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
dependencies:
@ -7669,6 +7788,21 @@ packages:
wide-align: 1.1.5
dev: false
/gauge/4.0.4:
resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
dependencies:
aproba: 2.0.0
color-support: 1.1.3
console-control-strings: 1.1.0
has-unicode: 2.0.1
signal-exit: 3.0.7
string-width: 4.2.3
strip-ansi: 6.0.1
wide-align: 1.1.5
dev: false
optional: true
/gensync/1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
@ -7839,9 +7973,12 @@ packages:
dependencies:
get-intrinsic: 1.2.0
/gpt-3-encoder/1.1.4:
resolution: {integrity: sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg==}
dev: false
/graceful-fs/4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: true
/grapheme-splitter/1.0.4:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
@ -7907,7 +8044,7 @@ packages:
engines: {node: '>=4'}
dependencies:
inherits: 2.0.4
readable-stream: 3.6.0
readable-stream: 3.6.1
safe-buffer: 5.2.1
dev: false
@ -8109,6 +8246,23 @@ packages:
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
dev: false
/http-cache-semantics/4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: false
optional: true
/http-proxy-agent/4.0.1:
resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
engines: {node: '>= 6'}
dependencies:
'@tootallnate/once': 1.1.2
agent-base: 6.0.2
debug: 4.3.4
transitivePeerDependencies:
- supports-color
dev: false
optional: true
/https-proxy-agent/5.0.1:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
@ -8151,6 +8305,13 @@ packages:
'@babel/runtime': 7.20.13
dev: false
/iconv-lite/0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: false
/idb-keyval/6.2.0:
resolution: {integrity: sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==}
dependencies:
@ -8184,12 +8345,15 @@ packages:
/imurmurhash/0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
dev: true
/indent-string/4.0.0:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
dev: true
/infer-owner/1.0.4:
resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
dev: false
optional: true
/inflight/1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
@ -8254,6 +8418,11 @@ packages:
engines: {node: '>=8'}
dev: false
/ip/2.0.0:
resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
dev: false
optional: true
/is-alphabetical/2.0.1:
resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
dev: false
@ -8408,6 +8577,11 @@ packages:
- supports-color
dev: false
/is-lambda/1.0.1:
resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==}
dev: false
optional: true
/is-map/2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
dev: true
@ -8576,7 +8750,6 @@ packages:
/isexe/2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
/iso-url/1.2.1:
resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==}
@ -8762,7 +8935,6 @@ packages:
/jsonpointer/5.0.1:
resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
engines: {node: '>=0.10.0'}
dev: true
/jsx-ast-utils/3.3.3:
resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
@ -8793,7 +8965,7 @@ packages:
dependencies:
node-addon-api: 2.0.2
node-gyp-build: 4.6.0
readable-stream: 3.6.0
readable-stream: 3.6.1
dev: false
/keypress/0.1.0:
@ -8813,6 +8985,58 @@ packages:
resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==}
dev: true
/langchain/0.0.20:
resolution: {integrity: sha512-ADh1pRy8gWyHin3pAnsc57wO/HF9g2e/c+pQNk73qvEN5chtQjUR8/E8ZANxaMHaZOk24vXZ3Jfw40QU/faEPg==}
peerDependencies:
'@dqbd/tiktoken': ^0.4.0
'@pinecone-database/pinecone': ^0.0.8
cheerio: ^1.0.0-rc.12
chromadb: ^1.3.0
cohere-ai: ^5.0.2
hnswlib-node: ^1.3.0
huggingface: ^1.4.0
serpapi: ^1.1.1
srt-parser-2: ^1.2.2
peerDependenciesMeta:
'@dqbd/tiktoken':
optional: true
'@pinecone-database/pinecone':
optional: true
cheerio:
optional: true
chromadb:
optional: true
cohere-ai:
optional: true
hnswlib-node:
optional: true
serpapi:
optional: true
srt-parser-2:
optional: true
dependencies:
browser-or-node: 2.1.1
d3-dsv: 3.0.1
deepcopy: 2.1.0
eventsource-parser: 0.1.0
exponential-backoff: 3.1.1
expr-eval: 2.0.2
gpt-3-encoder: 1.1.4
jsonpointer: 5.0.1
openai: 3.2.1
p-queue: 7.3.4
pdf-parse: 1.1.1
sqlite3: 5.1.4
unfetch: 5.0.0
uuid: 9.0.0
yaml: 2.2.1
transitivePeerDependencies:
- bluebird
- debug
- encoding
- supports-color
dev: false
/language-subtag-registry/0.3.22:
resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
dev: true
@ -9090,6 +9314,32 @@ packages:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: false
/make-fetch-happen/9.1.0:
resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==}
engines: {node: '>= 10'}
dependencies:
agentkeepalive: 4.2.1
cacache: 15.3.0
http-cache-semantics: 4.1.1
http-proxy-agent: 4.0.1
https-proxy-agent: 5.0.1
is-lambda: 1.0.1
lru-cache: 6.0.0
minipass: 3.3.6
minipass-collect: 1.0.2
minipass-fetch: 1.4.1
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
negotiator: 0.6.3
promise-retry: 2.0.1
socks-proxy-agent: 6.2.1
ssri: 8.0.1
transitivePeerDependencies:
- bluebird
- supports-color
dev: false
optional: true
/markdown-table/3.0.3:
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
dev: false
@ -9637,6 +9887,50 @@ packages:
/minimist/1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
/minipass-collect/1.0.2:
resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==}
engines: {node: '>= 8'}
dependencies:
minipass: 3.3.6
dev: false
optional: true
/minipass-fetch/1.4.1:
resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==}
engines: {node: '>=8'}
dependencies:
minipass: 3.3.6
minipass-sized: 1.0.3
minizlib: 2.1.2
optionalDependencies:
encoding: 0.1.13
dev: false
optional: true
/minipass-flush/1.0.5:
resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
engines: {node: '>= 8'}
dependencies:
minipass: 3.3.6
dev: false
optional: true
/minipass-pipeline/1.2.4:
resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==}
engines: {node: '>=8'}
dependencies:
minipass: 3.3.6
dev: false
optional: true
/minipass-sized/1.0.3:
resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==}
engines: {node: '>=8'}
dependencies:
minipass: 3.3.6
dev: false
optional: true
/minipass/3.3.6:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
engines: {node: '>=8'}
@ -9787,6 +10081,12 @@ packages:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true
/negotiator/0.6.3:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
dev: false
optional: true
/next-i18next/13.2.1_3hsgjxhlfhabtu3n4ai6yx6ufq:
resolution: {integrity: sha512-5JYAWHedbbgIZbGBtxjTMC4M1scvkJq6Wif5kiijXzs4L0CRMpnXtAG9mWOp2N0z2znhr/RtsK3nwVgPt54PNw==}
engines: {node: '>=14'}
@ -9907,10 +10207,18 @@ packages:
resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==}
dev: false
/node-addon-api/4.3.0:
resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==}
dev: false
/node-addon-api/5.1.0:
resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==}
dev: false
/node-ensure/0.0.0:
resolution: {integrity: sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==}
dev: false
/node-fetch-native/1.0.2:
resolution: {integrity: sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==}
dev: true
@ -9956,6 +10264,28 @@ packages:
hasBin: true
dev: false
/node-gyp/8.4.1:
resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==}
engines: {node: '>= 10.12.0'}
hasBin: true
requiresBuild: true
dependencies:
env-paths: 2.2.1
glob: 7.2.3
graceful-fs: 4.2.10
make-fetch-happen: 9.1.0
nopt: 5.0.0
npmlog: 6.0.2
rimraf: 3.0.2
semver: 7.3.8
tar: 6.1.13
which: 2.0.2
transitivePeerDependencies:
- bluebird
- supports-color
dev: false
optional: true
/node-releases/2.0.8:
resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==}
@ -10028,6 +10358,17 @@ packages:
set-blocking: 2.0.0
dev: false
/npmlog/6.0.2:
resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
dependencies:
are-we-there-yet: 3.0.1
console-control-strings: 1.1.0
gauge: 4.0.4
set-blocking: 2.0.0
dev: false
optional: true
/nprogress/0.2.0:
resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
dev: false
@ -10158,6 +10499,15 @@ packages:
is-wsl: 2.2.0
dev: true
/openai/3.2.1:
resolution: {integrity: sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==}
dependencies:
axios: 0.26.1
form-data: 4.0.0
transitivePeerDependencies:
- debug
dev: false
/opener/1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
@ -10223,7 +10573,19 @@ packages:
engines: {node: '>=10'}
dependencies:
aggregate-error: 3.1.0
dev: true
/p-queue/7.3.4:
resolution: {integrity: sha512-esox8CWt0j9EZECFvkFl2WNPat8LN4t7WWeXq73D9ha0V96qPRufApZi4ZhPwXAln1uVVal429HVVKPa2X0yQg==}
engines: {node: '>=12'}
dependencies:
eventemitter3: 4.0.7
p-timeout: 5.1.0
dev: false
/p-timeout/5.1.0:
resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==}
engines: {node: '>=12'}
dev: false
/p-try/2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
@ -10331,6 +10693,16 @@ packages:
sha.js: 2.4.11
dev: false
/pdf-parse/1.1.1:
resolution: {integrity: sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==}
engines: {node: '>=6.8.1'}
dependencies:
debug: 3.2.7
node-ensure: 0.0.0
transitivePeerDependencies:
- supports-color
dev: false
/perfect-debounce/0.1.3:
resolution: {integrity: sha512-NOT9AcKiDGpnV/HBhI22Str++XWcErO/bALvHCuhv33owZW/CjH8KAFLZDCmu3727sihe0wTxpDhyGc6M8qacQ==}
dev: true
@ -10606,6 +10978,25 @@ packages:
resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==}
dev: false
/promise-inflight/1.0.1:
resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==}
peerDependencies:
bluebird: '*'
peerDependenciesMeta:
bluebird:
optional: true
dev: false
optional: true
/promise-retry/2.0.1:
resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
engines: {node: '>=10'}
dependencies:
err-code: 2.0.3
retry: 0.12.0
dev: false
optional: true
/prop-types/15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
dependencies:
@ -11301,6 +11692,12 @@ packages:
signal-exit: 3.0.7
dev: true
/retry/0.12.0:
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
engines: {node: '>= 4'}
dev: false
optional: true
/retry/0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
engines: {node: '>= 4'}
@ -11387,6 +11784,10 @@ packages:
dependencies:
queue-microtask: 1.2.3
/rw/1.3.3:
resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
dev: false
/rxjs/6.6.7:
resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
engines: {npm: '>=2.0.0'}
@ -11438,6 +11839,10 @@ packages:
engines: {node: '>=10'}
dev: false
/safer-buffer/2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: false
/scheduler/0.23.0:
resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
dependencies:
@ -11654,6 +12059,33 @@ packages:
is-fullwidth-code-point: 4.0.0
dev: true
/smart-buffer/4.2.0:
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
dev: false
optional: true
/socks-proxy-agent/6.2.1:
resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==}
engines: {node: '>= 10'}
dependencies:
agent-base: 6.0.2
debug: 4.3.4
socks: 2.7.1
transitivePeerDependencies:
- supports-color
dev: false
optional: true
/socks/2.7.1:
resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==}
engines: {node: '>= 10.13.0', npm: '>= 3.0.0'}
dependencies:
ip: 2.0.0
smart-buffer: 4.2.0
dev: false
optional: true
/sonic-boom/2.8.0:
resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==}
dependencies:
@ -11715,6 +12147,32 @@ packages:
engines: {node: '>= 10.x'}
dev: false
/sqlite3/5.1.4:
resolution: {integrity: sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA==}
requiresBuild: true
peerDependenciesMeta:
node-gyp:
optional: true
dependencies:
'@mapbox/node-pre-gyp': 1.0.10
node-addon-api: 4.3.0
tar: 6.1.13
optionalDependencies:
node-gyp: 8.4.1
transitivePeerDependencies:
- bluebird
- encoding
- supports-color
dev: false
/ssri/8.0.1:
resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==}
engines: {node: '>= 8'}
dependencies:
minipass: 3.3.6
dev: false
optional: true
/stackback/0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
dev: true
@ -12053,7 +12511,7 @@ packages:
end-of-stream: 1.4.4
fs-constants: 1.0.0
inherits: 2.0.4
readable-stream: 3.6.0
readable-stream: 3.6.1
dev: false
/tar/6.1.13:
@ -12387,6 +12845,10 @@ packages:
busboy: 1.6.0
dev: false
/unfetch/5.0.0:
resolution: {integrity: sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==}
dev: false
/unicode-canonical-property-names-ecmascript/2.0.0:
resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
engines: {node: '>=4'}
@ -12443,6 +12905,20 @@ packages:
vfile: 5.3.6
dev: false
/unique-filename/1.1.1:
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
dependencies:
unique-slug: 2.0.2
dev: false
optional: true
/unique-slug/2.0.2:
resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==}
dependencies:
imurmurhash: 0.1.4
dev: false
optional: true
/unique-string/2.0.0:
resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
engines: {node: '>=8'}
@ -13084,7 +13560,6 @@ packages:
hasBin: true
dependencies:
isexe: 2.0.0
dev: true
/why-is-node-running/2.2.2:
resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
@ -13394,7 +13869,6 @@ packages:
/yaml/2.2.1:
resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==}
engines: {node: '>= 14'}
dev: true
/yargs-parser/13.1.2:
resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==}

View File

@ -47,5 +47,7 @@
"Upgrade to Wallet": "升级为钱包",
"Disconnect": "断开连接",
"Loading": "加载中",
"Showcase": "展示柜"
"Showcase": "展示柜",
"AI-generated summary": "AI 生成的摘要",
"Generating": "生成中"
}

View File

@ -6,10 +6,16 @@ import { useEffect, useState } from "react"
import { CharacterFloatCard } from "~/components/common/CharacterFloatCard"
import { getSiteLink } from "~/lib/helpers"
import { Avatar } from "~/components/ui/Avatar"
import { EyeIcon, PencilSquareIcon } from "@heroicons/react/24/outline"
import {
EyeIcon,
PencilSquareIcon,
LightBulbIcon,
} from "@heroicons/react/24/outline"
import { useUserRole } from "~/hooks/useUserRole"
import { useTranslation } from "next-i18next"
import { useDate } from "~/hooks/useDate"
import { useGetSummary } from "~/queries/page"
import { toCid } from "~/lib/ipfs-parser"
export const PostMeta: React.FC<{
page: Note
@ -19,6 +25,11 @@ export const PostMeta: React.FC<{
const { t } = useTranslation("common")
const date = useDate()
const [isMounted, setIsMounted] = useState(false)
const { i18n } = useTranslation()
const summary = useGetSummary({
cid: toCid(page.related_urls?.[0] || ""),
lang: i18n.resolvedLanguage,
})
useEffect(() => {
setIsMounted(true)
@ -33,77 +44,90 @@ export const PostMeta: React.FC<{
}, [userRole.isSuccess, userRole.data])
return (
<div className="text-zinc-400 mt-4 xlog-post-meta space-x-5 flex items-center">
<time
dateTime={date.formatToISO(page.date_published)}
className="xlog-post-date whitespace-nowrap"
>
{date.formatDate(
page.date_published,
undefined,
isMounted ? undefined : "America/Los_Angeles",
)}
</time>
{page.tags?.filter((tag) => tag !== "post" && tag !== "page").length ? (
<>
<span className="xlog-post-tags space-x-1 truncate min-w-0">
{page.tags
?.filter((tag) => tag !== "post" && tag !== "page")
.map((tag) => (
<UniLink
className="hover:text-zinc-600"
key={tag}
href={`/tag/${tag}`}
>
<>#{tag}</>
</UniLink>
))}
</span>
</>
) : null}
<span className="xlog-post-views inline-flex items-center">
<EyeIcon className="w-4 h-4 inline-block mr-[2px]" />
<span>{page.views}</span>
</span>
{author?.username && site?.username !== author?.username && (
<>
<span className="inline-flex items-center">
<CharacterFloatCard siteId={author?.username}>
<UniLink
href={getSiteLink({
subdomain: author?.username,
})}
className="cursor-pointer hover:text-zinc-600 inline-flex items-center"
>
<Avatar
className="mr-1"
images={author?.avatars || []}
size={19}
name={author?.name}
/>
<span>{author?.name}</span>
</UniLink>
</CharacterFloatCard>
</span>
</>
)}
<UniLink
className="xlog-post-blockchain inline-block"
href={
page.related_urls?.filter((url) =>
url.startsWith(CSB_SCAN + "/tx/"),
)?.[0]
}
>
<BlockchainIcon className="fill-zinc-500 ml-1" />
</UniLink>
{showEdit && (
<UniLink
className="xlog-post-editor inline-flex items-center"
href={`${SITE_URL}/dashboard/${site?.username}/editor?id=${page.id}`}
<div className="xlog-post-meta">
<div className="text-zinc-400 mt-4 space-x-5 flex items-center">
<time
dateTime={date.formatToISO(page.date_published)}
className="xlog-post-date whitespace-nowrap"
>
<PencilSquareIcon className="w-4 h-4 mx-1 inline-block" /> Edit
{date.formatDate(
page.date_published,
undefined,
isMounted ? undefined : "America/Los_Angeles",
)}
</time>
{page.tags?.filter((tag) => tag !== "post" && tag !== "page").length ? (
<>
<span className="xlog-post-tags space-x-1 truncate min-w-0">
{page.tags
?.filter((tag) => tag !== "post" && tag !== "page")
.map((tag) => (
<UniLink
className="hover:text-zinc-600"
key={tag}
href={`/tag/${tag}`}
>
<>#{tag}</>
</UniLink>
))}
</span>
</>
) : null}
<span className="xlog-post-views inline-flex items-center">
<EyeIcon className="w-4 h-4 inline-block mr-[2px]" />
<span>{page.views}</span>
</span>
{author?.username && site?.username !== author?.username && (
<>
<span className="inline-flex items-center">
<CharacterFloatCard siteId={author?.username}>
<UniLink
href={getSiteLink({
subdomain: author?.username,
})}
className="cursor-pointer hover:text-zinc-600 inline-flex items-center"
>
<Avatar
className="mr-1"
images={author?.avatars || []}
size={19}
name={author?.name}
/>
<span>{author?.name}</span>
</UniLink>
</CharacterFloatCard>
</span>
</>
)}
<UniLink
className="xlog-post-blockchain inline-block"
href={
page.related_urls?.filter((url) =>
url.startsWith(CSB_SCAN + "/tx/"),
)?.[0]
}
>
<BlockchainIcon className="fill-zinc-500 ml-1" />
</UniLink>
{showEdit && (
<UniLink
className="xlog-post-editor inline-flex items-center"
href={`${SITE_URL}/dashboard/${site?.username}/editor?id=${page.id}`}
>
<PencilSquareIcon className="w-4 h-4 mx-1 inline-block" /> Edit
</UniLink>
)}
</div>
{!(summary.isSuccess && !summary.data) && (
<div className="border rounded-xl mt-4 p-4 space-y-2">
<div className="font-bold text-zinc-700 flex items-center">
<LightBulbIcon className="inline w-4 h-4 mr-2 stroke-[2]" />
{t("AI-generated summary")}
</div>
<div className="text-zinc-500 leading-loose text-sm">
{summary.data || `${t("Generating")}...`}
</div>
</div>
)}
</div>
)

View File

@ -22,3 +22,13 @@ export const toIPFS = (url: string) => {
.replaceAll("https://ipfs.4everland.xyz/ipfs/", IPFS_PREFIX)
.replaceAll("https://rss3.mypinata.cloud/ipfs/", IPFS_PREFIX)
}
export const toCid = (url: string) => {
return url
?.replaceAll(IPFS_GATEWAY, "")
.replaceAll("https://gateway.ipfs.io/ipfs/", "")
.replaceAll("https://ipfs.io/ipfs/", "")
.replaceAll("https://cf-ipfs.com/ipfs/", "")
.replaceAll("https://ipfs.4everland.xyz/ipfs/", "")
.replaceAll("https://rss3.mypinata.cloud/ipfs/", "")
}

View File

@ -603,3 +603,15 @@ export function toPageId({
}: ReturnType<typeof parsePageId>) {
return `${characterId}-${noteId}`
}
export async function getSummary({
cid,
lang,
}: {
cid: string
lang?: string
}) {
return await (
await fetch(`/api/summary?cid=${cid}&lang=${lang || "en"}`)
).text()
}

96
src/pages/api/summary.ts Normal file
View File

@ -0,0 +1,96 @@
import { NextApiRequest, NextApiResponse } from "next"
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter"
import { cacheGet } from "~/lib/redis.server"
import { toGateway } from "~/lib/ipfs-parser"
const returnLimit = 400
const chunkSize = 4000
const splitter = new RecursiveCharacterTextSplitter({
chunkSize,
chunkOverlap: 1,
})
async function segmentedSummary(
content: string,
lang: string,
): Promise<string> {
const segments = await splitter.createDocuments([content])
const results: string[] = await Promise.all(
segments.map(async (segment) => {
const prompt = `Summarize this in ${lang} language in less than ${returnLimit} characters: ${segment.pageContent}`
const response = await (
await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
},
body: JSON.stringify({
model: "gpt-3.5-turbo-0301",
temperature: 0,
top_p: 1,
frequency_penalty: 1,
presence_penalty: 1,
messages: [
{
role: "user",
content: prompt,
},
],
}),
})
).json()
return response.choices?.[0]?.message?.content?.trim()
}),
)
if (results.length > 1) {
return segmentedSummary(results.join("\n"), lang)
} else {
return results[0]
}
}
export async function getSummary(cid: string, lang: string = "en") {
const summary = await cacheGet({
key: ["summary", cid, lang],
getValueFun: async () => {
try {
console.log("fetching summary", cid, lang)
const { content } = await (
await fetch(toGateway(`ipfs://${cid}`))
).json()
const result = await segmentedSummary(content, lang)
return result
} catch (error) {
console.error(error)
return undefined
}
},
noUpdate: true,
})
return summary
}
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
let { cid, lang } = req.query
if (!cid) {
res.status(400).send("Bad Request")
return
}
res.status(200).send(await getSummary(cid as string, lang as string))
}

View File

@ -2,6 +2,7 @@ import * as pageModel from "~/models/page.model"
import { QueryClient } from "@tanstack/react-query"
import { cacheGet } from "~/lib/redis.server"
import { getIdBySlug } from "~/pages/api/slug2id"
import { getSummary } from "~/pages/api/summary"
export const fetchGetPage = async (
input: Parameters<typeof pageModel.getPage>[0],
@ -60,3 +61,16 @@ export const fetchGetPagesBySite = async (
})
})
}
export const prefetchGetSummary = async (
input: { cid?: string; lang?: string },
queryClient: QueryClient,
) => {
const key = ["getSummary", input.cid, input.lang]
await queryClient.fetchQuery(key, async () => {
if (!input.cid || !input.lang) {
return
}
return getSummary(input.cid, input.lang)
})
}

View File

@ -221,3 +221,15 @@ export function useGetComments(input: { pageId?: string }) {
})
})
}
export function useGetSummary(input: { cid?: string; lang?: string }) {
return useQuery(["getSummary", input.cid, input.lang], async () => {
if (!input.cid || !input.lang) {
return
}
return pageModel.getSummary({
cid: input.cid,
lang: input.lang,
})
})
}