balibabu commited on
Commit
f850783
·
1 Parent(s): 13b2570

feat: API access key management #2846 (#2865)

Browse files

### What problem does this PR solve?

feat: API access key management #2846
feat: Render markdown file with remark-loader #2846

### Type of change

- [ ] Bug Fix (non-breaking change which fixes an issue)
- [x] New Feature (non-breaking change which adds functionality)
- [ ] Documentation Update
- [ ] Refactoring
- [ ] Performance Improvement
- [ ] Other (please describe):

web/.umirc.ts CHANGED
@@ -25,6 +25,9 @@ export default defineConfig({
25
  hack: `true; @import "~@/less/index.less";`,
26
  },
27
  },
 
 
 
28
  devtool: 'source-map',
29
  copy: ['src/conf.json'],
30
  proxy: {
@@ -36,4 +39,16 @@ export default defineConfig({
36
  // pathRewrite: { '^/v1': '/v1' },
37
  },
38
  },
 
 
 
 
 
 
 
 
 
 
 
 
39
  });
 
25
  hack: `true; @import "~@/less/index.less";`,
26
  },
27
  },
28
+ mdx: {
29
+ loader: 'remark-loader',
30
+ },
31
  devtool: 'source-map',
32
  copy: ['src/conf.json'],
33
  proxy: {
 
39
  // pathRewrite: { '^/v1': '/v1' },
40
  },
41
  },
42
+ chainWebpack(memo, args) {
43
+ memo.module
44
+ .rule('markdown')
45
+ .test(/\.md$/)
46
+ .use('html-loader')
47
+ .loader('html-loader')
48
+ .end()
49
+ .use('remark-loader')
50
+ .loader('remark-loader');
51
+
52
+ return memo;
53
+ },
54
  });
web/package-lock.json CHANGED
@@ -67,6 +67,7 @@
67
  "@umijs/lint": "^4.1.1",
68
  "@umijs/plugins": "^4.1.0",
69
  "cross-env": "^7.0.3",
 
70
  "husky": "^9.0.11",
71
  "jest": "^29.7.0",
72
  "jest-environment-jsdom": "^29.7.0",
@@ -75,6 +76,7 @@
75
  "prettier-plugin-organize-imports": "^3.2.4",
76
  "prettier-plugin-packagejson": "^2.4.9",
77
  "react-dev-inspector": "^2.0.1",
 
78
  "ts-node": "^10.9.2",
79
  "typescript": "^5.0.3",
80
  "umi-plugin-icons": "^0.1.1"
@@ -13411,6 +13413,15 @@
13411
  }
13412
  ]
13413
  },
 
 
 
 
 
 
 
 
 
13414
  "node_modules/fs-extra": {
13415
  "version": "10.1.0",
13416
  "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -14279,6 +14290,56 @@
14279
  "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
14280
  "devOptional": true
14281
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14282
  "node_modules/html-minifier-terser": {
14283
  "version": "6.1.0",
14284
  "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@@ -19895,6 +19956,16 @@
19895
  "node": "*"
19896
  }
19897
  },
 
 
 
 
 
 
 
 
 
 
19898
  "node_modules/ms": {
19899
  "version": "2.1.2",
19900
  "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
@@ -23889,6 +23960,23 @@
23889
  "node": ">= 0.10"
23890
  }
23891
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23892
  "node_modules/remark-gfm": {
23893
  "version": "4.0.0",
23894
  "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.0.tgz",
@@ -23902,6 +23990,26 @@
23902
  "unified": "^11.0.0"
23903
  }
23904
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23905
  "node_modules/remark-parse": {
23906
  "version": "11.0.0",
23907
  "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz",
@@ -23935,6 +24043,728 @@
23935
  "unified": "^11.0.0"
23936
  }
23937
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23938
  "node_modules/remove-accents": {
23939
  "version": "0.4.2",
23940
  "resolved": "https://registry.npmmirror.com/remove-accents/-/remove-accents-0.4.2.tgz",
@@ -24188,6 +25018,19 @@
24188
  "queue-microtask": "^1.2.2"
24189
  }
24190
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
24191
  "node_modules/safe-array-concat": {
24192
  "version": "1.1.2",
24193
  "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
@@ -26834,6 +27677,45 @@
26834
  "uuid": "dist/bin/uuid"
26835
  }
26836
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26837
  "node_modules/v8-compile-cache": {
26838
  "version": "2.4.0",
26839
  "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
 
67
  "@umijs/lint": "^4.1.1",
68
  "@umijs/plugins": "^4.1.0",
69
  "cross-env": "^7.0.3",
70
+ "html-loader": "^5.1.0",
71
  "husky": "^9.0.11",
72
  "jest": "^29.7.0",
73
  "jest-environment-jsdom": "^29.7.0",
 
76
  "prettier-plugin-organize-imports": "^3.2.4",
77
  "prettier-plugin-packagejson": "^2.4.9",
78
  "react-dev-inspector": "^2.0.1",
79
+ "remark-loader": "^6.0.0",
80
  "ts-node": "^10.9.2",
81
  "typescript": "^5.0.3",
82
  "umi-plugin-icons": "^0.1.1"
 
13413
  }
13414
  ]
13415
  },
13416
+ "node_modules/front-matter": {
13417
+ "version": "4.0.2",
13418
+ "resolved": "https://registry.npmmirror.com/front-matter/-/front-matter-4.0.2.tgz",
13419
+ "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
13420
+ "dev": true,
13421
+ "dependencies": {
13422
+ "js-yaml": "^3.13.1"
13423
+ }
13424
+ },
13425
  "node_modules/fs-extra": {
13426
  "version": "10.1.0",
13427
  "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
 
14290
  "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
14291
  "devOptional": true
14292
  },
14293
+ "node_modules/html-loader": {
14294
+ "version": "5.1.0",
14295
+ "resolved": "https://registry.npmmirror.com/html-loader/-/html-loader-5.1.0.tgz",
14296
+ "integrity": "sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA==",
14297
+ "dev": true,
14298
+ "dependencies": {
14299
+ "html-minifier-terser": "^7.2.0",
14300
+ "parse5": "^7.1.2"
14301
+ },
14302
+ "engines": {
14303
+ "node": ">= 18.12.0"
14304
+ },
14305
+ "funding": {
14306
+ "type": "opencollective",
14307
+ "url": "https://opencollective.com/webpack"
14308
+ },
14309
+ "peerDependencies": {
14310
+ "webpack": "^5.0.0"
14311
+ }
14312
+ },
14313
+ "node_modules/html-loader/node_modules/commander": {
14314
+ "version": "10.0.1",
14315
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz",
14316
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
14317
+ "dev": true,
14318
+ "engines": {
14319
+ "node": ">=14"
14320
+ }
14321
+ },
14322
+ "node_modules/html-loader/node_modules/html-minifier-terser": {
14323
+ "version": "7.2.0",
14324
+ "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
14325
+ "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
14326
+ "dev": true,
14327
+ "dependencies": {
14328
+ "camel-case": "^4.1.2",
14329
+ "clean-css": "~5.3.2",
14330
+ "commander": "^10.0.0",
14331
+ "entities": "^4.4.0",
14332
+ "param-case": "^3.0.4",
14333
+ "relateurl": "^0.2.7",
14334
+ "terser": "^5.15.1"
14335
+ },
14336
+ "bin": {
14337
+ "html-minifier-terser": "cli.js"
14338
+ },
14339
+ "engines": {
14340
+ "node": "^14.13.1 || >=16.0.0"
14341
+ }
14342
+ },
14343
  "node_modules/html-minifier-terser": {
14344
  "version": "6.1.0",
14345
  "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
 
19956
  "node": "*"
19957
  }
19958
  },
19959
+ "node_modules/mri": {
19960
+ "version": "1.2.0",
19961
+ "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz",
19962
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
19963
+ "dev": true,
19964
+ "peer": true,
19965
+ "engines": {
19966
+ "node": ">=4"
19967
+ }
19968
+ },
19969
  "node_modules/ms": {
19970
  "version": "2.1.2",
19971
  "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
 
23960
  "node": ">= 0.10"
23961
  }
23962
  },
23963
+ "node_modules/remark": {
23964
+ "version": "14.0.3",
23965
+ "resolved": "https://registry.npmmirror.com/remark/-/remark-14.0.3.tgz",
23966
+ "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==",
23967
+ "dev": true,
23968
+ "peer": true,
23969
+ "dependencies": {
23970
+ "@types/mdast": "^3.0.0",
23971
+ "remark-parse": "^10.0.0",
23972
+ "remark-stringify": "^10.0.0",
23973
+ "unified": "^10.0.0"
23974
+ },
23975
+ "funding": {
23976
+ "type": "opencollective",
23977
+ "url": "https://opencollective.com/unified"
23978
+ }
23979
+ },
23980
  "node_modules/remark-gfm": {
23981
  "version": "4.0.0",
23982
  "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.0.tgz",
 
23990
  "unified": "^11.0.0"
23991
  }
23992
  },
23993
+ "node_modules/remark-loader": {
23994
+ "version": "6.0.0",
23995
+ "resolved": "https://registry.npmmirror.com/remark-loader/-/remark-loader-6.0.0.tgz",
23996
+ "integrity": "sha512-3Z4WLyVYbI1F6TQNnA9/iuHsoRcu8ruH2ABixLpgSWiSiYdNgURgLdpbdze8jTm2+VWWcAq9xIH7maWSpi2sSw==",
23997
+ "dev": true,
23998
+ "dependencies": {
23999
+ "front-matter": "^4.0.2"
24000
+ },
24001
+ "engines": {
24002
+ "node": ">= 18.12.0"
24003
+ },
24004
+ "funding": {
24005
+ "type": "opencollective",
24006
+ "url": "https://opencollective.com/webpack"
24007
+ },
24008
+ "peerDependencies": {
24009
+ "remark": "^14.0.0",
24010
+ "webpack": "^5.0.0"
24011
+ }
24012
+ },
24013
  "node_modules/remark-parse": {
24014
  "version": "11.0.0",
24015
  "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz",
 
24043
  "unified": "^11.0.0"
24044
  }
24045
  },
