mirror of
https://github.com/EthanMarti/infio-copilot.git
synced 2026-01-16 08:21:55 +00:00
release version update
This commit is contained in:
parent
80e72394a9
commit
9a848489e3
@ -1,4 +1,7 @@
|
|||||||
releases:
|
releases:
|
||||||
|
- version: "0.8.0"
|
||||||
|
features:
|
||||||
|
- "add infio pro"
|
||||||
- version: "0.7.6"
|
- version: "0.7.6"
|
||||||
features:
|
features:
|
||||||
- "update mcp settings file watcher"
|
- "update mcp settings file watcher"
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
{
|
{
|
||||||
"id": "infio-copilot",
|
"id": "infio-copilot",
|
||||||
"name": "Infio Copilot",
|
"name": "Infio Copilot",
|
||||||
"version": "0.7.6",
|
"version": "0.8.0",
|
||||||
"minAppVersion": "0.15.0",
|
"minAppVersion": "0.15.0",
|
||||||
"description": "A Cursor-inspired AI assistant for notes that offers smart autocomplete and interactive chat with your selected notes",
|
"description": "A Cursor-inspired AI assistant for notes that offers smart autocomplete and interactive chat with your selected notes",
|
||||||
"author": "Felix.D",
|
"author": "Felix.D",
|
||||||
"authorUrl": "https://github.com/infiolab",
|
"authorUrl": "https://github.com/infiolab",
|
||||||
"isDesktopOnly": true
|
"isDesktopOnly": true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
package.json
13
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian-infio-copilot",
|
"name": "obsidian-infio-copilot",
|
||||||
"version": "0.7.6",
|
"version": "0.8.0",
|
||||||
"description": "A Cursor-inspired AI assistant that offers smart autocomplete and interactive chat with your selected notes",
|
"description": "A Cursor-inspired AI assistant that offers smart autocomplete and interactive chat with your selected notes",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -55,16 +55,15 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@anthropic-ai/sdk": "^0.27.3",
|
"@anthropic-ai/sdk": "^0.27.3",
|
||||||
"codemirror": "^6.0.1",
|
"@codemirror/basic-setup": "^0.20.0",
|
||||||
"@codemirror/commands": "^6.7.1",
|
"@codemirror/commands": "^6.7.1",
|
||||||
"@codemirror/lang-json": "^6.0.1",
|
"@codemirror/lang-json": "^6.0.1",
|
||||||
|
"@codemirror/lang-markdown": "^6.3.2",
|
||||||
|
"@codemirror/language": "^6.11.2",
|
||||||
|
"@codemirror/merge": "^6.10.0",
|
||||||
"@codemirror/state": "^6.5.2",
|
"@codemirror/state": "^6.5.2",
|
||||||
"@codemirror/theme-one-dark": "^6.1.2",
|
"@codemirror/theme-one-dark": "^6.1.2",
|
||||||
"@codemirror/view": "^6.35.0",
|
"@codemirror/view": "^6.35.0",
|
||||||
"@codemirror/basic-setup": "^0.20.0",
|
|
||||||
"@codemirror/lang-markdown": "^6.3.2",
|
|
||||||
"@codemirror/merge": "^6.10.0",
|
|
||||||
"@codemirror/language": "^6.11.2",
|
|
||||||
"@electric-sql/pglite": "0.2.14",
|
"@electric-sql/pglite": "0.2.14",
|
||||||
"@google/genai": "^1.2.0",
|
"@google/genai": "^1.2.0",
|
||||||
"@google/generative-ai": "^0.21.0",
|
"@google/generative-ai": "^0.21.0",
|
||||||
@ -86,6 +85,7 @@
|
|||||||
"axios": "^1.8.3",
|
"axios": "^1.8.3",
|
||||||
"chokidar": "^4.0.3",
|
"chokidar": "^4.0.3",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
"codemirror": "^6.0.1",
|
||||||
"delay": "^6.0.0",
|
"delay": "^6.0.0",
|
||||||
"diff": "^7.0.0",
|
"diff": "^7.0.0",
|
||||||
"diff-match-patch": "^1.0.5",
|
"diff-match-patch": "^1.0.5",
|
||||||
@ -101,6 +101,7 @@
|
|||||||
"js-tiktoken": "^1.0.15",
|
"js-tiktoken": "^1.0.15",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"json5": "^2.2.3",
|
"json5": "^2.2.3",
|
||||||
|
"jszip": "^3.10.1",
|
||||||
"langchain": "^0.3.15",
|
"langchain": "^0.3.15",
|
||||||
"lexical": "^0.17.1",
|
"lexical": "^0.17.1",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
|
|||||||
286
pnpm-lock.yaml
generated
286
pnpm-lock.yaml
generated
@ -153,6 +153,9 @@ importers:
|
|||||||
json5:
|
json5:
|
||||||
specifier: ^2.2.3
|
specifier: ^2.2.3
|
||||||
version: 2.2.3
|
version: 2.2.3
|
||||||
|
jszip:
|
||||||
|
specifier: ^3.10.1
|
||||||
|
version: 3.10.1
|
||||||
langchain:
|
langchain:
|
||||||
specifier: ^0.3.15
|
specifier: ^0.3.15
|
||||||
version: 0.3.29(@langchain/core@0.3.40(openai@4.104.0(ws@8.18.3)(zod@3.24.2)))(axios@1.10.0)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.24.2))(ws@8.18.3)
|
version: 0.3.29(@langchain/core@0.3.40(openai@4.104.0(ws@8.18.3)(zod@3.24.2)))(axios@1.10.0)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.24.2))(ws@8.18.3)
|
||||||
@ -702,8 +705,8 @@ packages:
|
|||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [aix]
|
os: [aix]
|
||||||
|
|
||||||
'@esbuild/aix-ppc64@0.25.7':
|
'@esbuild/aix-ppc64@0.25.9':
|
||||||
resolution: {integrity: sha512-uD0kKFHh6ETr8TqEtaAcV+dn/2qnYbH/+8wGEdY70Qf7l1l/jmBUbrmQqwiPKAQE6cOQ7dTj6Xr0HzQDGHyceQ==}
|
resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [aix]
|
os: [aix]
|
||||||
@ -726,8 +729,8 @@ packages:
|
|||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@esbuild/android-arm64@0.25.7':
|
'@esbuild/android-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-p0ohDnwyIbAtztHTNUTzN5EGD/HJLs1bwysrOPgSdlIA6NDnReoVfoCyxG6W1d85jr2X80Uq5KHftyYgaK9LPQ==}
|
resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
@ -750,8 +753,8 @@ packages:
|
|||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@esbuild/android-arm@0.25.7':
|
'@esbuild/android-arm@0.25.9':
|
||||||
resolution: {integrity: sha512-Jhuet0g1k9rAJHrXGIh7sFknFuT4sfytYZpZpuZl7YKDhnPByVAm5oy2LEBmMbuYf3ejWVYCc2seX81Mk+madA==}
|
resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [android]
|
os: [android]
|
||||||
@ -774,8 +777,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@esbuild/android-x64@0.25.7':
|
'@esbuild/android-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-mMxIJFlSgVK23HSsII3ZX9T2xKrBCDGyk0qiZnIW10LLFFtZLkFD6imZHu7gUo2wkNZwS9Yj3mOtZD3ZPcjCcw==}
|
resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [android]
|
os: [android]
|
||||||
@ -798,8 +801,8 @@ packages:
|
|||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@esbuild/darwin-arm64@0.25.7':
|
'@esbuild/darwin-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-jyOFLGP2WwRwxM8F1VpP6gcdIJc8jq2CUrURbbTouJoRO7XCkU8GdnTDFIHdcifVBT45cJlOYsZ1kSlfbKjYUQ==}
|
resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
@ -822,8 +825,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@esbuild/darwin-x64@0.25.7':
|
'@esbuild/darwin-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-m9bVWqZCwQ1BthruifvG64hG03zzz9gE2r/vYAhztBna1/+qXiHyP9WgnyZqHgGeXoimJPhAmxfbeU+nMng6ZA==}
|
resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
@ -846,8 +849,8 @@ packages:
|
|||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
'@esbuild/freebsd-arm64@0.25.7':
|
'@esbuild/freebsd-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-Bss7P4r6uhr3kDzRjPNEnTm/oIBdTPRNQuwaEFWT/uvt6A1YzK/yn5kcx5ZxZ9swOga7LqeYlu7bDIpDoS01bA==}
|
resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
@ -870,8 +873,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
'@esbuild/freebsd-x64@0.25.7':
|
'@esbuild/freebsd-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-S3BFyjW81LXG7Vqmr37ddbThrm3A84yE7ey/ERBlK9dIiaWgrjRlre3pbG7txh1Uaxz8N7wGGQXmC9zV+LIpBQ==}
|
resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
@ -894,8 +897,8 @@ packages:
|
|||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-arm64@0.25.7':
|
'@esbuild/linux-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-HfQZQqrNOfS1Okn7PcsGUqHymL1cWGBslf78dGvtrj8q7cN3FkapFgNA4l/a5lXDwr7BqP2BSO6mz9UremNPbg==}
|
resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -918,8 +921,8 @@ packages:
|
|||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-arm@0.25.7':
|
'@esbuild/linux-arm@0.25.9':
|
||||||
resolution: {integrity: sha512-JZMIci/1m5vfQuhKoFXogCKVYVfYQmoZJg8vSIMR4TUXbF+0aNlfXH3DGFEFMElT8hOTUF5hisdZhnrZO/bkDw==}
|
resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -942,8 +945,8 @@ packages:
|
|||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-ia32@0.25.7':
|
'@esbuild/linux-ia32@0.25.9':
|
||||||
resolution: {integrity: sha512-9Jex4uVpdeofiDxnwHRgen+j6398JlX4/6SCbbEFEXN7oMO2p0ueLN+e+9DdsdPLUdqns607HmzEFnxwr7+5wQ==}
|
resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -966,8 +969,8 @@ packages:
|
|||||||
cpu: [loong64]
|
cpu: [loong64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-loong64@0.25.7':
|
'@esbuild/linux-loong64@0.25.9':
|
||||||
resolution: {integrity: sha512-TG1KJqjBlN9IHQjKVUYDB0/mUGgokfhhatlay8aZ/MSORMubEvj/J1CL8YGY4EBcln4z7rKFbsH+HeAv0d471w==}
|
resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [loong64]
|
cpu: [loong64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -990,8 +993,8 @@ packages:
|
|||||||
cpu: [mips64el]
|
cpu: [mips64el]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-mips64el@0.25.7':
|
'@esbuild/linux-mips64el@0.25.9':
|
||||||
resolution: {integrity: sha512-Ty9Hj/lx7ikTnhOfaP7ipEm/ICcBv94i/6/WDg0OZ3BPBHhChsUbQancoWYSO0WNkEiSW5Do4febTTy4x1qYQQ==}
|
resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [mips64el]
|
cpu: [mips64el]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -1014,8 +1017,8 @@ packages:
|
|||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-ppc64@0.25.7':
|
'@esbuild/linux-ppc64@0.25.9':
|
||||||
resolution: {integrity: sha512-MrOjirGQWGReJl3BNQ58BLhUBPpWABnKrnq8Q/vZWWwAB1wuLXOIxS2JQ1LT3+5T+3jfPh0tyf5CpbyQHqnWIQ==}
|
resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -1038,8 +1041,8 @@ packages:
|
|||||||
cpu: [riscv64]
|
cpu: [riscv64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-riscv64@0.25.7':
|
'@esbuild/linux-riscv64@0.25.9':
|
||||||
resolution: {integrity: sha512-9pr23/pqzyqIZEZmQXnFyqp3vpa+KBk5TotfkzGMqpw089PGm0AIowkUppHB9derQzqniGn3wVXgck19+oqiOw==}
|
resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [riscv64]
|
cpu: [riscv64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -1062,8 +1065,8 @@ packages:
|
|||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-s390x@0.25.7':
|
'@esbuild/linux-s390x@0.25.9':
|
||||||
resolution: {integrity: sha512-4dP11UVGh9O6Y47m8YvW8eoA3r8qL2toVZUbBKyGta8j6zdw1cn9F/Rt59/Mhv0OgY68pHIMjGXWOUaykCnx+w==}
|
resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
@ -1086,14 +1089,14 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/linux-x64@0.25.7':
|
'@esbuild/linux-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-ghJMAJTdw/0uhz7e7YnpdX1xVn7VqA0GrWrAO2qKMuqbvgHT2VZiBv1BQ//VcHsPir4wsL3P2oPggfKPzTKoCA==}
|
resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@esbuild/netbsd-arm64@0.25.7':
|
'@esbuild/netbsd-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-bwXGEU4ua45+u5Ci/a55B85KWaDSRS8NPOHtxy2e3etDjbz23wlry37Ffzapz69JAGGc4089TBo+dGzydQmydg==}
|
resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [netbsd]
|
os: [netbsd]
|
||||||
@ -1116,14 +1119,14 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [netbsd]
|
os: [netbsd]
|
||||||
|
|
||||||
'@esbuild/netbsd-x64@0.25.7':
|
'@esbuild/netbsd-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-tUZRvLtgLE5OyN46sPSYlgmHoBS5bx2URSrgZdW1L1teWPYVmXh+QN/sKDqkzBo/IHGcKcHLKDhBeVVkO7teEA==}
|
resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [netbsd]
|
os: [netbsd]
|
||||||
|
|
||||||
'@esbuild/openbsd-arm64@0.25.7':
|
'@esbuild/openbsd-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-bTJ50aoC+WDlDGBReWYiObpYvQfMjBNlKztqoNUL0iUkYtwLkBQQeEsTq/I1KyjsKA5tyov6VZaPb8UdD6ci6Q==}
|
resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [openbsd]
|
os: [openbsd]
|
||||||
@ -1146,14 +1149,14 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [openbsd]
|
os: [openbsd]
|
||||||
|
|
||||||
'@esbuild/openbsd-x64@0.25.7':
|
'@esbuild/openbsd-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-TA9XfJrgzAipFUU895jd9j2SyDh9bbNkK2I0gHcvqb/o84UeQkBpi/XmYX3cO1q/9hZokdcDqQxIi6uLVrikxg==}
|
resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [openbsd]
|
os: [openbsd]
|
||||||
|
|
||||||
'@esbuild/openharmony-arm64@0.25.7':
|
'@esbuild/openharmony-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-5VTtExUrWwHHEUZ/N+rPlHDwVFQ5aME7vRJES8+iQ0xC/bMYckfJ0l2n3yGIfRoXcK/wq4oXSItZAz5wslTKGw==}
|
resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [openharmony]
|
os: [openharmony]
|
||||||
@ -1176,8 +1179,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [sunos]
|
os: [sunos]
|
||||||
|
|
||||||
'@esbuild/sunos-x64@0.25.7':
|
'@esbuild/sunos-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-umkbn7KTxsexhv2vuuJmj9kggd4AEtL32KodkJgfhNOHMPtQ55RexsaSrMb+0+jp9XL4I4o2y91PZauVN4cH3A==}
|
resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [sunos]
|
os: [sunos]
|
||||||
@ -1200,8 +1203,8 @@ packages:
|
|||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@esbuild/win32-arm64@0.25.7':
|
'@esbuild/win32-arm64@0.25.9':
|
||||||
resolution: {integrity: sha512-j20JQGP/gz8QDgzl5No5Gr4F6hurAZvtkFxAKhiv2X49yi/ih8ECK4Y35YnjlMogSKJk931iNMcd35BtZ4ghfw==}
|
resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@ -1224,8 +1227,8 @@ packages:
|
|||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@esbuild/win32-ia32@0.25.7':
|
'@esbuild/win32-ia32@0.25.9':
|
||||||
resolution: {integrity: sha512-4qZ6NUfoiiKZfLAXRsvFkA0hoWVM+1y2bSHXHkpdLAs/+r0LgwqYohmfZCi985c6JWHhiXP30mgZawn/XrqAkQ==}
|
resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@ -1248,8 +1251,8 @@ packages:
|
|||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@esbuild/win32-x64@0.25.7':
|
'@esbuild/win32-x64@0.25.9':
|
||||||
resolution: {integrity: sha512-FaPsAHTwm+1Gfvn37Eg3E5HIpfR3i6x1AIcla/MkqAIupD4BW3MrSeUqfoTzwwJhk3WE2/KqUn4/eenEJC76VA==}
|
resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@ -3218,6 +3221,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
|
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
|
core-util-is@1.0.3:
|
||||||
|
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
|
||||||
|
|
||||||
cors@2.8.5:
|
cors@2.8.5:
|
||||||
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
|
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
@ -3784,8 +3790,8 @@ packages:
|
|||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
esbuild@0.25.7:
|
esbuild@0.25.9:
|
||||||
resolution: {integrity: sha512-daJB0q2dmTzo90L9NjRaohhRWrCzYxWNFTjEi72/h+p5DcY3yn4MacWfDakHmaBaDzDiuLJsCh0+6LK/iX+c+Q==}
|
resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@ -4588,6 +4594,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
|
resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
isarray@1.0.0:
|
||||||
|
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
|
||||||
|
|
||||||
isarray@2.0.5:
|
isarray@2.0.5:
|
||||||
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
|
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
|
||||||
|
|
||||||
@ -4837,6 +4846,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
|
resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
|
||||||
engines: {node: '>=4.0'}
|
engines: {node: '>=4.0'}
|
||||||
|
|
||||||
|
jszip@3.10.1:
|
||||||
|
resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==}
|
||||||
|
|
||||||
jwa@2.0.1:
|
jwa@2.0.1:
|
||||||
resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
|
resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
|
||||||
|
|
||||||
@ -4977,6 +4989,9 @@ packages:
|
|||||||
lie@3.1.1:
|
lie@3.1.1:
|
||||||
resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==}
|
resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==}
|
||||||
|
|
||||||
|
lie@3.3.0:
|
||||||
|
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
|
||||||
|
|
||||||
lines-and-columns@1.2.4:
|
lines-and-columns@1.2.4:
|
||||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||||
|
|
||||||
@ -5615,6 +5630,9 @@ packages:
|
|||||||
package-manager-detector@1.3.0:
|
package-manager-detector@1.3.0:
|
||||||
resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
|
resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
|
||||||
|
|
||||||
|
pako@1.0.11:
|
||||||
|
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
|
||||||
|
|
||||||
papaparse@5.5.3:
|
papaparse@5.5.3:
|
||||||
resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==}
|
resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==}
|
||||||
|
|
||||||
@ -5769,6 +5787,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
|
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
process-nextick-args@2.0.1:
|
||||||
|
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
|
||||||
|
|
||||||
process@0.11.10:
|
process@0.11.10:
|
||||||
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
|
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
|
||||||
engines: {node: '>= 0.6.0'}
|
engines: {node: '>= 0.6.0'}
|
||||||
@ -5922,6 +5943,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
|
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
|
readable-stream@2.3.8:
|
||||||
|
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
|
||||||
|
|
||||||
readable-stream@3.6.2:
|
readable-stream@3.6.2:
|
||||||
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
|
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
@ -6042,6 +6066,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
|
resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
|
||||||
engines: {node: '>=0.4'}
|
engines: {node: '>=0.4'}
|
||||||
|
|
||||||
|
safe-buffer@5.1.2:
|
||||||
|
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
|
||||||
|
|
||||||
safe-buffer@5.2.1:
|
safe-buffer@5.2.1:
|
||||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||||
|
|
||||||
@ -6102,6 +6129,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
|
resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
setimmediate@1.0.5:
|
||||||
|
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
|
||||||
|
|
||||||
setprototypeof@1.2.0:
|
setprototypeof@1.2.0:
|
||||||
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||||
|
|
||||||
@ -6256,6 +6286,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
|
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
string_decoder@1.1.1:
|
||||||
|
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
|
||||||
|
|
||||||
string_decoder@1.3.0:
|
string_decoder@1.3.0:
|
||||||
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
|
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
|
||||||
|
|
||||||
@ -7260,7 +7293,7 @@ snapshots:
|
|||||||
'@esbuild/aix-ppc64@0.19.12':
|
'@esbuild/aix-ppc64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/aix-ppc64@0.25.7':
|
'@esbuild/aix-ppc64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-arm64@0.17.3':
|
'@esbuild/android-arm64@0.17.3':
|
||||||
@ -7272,7 +7305,7 @@ snapshots:
|
|||||||
'@esbuild/android-arm64@0.19.12':
|
'@esbuild/android-arm64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-arm64@0.25.7':
|
'@esbuild/android-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-arm@0.17.3':
|
'@esbuild/android-arm@0.17.3':
|
||||||
@ -7284,7 +7317,7 @@ snapshots:
|
|||||||
'@esbuild/android-arm@0.19.12':
|
'@esbuild/android-arm@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-arm@0.25.7':
|
'@esbuild/android-arm@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-x64@0.17.3':
|
'@esbuild/android-x64@0.17.3':
|
||||||
@ -7296,7 +7329,7 @@ snapshots:
|
|||||||
'@esbuild/android-x64@0.19.12':
|
'@esbuild/android-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/android-x64@0.25.7':
|
'@esbuild/android-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/darwin-arm64@0.17.3':
|
'@esbuild/darwin-arm64@0.17.3':
|
||||||
@ -7308,7 +7341,7 @@ snapshots:
|
|||||||
'@esbuild/darwin-arm64@0.19.12':
|
'@esbuild/darwin-arm64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/darwin-arm64@0.25.7':
|
'@esbuild/darwin-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/darwin-x64@0.17.3':
|
'@esbuild/darwin-x64@0.17.3':
|
||||||
@ -7320,7 +7353,7 @@ snapshots:
|
|||||||
'@esbuild/darwin-x64@0.19.12':
|
'@esbuild/darwin-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/darwin-x64@0.25.7':
|
'@esbuild/darwin-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/freebsd-arm64@0.17.3':
|
'@esbuild/freebsd-arm64@0.17.3':
|
||||||
@ -7332,7 +7365,7 @@ snapshots:
|
|||||||
'@esbuild/freebsd-arm64@0.19.12':
|
'@esbuild/freebsd-arm64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/freebsd-arm64@0.25.7':
|
'@esbuild/freebsd-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/freebsd-x64@0.17.3':
|
'@esbuild/freebsd-x64@0.17.3':
|
||||||
@ -7344,7 +7377,7 @@ snapshots:
|
|||||||
'@esbuild/freebsd-x64@0.19.12':
|
'@esbuild/freebsd-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/freebsd-x64@0.25.7':
|
'@esbuild/freebsd-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-arm64@0.17.3':
|
'@esbuild/linux-arm64@0.17.3':
|
||||||
@ -7356,7 +7389,7 @@ snapshots:
|
|||||||
'@esbuild/linux-arm64@0.19.12':
|
'@esbuild/linux-arm64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-arm64@0.25.7':
|
'@esbuild/linux-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-arm@0.17.3':
|
'@esbuild/linux-arm@0.17.3':
|
||||||
@ -7368,7 +7401,7 @@ snapshots:
|
|||||||
'@esbuild/linux-arm@0.19.12':
|
'@esbuild/linux-arm@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-arm@0.25.7':
|
'@esbuild/linux-arm@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-ia32@0.17.3':
|
'@esbuild/linux-ia32@0.17.3':
|
||||||
@ -7380,7 +7413,7 @@ snapshots:
|
|||||||
'@esbuild/linux-ia32@0.19.12':
|
'@esbuild/linux-ia32@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-ia32@0.25.7':
|
'@esbuild/linux-ia32@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-loong64@0.17.3':
|
'@esbuild/linux-loong64@0.17.3':
|
||||||
@ -7392,7 +7425,7 @@ snapshots:
|
|||||||
'@esbuild/linux-loong64@0.19.12':
|
'@esbuild/linux-loong64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-loong64@0.25.7':
|
'@esbuild/linux-loong64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-mips64el@0.17.3':
|
'@esbuild/linux-mips64el@0.17.3':
|
||||||
@ -7404,7 +7437,7 @@ snapshots:
|
|||||||
'@esbuild/linux-mips64el@0.19.12':
|
'@esbuild/linux-mips64el@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-mips64el@0.25.7':
|
'@esbuild/linux-mips64el@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-ppc64@0.17.3':
|
'@esbuild/linux-ppc64@0.17.3':
|
||||||
@ -7416,7 +7449,7 @@ snapshots:
|
|||||||
'@esbuild/linux-ppc64@0.19.12':
|
'@esbuild/linux-ppc64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-ppc64@0.25.7':
|
'@esbuild/linux-ppc64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-riscv64@0.17.3':
|
'@esbuild/linux-riscv64@0.17.3':
|
||||||
@ -7428,7 +7461,7 @@ snapshots:
|
|||||||
'@esbuild/linux-riscv64@0.19.12':
|
'@esbuild/linux-riscv64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-riscv64@0.25.7':
|
'@esbuild/linux-riscv64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-s390x@0.17.3':
|
'@esbuild/linux-s390x@0.17.3':
|
||||||
@ -7440,7 +7473,7 @@ snapshots:
|
|||||||
'@esbuild/linux-s390x@0.19.12':
|
'@esbuild/linux-s390x@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-s390x@0.25.7':
|
'@esbuild/linux-s390x@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-x64@0.17.3':
|
'@esbuild/linux-x64@0.17.3':
|
||||||
@ -7452,10 +7485,10 @@ snapshots:
|
|||||||
'@esbuild/linux-x64@0.19.12':
|
'@esbuild/linux-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/linux-x64@0.25.7':
|
'@esbuild/linux-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/netbsd-arm64@0.25.7':
|
'@esbuild/netbsd-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/netbsd-x64@0.17.3':
|
'@esbuild/netbsd-x64@0.17.3':
|
||||||
@ -7467,10 +7500,10 @@ snapshots:
|
|||||||
'@esbuild/netbsd-x64@0.19.12':
|
'@esbuild/netbsd-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/netbsd-x64@0.25.7':
|
'@esbuild/netbsd-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openbsd-arm64@0.25.7':
|
'@esbuild/openbsd-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openbsd-x64@0.17.3':
|
'@esbuild/openbsd-x64@0.17.3':
|
||||||
@ -7482,10 +7515,10 @@ snapshots:
|
|||||||
'@esbuild/openbsd-x64@0.19.12':
|
'@esbuild/openbsd-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openbsd-x64@0.25.7':
|
'@esbuild/openbsd-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/openharmony-arm64@0.25.7':
|
'@esbuild/openharmony-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/sunos-x64@0.17.3':
|
'@esbuild/sunos-x64@0.17.3':
|
||||||
@ -7497,7 +7530,7 @@ snapshots:
|
|||||||
'@esbuild/sunos-x64@0.19.12':
|
'@esbuild/sunos-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/sunos-x64@0.25.7':
|
'@esbuild/sunos-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-arm64@0.17.3':
|
'@esbuild/win32-arm64@0.17.3':
|
||||||
@ -7509,7 +7542,7 @@ snapshots:
|
|||||||
'@esbuild/win32-arm64@0.19.12':
|
'@esbuild/win32-arm64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-arm64@0.25.7':
|
'@esbuild/win32-arm64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-ia32@0.17.3':
|
'@esbuild/win32-ia32@0.17.3':
|
||||||
@ -7521,7 +7554,7 @@ snapshots:
|
|||||||
'@esbuild/win32-ia32@0.19.12':
|
'@esbuild/win32-ia32@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-ia32@0.25.7':
|
'@esbuild/win32-ia32@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-x64@0.17.3':
|
'@esbuild/win32-x64@0.17.3':
|
||||||
@ -7533,7 +7566,7 @@ snapshots:
|
|||||||
'@esbuild/win32-x64@0.19.12':
|
'@esbuild/win32-x64@0.19.12':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@esbuild/win32-x64@0.25.7':
|
'@esbuild/win32-x64@0.25.9':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)':
|
'@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)':
|
||||||
@ -9894,6 +9927,8 @@ snapshots:
|
|||||||
|
|
||||||
cookie@0.7.2: {}
|
cookie@0.7.2: {}
|
||||||
|
|
||||||
|
core-util-is@1.0.3: {}
|
||||||
|
|
||||||
cors@2.8.5:
|
cors@2.8.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
object-assign: 4.1.1
|
object-assign: 4.1.1
|
||||||
@ -10428,7 +10463,7 @@ snapshots:
|
|||||||
|
|
||||||
esbuild-plugin-inline-worker@0.1.1:
|
esbuild-plugin-inline-worker@0.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.25.7
|
esbuild: 0.25.9
|
||||||
find-cache-dir: 3.3.2
|
find-cache-dir: 3.3.2
|
||||||
|
|
||||||
esbuild-register@3.6.0(esbuild@0.19.12):
|
esbuild-register@3.6.0(esbuild@0.19.12):
|
||||||
@ -10514,34 +10549,34 @@ snapshots:
|
|||||||
'@esbuild/win32-ia32': 0.19.12
|
'@esbuild/win32-ia32': 0.19.12
|
||||||
'@esbuild/win32-x64': 0.19.12
|
'@esbuild/win32-x64': 0.19.12
|
||||||
|
|
||||||
esbuild@0.25.7:
|
esbuild@0.25.9:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@esbuild/aix-ppc64': 0.25.7
|
'@esbuild/aix-ppc64': 0.25.9
|
||||||
'@esbuild/android-arm': 0.25.7
|
'@esbuild/android-arm': 0.25.9
|
||||||
'@esbuild/android-arm64': 0.25.7
|
'@esbuild/android-arm64': 0.25.9
|
||||||
'@esbuild/android-x64': 0.25.7
|
'@esbuild/android-x64': 0.25.9
|
||||||
'@esbuild/darwin-arm64': 0.25.7
|
'@esbuild/darwin-arm64': 0.25.9
|
||||||
'@esbuild/darwin-x64': 0.25.7
|
'@esbuild/darwin-x64': 0.25.9
|
||||||
'@esbuild/freebsd-arm64': 0.25.7
|
'@esbuild/freebsd-arm64': 0.25.9
|
||||||
'@esbuild/freebsd-x64': 0.25.7
|
'@esbuild/freebsd-x64': 0.25.9
|
||||||
'@esbuild/linux-arm': 0.25.7
|
'@esbuild/linux-arm': 0.25.9
|
||||||
'@esbuild/linux-arm64': 0.25.7
|
'@esbuild/linux-arm64': 0.25.9
|
||||||
'@esbuild/linux-ia32': 0.25.7
|
'@esbuild/linux-ia32': 0.25.9
|
||||||
'@esbuild/linux-loong64': 0.25.7
|
'@esbuild/linux-loong64': 0.25.9
|
||||||
'@esbuild/linux-mips64el': 0.25.7
|
'@esbuild/linux-mips64el': 0.25.9
|
||||||
'@esbuild/linux-ppc64': 0.25.7
|
'@esbuild/linux-ppc64': 0.25.9
|
||||||
'@esbuild/linux-riscv64': 0.25.7
|
'@esbuild/linux-riscv64': 0.25.9
|
||||||
'@esbuild/linux-s390x': 0.25.7
|
'@esbuild/linux-s390x': 0.25.9
|
||||||
'@esbuild/linux-x64': 0.25.7
|
'@esbuild/linux-x64': 0.25.9
|
||||||
'@esbuild/netbsd-arm64': 0.25.7
|
'@esbuild/netbsd-arm64': 0.25.9
|
||||||
'@esbuild/netbsd-x64': 0.25.7
|
'@esbuild/netbsd-x64': 0.25.9
|
||||||
'@esbuild/openbsd-arm64': 0.25.7
|
'@esbuild/openbsd-arm64': 0.25.9
|
||||||
'@esbuild/openbsd-x64': 0.25.7
|
'@esbuild/openbsd-x64': 0.25.9
|
||||||
'@esbuild/openharmony-arm64': 0.25.7
|
'@esbuild/openharmony-arm64': 0.25.9
|
||||||
'@esbuild/sunos-x64': 0.25.7
|
'@esbuild/sunos-x64': 0.25.9
|
||||||
'@esbuild/win32-arm64': 0.25.7
|
'@esbuild/win32-arm64': 0.25.9
|
||||||
'@esbuild/win32-ia32': 0.25.7
|
'@esbuild/win32-ia32': 0.25.9
|
||||||
'@esbuild/win32-x64': 0.25.7
|
'@esbuild/win32-x64': 0.25.9
|
||||||
|
|
||||||
escalade@3.2.0: {}
|
escalade@3.2.0: {}
|
||||||
|
|
||||||
@ -11493,6 +11528,8 @@ snapshots:
|
|||||||
call-bound: 1.0.4
|
call-bound: 1.0.4
|
||||||
get-intrinsic: 1.3.0
|
get-intrinsic: 1.3.0
|
||||||
|
|
||||||
|
isarray@1.0.0: {}
|
||||||
|
|
||||||
isarray@2.0.5: {}
|
isarray@2.0.5: {}
|
||||||
|
|
||||||
isexe@2.0.0: {}
|
isexe@2.0.0: {}
|
||||||
@ -11962,6 +11999,13 @@ snapshots:
|
|||||||
object.assign: 4.1.7
|
object.assign: 4.1.7
|
||||||
object.values: 1.2.1
|
object.values: 1.2.1
|
||||||
|
|
||||||
|
jszip@3.10.1:
|
||||||
|
dependencies:
|
||||||
|
lie: 3.3.0
|
||||||
|
pako: 1.0.11
|
||||||
|
readable-stream: 2.3.8
|
||||||
|
setimmediate: 1.0.5
|
||||||
|
|
||||||
jwa@2.0.1:
|
jwa@2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
buffer-equal-constant-time: 1.0.1
|
buffer-equal-constant-time: 1.0.1
|
||||||
@ -12062,6 +12106,10 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
immediate: 3.0.6
|
immediate: 3.0.6
|
||||||
|
|
||||||
|
lie@3.3.0:
|
||||||
|
dependencies:
|
||||||
|
immediate: 3.0.6
|
||||||
|
|
||||||
lines-and-columns@1.2.4: {}
|
lines-and-columns@1.2.4: {}
|
||||||
|
|
||||||
local-pkg@1.1.1:
|
local-pkg@1.1.1:
|
||||||
@ -12847,6 +12895,8 @@ snapshots:
|
|||||||
|
|
||||||
package-manager-detector@1.3.0: {}
|
package-manager-detector@1.3.0: {}
|
||||||
|
|
||||||
|
pako@1.0.11: {}
|
||||||
|
|
||||||
papaparse@5.5.3: {}
|
papaparse@5.5.3: {}
|
||||||
|
|
||||||
parent-module@1.0.1:
|
parent-module@1.0.1:
|
||||||
@ -13001,6 +13051,8 @@ snapshots:
|
|||||||
|
|
||||||
prismjs@1.30.0: {}
|
prismjs@1.30.0: {}
|
||||||
|
|
||||||
|
process-nextick-args@2.0.1: {}
|
||||||
|
|
||||||
process@0.11.10: {}
|
process@0.11.10: {}
|
||||||
|
|
||||||
prompts@2.4.2:
|
prompts@2.4.2:
|
||||||
@ -13242,6 +13294,16 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
loose-envify: 1.4.0
|
loose-envify: 1.4.0
|
||||||
|
|
||||||
|
readable-stream@2.3.8:
|
||||||
|
dependencies:
|
||||||
|
core-util-is: 1.0.3
|
||||||
|
inherits: 2.0.4
|
||||||
|
isarray: 1.0.0
|
||||||
|
process-nextick-args: 2.0.1
|
||||||
|
safe-buffer: 5.1.2
|
||||||
|
string_decoder: 1.1.1
|
||||||
|
util-deprecate: 1.0.2
|
||||||
|
|
||||||
readable-stream@3.6.2:
|
readable-stream@3.6.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
inherits: 2.0.4
|
inherits: 2.0.4
|
||||||
@ -13402,6 +13464,8 @@ snapshots:
|
|||||||
has-symbols: 1.1.0
|
has-symbols: 1.1.0
|
||||||
isarray: 2.0.5
|
isarray: 2.0.5
|
||||||
|
|
||||||
|
safe-buffer@5.1.2: {}
|
||||||
|
|
||||||
safe-buffer@5.2.1: {}
|
safe-buffer@5.2.1: {}
|
||||||
|
|
||||||
safe-push-apply@1.0.0:
|
safe-push-apply@1.0.0:
|
||||||
@ -13484,6 +13548,8 @@ snapshots:
|
|||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
es-object-atoms: 1.1.1
|
es-object-atoms: 1.1.1
|
||||||
|
|
||||||
|
setimmediate@1.0.5: {}
|
||||||
|
|
||||||
setprototypeof@1.2.0: {}
|
setprototypeof@1.2.0: {}
|
||||||
|
|
||||||
shallowequal@1.1.0: {}
|
shallowequal@1.1.0: {}
|
||||||
@ -13710,6 +13776,10 @@ snapshots:
|
|||||||
define-properties: 1.2.1
|
define-properties: 1.2.1
|
||||||
es-object-atoms: 1.1.1
|
es-object-atoms: 1.1.1
|
||||||
|
|
||||||
|
string_decoder@1.1.1:
|
||||||
|
dependencies:
|
||||||
|
safe-buffer: 5.1.2
|
||||||
|
|
||||||
string_decoder@1.3.0:
|
string_decoder@1.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer: 5.2.1
|
safe-buffer: 5.2.1
|
||||||
|
|||||||
246
src/components/modals/ApiKeyModal.tsx
Normal file
246
src/components/modals/ApiKeyModal.tsx
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
import { App, Modal } from 'obsidian'
|
||||||
|
import { createRoot, Root } from 'react-dom/client'
|
||||||
|
|
||||||
|
import { INFIO_PLATFORM_URL } from '../../constants'
|
||||||
|
interface ApiKeyModalContentProps {
|
||||||
|
onClose: () => void
|
||||||
|
app: App
|
||||||
|
}
|
||||||
|
|
||||||
|
const ApiKeyModalContent: React.FC<ApiKeyModalContentProps> = ({ onClose, app }) => {
|
||||||
|
const handleGetApiKeyClick = () => {
|
||||||
|
window.open(`${INFIO_PLATFORM_URL}/api-keys`, '_blank')
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleUpgradeProClick = () => {
|
||||||
|
window.open(`${INFIO_PLATFORM_URL}/billing`, '_blank')
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleOpenSettingsClick = () => {
|
||||||
|
onClose()
|
||||||
|
// 打开设置面板到 Infio Provider 选项卡
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const setting = (app as any).setting
|
||||||
|
setting.open()
|
||||||
|
setting.openTabById('infio-copilot')
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="api-key-modal-content">
|
||||||
|
<div className="api-key-modal-header">
|
||||||
|
<h2>配置 API Key</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="api-key-modal-body">
|
||||||
|
<div className="api-key-message">
|
||||||
|
{/* <div className="api-key-icon">🔑</div> */}
|
||||||
|
<p>请先在 Infio Provider 设置中配置 Infio API Key</p>
|
||||||
|
<p>您可以按照以下步骤获取和配置 API Key:</p>
|
||||||
|
|
||||||
|
<div className="api-key-steps">
|
||||||
|
<div className="api-key-step">
|
||||||
|
<div className="step-number">1</div>
|
||||||
|
<div className="step-content">
|
||||||
|
<h4>获取 API Key</h4>
|
||||||
|
<p>访问 Infio 平台获取您的 API Key</p>
|
||||||
|
<button className="step-action-btn" onClick={handleGetApiKeyClick}>
|
||||||
|
获取 API Key
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="api-key-step">
|
||||||
|
<div className="step-number">2</div>
|
||||||
|
<div className="step-content">
|
||||||
|
<h4>确保已升级为 Pro 会员</h4>
|
||||||
|
<p>升级到 Pro 会员以享受更多高级功能和模型访问权限</p>
|
||||||
|
<button className="step-action-btn" onClick={handleUpgradeProClick}>
|
||||||
|
升级到 Pro
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="api-key-step">
|
||||||
|
<div className="step-number">3</div>
|
||||||
|
<div className="step-content">
|
||||||
|
<h4>配置 Infio API Key</h4>
|
||||||
|
<p>在插件设置中的 Infio Provider 部分配置您的 Infio API Key</p>
|
||||||
|
<button className="step-action-btn" onClick={handleOpenSettingsClick}>
|
||||||
|
打开设置
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="api-key-modal-footer">
|
||||||
|
<button className="api-key-btn-close" onClick={onClose}>
|
||||||
|
关闭
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
{`
|
||||||
|
.api-key-modal-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-modal-header {
|
||||||
|
padding: 20px 24px 16px;
|
||||||
|
border-bottom: 1px solid var(--background-modifier-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-modal-header h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-modal-body {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-message {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-icon {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-message p {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: var(--text-normal);
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-steps {
|
||||||
|
margin: 24px 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-step {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding: 16px;
|
||||||
|
background: var(--background-secondary);
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
border-left: 3px solid var(--interactive-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-number {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
background: var(--interactive-accent);
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-content {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-content h4 {
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-content p {
|
||||||
|
margin: 0 0 12px 0;
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--text-muted);
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-action-btn {
|
||||||
|
padding: 8px 16px;
|
||||||
|
border: 1px solid var(--interactive-accent);
|
||||||
|
background: transparent;
|
||||||
|
color: var(--interactive-accent);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-action-btn:hover {
|
||||||
|
background: var(--interactive-accent);
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-modal-footer {
|
||||||
|
padding: 16px 24px 24px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-btn-close {
|
||||||
|
padding: 10px 24px;
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
background: var(--background-secondary);
|
||||||
|
color: var(--text-normal);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-key-btn-close:hover {
|
||||||
|
background: var(--background-modifier-hover);
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ApiKeyModal extends Modal {
|
||||||
|
private root: Root | null = null
|
||||||
|
|
||||||
|
constructor(app: App) {
|
||||||
|
super(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
onOpen(): void {
|
||||||
|
const { contentEl, modalEl } = this
|
||||||
|
|
||||||
|
// 添加特定的CSS类
|
||||||
|
modalEl.addClass('mod-api-key')
|
||||||
|
|
||||||
|
// 设置模态框样式
|
||||||
|
modalEl.style.width = '520px'
|
||||||
|
modalEl.style.maxWidth = '90vw'
|
||||||
|
|
||||||
|
this.root = createRoot(contentEl)
|
||||||
|
|
||||||
|
this.root.render(
|
||||||
|
<ApiKeyModalContent
|
||||||
|
onClose={() => this.close()}
|
||||||
|
app={this.app}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
onClose(): void {
|
||||||
|
const { contentEl, modalEl } = this
|
||||||
|
modalEl.removeClass('mod-api-key')
|
||||||
|
this.root?.unmount()
|
||||||
|
this.root = null
|
||||||
|
contentEl.empty()
|
||||||
|
}
|
||||||
|
}
|
||||||
183
src/components/modals/ProUpgradeModal.tsx
Normal file
183
src/components/modals/ProUpgradeModal.tsx
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
import { App, Modal } from 'obsidian'
|
||||||
|
import { createRoot, Root } from 'react-dom/client'
|
||||||
|
|
||||||
|
interface ProUpgradeModalContentProps {
|
||||||
|
onClose: () => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const ProUpgradeModalContent: React.FC<ProUpgradeModalContentProps> = ({ onClose }) => {
|
||||||
|
const handleUpgradeClick = () => {
|
||||||
|
window.open('https://platform.infio.com/billing', '_blank')
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="pro-upgrade-modal-content">
|
||||||
|
<div className="pro-upgrade-modal-header">
|
||||||
|
<h2>升级到 Pro 会员</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="pro-upgrade-modal-body">
|
||||||
|
<div className="pro-upgrade-message">
|
||||||
|
<div className="pro-upgrade-icon">⭐</div>
|
||||||
|
<p>您的账户不是Pro会员,无法升级到Pro版本。</p>
|
||||||
|
<p>请先升级到Pro,享受更多高级功能:</p>
|
||||||
|
<ul className="pro-upgrade-features">
|
||||||
|
<li>✨ 全新的UI界面</li>
|
||||||
|
<li>🚀 在线市场使用权限</li>
|
||||||
|
<li>💎 专注任务模型访问权限</li>
|
||||||
|
<li>🎯 专业技术支持</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="pro-upgrade-modal-footer">
|
||||||
|
<button className="pro-upgrade-btn-cancel" onClick={onClose}>
|
||||||
|
关闭
|
||||||
|
</button>
|
||||||
|
<button className="pro-upgrade-btn-upgrade" onClick={handleUpgradeClick}>
|
||||||
|
立即升级 Pro
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
{`
|
||||||
|
.pro-upgrade-modal-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-modal-header {
|
||||||
|
padding: 20px 24px 16px;
|
||||||
|
border-bottom: 1px solid var(--background-modifier-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-modal-header h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-modal-body {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-message {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-icon {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-message p {
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: var(--text-normal);
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-features {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 20px 0;
|
||||||
|
text-align: left;
|
||||||
|
background: var(--background-secondary);
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
padding: 16px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-features li {
|
||||||
|
padding: 8px 0;
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--text-normal);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-modal-footer {
|
||||||
|
padding: 16px 24px 24px;
|
||||||
|
display: flex;
|
||||||
|
gap: 12px;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-btn-cancel {
|
||||||
|
padding: 10px 20px;
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
background: var(--background-secondary);
|
||||||
|
color: var(--text-normal);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-btn-cancel:hover {
|
||||||
|
background: var(--background-modifier-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-btn-upgrade {
|
||||||
|
padding: 10px 20px;
|
||||||
|
border: none;
|
||||||
|
background: linear-gradient(135deg, var(--interactive-accent), var(--interactive-accent-hover));
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-btn-upgrade:hover {
|
||||||
|
background: linear-gradient(135deg, var(--interactive-accent-hover), var(--interactive-accent));
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pro-upgrade-btn-upgrade:active {
|
||||||
|
transform: translateY(0);
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ProUpgradeModal extends Modal {
|
||||||
|
private root: Root | null = null
|
||||||
|
|
||||||
|
constructor(app: App) {
|
||||||
|
super(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
onOpen(): void {
|
||||||
|
const { contentEl, modalEl } = this
|
||||||
|
|
||||||
|
// 添加特定的CSS类
|
||||||
|
modalEl.addClass('mod-pro-upgrade')
|
||||||
|
|
||||||
|
// 设置模态框样式
|
||||||
|
modalEl.style.width = '480px'
|
||||||
|
modalEl.style.maxWidth = '90vw'
|
||||||
|
|
||||||
|
this.root = createRoot(contentEl)
|
||||||
|
|
||||||
|
this.root.render(
|
||||||
|
<ProUpgradeModalContent
|
||||||
|
onClose={() => this.close()}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
onClose(): void {
|
||||||
|
const { contentEl, modalEl } = this
|
||||||
|
modalEl.removeClass('mod-pro-upgrade')
|
||||||
|
this.root?.unmount()
|
||||||
|
this.root = null
|
||||||
|
contentEl.empty()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -22,7 +22,9 @@ export const GROK_BASE_URL = 'https://api.x.ai/v1'
|
|||||||
export const SILICONFLOW_BASE_URL = 'https://api.siliconflow.cn/v1'
|
export const SILICONFLOW_BASE_URL = 'https://api.siliconflow.cn/v1'
|
||||||
export const ALIBABA_QWEN_BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1'
|
export const ALIBABA_QWEN_BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1'
|
||||||
export const MOONSHOT_BASE_URL = 'https://api.moonshot.cn/v1'
|
export const MOONSHOT_BASE_URL = 'https://api.moonshot.cn/v1'
|
||||||
export const INFIO_BASE_URL = 'https://api.infio.app'
|
// export const INFIO_BASE_URL = 'https://api.infio.app'
|
||||||
|
export const INFIO_PLATFORM_URL = 'https://platform.infio.app'
|
||||||
|
export const INFIO_BASE_URL = 'http://192.168.31.211:4000'
|
||||||
export const JINA_BASE_URL = 'https://r.jina.ai'
|
export const JINA_BASE_URL = 'https://r.jina.ai'
|
||||||
export const SERPER_BASE_URL = 'https://serpapi.com/search'
|
export const SERPER_BASE_URL = 'https://serpapi.com/search'
|
||||||
// Pricing in dollars per million tokens
|
// Pricing in dollars per million tokens
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import OpenAI from 'openai'
|
import OpenAI from 'openai'
|
||||||
|
|
||||||
import { ALIBABA_QWEN_BASE_URL, MOONSHOT_BASE_URL } from '../../constants'
|
import { ALIBABA_QWEN_BASE_URL, INFIO_BASE_URL, MOONSHOT_BASE_URL } from '../../constants'
|
||||||
import { LLMModel } from '../../types/llm/model'
|
import { LLMModel } from '../../types/llm/model'
|
||||||
import {
|
import {
|
||||||
LLMOptions,
|
LLMOptions,
|
||||||
@ -51,16 +51,23 @@ export class OpenAICompatibleProvider implements BaseLLMProvider {
|
|||||||
private isAlibabaQwen(): boolean {
|
private isAlibabaQwen(): boolean {
|
||||||
return this.baseURL === ALIBABA_QWEN_BASE_URL ||
|
return this.baseURL === ALIBABA_QWEN_BASE_URL ||
|
||||||
this.baseURL?.includes('dashscope.aliyuncs.com')
|
this.baseURL?.includes('dashscope.aliyuncs.com')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isGemini(modelName: string): boolean {
|
||||||
|
return this.baseURL === INFIO_BASE_URL && modelName.includes('gemini')
|
||||||
|
}
|
||||||
|
|
||||||
// 获取提供商特定的额外参数
|
// 获取提供商特定的额外参数
|
||||||
private getExtraParams(isStreaming: boolean): Record<string, unknown> {
|
private getExtraParams(isStreaming: boolean, modelName: string): Record<string, unknown> {
|
||||||
const extraParams: Record<string, unknown> = {}
|
const extraParams: Record<string, unknown> = {}
|
||||||
|
|
||||||
// 阿里云Qwen API需要在非流式调用中设置 enable_thinking: false
|
// 阿里云Qwen API需要在非流式调用中设置 enable_thinking: false
|
||||||
if (this.isAlibabaQwen() && !isStreaming) {
|
if (this.isAlibabaQwen() && !isStreaming) {
|
||||||
extraParams.enable_thinking = false
|
extraParams.enable_thinking = false
|
||||||
}
|
}
|
||||||
|
if (this.isGemini(modelName)) {
|
||||||
|
extraParams.reasoning_effort = 'low';
|
||||||
|
}
|
||||||
|
|
||||||
return extraParams
|
return extraParams
|
||||||
}
|
}
|
||||||
@ -91,7 +98,7 @@ export class OpenAICompatibleProvider implements BaseLLMProvider {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const extraParams = this.getExtraParams(true) // 流式调用
|
const extraParams = this.getExtraParams(true, model.modelId) // 流式调用
|
||||||
return this.adapter.streamResponse(this.client as OpenAI, request, options, extraParams)
|
return this.adapter.streamResponse(this.client as OpenAI, request, options, extraParams)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
294
src/hooks/use-infio.ts
Normal file
294
src/hooks/use-infio.ts
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
/* eslint-disable no-console, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */
|
||||||
|
import JSZip from "jszip";
|
||||||
|
import { App, Notice, Plugin, requestUrl } from "obsidian";
|
||||||
|
|
||||||
|
import { INFIO_BASE_URL } from "../constants";
|
||||||
|
|
||||||
|
// 扩展App类型以包含plugins属性
|
||||||
|
type AppWithPlugins = App & {
|
||||||
|
plugins: {
|
||||||
|
reloadPlugin: (id: string) => void;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// 类型保护函数
|
||||||
|
function hasPluginsProperty(app: App): app is AppWithPlugins {
|
||||||
|
return 'plugins' in app &&
|
||||||
|
app.plugins !== undefined &&
|
||||||
|
typeof app.plugins === 'object' &&
|
||||||
|
'reloadPlugin' in app.plugins &&
|
||||||
|
typeof app.plugins.reloadPlugin === 'function';
|
||||||
|
}
|
||||||
|
|
||||||
|
// API响应类型定义
|
||||||
|
export type UserPlanResponse = {
|
||||||
|
plan: string;
|
||||||
|
status: string;
|
||||||
|
dl_zip?: string;
|
||||||
|
[key: string]: unknown;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type UpgradeResult = {
|
||||||
|
success: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const fetchUserPlan = async (apiKey: string): Promise<UserPlanResponse> => {
|
||||||
|
const response = await requestUrl({
|
||||||
|
url: `${INFIO_BASE_URL}/subscription/status`,
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${apiKey}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
||||||
|
return response.json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查用户是否为Pro用户
|
||||||
|
*/
|
||||||
|
export const checkIsProUser = async (apiKey: string): Promise<boolean> => {
|
||||||
|
try {
|
||||||
|
if (!apiKey) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const userPlan = await fetchUserPlan(apiKey);
|
||||||
|
return userPlan.plan?.toLowerCase().startsWith('pro') || false;
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error('检查Pro用户状态失败:', error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理临时目录
|
||||||
|
*/
|
||||||
|
const cleanupTempDirectory = async (adapter: Plugin['app']['vault']['adapter'], tempDir: string): Promise<void> => {
|
||||||
|
try {
|
||||||
|
// 检查目录是否存在
|
||||||
|
if (await adapter.exists(tempDir)) {
|
||||||
|
console.log(`清理临时目录: ${tempDir}`);
|
||||||
|
// 删除临时目录及其所有内容
|
||||||
|
await adapter.rmdir(tempDir, true);
|
||||||
|
console.log(`临时目录清理完成: ${tempDir}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log("清理临时目录失败:", error);
|
||||||
|
// 不抛出错误,因为这不是关键操作
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载并解压ZIP文件到临时目录
|
||||||
|
*/
|
||||||
|
const downloadAndExtractToTemp = async (
|
||||||
|
adapter: Plugin['app']['vault']['adapter'],
|
||||||
|
tempDir: string,
|
||||||
|
downloadUrl: string
|
||||||
|
): Promise<void> => {
|
||||||
|
console.log(`开始下载文件: ${downloadUrl}`);
|
||||||
|
|
||||||
|
// 下载ZIP文件
|
||||||
|
let zipResponse;
|
||||||
|
try {
|
||||||
|
zipResponse = await requestUrl({
|
||||||
|
url: downloadUrl,
|
||||||
|
method: "GET",
|
||||||
|
});
|
||||||
|
console.log("文件下载完成,状态:", zipResponse.status);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("下载失败:", error);
|
||||||
|
throw new Error("网络连接失败,无法下载Pro版本文件");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!zipResponse.arrayBuffer) {
|
||||||
|
console.log("响应格式无效,缺少arrayBuffer");
|
||||||
|
throw new Error("下载的文件格式无效");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
console.log("正在解压文件到临时目录...");
|
||||||
|
console.log(`开始解压文件到临时目录: ${tempDir}`);
|
||||||
|
|
||||||
|
// 解压ZIP文件
|
||||||
|
let zipData: JSZip;
|
||||||
|
try {
|
||||||
|
const zip = new JSZip();
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||||
|
zipData = await zip.loadAsync(zipResponse.arrayBuffer);
|
||||||
|
console.log("ZIP文件解析成功");
|
||||||
|
} catch (error) {
|
||||||
|
console.log("ZIP文件解析失败:", error);
|
||||||
|
throw new Error("文件解压失败,可能文件已损坏");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建临时目录
|
||||||
|
try {
|
||||||
|
if (!(await adapter.exists(tempDir))) {
|
||||||
|
await adapter.mkdir(tempDir);
|
||||||
|
console.log(`临时目录创建成功: ${tempDir}`);
|
||||||
|
} else {
|
||||||
|
console.log(`临时目录已存在: ${tempDir}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log("创建临时目录失败:", error);
|
||||||
|
throw new Error("无法创建临时目录");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解压所有文件到临时目录
|
||||||
|
try {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||||
|
const files = Object.keys(zipData.files);
|
||||||
|
console.log(files);
|
||||||
|
console.log(`ZIP文件中包含 ${files.length} 个条目`);
|
||||||
|
|
||||||
|
let extractedCount = 0;
|
||||||
|
for (const filename of files) {
|
||||||
|
const file = zipData.files[filename];
|
||||||
|
|
||||||
|
// 跳过目录
|
||||||
|
if (file?.dir) {
|
||||||
|
console.log(`跳过目录: ${filename}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`正在解压文件: ${filename}`);
|
||||||
|
|
||||||
|
// 获取文件内容
|
||||||
|
const content = await file?.async("text");
|
||||||
|
|
||||||
|
if (!content) {
|
||||||
|
console.log(`跳过空文件: ${filename}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取文件名(去掉路径前缀)
|
||||||
|
const pathParts = filename.split('/');
|
||||||
|
const actualFileName = pathParts[pathParts.length - 1];
|
||||||
|
|
||||||
|
// 直接写入到临时目录根目录,不创建子目录
|
||||||
|
const tempFilePath = `${tempDir}/${actualFileName}`;
|
||||||
|
|
||||||
|
// 写入文件到临时目录
|
||||||
|
await adapter.write(tempFilePath, content);
|
||||||
|
extractedCount++;
|
||||||
|
console.log(`文件解压完成: ${actualFileName} (${extractedCount}/${files.filter(f => !zipData.files[f].dir).length})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`所有文件解压完成,共解压 ${extractedCount} 个文件`);
|
||||||
|
} catch (error) {
|
||||||
|
console.log("文件解压过程中出错:", error);
|
||||||
|
throw new Error("文件解压过程中出现错误");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从临时目录复制文件到插件目录
|
||||||
|
*/
|
||||||
|
const copyFilesFromTemp = async (
|
||||||
|
adapter: Plugin['app']['vault']['adapter'],
|
||||||
|
tempDir: string,
|
||||||
|
pluginDir: string
|
||||||
|
): Promise<void> => {
|
||||||
|
console.log("正在更新插件文件...");
|
||||||
|
console.log(`开始从临时目录复制文件到插件目录: ${tempDir} -> ${pluginDir}`);
|
||||||
|
|
||||||
|
// 需要复制的关键文件
|
||||||
|
const filesToCopy = ['main.js', 'styles.css', 'manifest.json'];
|
||||||
|
|
||||||
|
// 检查必需文件是否存在
|
||||||
|
const mainJsPath = `${tempDir}/main.js`;
|
||||||
|
if (!(await adapter.exists(mainJsPath))) {
|
||||||
|
console.log("关键文件缺失: main.js");
|
||||||
|
throw new Error("升级文件不完整,缺少关键组件");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 复制文件
|
||||||
|
let copiedCount = 0;
|
||||||
|
for (const filename of filesToCopy) {
|
||||||
|
const tempFilePath = `${tempDir}/${filename}`;
|
||||||
|
const pluginFilePath = `${pluginDir}/${filename}`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (await adapter.exists(tempFilePath)) {
|
||||||
|
const content = await adapter.read(tempFilePath);
|
||||||
|
await adapter.write(pluginFilePath, content);
|
||||||
|
copiedCount++;
|
||||||
|
} else if (filename !== 'main.js') {
|
||||||
|
console.log(`可选文件不存在,跳过: ${filename}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(`文件更新失败: ${filename}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`文件复制完成,共复制 ${copiedCount} 个文件`);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载并安装Pro版本
|
||||||
|
*/
|
||||||
|
export const upgradeToProVersion = async (
|
||||||
|
plugin: Plugin,
|
||||||
|
dl_zip: string
|
||||||
|
): Promise<UpgradeResult> => {
|
||||||
|
const tempDir = '.infio_download_cache';
|
||||||
|
const adapter = plugin.app.vault.adapter;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 获取插件目录
|
||||||
|
const pluginDir = plugin.manifest.dir;
|
||||||
|
if (!pluginDir) {
|
||||||
|
console.log("插件目录未找到");
|
||||||
|
throw new Error("无法找到插件目录");
|
||||||
|
}
|
||||||
|
new Notice("正在加载...");
|
||||||
|
|
||||||
|
await cleanupTempDirectory(adapter, tempDir);
|
||||||
|
|
||||||
|
await downloadAndExtractToTemp(
|
||||||
|
adapter,
|
||||||
|
tempDir,
|
||||||
|
dl_zip
|
||||||
|
);
|
||||||
|
|
||||||
|
await copyFilesFromTemp(adapter, tempDir, pluginDir);
|
||||||
|
|
||||||
|
new Notice("加载完成,成功升级为Pro");
|
||||||
|
|
||||||
|
await cleanupTempDirectory(adapter, tempDir);
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
console.log(`重载插件: ${plugin.manifest.id}`);
|
||||||
|
if (hasPluginsProperty(plugin.app)) {
|
||||||
|
plugin.app.plugins.reloadPlugin(plugin.manifest.id);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
message: "加载完成,成功升级为Pro"
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log("错误详情:", error);
|
||||||
|
|
||||||
|
// 发生错误时也要清理临时目录
|
||||||
|
await cleanupTempDirectory(adapter, tempDir);
|
||||||
|
|
||||||
|
const errorMessage = error instanceof Error ? error.message : "升级过程中出现未知错误";
|
||||||
|
console.log(`最终错误信息: ${errorMessage}`);
|
||||||
|
new Notice(`加载失败: ${errorMessage}`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message: errorMessage
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,6 +18,7 @@ import { findFilesMatchingPatterns } from '../utils/glob-utils';
|
|||||||
import BasicAutoCompleteSettings from './components/BasicAutoCompleteSettings';
|
import BasicAutoCompleteSettings from './components/BasicAutoCompleteSettings';
|
||||||
// import DangerZoneSettings from './components/DangerZoneSettings';
|
// import DangerZoneSettings from './components/DangerZoneSettings';
|
||||||
import CustomProviderSettings from './components/ModelProviderSettings';
|
import CustomProviderSettings from './components/ModelProviderSettings';
|
||||||
|
import PluginInfoSettings from './components/PluginInfoSettings';
|
||||||
import PostprocessingSettings from './components/PostprocessingSettings';
|
import PostprocessingSettings from './components/PostprocessingSettings';
|
||||||
import PreprocessingSettings from './components/PreprocessingSettings';
|
import PreprocessingSettings from './components/PreprocessingSettings';
|
||||||
import PrivacySettings from './components/PrivacySettings';
|
import PrivacySettings from './components/PrivacySettings';
|
||||||
@ -27,6 +28,7 @@ export class InfioSettingTab extends PluginSettingTab {
|
|||||||
plugin: InfioPlugin;
|
plugin: InfioPlugin;
|
||||||
private autoCompleteContainer: HTMLElement | null = null;
|
private autoCompleteContainer: HTMLElement | null = null;
|
||||||
private modelsContainer: HTMLElement | null = null;
|
private modelsContainer: HTMLElement | null = null;
|
||||||
|
private pluginInfoContainer: HTMLElement | null = null;
|
||||||
|
|
||||||
constructor(app: App, plugin: InfioPlugin) {
|
constructor(app: App, plugin: InfioPlugin) {
|
||||||
super(app, plugin)
|
super(app, plugin)
|
||||||
@ -36,6 +38,7 @@ export class InfioSettingTab extends PluginSettingTab {
|
|||||||
display(): void {
|
display(): void {
|
||||||
const { containerEl } = this
|
const { containerEl } = this
|
||||||
containerEl.empty()
|
containerEl.empty()
|
||||||
|
this.renderPluginInfoSection(containerEl)
|
||||||
this.renderModelsSection(containerEl)
|
this.renderModelsSection(containerEl)
|
||||||
this.renderModelParametersSection(containerEl)
|
this.renderModelParametersSection(containerEl)
|
||||||
this.renderFilesSearchSection(containerEl)
|
this.renderFilesSearchSection(containerEl)
|
||||||
@ -242,6 +245,12 @@ export class InfioSettingTab extends PluginSettingTab {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderPluginInfoSection(containerEl: HTMLElement): void {
|
||||||
|
const pluginInfoDiv = containerEl.createDiv("plugin-info-section");
|
||||||
|
this.pluginInfoContainer = pluginInfoDiv;
|
||||||
|
this.renderPluginInfoContent(pluginInfoDiv);
|
||||||
|
}
|
||||||
|
|
||||||
renderModelsSection(containerEl: HTMLElement): void {
|
renderModelsSection(containerEl: HTMLElement): void {
|
||||||
const modelsDiv = containerEl.createDiv("models-section");
|
const modelsDiv = containerEl.createDiv("models-section");
|
||||||
this.modelsContainer = modelsDiv;
|
this.modelsContainer = modelsDiv;
|
||||||
@ -725,6 +734,22 @@ export class InfioSettingTab extends PluginSettingTab {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private renderPluginInfoContent(containerEl: HTMLElement): void {
|
||||||
|
const div = containerEl.createDiv("div");
|
||||||
|
const root = createRoot(div);
|
||||||
|
root.render(
|
||||||
|
<PluginInfoSettings
|
||||||
|
pluginVersion={this.plugin.manifest.version}
|
||||||
|
// pluginName={this.plugin.manifest.name}
|
||||||
|
author={this.plugin.manifest.author}
|
||||||
|
authorUrl={this.plugin.manifest.authorUrl}
|
||||||
|
// description={this.plugin.manifest.description}
|
||||||
|
plugin={this.plugin}
|
||||||
|
settings={this.plugin.settings}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private renderComponent(containerEl: HTMLElement, component: React.ReactNode) {
|
private renderComponent(containerEl: HTMLElement, component: React.ReactNode) {
|
||||||
const div = containerEl.createDiv("div");
|
const div = containerEl.createDiv("div");
|
||||||
const root = createRoot(div);
|
const root = createRoot(div);
|
||||||
|
|||||||
354
src/settings/components/PluginInfoSettings.tsx
Normal file
354
src/settings/components/PluginInfoSettings.tsx
Normal file
@ -0,0 +1,354 @@
|
|||||||
|
import { Notice, Plugin } from 'obsidian';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { ApiKeyModal } from '../../components/modals/ApiKeyModal';
|
||||||
|
import { ProUpgradeModal } from '../../components/modals/ProUpgradeModal';
|
||||||
|
import { fetchUserPlan, upgradeToProVersion } from '../../hooks/use-infio';
|
||||||
|
import type { InfioSettings } from '../../types/settings';
|
||||||
|
import { getInfioLogoSvg } from '../../utils/icon';
|
||||||
|
|
||||||
|
type PluginInfoSettingsProps = {
|
||||||
|
pluginVersion: string;
|
||||||
|
author: string;
|
||||||
|
authorUrl: string;
|
||||||
|
plugin?: Plugin;
|
||||||
|
settings?: InfioSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function PluginInfoSettings({
|
||||||
|
pluginVersion,
|
||||||
|
author,
|
||||||
|
authorUrl,
|
||||||
|
plugin,
|
||||||
|
settings
|
||||||
|
}: PluginInfoSettingsProps) {
|
||||||
|
const isPro = false; // this is must be false
|
||||||
|
const [isUpgrading, setIsUpgrading] = React.useState(false);
|
||||||
|
// Convert SVG string to data URL for proper display
|
||||||
|
const logoDataUrl = `data:image/svg+xml;base64,${btoa(getInfioLogoSvg())}`;
|
||||||
|
|
||||||
|
// 处理升级按钮点击
|
||||||
|
const handleUpgrade = async () => {
|
||||||
|
if (!plugin) {
|
||||||
|
new Notice('无法获取插件实例');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!settings?.infioProvider?.apiKey) {
|
||||||
|
if (plugin?.app) {
|
||||||
|
new ApiKeyModal(plugin.app).open();
|
||||||
|
} else {
|
||||||
|
new Notice('请先在Infio Provider设置中配置 Infio API Key');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setIsUpgrading(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 检查是否为Pro用户
|
||||||
|
const userPlan = await fetchUserPlan(settings.infioProvider.apiKey);
|
||||||
|
const isProUser = userPlan.plan?.toLowerCase().startsWith('pro') || false;
|
||||||
|
if (!isProUser) {
|
||||||
|
if (plugin?.app) {
|
||||||
|
new ProUpgradeModal(plugin.app).open();
|
||||||
|
} else {
|
||||||
|
new Notice('您的账户不是Pro用户,无法升级到Pro版本, 请先升级到Pro');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行升级
|
||||||
|
const result = await upgradeToProVersion(plugin, userPlan.dl_zip || '');
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
// 升级成功的提示已经在upgradeToProVersion中处理了
|
||||||
|
} else {
|
||||||
|
new Notice(`加载失败: ${result.message}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error('升级过程中发生错误:', error);
|
||||||
|
} finally {
|
||||||
|
setIsUpgrading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="plugin-info-container">
|
||||||
|
{/* 插件头部区域 */}
|
||||||
|
<div className="plugin-header">
|
||||||
|
<div className="plugin-brand">
|
||||||
|
<div className="plugin-logo-wrapper">
|
||||||
|
<img src={logoDataUrl} alt="Infio Logo" className="plugin-logo" />
|
||||||
|
</div>
|
||||||
|
<div className="plugin-title-info">
|
||||||
|
<h1 className="plugin-name">Infio</h1>
|
||||||
|
<div className="plugin-badges">
|
||||||
|
<span className={`version-type-badge ${isPro ? 'pro' : 'community'}`}>
|
||||||
|
{isPro ? 'Pro' : 'community'}
|
||||||
|
</span>
|
||||||
|
<span className="version-number">v{pluginVersion}</span>
|
||||||
|
<button
|
||||||
|
className="upgrade-button"
|
||||||
|
onClick={handleUpgrade}
|
||||||
|
disabled={isUpgrading}
|
||||||
|
>
|
||||||
|
{isUpgrading ? '加载中...' : '升级到Pro'}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 链接容器 */}
|
||||||
|
<div className="plugin-links">
|
||||||
|
{author && authorUrl && (
|
||||||
|
<a
|
||||||
|
href={authorUrl}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="plugin-link"
|
||||||
|
>
|
||||||
|
<span className="plugin-link-icon">👤</span>
|
||||||
|
<span>{author}</span>
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="https://github.com/infiolab/infio-copilot"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="plugin-link"
|
||||||
|
>
|
||||||
|
<span className="plugin-link-icon">📖</span>
|
||||||
|
<span>GitHub</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="https://infio.app/docs"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="plugin-link"
|
||||||
|
>
|
||||||
|
<span className="plugin-link-icon">📚</span>
|
||||||
|
<span>Documentation</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="https://github.com/infiolab/obsidian-infio-copilot/issues"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="plugin-link"
|
||||||
|
>
|
||||||
|
<span className="plugin-link-icon">💬</span>
|
||||||
|
<span>Feedback</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
{`
|
||||||
|
/* 插件信息容器样式 */
|
||||||
|
.plugin-info-container {
|
||||||
|
background: var(--background-primary);
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
border-radius: var(--radius-l);
|
||||||
|
padding: var(--size-4-6);
|
||||||
|
margin-bottom: var(--size-4-8);
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
||||||
|
transition: box-shadow 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-info-container:hover {
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 插件头部区域 */
|
||||||
|
.plugin-header {
|
||||||
|
margin-bottom: var(--size-4-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 品牌区域 */
|
||||||
|
.plugin-brand {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--size-4-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Logo包装器 */
|
||||||
|
.plugin-logo-wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
border-radius: var(--radius-m);
|
||||||
|
padding: var(--size-2-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 插件logo */
|
||||||
|
.plugin-logo {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 标题信息区域 */
|
||||||
|
.plugin-title-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--size-2-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 插件名称 */
|
||||||
|
.plugin-name {
|
||||||
|
font-size: 1.75rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-normal);
|
||||||
|
margin: 0;
|
||||||
|
line-height: 1.2;
|
||||||
|
letter-spacing: -0.01em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 徽章容器 */
|
||||||
|
.plugin-badges {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--size-2-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 版本类型标识 */
|
||||||
|
.version-type-badge {
|
||||||
|
padding: var(--size-2-1) var(--size-2-3);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 700;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.8px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-type-badge.pro {
|
||||||
|
background: linear-gradient(135deg, var(--interactive-accent), var(--interactive-accent-hover));
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-type-badge.community {
|
||||||
|
background: var(--background-modifier-border);
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 版本号 */
|
||||||
|
.version-number {
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: var(--font-ui-medium);
|
||||||
|
font-weight: 500;
|
||||||
|
background: var(--background-secondary);
|
||||||
|
padding: var(--size-2-1) var(--size-2-2);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 升级按钮 */
|
||||||
|
.upgrade-button {
|
||||||
|
background: linear-gradient(135deg, var(--interactive-accent), var(--interactive-accent-hover));
|
||||||
|
color: var(--text-on-accent);
|
||||||
|
border: none;
|
||||||
|
padding: var(--size-2-1) var(--size-2-3);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
font-size: var(--font-ui-small);
|
||||||
|
font-weight: 600;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
white-space: nowrap;
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.upgrade-button:hover:not(:disabled) {
|
||||||
|
background: linear-gradient(135deg, var(--interactive-accent-hover), var(--interactive-accent));
|
||||||
|
transform: translateY(-1px);
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.upgrade-button:active:not(:disabled) {
|
||||||
|
transform: translateY(0);
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.upgrade-button:disabled {
|
||||||
|
opacity: 0.6;
|
||||||
|
cursor: not-allowed;
|
||||||
|
transform: none;
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 链接容器 */
|
||||||
|
.plugin-links {
|
||||||
|
display: flex;
|
||||||
|
gap: var(--size-4-2);
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 链接样式 */
|
||||||
|
.plugin-link {
|
||||||
|
color: var(--text-accent);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: var(--font-ui-small);
|
||||||
|
padding: var(--size-2-1) var(--size-2-3);
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: var(--size-2-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-link:hover {
|
||||||
|
background: var(--background-modifier-hover);
|
||||||
|
border-color: var(--background-modifier-border-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 响应式设计 */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.plugin-title-row {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: var(--size-2-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-logo {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-name {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-badges {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-links {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
gap: var(--size-2-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-link {
|
||||||
|
justify-content: center;
|
||||||
|
padding: var(--size-2-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 深色模式适配 */
|
||||||
|
.theme-dark .plugin-info-container {
|
||||||
|
background: var(--background-primary-alt);
|
||||||
|
border-color: var(--background-modifier-border-hover);
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -343,13 +343,31 @@ export const ComboBoxComponent: React.FC<ComboBoxComponentProps> = ({
|
|||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
</Popover.Trigger>
|
</Popover.Trigger>
|
||||||
<Popover.Content
|
<Popover.Portal>
|
||||||
side="bottom"
|
<Popover.Content
|
||||||
align="start"
|
side="bottom"
|
||||||
sideOffset={4}
|
align="start"
|
||||||
className="infio-llm-setting-combobox-dropdown"
|
sideOffset={4}
|
||||||
>
|
className="infio-model-picker-dropdown"
|
||||||
<div ref={listRef}>
|
avoidCollisions={true}
|
||||||
|
collisionPadding={8}
|
||||||
|
onOpenAutoFocus={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
// 延迟聚焦到搜索输入框
|
||||||
|
setTimeout(() => {
|
||||||
|
const input = e.currentTarget.querySelector('input');
|
||||||
|
input?.focus();
|
||||||
|
}, 0);
|
||||||
|
}}
|
||||||
|
onCloseAutoFocus={(e) => e.preventDefault()}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
ref={listRef}
|
||||||
|
onMouseDown={(e) => {
|
||||||
|
// 防止点击内容区域时关闭 Popover
|
||||||
|
e.stopPropagation();
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div className="infio-llm-setting-search-container">
|
<div className="infio-llm-setting-search-container">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
@ -360,6 +378,14 @@ export const ComboBoxComponent: React.FC<ComboBoxComponentProps> = ({
|
|||||||
setSearchTerm(e.target.value);
|
setSearchTerm(e.target.value);
|
||||||
setSelectedIndex(0);
|
setSelectedIndex(0);
|
||||||
}}
|
}}
|
||||||
|
onMouseDown={(e) => {
|
||||||
|
// 防止点击输入框时关闭 Popover
|
||||||
|
e.stopPropagation();
|
||||||
|
}}
|
||||||
|
onFocus={(e) => {
|
||||||
|
// 防止聚焦时关闭 Popover
|
||||||
|
e.stopPropagation();
|
||||||
|
}}
|
||||||
onKeyDown={(e) => {
|
onKeyDown={(e) => {
|
||||||
switch (e.key) {
|
switch (e.key) {
|
||||||
case "ArrowDown":
|
case "ArrowDown":
|
||||||
@ -399,25 +425,28 @@ export const ComboBoxComponent: React.FC<ComboBoxComponentProps> = ({
|
|||||||
{filteredOptions.length > 0 ? (
|
{filteredOptions.length > 0 ? (
|
||||||
<div className="infio-llm-setting-options-list">
|
<div className="infio-llm-setting-options-list">
|
||||||
{filteredOptions.map((option, index) => (
|
{filteredOptions.map((option, index) => (
|
||||||
<Popover.Close key={option.id} asChild>
|
<div
|
||||||
<div
|
key={option.id}
|
||||||
ref={(el) => (itemRefs.current[index] = el)}
|
ref={(el) => (itemRefs.current[index] = el)}
|
||||||
onMouseEnter={() => setSelectedIndex(index)}
|
onMouseEnter={() => setSelectedIndex(index)}
|
||||||
onClick={() => {
|
onMouseDown={(e) => {
|
||||||
handleModelSelect(modelProvider, option.id, option.isCustom);
|
// 防止事件冒泡
|
||||||
setSearchTerm("");
|
e.preventDefault();
|
||||||
setIsOpen(false);
|
e.stopPropagation();
|
||||||
}}
|
handleModelSelect(modelProvider, option.id, option.isCustom);
|
||||||
className={`infio-llm-setting-combobox-option ${index === selectedIndex ? 'is-selected' : ''}`}
|
setSearchTerm("");
|
||||||
>
|
setIsOpen(false);
|
||||||
<HighlightedText segments={option.html} />
|
}}
|
||||||
</div>
|
className={`infio-llm-setting-combobox-option ${index === selectedIndex ? 'is-selected' : ''}`}
|
||||||
</Popover.Close>
|
>
|
||||||
|
<HighlightedText segments={option.html} />
|
||||||
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
</Popover.Content>
|
</Popover.Content>
|
||||||
|
</Popover.Portal>
|
||||||
</Popover.Root>
|
</Popover.Root>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -457,6 +486,7 @@ export const ComboBoxComponent: React.FC<ComboBoxComponentProps> = ({
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.infio-llm-setting-provider-label,
|
.infio-llm-setting-provider-label,
|
||||||
@ -545,15 +575,30 @@ export const ComboBoxComponent: React.FC<ComboBoxComponentProps> = ({
|
|||||||
transform: rotate(180deg);
|
transform: rotate(180deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.infio-llm-setting-combobox-dropdown {
|
.infio-model-picker-dropdown {
|
||||||
background: var(--background-primary);
|
background: var(--background-primary);
|
||||||
border: 1px solid var(--background-modifier-border);
|
border: 1px solid var(--background-modifier-border);
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
box-shadow: var(--shadow-s);
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
min-width: 300px;
|
min-width: 300px;
|
||||||
max-width: 500px;
|
max-width: 500px;
|
||||||
z-index: 1000;
|
z-index: 10000;
|
||||||
|
max-height: 300px;
|
||||||
|
overflow: hidden;
|
||||||
|
transform-origin: var(--radix-popover-content-transform-origin);
|
||||||
|
animation: popover-in 0.15s ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes popover-in {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0.95) translateY(-5px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1) translateY(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.infio-llm-setting-search-container {
|
.infio-llm-setting-search-container {
|
||||||
@ -578,8 +623,9 @@ export const ComboBoxComponent: React.FC<ComboBoxComponentProps> = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
.infio-llm-setting-options-list {
|
.infio-llm-setting-options-list {
|
||||||
max-height: 200px;
|
max-height: 240px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
overscroll-behavior: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.infio-llm-setting-combobox-option {
|
.infio-llm-setting-combobox-option {
|
||||||
|
|||||||
2
src/utils/icon.d.ts
vendored
Normal file
2
src/utils/icon.d.ts
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export declare function getInfioLogoSimpleSvg(): string;
|
||||||
|
export declare function getInfioLogoSvg(): string;
|
||||||
22
src/utils/icon.ts
Normal file
22
src/utils/icon.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Utility functions for creating Obsidian-compatible icons
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a simplified monochrome version for smaller sizes
|
||||||
|
*/
|
||||||
|
export function getInfioLogoSimpleSvg(): string {
|
||||||
|
return `<svg viewBox="0 0 233 179" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M231.342 93.98L229.862 92.43H219.602L223.192 0.45L208.392 0L205.622 65.43C146.022 62.19 86.2922 62.19 26.7022 65.41L24.9722 0.45L10.1722 0.9L12.6722 92.43H2.16217L0.752167 93.9C-0.797833 110.13 0.0921667 126.58 3.01217 142.79H13.8422L14.0222 144.06C14.6922 163.4 30.1222 178.74 49.9222 178.74C69.7222 178.74 94.7822 177.82 116.042 177.82C137.302 177.82 162.602 178.74 181.992 178.74C201.382 178.74 217.182 163.45 217.892 144.13L218.052 142.79H229.072C231.982 126.6 232.882 110.18 231.332 93.98H231.342ZM73.1122 151.99C55.8422 151.99 42.8622 138.21 42.8622 122.21C42.8622 106.21 55.8522 92.43 73.1122 92.43C90.3722 92.43 102.732 106.37 102.732 122.37C102.732 138.37 90.3822 151.99 73.1122 151.99ZM159.622 151.99C142.352 151.99 129.372 138.21 129.372 122.21C129.372 106.21 142.362 92.43 159.622 92.43C176.882 92.43 189.242 106.37 189.242 122.37C189.242 138.37 176.892 151.99 159.622 151.99Z" style="fill:currentColor;fill-rule:nonzero"/>
|
||||||
|
</svg>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getInfioLogoSvg(): string {
|
||||||
|
return `<svg width="233" height="233" viewBox="0 0 233 233" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M231.342 93.98L229.862 92.43H219.602L223.192 0.45L208.392 0L205.622 65.43C146.022 62.19 86.2922 62.19 26.7022 65.41L24.9722 0.45L10.1722 0.9L12.6722 92.43H2.16217L0.752167 93.9C-0.797833 110.13 0.0921667 126.58 3.01217 142.79H13.8422L14.0222 144.06C14.6922 163.4 30.1222 178.74 49.9222 178.74C69.7222 178.74 94.7822 177.82 116.042 177.82C137.302 177.82 162.602 178.74 181.992 178.74C201.382 178.74 217.182 163.45 217.892 144.13L218.052 142.79H229.072C231.982 126.6 232.882 110.18 231.332 93.98H231.342ZM73.1122 151.99C55.8422 151.99 42.8622 138.21 42.8622 122.21C42.8622 106.21 55.8522 92.43 73.1122 92.43C90.3722 92.43 102.732 106.37 102.732 122.37C102.732 138.37 90.3822 151.99 73.1122 151.99ZM159.622 151.99C142.352 151.99 129.372 138.21 129.372 122.21C129.372 106.21 142.362 92.43 159.622 92.43C176.882 92.43 189.242 106.37 189.242 122.37C189.242 138.37 176.892 151.99 159.622 151.99Z" fill="#808080"/>
|
||||||
|
</svg>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
@ -2,7 +2,7 @@ import { ApiProvider } from '../types/llm/model';
|
|||||||
|
|
||||||
// Provider API Key获取地址映射
|
// Provider API Key获取地址映射
|
||||||
export const providerApiUrls: Record<ApiProvider, string> = {
|
export const providerApiUrls: Record<ApiProvider, string> = {
|
||||||
[ApiProvider.Infio]: 'https://platform.infio.app/home',
|
[ApiProvider.Infio]: 'https://platform.infio.app/api-keys',
|
||||||
[ApiProvider.OpenRouter]: 'https://openrouter.ai/settings/keys',
|
[ApiProvider.OpenRouter]: 'https://openrouter.ai/settings/keys',
|
||||||
[ApiProvider.SiliconFlow]: 'https://cloud.siliconflow.cn/account/ak',
|
[ApiProvider.SiliconFlow]: 'https://cloud.siliconflow.cn/account/ak',
|
||||||
[ApiProvider.AlibabaQwen]: 'https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key',
|
[ApiProvider.AlibabaQwen]: 'https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user