24046
+ "node_modules/remark/node_modules/@types/mdast": {
24047
+ "version": "3.0.15",
24048
+ "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.15.tgz",
24049
+ "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
24050
+ "dev": true,
24051
+ "peer": true,
24052
+ "dependencies": {
24053
+ "@types/unist": "^2"
24054
+ }
24055
+ },
24056
+ "node_modules/remark/node_modules/@types/unist": {
24057
+ "version": "2.0.11",
24058
+ "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz",
24059
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
24060
+ "dev": true,
24061
+ "peer": true
24062
+ },
24063
+ "node_modules/remark/node_modules/is-buffer": {
24064
+ "version": "2.0.5",
24065
+ "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-2.0.5.tgz",
24066
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
24067
+ "dev": true,
24068
+ "funding": [
24069
+ {
24070
+ "type": "github",
24071
+ "url": "https://github.com/sponsors/feross"
24072
+ },
24073
+ {
24074
+ "type": "patreon",
24075
+ "url": "https://www.patreon.com/feross"
24076
+ },
24077
+ {
24078
+ "type": "consulting",
24079
+ "url": "https://feross.org/support"
24080
+ }
24081
+ ],
24082
+ "peer": true,
24083
+ "engines": {
24084
+ "node": ">=4"
24085
+ }
24086
+ },
24087
+ "node_modules/remark/node_modules/mdast-util-from-markdown": {
24088
+ "version": "1.3.1",
24089
+ "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz",
24090
+ "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==",
24091
+ "dev": true,
24092
+ "peer": true,
24093
+ "dependencies": {
24094
+ "@types/mdast": "^3.0.0",
24095
+ "@types/unist": "^2.0.0",
24096
+ "decode-named-character-reference": "^1.0.0",
24097
+ "mdast-util-to-string": "^3.1.0",
24098
+ "micromark": "^3.0.0",
24099
+ "micromark-util-decode-numeric-character-reference": "^1.0.0",
24100
+ "micromark-util-decode-string": "^1.0.0",
24101
+ "micromark-util-normalize-identifier": "^1.0.0",
24102
+ "micromark-util-symbol": "^1.0.0",
24103
+ "micromark-util-types": "^1.0.0",
24104
+ "unist-util-stringify-position": "^3.0.0",
24105
+ "uvu": "^0.5.0"
24106
+ },
24107
+ "funding": {
24108
+ "type": "opencollective",
24109
+ "url": "https://opencollective.com/unified"
24110
+ }
24111
+ },
24112
+ "node_modules/remark/node_modules/mdast-util-phrasing": {
24113
+ "version": "3.0.1",
24114
+ "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz",
24115
+ "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==",
24116
+ "dev": true,
24117
+ "peer": true,
24118
+ "dependencies": {
24119
+ "@types/mdast": "^3.0.0",
24120
+ "unist-util-is": "^5.0.0"
24121
+ },
24122
+ "funding": {
24123
+ "type": "opencollective",
24124
+ "url": "https://opencollective.com/unified"
24125
+ }
24126
+ },
24127
+ "node_modules/remark/node_modules/mdast-util-to-markdown": {
24128
+ "version": "1.5.0",
24129
+ "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz",
24130
+ "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==",
24131
+ "dev": true,
24132
+ "peer": true,
24133
+ "dependencies": {
24134
+ "@types/mdast": "^3.0.0",
24135
+ "@types/unist": "^2.0.0",
24136
+ "longest-streak": "^3.0.0",
24137
+ "mdast-util-phrasing": "^3.0.0",
24138
+ "mdast-util-to-string": "^3.0.0",
24139
+ "micromark-util-decode-string": "^1.0.0",
24140
+ "unist-util-visit": "^4.0.0",
24141
+ "zwitch": "^2.0.0"
24142
+ },
24143
+ "funding": {
24144
+ "type": "opencollective",
24145
+ "url": "https://opencollective.com/unified"
24146
+ }
24147
+ },
24148
+ "node_modules/remark/node_modules/mdast-util-to-string": {
24149
+ "version": "3.2.0",
24150
+ "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz",
24151
+ "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==",
24152
+ "dev": true,
24153
+ "peer": true,
24154
+ "dependencies": {
24155
+ "@types/mdast": "^3.0.0"
24156
+ },
24157
+ "funding": {
24158
+ "type": "opencollective",
24159
+ "url": "https://opencollective.com/unified"
24160
+ }
24161
+ },
24162
+ "node_modules/remark/node_modules/micromark": {
24163
+ "version": "3.2.0",
24164
+ "resolved": "https://registry.npmmirror.com/micromark/-/micromark-3.2.0.tgz",
24165
+ "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==",
24166
+ "dev": true,
24167
+ "funding": [
24168
+ {
24169
+ "type": "GitHub Sponsors",
24170
+ "url": "https://github.com/sponsors/unifiedjs"
24171
+ },
24172
+ {
24173
+ "type": "OpenCollective",
24174
+ "url": "https://opencollective.com/unified"
24175
+ }
24176
+ ],
24177
+ "peer": true,
24178
+ "dependencies": {
24179
+ "@types/debug": "^4.0.0",
24180
+ "debug": "^4.0.0",
24181
+ "decode-named-character-reference": "^1.0.0",
24182
+ "micromark-core-commonmark": "^1.0.1",
24183
+ "micromark-factory-space": "^1.0.0",
24184
+ "micromark-util-character": "^1.0.0",
24185
+ "micromark-util-chunked": "^1.0.0",
24186
+ "micromark-util-combine-extensions": "^1.0.0",
24187
+ "micromark-util-decode-numeric-character-reference": "^1.0.0",
24188
+ "micromark-util-encode": "^1.0.0",
24189
+ "micromark-util-normalize-identifier": "^1.0.0",
24190
+ "micromark-util-resolve-all": "^1.0.0",
24191
+ "micromark-util-sanitize-uri": "^1.0.0",
24192
+ "micromark-util-subtokenize": "^1.0.0",
24193
+ "micromark-util-symbol": "^1.0.0",
24194
+ "micromark-util-types": "^1.0.1",
24195
+ "uvu": "^0.5.0"
24196
+ }
24197
+ },
24198
+ "node_modules/remark/node_modules/micromark-core-commonmark": {
24199
+ "version": "1.1.0",
24200
+ "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz",
24201
+ "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==",
24202
+ "dev": true,
24203
+ "funding": [
24204
+ {
24205
+ "type": "GitHub Sponsors",
24206
+ "url": "https://github.com/sponsors/unifiedjs"
24207
+ },
24208
+ {
24209
+ "type": "OpenCollective",
24210
+ "url": "https://opencollective.com/unified"
24211
+ }
24212
+ ],
24213
+ "peer": true,
24214
+ "dependencies": {
24215
+ "decode-named-character-reference": "^1.0.0",
24216
+ "micromark-factory-destination": "^1.0.0",
24217
+ "micromark-factory-label": "^1.0.0",
24218
+ "micromark-factory-space": "^1.0.0",
24219
+ "micromark-factory-title": "^1.0.0",
24220
+ "micromark-factory-whitespace": "^1.0.0",
24221
+ "micromark-util-character": "^1.0.0",
24222
+ "micromark-util-chunked": "^1.0.0",
24223
+ "micromark-util-classify-character": "^1.0.0",
24224
+ "micromark-util-html-tag-name": "^1.0.0",
24225
+ "micromark-util-normalize-identifier": "^1.0.0",
24226
+ "micromark-util-resolve-all": "^1.0.0",
24227
+ "micromark-util-subtokenize": "^1.0.0",
24228
+ "micromark-util-symbol": "^1.0.0",
24229
+ "micromark-util-types": "^1.0.1",
24230
+ "uvu": "^0.5.0"
24231
+ }
24232
+ },
24233
+ "node_modules/remark/node_modules/micromark-factory-destination": {
24234
+ "version": "1.1.0",
24235
+ "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz",
24236
+ "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==",
24237
+ "dev": true,
24238
+ "funding": [
24239
+ {
24240
+ "type": "GitHub Sponsors",
24241
+ "url": "https://github.com/sponsors/unifiedjs"
24242
+ },
24243
+ {
24244
+ "type": "OpenCollective",
24245
+ "url": "https://opencollective.com/unified"
24246
+ }
24247
+ ],
24248
+ "peer": true,
24249
+ "dependencies": {
24250
+ "micromark-util-character": "^1.0.0",
24251
+ "micromark-util-symbol": "^1.0.0",
24252
+ "micromark-util-types": "^1.0.0"
24253
+ }
24254
+ },
24255
+ "node_modules/remark/node_modules/micromark-factory-label": {
24256
+ "version": "1.1.0",
24257
+ "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz",
24258
+ "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==",
24259
+ "dev": true,
24260
+ "funding": [
24261
+ {
24262
+ "type": "GitHub Sponsors",
24263
+ "url": "https://github.com/sponsors/unifiedjs"
24264
+ },
24265
+ {
24266
+ "type": "OpenCollective",
24267
+ "url": "https://opencollective.com/unified"
24268
+ }
24269
+ ],
24270
+ "peer": true,
24271
+ "dependencies": {
24272
+ "micromark-util-character": "^1.0.0",
24273
+ "micromark-util-symbol": "^1.0.0",
24274
+ "micromark-util-types": "^1.0.0",
24275
+ "uvu": "^0.5.0"
24276
+ }
24277
+ },
24278
+ "node_modules/remark/node_modules/micromark-factory-space": {
24279
+ "version": "1.1.0",
24280
+ "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
24281
+ "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
24282
+ "dev": true,
24283
+ "funding": [
24284
+ {
24285
+ "type": "GitHub Sponsors",
24286
+ "url": "https://github.com/sponsors/unifiedjs"
24287
+ },
24288
+ {
24289
+ "type": "OpenCollective",
24290
+ "url": "https://opencollective.com/unified"
24291
+ }
24292
+ ],
24293
+ "peer": true,
24294
+ "dependencies": {
24295
+ "micromark-util-character": "^1.0.0",
24296
+ "micromark-util-types": "^1.0.0"
24297
+ }
24298
+ },
24299
+ "node_modules/remark/node_modules/micromark-factory-title": {
24300
+ "version": "1.1.0",
24301
+ "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz",
24302
+ "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==",
24303
+ "dev": true,
24304
+ "funding": [
24305
+ {
24306
+ "type": "GitHub Sponsors",
24307
+ "url": "https://github.com/sponsors/unifiedjs"
24308
+ },
24309
+ {
24310
+ "type": "OpenCollective",
24311
+ "url": "https://opencollective.com/unified"
24312
+ }
24313
+ ],
24314
+ "peer": true,
24315
+ "dependencies": {
24316
+ "micromark-factory-space": "^1.0.0",
24317
+ "micromark-util-character": "^1.0.0",
24318
+ "micromark-util-symbol": "^1.0.0",
24319
+ "micromark-util-types": "^1.0.0"
24320
+ }
24321
+ },
24322
+ "node_modules/remark/node_modules/micromark-factory-whitespace": {
24323
+ "version": "1.1.0",
24324
+ "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz",
24325
+ "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==",
24326
+ "dev": true,
24327
+ "funding": [
24328
+ {
24329
+ "type": "GitHub Sponsors",
24330
+ "url": "https://github.com/sponsors/unifiedjs"
24331
+ },
24332
+ {
24333
+ "type": "OpenCollective",
24334
+ "url": "https://opencollective.com/unified"
24335
+ }
24336
+ ],
24337
+ "peer": true,
24338
+ "dependencies": {
24339
+ "micromark-factory-space": "^1.0.0",
24340
+ "micromark-util-character": "^1.0.0",
24341
+ "micromark-util-symbol": "^1.0.0",
24342
+ "micromark-util-types": "^1.0.0"
24343
+ }
24344
+ },
24345
+ "node_modules/remark/node_modules/micromark-util-character": {
24346
+ "version": "1.2.0",
24347
+ "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
24348
+ "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
24349
+ "dev": true,
24350
+ "funding": [
24351
+ {
24352
+ "type": "GitHub Sponsors",
24353
+ "url": "https://github.com/sponsors/unifiedjs"
24354
+ },
24355
+ {
24356
+ "type": "OpenCollective",
24357
+ "url": "https://opencollective.com/unified"
24358
+ }
24359
+ ],
24360
+ "peer": true,
24361
+ "dependencies": {
24362
+ "micromark-util-symbol": "^1.0.0",
24363
+ "micromark-util-types": "^1.0.0"
24364
+ }
24365
+ },
24366
+ "node_modules/remark/node_modules/micromark-util-chunked": {
24367
+ "version": "1.1.0",
24368
+ "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz",
24369
+ "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==",
24370
+ "dev": true,
24371
+ "funding": [
24372
+ {
24373
+ "type": "GitHub Sponsors",
24374
+ "url": "https://github.com/sponsors/unifiedjs"
24375
+ },
24376
+ {
24377
+ "type": "OpenCollective",
24378
+ "url": "https://opencollective.com/unified"
24379
+ }
24380
+ ],
24381
+ "peer": true,
24382
+ "dependencies": {
24383
+ "micromark-util-symbol": "^1.0.0"
24384
+ }
24385
+ },
24386
+ "node_modules/remark/node_modules/micromark-util-classify-character": {
24387
+ "version": "1.1.0",
24388
+ "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz",
24389
+ "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==",
24390
+ "dev": true,
24391
+ "funding": [
24392
+ {
24393
+ "type": "GitHub Sponsors",
24394
+ "url": "https://github.com/sponsors/unifiedjs"
24395
+ },
24396
+ {
24397
+ "type": "OpenCollective",
24398
+ "url": "https://opencollective.com/unified"
24399
+ }
24400
+ ],
24401
+ "peer": true,
24402
+ "dependencies": {
24403
+ "micromark-util-character": "^1.0.0",
24404
+ "micromark-util-symbol": "^1.0.0",
24405
+ "micromark-util-types": "^1.0.0"
24406
+ }
24407
+ },
24408
+ "node_modules/remark/node_modules/micromark-util-combine-extensions": {
24409
+ "version": "1.1.0",
24410
+ "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz",
24411
+ "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==",
24412
+ "dev": true,
24413
+ "funding": [
24414
+ {
24415
+ "type": "GitHub Sponsors",
24416
+ "url": "https://github.com/sponsors/unifiedjs"
24417
+ },
24418
+ {
24419
+ "type": "OpenCollective",
24420
+ "url": "https://opencollective.com/unified"
24421
+ }
24422
+ ],
24423
+ "peer": true,
24424
+ "dependencies": {
24425
+ "micromark-util-chunked": "^1.0.0",
24426
+ "micromark-util-types": "^1.0.0"
24427
+ }
24428
+ },
24429
+ "node_modules/remark/node_modules/micromark-util-decode-numeric-character-reference": {
24430
+ "version": "1.1.0",
24431
+ "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
24432
+ "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
24433
+ "dev": true,
24434
+ "funding": [
24435
+ {
24436
+ "type": "GitHub Sponsors",
24437
+ "url": "https://github.com/sponsors/unifiedjs"
24438
+ },
24439
+ {
24440
+ "type": "OpenCollective",
24441
+ "url": "https://opencollective.com/unified"
24442
+ }
24443
+ ],
24444
+ "peer": true,
24445
+ "dependencies": {
24446
+ "micromark-util-symbol": "^1.0.0"
24447
+ }
24448
+ },
24449
+ "node_modules/remark/node_modules/micromark-util-decode-string": {
24450
+ "version": "1.1.0",
24451
+ "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
24452
+ "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
24453
+ "dev": true,
24454
+ "funding": [
24455
+ {
24456
+ "type": "GitHub Sponsors",
24457
+ "url": "https://github.com/sponsors/unifiedjs"
24458
+ },
24459
+ {
24460
+ "type": "OpenCollective",
24461
+ "url": "https://opencollective.com/unified"
24462
+ }
24463
+ ],
24464
+ "peer": true,
24465
+ "dependencies": {
24466
+ "decode-named-character-reference": "^1.0.0",
24467
+ "micromark-util-character": "^1.0.0",
24468
+ "micromark-util-decode-numeric-character-reference": "^1.0.0",
24469
+ "micromark-util-symbol": "^1.0.0"
24470
+ }
24471
+ },
24472
+ "node_modules/remark/node_modules/micromark-util-encode": {
24473
+ "version": "1.1.0",
24474
+ "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz",
24475
+ "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==",
24476
+ "dev": true,
24477
+ "funding": [
24478
+ {
24479
+ "type": "GitHub Sponsors",
24480
+ "url": "https://github.com/sponsors/unifiedjs"
24481
+ },
24482
+ {
24483
+ "type": "OpenCollective",
24484
+ "url": "https://opencollective.com/unified"
24485
+ }
24486
+ ],
24487
+ "peer": true
24488
+ },
24489
+ "node_modules/remark/node_modules/micromark-util-html-tag-name": {
24490
+ "version": "1.2.0",
24491
+ "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz",
24492
+ "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==",
24493
+ "dev": true,
24494
+ "funding": [
24495
+ {
24496
+ "type": "GitHub Sponsors",
24497
+ "url": "https://github.com/sponsors/unifiedjs"
24498
+ },
24499
+ {
24500
+ "type": "OpenCollective",
24501
+ "url": "https://opencollective.com/unified"
24502
+ }
24503
+ ],
24504
+ "peer": true
24505
+ },
24506
+ "node_modules/remark/node_modules/micromark-util-normalize-identifier": {
24507
+ "version": "1.1.0",
24508
+ "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz",
24509
+ "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==",
24510
+ "dev": true,
24511
+ "funding": [
24512
+ {
24513
+ "type": "GitHub Sponsors",
24514
+ "url": "https://github.com/sponsors/unifiedjs"
24515
+ },
24516
+ {
24517
+ "type": "OpenCollective",
24518
+ "url": "https://opencollective.com/unified"
24519
+ }
24520
+ ],
24521
+ "peer": true,
24522
+ "dependencies": {
24523
+ "micromark-util-symbol": "^1.0.0"
24524
+ }
24525
+ },
24526
+ "node_modules/remark/node_modules/micromark-util-resolve-all": {
24527
+ "version": "1.1.0",
24528
+ "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz",
24529
+ "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==",
24530
+ "dev": true,
24531
+ "funding": [
24532
+ {
24533
+ "type": "GitHub Sponsors",
24534
+ "url": "https://github.com/sponsors/unifiedjs"
24535
+ },
24536
+ {
24537
+ "type": "OpenCollective",
24538
+ "url": "https://opencollective.com/unified"
24539
+ }
24540
+ ],
24541
+ "peer": true,
24542
+ "dependencies": {
24543
+ "micromark-util-types": "^1.0.0"
24544
+ }
24545
+ },
24546
+ "node_modules/remark/node_modules/micromark-util-sanitize-uri": {
24547
+ "version": "1.2.0",
24548
+ "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz",
24549
+ "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==",
24550
+ "dev": true,
24551
+ "funding": [
24552
+ {
24553
+ "type": "GitHub Sponsors",
24554
+ "url": "https://github.com/sponsors/unifiedjs"
24555
+ },
24556
+ {
24557
+ "type": "OpenCollective",
24558
+ "url": "https://opencollective.com/unified"
24559
+ }
24560
+ ],
24561
+ "peer": true,
24562
+ "dependencies": {
24563
+ "micromark-util-character": "^1.0.0",
24564
+ "micromark-util-encode": "^1.0.0",
24565
+ "micromark-util-symbol": "^1.0.0"
24566
+ }
24567
+ },
24568
+ "node_modules/remark/node_modules/micromark-util-subtokenize": {
24569
+ "version": "1.1.0",
24570
+ "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz",
24571
+ "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==",
24572
+ "dev": true,
24573
+ "funding": [
24574
+ {
24575
+ "type": "GitHub Sponsors",
24576
+ "url": "https://github.com/sponsors/unifiedjs"
24577
+ },
24578
+ {
24579
+ "type": "OpenCollective",
24580
+ "url": "https://opencollective.com/unified"
24581
+ }
24582
+ ],
24583
+ "peer": true,
24584
+ "dependencies": {
24585
+ "micromark-util-chunked": "^1.0.0",
24586
+ "micromark-util-symbol": "^1.0.0",
24587
+ "micromark-util-types": "^1.0.0",
24588
+ "uvu": "^0.5.0"
24589
+ }
24590
+ },
24591
+ "node_modules/remark/node_modules/micromark-util-symbol": {
24592
+ "version": "1.1.0",
24593
+ "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
24594
+ "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
24595
+ "dev": true,
24596
+ "funding": [
24597
+ {
24598
+ "type": "GitHub Sponsors",
24599
+ "url": "https://github.com/sponsors/unifiedjs"
24600
+ },
24601
+ {
24602
+ "type": "OpenCollective",
24603
+ "url": "https://opencollective.com/unified"
24604
+ }
24605
+ ],
24606
+ "peer": true
24607
+ },
24608
+ "node_modules/remark/node_modules/micromark-util-types": {
24609
+ "version": "1.1.0",
24610
+ "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
24611
+ "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
24612
+ "dev": true,
24613
+ "funding": [
24614
+ {
24615
+ "type": "GitHub Sponsors",
24616
+ "url": "https://github.com/sponsors/unifiedjs"
24617
+ },
24618
+ {
24619
+ "type": "OpenCollective",
24620
+ "url": "https://opencollective.com/unified"
24621
+ }
24622
+ ],
24623
+ "peer": true
24624
+ },
24625
+ "node_modules/remark/node_modules/remark-parse": {
24626
+ "version": "10.0.2",
24627
+ "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-10.0.2.tgz",
24628
+ "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==",
24629
+ "dev": true,
24630
+ "peer": true,
24631
+ "dependencies": {
24632
+ "@types/mdast": "^3.0.0",
24633
+ "mdast-util-from-markdown": "^1.0.0",
24634
+ "unified": "^10.0.0"
24635
+ },
24636
+ "funding": {
24637
+ "type": "opencollective",
24638
+ "url": "https://opencollective.com/unified"
24639
+ }
24640
+ },
24641
+ "node_modules/remark/node_modules/remark-stringify": {
24642
+ "version": "10.0.3",
24643
+ "resolved": "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-10.0.3.tgz",
24644
+ "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==",
24645
+ "dev": true,
24646
+ "peer": true,
24647
+ "dependencies": {
24648
+ "@types/mdast": "^3.0.0",
24649
+ "mdast-util-to-markdown": "^1.0.0",
24650
+ "unified": "^10.0.0"
24651
+ },
24652
+ "funding": {
24653
+ "type": "opencollective",
24654
+ "url": "https://opencollective.com/unified"
24655
+ }
24656
+ },
24657
+ "node_modules/remark/node_modules/unified": {
24658
+ "version": "10.1.2",
24659
+ "resolved": "https://registry.npmmirror.com/unified/-/unified-10.1.2.tgz",
24660
+ "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
24661
+ "dev": true,
24662
+ "peer": true,
24663
+ "dependencies": {
24664
+ "@types/unist": "^2.0.0",
24665
+ "bail": "^2.0.0",
24666
+ "extend": "^3.0.0",
24667
+ "is-buffer": "^2.0.0",
24668
+ "is-plain-obj": "^4.0.0",
24669
+ "trough": "^2.0.0",
24670
+ "vfile": "^5.0.0"
24671
+ },
24672
+ "funding": {
24673
+ "type": "opencollective",
24674
+ "url": "https://opencollective.com/unified"
24675
+ }
24676
+ },
24677
+ "node_modules/remark/node_modules/unist-util-is": {
24678
+ "version": "5.2.1",
24679
+ "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-5.2.1.tgz",
24680
+ "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
24681
+ "dev": true,
24682
+ "peer": true,
24683
+ "dependencies": {
24684
+ "@types/unist": "^2.0.0"
24685
+ },
24686
+ "funding": {
24687
+ "type": "opencollective",
24688
+ "url": "https://opencollective.com/unified"
24689
+ }
24690
+ },
24691
+ "node_modules/remark/node_modules/unist-util-stringify-position": {
24692
+ "version": "3.0.3",
24693
+ "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
24694
+ "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
24695
+ "dev": true,
24696
+ "peer": true,
24697
+ "dependencies": {
24698
+ "@types/unist": "^2.0.0"
24699
+ },
24700
+ "funding": {
24701
+ "type": "opencollective",
24702
+ "url": "https://opencollective.com/unified"
24703
+ }
24704
+ },
24705
+ "node_modules/remark/node_modules/unist-util-visit": {
24706
+ "version": "4.1.2",
24707
+ "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
24708
+ "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
24709
+ "dev": true,
24710
+ "peer": true,
24711
+ "dependencies": {
24712
+ "@types/unist": "^2.0.0",
24713
+ "unist-util-is": "^5.0.0",
24714
+ "unist-util-visit-parents": "^5.1.1"
24715
+ },
24716
+ "funding": {
24717
+ "type": "opencollective",
24718
+ "url": "https://opencollective.com/unified"
24719
+ }
24720
+ },
24721
+ "node_modules/remark/node_modules/unist-util-visit-parents": {
24722
+ "version": "5.1.3",
24723
+ "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
24724
+ "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
24725
+ "dev": true,
24726
+ "peer": true,
24727
+ "dependencies": {
24728
+ "@types/unist": "^2.0.0",
24729
+ "unist-util-is": "^5.0.0"
24730
+ },
24731
+ "funding": {
24732
+ "type": "opencollective",
24733
+ "url": "https://opencollective.com/unified"
24734
+ }
24735
+ },
24736
+ "node_modules/remark/node_modules/vfile": {
24737
+ "version": "5.3.7",
24738
+ "resolved": "https://registry.npmmirror.com/vfile/-/vfile-5.3.7.tgz",
24739
+ "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
24740
+ "dev": true,
24741
+ "peer": true,
24742
+ "dependencies": {
24743
+ "@types/unist": "^2.0.0",
24744
+ "is-buffer": "^2.0.0",
24745
+ "unist-util-stringify-position": "^3.0.0",
24746
+ "vfile-message": "^3.0.0"
24747
+ },
24748
+ "funding": {
24749
+ "type": "opencollective",
24750
+ "url": "https://opencollective.com/unified"
24751
+ }
24752
+ },
24753
+ "node_modules/remark/node_modules/vfile-message": {
24754
+ "version": "3.1.4",
24755
+ "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-3.1.4.tgz",
24756
+ "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
24757
+ "dev": true,
24758
+ "peer": true,
24759
+ "dependencies": {
24760
+ "@types/unist": "^2.0.0",
24761
+ "unist-util-stringify-position": "^3.0.0"
24762
+ },
24763
+ "funding": {
24764
+ "type": "opencollective",
24765
+ "url": "https://opencollective.com/unified"
24766
+ }
24767
+ },
24768
  "node_modules/remove-accents": {
24769
  "version": "0.4.2",
24770
  "resolved": "https://registry.npmmirror.com/remove-accents/-/remove-accents-0.4.2.tgz",
 
25018
  "queue-microtask": "^1.2.2"
25019
  }
25020
  },
25021
+ "node_modules/sade": {
25022
+ "version": "1.8.1",
25023
+ "resolved": "https://registry.npmmirror.com/sade/-/sade-1.8.1.tgz",
25024
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
25025
+ "dev": true,
25026
+ "peer": true,
25027
+ "dependencies": {
25028
+ "mri": "^1.1.0"
25029
+ },
25030
+ "engines": {
25031
+ "node": ">=6"
25032
+ }
25033
+ },
25034
  "node_modules/safe-array-concat": {
25035
  "version": "1.1.2",
25036
  "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
 
27677
  "uuid": "dist/bin/uuid"
27678
  }
27679
  },
27680
+ "node_modules/uvu": {
27681
+ "version": "0.5.6",
27682
+ "resolved": "https://registry.npmmirror.com/uvu/-/uvu-0.5.6.tgz",
27683
+ "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==",
27684
+ "dev": true,
27685
+ "peer": true,
27686
+ "dependencies": {
27687
+ "dequal": "^2.0.0",
27688
+ "diff": "^5.0.0",
27689
+ "kleur": "^4.0.3",
27690
+ "sade": "^1.7.3"
27691
+ },
27692
+ "bin": {
27693
+ "uvu": "bin.js"
27694
+ },
27695
+ "engines": {
27696
+ "node": ">=8"
27697
+ }
27698
+ },
27699
+ "node_modules/uvu/node_modules/diff": {
27700
+ "version": "5.2.0",
27701
+ "resolved": "https://registry.npmmirror.com/diff/-/diff-5.2.0.tgz",
27702
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
27703
+ "dev": true,
27704
+ "peer": true,
27705
+ "engines": {
27706
+ "node": ">=0.3.1"
27707
+ }
27708
+ },
27709
+ "node_modules/uvu/node_modules/kleur": {
27710
+ "version": "4.1.5",
27711
+ "resolved": "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz",
27712
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
27713
+ "dev": true,
27714
+ "peer": true,
27715
+ "engines": {
27716
+ "node": ">=6"
27717
+ }
27718
+ },
27719
  "node_modules/v8-compile-cache": {
27720
  "version": "2.4.0",
27721
  "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
web/package.json CHANGED
@@ -78,6 +78,7 @@
78
  "@umijs/lint": "^4.1.1",
79
  "@umijs/plugins": "^4.1.0",
80
  "cross-env": "^7.0.3",
 
81
  "husky": "^9.0.11",
82
  "jest": "^29.7.0",
83
  "jest-environment-jsdom": "^29.7.0",
@@ -86,6 +87,7 @@
86
  "prettier-plugin-organize-imports": "^3.2.4",
87
  "prettier-plugin-packagejson": "^2.4.9",
88
  "react-dev-inspector": "^2.0.1",
 
89
  "ts-node": "^10.9.2",
90
  "typescript": "^5.0.3",
91
  "umi-plugin-icons": "^0.1.1"
 
78
  "@umijs/lint": "^4.1.1",
79
  "@umijs/plugins": "^4.1.0",
80
  "cross-env": "^7.0.3",
81
+ "html-loader": "^5.1.0",
82
  "husky": "^9.0.11",
83
  "jest": "^29.7.0",
84
  "jest-environment-jsdom": "^29.7.0",
 
87
  "prettier-plugin-organize-imports": "^3.2.4",
88
  "prettier-plugin-packagejson": "^2.4.9",
89
  "react-dev-inspector": "^2.0.1",
90
+ "remark-loader": "^6.0.0",
91
  "ts-node": "^10.9.2",
92
  "typescript": "^5.0.3",
93
  "umi-plugin-icons": "^0.1.1"
web/src/assets/svg/api.svg ADDED
web/src/components/api-service/chat-api-key-modal/index.tsx CHANGED
@@ -12,9 +12,9 @@ const ChatApiKeyModal = ({
12
  dialogId,
13
  hideModal,
14
  idKey,
15
- }: IModalProps<any> & { dialogId: string; idKey: string }) => {
16
  const { createToken, removeToken, tokenList, listLoading, creatingLoading } =
17
- useOperateApiKey(dialogId, idKey);
18
  const { t } = useTranslate('chat');
19
 
20
  const columns: TableProps<IToken>['columns'] = [
@@ -36,9 +36,7 @@ const ChatApiKeyModal = ({
36
  render: (_, record) => (
37
  <Space size="middle">
38
  <CopyToClipboard text={record.token}></CopyToClipboard>
39
- <DeleteOutlined
40
- onClick={() => removeToken(record.token, record.tenant_id)}
41
- />
42
  </Space>
43
  ),
44
  },
@@ -60,8 +58,13 @@ const ChatApiKeyModal = ({
60
  dataSource={tokenList}
61
  rowKey={'token'}
62
  loading={listLoading}
 
63
  />
64
- <Button onClick={createToken} loading={creatingLoading}>
 
 
 
 
65
  {t('createNewKey')}
66
  </Button>
67
  </Modal>
 
12
  dialogId,
13
  hideModal,
14
  idKey,
15
+ }: IModalProps<any> & { dialogId?: string; idKey: string }) => {
16
  const { createToken, removeToken, tokenList, listLoading, creatingLoading } =
17
+ useOperateApiKey(idKey, dialogId);
18
  const { t } = useTranslate('chat');
19
 
20
  const columns: TableProps<IToken>['columns'] = [
 
36
  render: (_, record) => (
37
  <Space size="middle">
38
  <CopyToClipboard text={record.token}></CopyToClipboard>
39
+ <DeleteOutlined onClick={() => removeToken(record.token)} />
 
 
40
  </Space>
41
  ),
42
  },
 
58
  dataSource={tokenList}
59
  rowKey={'token'}
60
  loading={listLoading}
61
+ pagination={false}
62
  />
63
+ <Button
64
+ onClick={createToken}
65
+ loading={creatingLoading}
66
+ disabled={tokenList.length > 0}
67
+ >
68
  {t('createNewKey')}
69
  </Button>
70
  </Modal>
web/src/components/api-service/chat-overview-modal/api-content.tsx ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import HightLightMarkdown from '@/components/highlight-markdown';
2
+ import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
3
+ import { Button, Card, Flex, Space } from 'antd';
4
+ import apiDoc from '../../../../../docs/references/api.md';
5
+ import ChatApiKeyModal from '../chat-api-key-modal';
6
+ import EmbedModal from '../embed-modal';
7
+ import { usePreviewChat, useShowEmbedModal } from '../hooks';
8
+ import BackendServiceApi from './backend-service-api';
9
+
10
+ const ApiContent = ({
11
+ id,
12
+ idKey,
13
+ hideChatPreviewCard = false,
14
+ }: {
15
+ id?: string;
16
+ idKey: string;
17
+ hideChatPreviewCard?: boolean;
18
+ }) => {
19
+ const { t } = useTranslate('chat');
20
+ const {
21
+ visible: apiKeyVisible,
22
+ hideModal: hideApiKeyModal,
23
+ showModal: showApiKeyModal,
24
+ } = useSetModalState();
25
+ const { embedVisible, hideEmbedModal, showEmbedModal, embedToken } =
26
+ useShowEmbedModal(idKey, id);
27
+
28
+ const { handlePreview } = usePreviewChat(idKey, id);
29
+
30
+ return (
31
+ <div>
32
+ <Flex vertical gap={'middle'}>
33
+ <BackendServiceApi show={showApiKeyModal}></BackendServiceApi>
34
+ {!hideChatPreviewCard && (
35
+ <Card title={`${name} Web App`}>
36
+ <Flex gap={8} vertical>
37
+ <Space size={'middle'}>
38
+ <Button onClick={handlePreview}>{t('preview')}</Button>
39
+ <Button onClick={showEmbedModal}>{t('embedded')}</Button>
40
+ </Space>
41
+ </Flex>
42
+ </Card>
43
+ )}
44
+ <HightLightMarkdown>{apiDoc}</HightLightMarkdown>
45
+ </Flex>
46
+ {apiKeyVisible && (
47
+ <ChatApiKeyModal
48
+ hideModal={hideApiKeyModal}
49
+ dialogId={id}
50
+ idKey={idKey}
51
+ ></ChatApiKeyModal>
52
+ )}
53
+ {embedVisible && (
54
+ <EmbedModal
55
+ token={embedToken}
56
+ visible={embedVisible}
57
+ hideModal={hideEmbedModal}
58
+ ></EmbedModal>
59
+ )}
60
+ </div>
61
+ );
62
+ };
63
+
64
+ export default ApiContent;
web/src/components/api-service/chat-overview-modal/backend-service-api.tsx ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Button, Card, Flex, Space, Typography } from 'antd';
2
+
3
+ import { useTranslate } from '@/hooks/common-hooks';
4
+ import styles from './index.less';
5
+
6
+ const { Paragraph } = Typography;
7
+
8
+ const BackendServiceApi = ({ show }: { show(): void }) => {
9
+ const { t } = useTranslate('chat');
10
+
11
+ return (
12
+ <Card
13
+ title={
14
+ <Space size={'large'}>
15
+ <span>RAGFlow API</span>
16
+ <Button onClick={show} type="primary">
17
+ {t('apiKey')}
18
+ </Button>
19
+ </Space>
20
+ }
21
+ >
22
+ <Flex gap={8} align="center">
23
+ <b>{t('backendServiceApi')}</b>
24
+ <Paragraph
25
+ copyable={{ text: `${location.origin}/v1/api/` }}
26
+ className={styles.apiLinkText}
27
+ >
28
+ {location.origin}/v1/api/
29
+ </Paragraph>
30
+ </Flex>
31
+ </Card>
32
+ );
33
+ };
34
+
35
+ export default BackendServiceApi;
web/src/components/api-service/chat-overview-modal/index.less CHANGED
@@ -13,9 +13,7 @@
13
  padding-left: 60px;
14
  padding-bottom: 20px;
15
  }
16
- .linkText {
17
- border-radius: 6px;
18
- padding: 6px 10px;
19
- background-color: #eff8ff;
20
- border: 1px;
21
  }
 
13
  padding-left: 60px;
14
  padding-bottom: 20px;
15
  }
16
+ .apiLinkText {
17
+ .linkText();
18
+ margin: 0 !important;
 
 
19
  }
web/src/components/api-service/chat-overview-modal/index.tsx CHANGED
@@ -1,65 +1,15 @@
1
- import LineChart from '@/components/line-chart';
2
- import { useFetchNextStats } from '@/hooks/chat-hooks';
3
- import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
4
  import { IModalProps } from '@/interfaces/common';
5
- import { IStats } from '@/interfaces/database/chat';
6
- import { formatDate } from '@/utils/date';
7
- import { Button, Card, DatePicker, Flex, Modal, Space, Typography } from 'antd';
8
- import { RangePickerProps } from 'antd/es/date-picker';
9
- import dayjs from 'dayjs';
10
- import camelCase from 'lodash/camelCase';
11
- import ChatApiKeyModal from '../chat-api-key-modal';
12
- import EmbedModal from '../embed-modal';
13
- import {
14
- usePreviewChat,
15
- useSelectChartStatsList,
16
- useShowEmbedModal,
17
- } from '../hooks';
18
- import styles from './index.less';
19
-
20
- const { Paragraph } = Typography;
21
- const { RangePicker } = DatePicker;
22
-
23
- const StatsLineChart = ({ statsType }: { statsType: keyof IStats }) => {
24
- const { t } = useTranslate('chat');
25
- const chartList = useSelectChartStatsList();
26
- const list =
27
- chartList[statsType]?.map((x) => ({
28
- ...x,
29
- xAxis: formatDate(x.xAxis),
30
- })) ?? [];
31
-
32
- return (
33
- <div className={styles.chartItem}>
34
- <b className={styles.chartLabel}>{t(camelCase(statsType))}</b>
35
- <LineChart data={list}></LineChart>
36
- </div>
37
- );
38
- };
39
 
40
  const ChatOverviewModal = ({
41
  visible,
42
  hideModal,
43
  id,
44
- name = '',
45
  idKey,
46
  }: IModalProps<any> & { id: string; name?: string; idKey: string }) => {
47
  const { t } = useTranslate('chat');
48
- const {
49
- visible: apiKeyVisible,
50
- hideModal: hideApiKeyModal,
51
- showModal: showApiKeyModal,
52
- } = useSetModalState();
53
- const { embedVisible, hideEmbedModal, showEmbedModal, embedToken } =
54
- useShowEmbedModal(id, idKey);
55
-
56
- const { pickerValue, setPickerValue } = useFetchNextStats();
57
-
58
- const disabledDate: RangePickerProps['disabledDate'] = (current) => {
59
- return current && current > dayjs().endOf('day');
60
- };
61
-
62
- const { handlePreview } = usePreviewChat(id, idKey);
63
 
64
  return (
65
  <>
@@ -72,69 +22,7 @@ const ChatOverviewModal = ({
72
  width={'100vw'}
73
  okText={t('close', { keyPrefix: 'common' })}
74
  >
75
- <Flex vertical gap={'middle'}>
76
- <Card title={t('backendServiceApi')}>
77
- <Flex gap={8} vertical>
78
- {t('serviceApiEndpoint')}
79
- <Paragraph
80
- copyable={{ text: `${location.origin}/v1/api/` }}
81
- className={styles.linkText}
82
- >
83
- {location.origin}/v1/api/
84
- </Paragraph>
85
- </Flex>
86
- <Space size={'middle'}>
87
- <Button onClick={showApiKeyModal}>{t('apiKey')}</Button>
88
- <a
89
- href={
90
- 'https://github.com/infiniflow/ragflow/blob/main/docs/references/api.md'
91
- }
92
- target="_blank"
93
- rel="noreferrer"
94
- >
95
- <Button>{t('apiReference')}</Button>
96
- </a>
97
- </Space>
98
- </Card>
99
- <Card title={`${name} Web App`}>
100
- <Flex gap={8} vertical>
101
- <Space size={'middle'}>
102
- <Button onClick={handlePreview}>{t('preview')}</Button>
103
- <Button onClick={showEmbedModal}>{t('embedded')}</Button>
104
- </Space>
105
- </Flex>
106
- </Card>
107
-
108
- <Space>
109
- <b>{t('dateRange')}</b>
110
- <RangePicker
111
- disabledDate={disabledDate}
112
- value={pickerValue}
113
- onChange={setPickerValue}
114
- allowClear={false}
115
- />
116
- </Space>
117
- <div className={styles.chartWrapper}>
118
- <StatsLineChart statsType={'pv'}></StatsLineChart>
119
- <StatsLineChart statsType={'round'}></StatsLineChart>
120
- <StatsLineChart statsType={'speed'}></StatsLineChart>
121
- <StatsLineChart statsType={'thumb_up'}></StatsLineChart>
122
- <StatsLineChart statsType={'tokens'}></StatsLineChart>
123
- <StatsLineChart statsType={'uv'}></StatsLineChart>
124
- </div>
125
- </Flex>
126
- {apiKeyVisible && (
127
- <ChatApiKeyModal
128
- hideModal={hideApiKeyModal}
129
- dialogId={id}
130
- idKey={idKey}
131
- ></ChatApiKeyModal>
132
- )}
133
- <EmbedModal
134
- token={embedToken}
135
- visible={embedVisible}
136
- hideModal={hideEmbedModal}
137
- ></EmbedModal>
138
  </Modal>
139
  </>
140
  );
 
1
+ import { useTranslate } from '@/hooks/common-hooks';
 
 
2
  import { IModalProps } from '@/interfaces/common';
3
+ import { Modal } from 'antd';
4
+ import ApiContent from './api-content';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  const ChatOverviewModal = ({
7
  visible,
8
  hideModal,
9
  id,
 
10
  idKey,
11
  }: IModalProps<any> & { id: string; name?: string; idKey: string }) => {
12
  const { t } = useTranslate('chat');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
  return (
15
  <>
 
22
  width={'100vw'}
23
  okText={t('close', { keyPrefix: 'common' })}
24
  >
25
+ <ApiContent id={id} idKey={idKey}></ApiContent>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  </Modal>
27
  </>
28
  );
web/src/components/api-service/chat-overview-modal/stats-chart.tsx ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import LineChart from '@/components/line-chart';
2
+ import { useTranslate } from '@/hooks/common-hooks';
3
+ import { IStats } from '@/interfaces/database/chat';
4
+ import { formatDate } from '@/utils/date';
5
+ import camelCase from 'lodash/camelCase';
6
+ import { useSelectChartStatsList } from '../hooks';
7
+
8
+ import styles from './index.less';
9
+
10
+ const StatsLineChart = ({ statsType }: { statsType: keyof IStats }) => {
11
+ const { t } = useTranslate('chat');
12
+ const chartList = useSelectChartStatsList();
13
+ const list =
14
+ chartList[statsType]?.map((x) => ({
15
+ ...x,
16
+ xAxis: formatDate(x.xAxis),
17
+ })) ?? [];
18
+
19
+ return (
20
+ <div className={styles.chartItem}>
21
+ <b className={styles.chartLabel}>{t(camelCase(statsType))}</b>
22
+ <LineChart data={list}></LineChart>
23
+ </div>
24
+ );
25
+ };
26
+
27
+ const StatsChart = () => {
28
+ return (
29
+ <div className={styles.chartWrapper}>
30
+ <StatsLineChart statsType={'pv'}></StatsLineChart>
31
+ <StatsLineChart statsType={'round'}></StatsLineChart>
32
+ <StatsLineChart statsType={'speed'}></StatsLineChart>
33
+ <StatsLineChart statsType={'thumb_up'}></StatsLineChart>
34
+ <StatsLineChart statsType={'tokens'}></StatsLineChart>
35
+ <StatsLineChart statsType={'uv'}></StatsLineChart>
36
+ </div>
37
+ );
38
+ };
39
+
40
+ export default StatsChart;
web/src/components/api-service/hooks.ts CHANGED
@@ -1,31 +1,31 @@
1
  import { SharedFrom } from '@/constants/chat';
2
- import {
3
- useCreateNextToken,
4
- useFetchTokenList,
5
- useRemoveNextToken,
6
- } from '@/hooks/chat-hooks';
7
  import {
8
  useSetModalState,
9
  useShowDeleteConfirm,
10
  useTranslate,
11
  } from '@/hooks/common-hooks';
 
 
 
 
 
12
  import { IStats } from '@/interfaces/database/chat';
13
  import { useQueryClient } from '@tanstack/react-query';
14
  import { message } from 'antd';
15
  import { useCallback } from 'react';
16
 
17
- export const useOperateApiKey = (dialogId: string, idKey: string) => {
18
- const { removeToken } = useRemoveNextToken();
19
- const { createToken, loading: creatingLoading } = useCreateNextToken();
20
- const { data: tokenList, loading: listLoading } = useFetchTokenList({
21
  [idKey]: dialogId,
22
  });
23
 
24
  const showDeleteConfirm = useShowDeleteConfirm();
25
 
26
- const onRemoveToken = (token: string, tenantId: string) => {
27
  showDeleteConfirm({
28
- onOk: () => removeToken({ dialogId, tokens: [token], tenantId }),
29
  });
30
  };
31
 
@@ -49,7 +49,7 @@ type ChartStatsType = {
49
  export const useSelectChartStatsList = (): ChartStatsType => {
50
  const queryClient = useQueryClient();
51
  const data = queryClient.getQueriesData({ queryKey: ['fetchStats'] });
52
- const stats: IStats = data[0][1] as IStats;
53
 
54
  return Object.keys(stats).reduce((pre, cur) => {
55
  const item = stats[cur as keyof IStats];
@@ -77,10 +77,12 @@ const getUrlWithToken = (token: string, from: string = 'chat') => {
77
  return `${protocol}//${host}/chat/share?shared_id=${token}&from=${from}`;
78
  };
79
 
80
- const useFetchTokenListBeforeOtherStep = (dialogId: string, idKey: string) => {
81
  const { showTokenEmptyError } = useShowTokenEmptyError();
82
 
83
- const { data: tokenList, refetch } = useFetchTokenList({ [idKey]: dialogId });
 
 
84
 
85
  const token =
86
  Array.isArray(tokenList) && tokenList.length > 0 ? tokenList[0].token : '';
@@ -102,7 +104,7 @@ const useFetchTokenListBeforeOtherStep = (dialogId: string, idKey: string) => {
102
  };
103
  };
104
 
105
- export const useShowEmbedModal = (dialogId: string, idKey: string) => {
106
  const {
107
  visible: embedVisible,
108
  hideModal: hideEmbedModal,
@@ -110,8 +112,8 @@ export const useShowEmbedModal = (dialogId: string, idKey: string) => {
110
  } = useSetModalState();
111
 
112
  const { handleOperate, token } = useFetchTokenListBeforeOtherStep(
113
- dialogId,
114
  idKey,
 
115
  );
116
 
117
  const handleShowEmbedModal = useCallback(async () => {
@@ -129,8 +131,8 @@ export const useShowEmbedModal = (dialogId: string, idKey: string) => {
129
  };
130
  };
131
 
132
- export const usePreviewChat = (dialogId: string, idKey: string) => {
133
- const { handleOperate } = useFetchTokenListBeforeOtherStep(dialogId, idKey);
134
 
135
  const open = useCallback(
136
  (t: string) => {
 
1
  import { SharedFrom } from '@/constants/chat';
 
 
 
 
 
2
  import {
3
  useSetModalState,
4
  useShowDeleteConfirm,
5
  useTranslate,
6
  } from '@/hooks/common-hooks';
7
+ import {
8
+ useCreateSystemToken,
9
+ useFetchSystemTokenList,
10
+ useRemoveSystemToken,
11
+ } from '@/hooks/user-setting-hooks';
12
  import { IStats } from '@/interfaces/database/chat';
13
  import { useQueryClient } from '@tanstack/react-query';
14
  import { message } from 'antd';
15
  import { useCallback } from 'react';
16
 
17
+ export const useOperateApiKey = (idKey: string, dialogId?: string) => {
18
+ const { removeToken } = useRemoveSystemToken();
19
+ const { createToken, loading: creatingLoading } = useCreateSystemToken();
20
+ const { data: tokenList, loading: listLoading } = useFetchSystemTokenList({
21
  [idKey]: dialogId,
22
  });
23
 
24
  const showDeleteConfirm = useShowDeleteConfirm();
25
 
26
+ const onRemoveToken = (token: string) => {
27
  showDeleteConfirm({
28
+ onOk: () => removeToken(token),
29
  });
30
  };
31
 
 
49
  export const useSelectChartStatsList = (): ChartStatsType => {
50
  const queryClient = useQueryClient();
51
  const data = queryClient.getQueriesData({ queryKey: ['fetchStats'] });
52
+ const stats: IStats = (data.length > 0 ? data[0][1] : {}) as IStats;
53
 
54
  return Object.keys(stats).reduce((pre, cur) => {
55
  const item = stats[cur as keyof IStats];
 
77
  return `${protocol}//${host}/chat/share?shared_id=${token}&from=${from}`;
78
  };
79
 
80
+ const useFetchTokenListBeforeOtherStep = (idKey: string, dialogId?: string) => {
81
  const { showTokenEmptyError } = useShowTokenEmptyError();
82
 
83
+ const { data: tokenList, refetch } = useFetchSystemTokenList({
84
+ [idKey]: dialogId,
85
+ });
86
 
87
  const token =
88
  Array.isArray(tokenList) && tokenList.length > 0 ? tokenList[0].token : '';
 
104
  };
105
  };
106
 
107
+ export const useShowEmbedModal = (idKey: string, dialogId?: string) => {
108
  const {
109
  visible: embedVisible,
110
  hideModal: hideEmbedModal,
 
112
  } = useSetModalState();
113
 
114
  const { handleOperate, token } = useFetchTokenListBeforeOtherStep(
 
115
  idKey,
116
+ dialogId,
117
  );
118
 
119
  const handleShowEmbedModal = useCallback(async () => {
 
131
  };
132
  };
133
 
134
+ export const usePreviewChat = (idKey: string, dialogId?: string) => {
135
+ const { handleOperate } = useFetchTokenListBeforeOtherStep(idKey, dialogId);
136
 
137
  const open = useCallback(
138
  (t: string) => {
web/src/components/highlight-markdown/index.less CHANGED
@@ -1,4 +1,19 @@
1
  .text {
2
- white-space: pre-wrap; // https://stackoverflow.com/questions/60332183/new-line-with-react-markdown
3
  .chunkText;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
 
1
  .text {
 
2
  .chunkText;
3
+ font-size: 16px;
4
+ li {
5
+ padding: 4px 0px;
6
+ }
7
+ p {
8
+ white-space: pre-wrap; // https://stackoverflow.com/questions/60332183/new-line-with-react-markdown
9
+ }
10
+ }
11
+
12
+ .code {
13
+ padding: 3px 6px 6px;
14
+ margin: 0;
15
+ white-space: break-spaces;
16
+ background-color: rgba(129, 139, 152, 0.12);
17
+ border-radius: 4px;
18
+ color: rgb(31, 35, 40);
19
  }
web/src/components/highlight-markdown/index.tsx CHANGED
@@ -1,6 +1,6 @@
1
  import classNames from 'classnames';
2
  import Markdown from 'react-markdown';
3
- import SyntaxHighlighter from 'react-syntax-highlighter';
4
  import rehypeRaw from 'rehype-raw';
5
  import remarkGfm from 'remark-gfm';
6
 
@@ -22,11 +22,16 @@ const HightLightMarkdown = ({
22
  const { children, className, node, ...rest } = props;
23
  const match = /language-(\w+)/.exec(className || '');
24
  return match ? (
25
- <SyntaxHighlighter {...rest} PreTag="div" language={match[1]}>
 
 
 
 
 
26
  {String(children).replace(/\n$/, '')}
27
  </SyntaxHighlighter>
28
  ) : (
29
- <code {...rest} className={className}>
30
  {children}
31
  </code>
32
  );
 
1
  import classNames from 'classnames';
2
  import Markdown from 'react-markdown';
3
+ import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
4
  import rehypeRaw from 'rehype-raw';
5
  import remarkGfm from 'remark-gfm';
6
 
 
22
  const { children, className, node, ...rest } = props;
23
  const match = /language-(\w+)/.exec(className || '');
24
  return match ? (
25
+ <SyntaxHighlighter
26
+ {...rest}
27
+ PreTag="div"
28
+ language={match[1]}
29
+ // style={dark}
30
+ >
31
  {String(children).replace(/\n$/, '')}
32
  </SyntaxHighlighter>
33
  ) : (
34
+ <code {...rest} className={`${className} ${styles.code}`}>
35
  {children}
36
  </code>
37
  );
web/src/constants/common.ts CHANGED
@@ -41,6 +41,12 @@ export const fileIconMap = {
41
 
42
  export const LanguageList = ['English', 'Chinese', 'Traditional Chinese'];
43
 
 
 
 
 
 
 
44
  export const LanguageTranslationMap = {
45
  English: 'en',
46
  Chinese: 'zh',
 
41
 
42
  export const LanguageList = ['English', 'Chinese', 'Traditional Chinese'];
43
 
44
+ export const LanguageMap = {
45
+ English: 'English',
46
+ Chinese: '简体中文',
47
+ 'Traditional Chinese': '繁體中文',
48
+ };
49
+
50
  export const LanguageTranslationMap = {
51
  English: 'en',
52
  Chinese: 'zh',
web/src/constants/setting.ts CHANGED
@@ -5,6 +5,7 @@ export enum UserSettingRouteKey {
5
  Password = 'password',
6
  Model = 'model',
7
  System = 'system',
 
8
  Team = 'team',
9
  Logout = 'logout',
10
  }
 
5
  Password = 'password',
6
  Model = 'model',
7
  System = 'system',
8
+ Api = 'api',
9
  Team = 'team',
10
  Logout = 'logout',
11
  }
web/src/hooks/chat-hooks.ts CHANGED
@@ -441,7 +441,7 @@ export const useRemoveNextToken = () => {
441
  mutationKey: ['removeToken'],
442
  mutationFn: async (params: {
443
  tenantId: string;
444
- dialogId: string;
445
  tokens: string[];
446
  }) => {
447
  const { data } = await chatService.removeToken(params);
 
441
  mutationKey: ['removeToken'],
442
  mutationFn: async (params: {
443
  tenantId: string;
444
+ dialogId?: string;
445
  tokens: string[];
446
  }) => {
447
  const { data } = await chatService.removeToken(params);
web/src/hooks/user-setting-hooks.tsx CHANGED
@@ -1,5 +1,6 @@
1
  import { LanguageTranslationMap } from '@/constants/common';
2
  import { ResponseGetType } from '@/interfaces/database/base';
 
3
  import { ITenantInfo } from '@/interfaces/database/knowledge';
4
  import { ISystemStatus, IUserInfo } from '@/interfaces/database/user-setting';
5
  import userService from '@/services/user-service';
@@ -152,3 +153,65 @@ export const useFetchSystemStatus = () => {
152
  loading,
153
  };
154
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import { LanguageTranslationMap } from '@/constants/common';
2
  import { ResponseGetType } from '@/interfaces/database/base';
3
+ import { IToken } from '@/interfaces/database/chat';
4
  import { ITenantInfo } from '@/interfaces/database/knowledge';
5
  import { ISystemStatus, IUserInfo } from '@/interfaces/database/user-setting';
6
  import userService from '@/services/user-service';
 
153
  loading,
154
  };
155
  };
156
+
157
+ export const useFetchSystemTokenList = (params: Record<string, any>) => {
158
+ const {
159
+ data,
160
+ isFetching: loading,
161
+ refetch,
162
+ } = useQuery<IToken[]>({
163
+ queryKey: ['fetchSystemTokenList', params],
164
+ initialData: [],
165
+ gcTime: 0,
166
+ queryFn: async () => {
167
+ const { data } = await userService.listToken(params);
168
+
169
+ return data?.data ?? [];
170
+ },
171
+ });
172
+
173
+ return { data, loading, refetch };
174
+ };
175
+
176
+ export const useRemoveSystemToken = () => {
177
+ const queryClient = useQueryClient();
178
+ const { t } = useTranslation();
179
+
180
+ const {
181
+ data,
182
+ isPending: loading,
183
+ mutateAsync,
184
+ } = useMutation({
185
+ mutationKey: ['removeSystemToken'],
186
+ mutationFn: async (token: string) => {
187
+ const { data } = await userService.removeToken({}, token);
188
+ if (data.retcode === 0) {
189
+ message.success(t('message.deleted'));
190
+ queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] });
191
+ }
192
+ return data?.data ?? [];
193
+ },
194
+ });
195
+
196
+ return { data, loading, removeToken: mutateAsync };
197
+ };
198
+
199
+ export const useCreateSystemToken = () => {
200
+ const queryClient = useQueryClient();
201
+ const {
202
+ data,
203
+ isPending: loading,
204
+ mutateAsync,
205
+ } = useMutation({
206
+ mutationKey: ['createSystemToken'],
207
+ mutationFn: async (params: Record<string, any>) => {
208
+ const { data } = await userService.createToken(params);
209
+ if (data.retcode === 0) {
210
+ queryClient.invalidateQueries({ queryKey: ['fetchSystemTokenList'] });
211
+ }
212
+ return data?.data ?? [];
213
+ },
214
+ });
215
+
216
+ return { data, loading, createToken: mutateAsync };
217
+ };
web/src/layouts/components/right-toolbar/index.tsx CHANGED
@@ -5,7 +5,7 @@ import camelCase from 'lodash/camelCase';
5
  import React from 'react';
6
  import User from '../user';
7
 
8
- import { LanguageList } from '@/constants/common';
9
  import { useChangeLanguage } from '@/hooks/logic-hooks';
10
  import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
11
  import styled from './index.less';
@@ -35,7 +35,7 @@ const RightToolBar = () => {
35
 
36
  const items: MenuProps['items'] = LanguageList.map((x) => ({
37
  key: x,
38
- label: <span>{t(camelCase(x))}</span>,
39
  })).reduce<MenuProps['items']>((pre, cur) => {
40
  return [...pre!, { type: 'divider' }, cur];
41
  }, []);
 
5
  import React from 'react';
6
  import User from '../user';
7
 
8
+ import { LanguageList, LanguageMap } from '@/constants/common';
9
  import { useChangeLanguage } from '@/hooks/logic-hooks';
10
  import { useFetchUserInfo } from '@/hooks/user-setting-hooks';
11
  import styled from './index.less';
 
35
 
36
  const items: MenuProps['items'] = LanguageList.map((x) => ({
37
  key: x,
38
+ label: <span>{LanguageMap[x as keyof typeof LanguageMap]}</span>,
39
  })).reduce<MenuProps['items']>((pre, cur) => {
40
  return [...pre!, { type: 'divider' }, cur];
41
  }, []);
web/src/less/mixins.less CHANGED
@@ -1,3 +1,8 @@
 
 
 
 
 
1
  .chunkText() {
2
  em {
3
  color: red;
@@ -5,6 +10,8 @@
5
  }
6
  table {
7
  width: 100%;
 
 
8
  }
9
 
10
  caption {
@@ -17,8 +24,13 @@
17
  }
18
 
19
  th {
20
- color: #fff;
21
- background-color: @blurBackground;
 
 
 
 
 
22
  }
23
 
24
  td:hover {
@@ -56,3 +68,10 @@
56
  overflow: hidden;
57
  text-overflow: ellipsis;
58
  }
 
 
 
 
 
 
 
 
1
+ .tableCell() {
2
+ padding: 6px 13px;
3
+ border: 1px solid #d1d9e0;
4
+ }
5
+
6
  .chunkText() {
7
  em {
8
  color: red;
 
10
  }
11
  table {
12
  width: 100%;
13
+ box-sizing: border-box;
14
+ border-collapse: collapse;
15
  }
16
 
17
  caption {
 
24
  }
25
 
26
  th {
27
+ // color: #fff;
28
+ // background-color: @blurBackground;
29
+ .tableCell;
30
+ }
31
+
32
+ td {
33
+ .tableCell;
34
  }
35
 
36
  td:hover {
 
68
  overflow: hidden;
69
  text-overflow: ellipsis;
70
  }
71
+
72
+ .linkText() {
73
+ border-radius: 6px;
74
+ padding: 6px 10px;
75
+ background-color: #eff8ff;
76
+ border: 1px;
77
+ }
web/src/locales/en.ts CHANGED
@@ -400,7 +400,7 @@ The above is the content you need to summarize.`,
400
  quoteTip: 'Should the source of the original text be displayed?',
401
  selfRag: 'Self-RAG',
402
  selfRagTip: 'Please refer to: https://huggingface.co/papers/2310.11511',
403
- overview: 'Chat Bot API',
404
  pv: 'Number of messages',
405
  uv: 'Active user number',
406
  speed: 'Token output speed',
@@ -413,7 +413,7 @@ The above is the content you need to summarize.`,
413
  apiKey: 'API Key',
414
  apiReference: 'API Documents',
415
  dateRange: 'Date Range:',
416
- backendServiceApi: 'Backend service API',
417
  createNewKey: 'Create new key',
418
  created: 'Created',
419
  action: 'Action',
@@ -451,6 +451,7 @@ The above is the content you need to summarize.`,
451
  team: 'Team',
452
  system: 'System',
453
  logout: 'Log out',
 
454
  username: 'Username',
455
  usernameMessage: 'Please input your username!',
456
  photo: 'Your photo',
 
400
  quoteTip: 'Should the source of the original text be displayed?',
401
  selfRag: 'Self-RAG',
402
  selfRagTip: 'Please refer to: https://huggingface.co/papers/2310.11511',
403
+ overview: 'Chat ID',
404
  pv: 'Number of messages',
405
  uv: 'Active user number',
406
  speed: 'Token output speed',
 
413
  apiKey: 'API Key',
414
  apiReference: 'API Documents',
415
  dateRange: 'Date Range:',
416
+ backendServiceApi: 'API Server',
417
  createNewKey: 'Create new key',
418
  created: 'Created',
419
  action: 'Action',
 
451
  team: 'Team',
452
  system: 'System',
453
  logout: 'Log out',
454
+ api: 'API',
455
  username: 'Username',
456
  usernameMessage: 'Please input your username!',
457
  photo: 'Your photo',
web/src/locales/zh-traditional.ts CHANGED
@@ -371,7 +371,7 @@ export default {
371
  quoteTip: '是否應該顯示原文出處?',
372
  selfRag: 'Self-RAG',
373
  selfRagTip: '請參考: https://huggingface.co/papers/2310.11511',
374
- overview: '聊天 API',
375
  pv: '消息數',
376
  uv: '活躍用戶數',
377
  speed: 'Token 輸出速度',
@@ -384,7 +384,7 @@ export default {
384
  apiKey: 'API 鍵',
385
  apiReference: 'API 文檔',
386
  dateRange: '日期範圍:',
387
- backendServiceApi: '後端服務 API',
388
  createNewKey: '創建新密鑰',
389
  created: '創建於',
390
  action: '操作',
 
371
  quoteTip: '是否應該顯示原文出處?',
372
  selfRag: 'Self-RAG',
373
  selfRagTip: '請參考: https://huggingface.co/papers/2310.11511',
374
+ overview: '聊天 ID',
375
  pv: '消息數',
376
  uv: '活躍用戶數',
377
  speed: 'Token 輸出速度',
 
384
  apiKey: 'API 鍵',
385
  apiReference: 'API 文檔',
386
  dateRange: '日期範圍:',
387
+ backendServiceApi: 'API 伺服器',
388
  createNewKey: '創建新密鑰',
389
  created: '創建於',
390
  action: '操作',
web/src/locales/zh.ts CHANGED
@@ -388,7 +388,7 @@ export default {
388
  quoteTip: '是否应该显示原文出处?',
389
  selfRag: 'Self-RAG',
390
  selfRagTip: '请参考: https://huggingface.co/papers/2310.11511',
391
- overview: '聊天 API',
392
  pv: '消息数',
393
  uv: '活跃用户数',
394
  speed: 'Token 输出速度',
@@ -401,7 +401,7 @@ export default {
401
  apiKey: 'API 键',
402
  apiReference: 'API 文档',
403
  dateRange: '日期范围:',
404
- backendServiceApi: '后端服务 API',
405
  createNewKey: '创建新密钥',
406
  created: '创建于',
407
  action: '操作',
 
388
  quoteTip: '是否应该显示原文出处?',
389
  selfRag: 'Self-RAG',
390
  selfRagTip: '请参考: https://huggingface.co/papers/2310.11511',
391
+ overview: '聊天 ID',
392
  pv: '消息数',
393
  uv: '活跃用户数',
394
  speed: 'Token 输出速度',
 
401
  apiKey: 'API 键',
402
  apiReference: 'API 文档',
403
  dateRange: '日期范围:',
404
+ backendServiceApi: 'API 服务器',
405
  createNewKey: '创建新密钥',
406
  created: '创建于',
407
  action: '操作',
web/src/pages/api/index.tsx ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ApiContent from '@/components/api-service/chat-overview-modal/api-content';
2
+
3
+ const ApiPage = () => {
4
+ return (
5
+ <div>
6
+ <ApiContent idKey="dialogId"></ApiContent>
7
+ </div>
8
+ );
9
+ };
10
+
11
+ export default ApiPage;
web/src/pages/chat/chat-id-modal/index.less ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ .id {
2
+ .linkText();
3
+ }
web/src/pages/chat/chat-id-modal/index.tsx ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useTranslate } from '@/hooks/common-hooks';
2
+ import { IModalProps } from '@/interfaces/common';
3
+ import { Modal, Typography } from 'antd';
4
+
5
+ import styles from './index.less';
6
+
7
+ const { Paragraph } = Typography;
8
+
9
+ const ChatIdModal = ({
10
+ visible,
11
+ hideModal,
12
+ id,
13
+ }: IModalProps<any> & { id: string; name?: string; idKey: string }) => {
14
+ const { t } = useTranslate('chat');
15
+
16
+ return (
17
+ <>
18
+ <Modal
19
+ title={t('overview')}
20
+ open={visible}
21
+ onCancel={hideModal}
22
+ cancelButtonProps={{ style: { display: 'none' } }}
23
+ onOk={hideModal}
24
+ okText={t('close', { keyPrefix: 'common' })}
25
+ >
26
+ <Paragraph copyable={{ text: id }} className={styles.id}>
27
+ {id}
28
+ </Paragraph>
29
+ </Modal>
30
+ </>
31
+ );
32
+ };
33
+
34
+ export default ChatIdModal;
web/src/pages/chat/index.tsx CHANGED
@@ -1,6 +1,6 @@
1
  import { ReactComponent as ChatAppCube } from '@/assets/svg/chat-app-cube.svg';
2
  import RenameModal from '@/components/rename-modal';
3
- import { CloudOutlined, DeleteOutlined, EditOutlined } from '@ant-design/icons';
4
  import {
5
  Avatar,
6
  Button,
@@ -29,7 +29,6 @@ import {
29
  useSelectDerivedConversationList,
30
  } from './hooks';
31
 
32
- import ChatOverviewModal from '@/components/api-service/chat-overview-modal';
33
  import SvgIcon from '@/components/svg-icon';
34
  import {
35
  useClickConversationCard,
@@ -40,6 +39,7 @@ import {
40
  import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
41
  import { useSetSelectedRecord } from '@/hooks/logic-hooks';
42
  import { IDialog } from '@/interfaces/database/chat';
 
43
  import styles from './index.less';
44
 
45
  const { Text } = Typography;
@@ -190,7 +190,7 @@ const Chat = () => {
190
  onClick: handleShowOverviewModal(dialog),
191
  label: (
192
  <Space>
193
- <CloudOutlined />
194
  {t('overview')}
195
  </Space>
196
  ),
@@ -367,13 +367,13 @@ const Chat = () => {
367
  loading={conversationRenameLoading}
368
  ></RenameModal>
369
  {overviewVisible && (
370
- <ChatOverviewModal
371
  visible={overviewVisible}
372
  hideModal={hideOverviewModal}
373
  id={currentRecord.id}
374
  name={currentRecord.name}
375
  idKey="dialogId"
376
- ></ChatOverviewModal>
377
  )}
378
  </Flex>
379
  );
 
1
  import { ReactComponent as ChatAppCube } from '@/assets/svg/chat-app-cube.svg';
2
  import RenameModal from '@/components/rename-modal';
3
+ import { DeleteOutlined, EditOutlined, KeyOutlined } from '@ant-design/icons';
4
  import {
5
  Avatar,
6
  Button,
 
29
  useSelectDerivedConversationList,
30
  } from './hooks';
31
 
 
32
  import SvgIcon from '@/components/svg-icon';
33
  import {
34
  useClickConversationCard,
 
39
  import { useSetModalState, useTranslate } from '@/hooks/common-hooks';
40
  import { useSetSelectedRecord } from '@/hooks/logic-hooks';
41
  import { IDialog } from '@/interfaces/database/chat';
42
+ import ChatIdModal from './chat-id-modal';
43
  import styles from './index.less';
44
 
45
  const { Text } = Typography;
 
190
  onClick: handleShowOverviewModal(dialog),
191
  label: (
192
  <Space>
193
+ <KeyOutlined />
194
  {t('overview')}
195
  </Space>
196
  ),
 
367
  loading={conversationRenameLoading}
368
  ></RenameModal>
369
  {overviewVisible && (
370
+ <ChatIdModal
371
  visible={overviewVisible}
372
  hideModal={hideOverviewModal}
373
  id={currentRecord.id}
374
  name={currentRecord.name}
375
  idKey="dialogId"
376
+ ></ChatIdModal>
377
  )}
378
  </Flex>
379
  );
web/src/pages/user-setting/constants.tsx CHANGED
@@ -1,3 +1,4 @@
 
1
  import { ReactComponent as LogoutIcon } from '@/assets/svg/logout.svg';
2
  import { ReactComponent as ModelIcon } from '@/assets/svg/model-providers.svg';
3
  import { ReactComponent as PasswordIcon } from '@/assets/svg/password.svg';
@@ -13,6 +14,7 @@ export const UserSettingIconMap = {
13
  [UserSettingRouteKey.System]: <MonitorOutlined style={{ fontSize: 24 }} />,
14
  [UserSettingRouteKey.Team]: <TeamIcon />,
15
  [UserSettingRouteKey.Logout]: <LogoutIcon />,
 
16
  };
17
 
18
  export * from '@/constants/setting';
 
1
+ import { ReactComponent as ApiIcon } from '@/assets/svg/api.svg';
2
  import { ReactComponent as LogoutIcon } from '@/assets/svg/logout.svg';
3
  import { ReactComponent as ModelIcon } from '@/assets/svg/model-providers.svg';
4
  import { ReactComponent as PasswordIcon } from '@/assets/svg/password.svg';
 
14
  [UserSettingRouteKey.System]: <MonitorOutlined style={{ fontSize: 24 }} />,
15
  [UserSettingRouteKey.Team]: <TeamIcon />,
16
  [UserSettingRouteKey.Logout]: <LogoutIcon />,
17
+ [UserSettingRouteKey.Api]: <ApiIcon />,
18
  };
19
 
20
  export * from '@/constants/setting';
web/src/pages/user-setting/setting-api/index.less ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ .apiWrapper {
2
+ width: 100%;
3
+
4
+ div[class^='chartWrapper'] {
5
+ height: auto !important;
6
+ }
7
+ }
web/src/pages/user-setting/setting-api/index.tsx ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ApiContent from '@/components/api-service/chat-overview-modal/api-content';
2
+
3
+ import styles from './index.less';
4
+
5
+ const ApiPage = () => {
6
+ return (
7
+ <div className={styles.apiWrapper}>
8
+ <ApiContent idKey="dialogId" hideChatPreviewCard></ApiContent>
9
+ </div>
10
+ );
11
+ };
12
+
13
+ export default ApiPage;
web/src/routes.ts CHANGED
@@ -77,6 +77,10 @@ const routes = [
77
  path: '/user-setting/system',
78
  component: '@/pages/user-setting/setting-system',
79
  },
 
 
 
 
80
  ],
81
  },
82
  {
 
77
  path: '/user-setting/system',
78
  component: '@/pages/user-setting/setting-system',
79
  },
80
+ {
81
+ path: '/user-setting/api',
82
+ component: '@/pages/user-setting/setting-api',
83
+ },
84
  ],
85
  },
86
  {
web/src/services/user-service.ts CHANGED
@@ -19,6 +19,9 @@ const {
19
  deleteFactory,
20
  getSystemStatus,
21
  getSystemVersion,
 
 
 
22
  } = api;
23
 
24
  const methods = {
@@ -86,6 +89,18 @@ const methods = {
86
  url: deleteFactory,
87
  method: 'post',
88
  },
 
 
 
 
 
 
 
 
 
 
 
 
89
  } as const;
90
 
91
  const userService = registerServer<keyof typeof methods>(methods, request);
 
19
  deleteFactory,
20
  getSystemStatus,
21
  getSystemVersion,
22
+ getSystemTokenList,
23
+ removeSystemToken,
24
+ createSystemToken,
25
  } = api;
26
 
27
  const methods = {
 
89
  url: deleteFactory,
90
  method: 'post',
91
  },
92
+ listToken: {
93
+ url: getSystemTokenList,
94
+ method: 'get',
95
+ },
96
+ createToken: {
97
+ url: createSystemToken,
98
+ method: 'post',
99
+ },
100
+ removeToken: {
101
+ url: removeSystemToken,
102
+ method: 'delete',
103
+ },
104
  } as const;
105
 
106
  const userService = registerServer<keyof typeof methods>(methods, request);
web/src/utils/api.ts CHANGED
@@ -94,6 +94,10 @@ export default {
94
  // system
95
  getSystemVersion: `${api_host}/system/version`,
96
  getSystemStatus: `${api_host}/system/status`,
 
 
 
 
97
 
98
  // flow
99
  listTemplates: `${api_host}/canvas/templates`,
 
94
  // system
95
  getSystemVersion: `${api_host}/system/version`,
96
  getSystemStatus: `${api_host}/system/status`,
97
+ getSystemTokenList: `${api_host}/system/token_list`,
98
+ createSystemToken: `${api_host}/system/new_token`,
99
+ listSystemToken: `${api_host}/system/token_list`,
100
+ removeSystemToken: `${api_host}/system/token`,
101
 
102
  // flow
103
  listTemplates: `${api_host}/canvas/templates`,