ваше сообщение коммита
This commit is contained in:
@@ -1 +0,0 @@
|
||||
{"AccountTag":"a67861072a144cdd746e9c9bdd8476fe","TunnelSecret":"NCu/3BUoqAbF5kwXfs3rTjU9QUiVvXv7OM27BrUd/50Kf/wthq2rIH0G+Eu76LK8JQon/UQBUbQPoRPRY3qbtA==","TunnelID":"a765a217-5312-48f8-9bb7-5a7ef56602b8"}
|
||||
@@ -1,7 +0,0 @@
|
||||
tunnel: a765a217-5312-48f8-9bb7-5a7ef56602b8
|
||||
credentials-file: /etc/cloudflared/a765a217-5312-48f8-9bb7-5a7ef56602b8.json
|
||||
|
||||
ingress:
|
||||
- hostname: hb3-accelerator.com
|
||||
service: http://dapp-frontend:5173
|
||||
- service: http_status:404
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM alpine:3.20 as base
|
||||
RUN apk add --no-cache bash curl wget
|
||||
|
||||
FROM cloudflare/cloudflared:2025.6.1 as src
|
||||
|
||||
FROM base
|
||||
COPY --from=src /usr/local/bin/cloudflared /usr/local/bin/cloudflared
|
||||
USER nobody
|
||||
ENTRYPOINT ["bash", "/start-cloudflared.sh"]
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"name": "ест3",
|
||||
"symbol": "тест3",
|
||||
"location": "07522, United States, Paterson",
|
||||
"isicCodes": [
|
||||
"0111"
|
||||
],
|
||||
"tokenAddress": "0xFcF1304FAe013d52e09a1497a47988d125a9e2Ed",
|
||||
"timelockAddress": "0xbcF1daCB040b681129Df122f67a0D2eC23DA99B6",
|
||||
"governorAddress": "0xC8aC4c9431B57934eEccac6322352abfcE8a994a",
|
||||
"creationBlock": 8626309,
|
||||
"creationTimestamp": 1750859640,
|
||||
"deployedManually": true
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1752,3 +1752,281 @@
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.889Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.890Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-06-28T23:06:53.890Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:13:39.979Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:13:39.982Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.153Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.154Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:16:13.155Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.759Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.760Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.760Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.760Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:17:39.761Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:18:26.622Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:18:26.623Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.366Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.370Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.371Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.372Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.375Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.376Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.376Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.377Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.380Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:22:06.381Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.948Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.949Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.949Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:23.950Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:43.017Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:43.018Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:34:58.241Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:35:30.659Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Not authenticated","stack":"Error: Not authenticated\n at Connection.openBox (/app/node_modules/imap/lib/Connection.js:409:11)\n at Connection.<anonymous> (/app/services/emailBot.js:105:19)\n at Object.onceWrapper (node:events:638:28)\n at Connection.emit (node:events:536:35)\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:1623:12)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)","timestamp":"2025-07-03T19:35:45.020Z"}
|
||||
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-03T19:36:51.701Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.893Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.894Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.894Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.895Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:36:56.895Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.227Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:22.228Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:45:37.459Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.234Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.235Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.236Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:48:42.236Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:49:48.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:49:48.913Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.240Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.240Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.240Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:53:43.241Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.569Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.570Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.570Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T19:59:16.570Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:00:23.282Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:00:23.283Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:00:55.560Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:02:36.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:02:36.581Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:02:36.581Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:03:08.903Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.543Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.544Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.545Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.545Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:07:35.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:09:16.584Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:09:16.585Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:09:16.585Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.579Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:12:36.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:14:15.535Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:14:15.536Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:14:15.536Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:15:22.204Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:15:22.204Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: write after end","timestamp":"2025-07-03T20:15:51.506Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:16:28.896Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:18:09.935Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:18:09.935Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:18:09.936Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.585Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.585Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.586Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.586Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.587Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.588Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.588Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:22:36.588Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.917Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:28:09.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:29:48.813Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:29:48.813Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:29:48.814Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.545Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:32:36.546Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:22.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:35:56.580Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:37:35.512Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:37:35.513Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:37:35.513Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.918Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.919Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:41:29.920Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.911Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.912Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:48:09.913Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.566Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.566Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.566Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.567Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:55:56.568Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.856Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T20:59:48.857Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.251Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.252Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.253Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:10:23.254Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.199Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.199Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.199Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.200Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.201Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:16:24.201Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.774Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:20:18.775Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.344Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.345Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:29:44.346Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:30:51.066Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:30:51.066Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:32:31.458Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:32:31.459Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:32:31.459Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.451Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.452Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.452Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.452Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:38:31.453Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.120Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.120Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.121Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.121Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.121Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.122Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.123Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.123Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:46:57.123Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.473Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.474Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.474Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:50:49.474Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T21:51:23.788Z"}
|
||||
{"level":"error","message":"Unhandled Rejection: Cannot use a pool after calling end on the pool","stack":"Error: Cannot use a pool after calling end on the pool\n at /app/node_modules/pg-pool/index.js:45:11\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/app.js:103:20","timestamp":"2025-07-03T21:56:00.872Z"}
|
||||
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-03T22:06:50.565Z"}
|
||||
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-03T22:06:50.566Z"}
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
"express-rate-limit": "^7.5.0",
|
||||
"express-session": "^1.17.3",
|
||||
"helmet": "^8.0.0",
|
||||
"hnswlib-node": "^3.0.0",
|
||||
"imap": "^0.8.19",
|
||||
"interface-store": "^6.0.2",
|
||||
"langchain": "^0.3.19",
|
||||
|
||||
@@ -10,9 +10,12 @@ router.get('/', async (req, res) => {
|
||||
|
||||
// Vector Search
|
||||
try {
|
||||
const vs = await axios.get(process.env.VECTOR_SEARCH_URL || 'http://vector-search:8001/health', { timeout: 2000 });
|
||||
const baseUrl = process.env.VECTOR_SEARCH_URL || 'http://vector-search:8001';
|
||||
const healthUrl = baseUrl.replace(/\/$/, '') + '/health';
|
||||
const vs = await axios.get(healthUrl, { timeout: 2000 });
|
||||
results.vectorSearch = { status: 'ok', ...vs.data };
|
||||
} catch (e) {
|
||||
console.log('Vector Search error:', e.message, 'Status:', e.response?.status);
|
||||
results.vectorSearch = { status: 'error', error: e.message };
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@ const express = require('express');
|
||||
const router = express.Router();
|
||||
const { ragAnswer, generateLLMResponse } = require('../services/ragService');
|
||||
|
||||
router.get('/health', (req, res) => {
|
||||
res.json({ status: 'ok', message: 'RAG service is running' });
|
||||
});
|
||||
|
||||
router.post('/answer', async (req, res) => {
|
||||
const { tableId, question, userTags, product, systemPrompt, priority, date, rules, history, model, language } = req.body;
|
||||
try {
|
||||
@@ -24,6 +28,7 @@ router.post('/answer', async (req, res) => {
|
||||
});
|
||||
res.json({ ...ragResult, llmResponse });
|
||||
} catch (e) {
|
||||
console.error('[RAG] Error in /answer route:', e);
|
||||
res.status(500).json({ error: e.message });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -5,9 +5,16 @@ const { getProviderSettings } = require('./aiProviderSettingsService');
|
||||
console.log('[RAG] ragService.js loaded');
|
||||
|
||||
async function getTableData(tableId) {
|
||||
console.log(`[RAG] getTableData called for tableId: ${tableId}`);
|
||||
|
||||
const columns = (await db.query('SELECT * FROM user_columns WHERE table_id = $1', [tableId])).rows;
|
||||
console.log(`[RAG] Found ${columns.length} columns:`, columns.map(col => ({ id: col.id, name: col.name, purpose: col.options?.purpose })));
|
||||
|
||||
const rows = (await db.query('SELECT * FROM user_rows WHERE table_id = $1', [tableId])).rows;
|
||||
console.log(`[RAG] Found ${rows.length} rows:`, rows.map(row => ({ id: row.id, name: row.name })));
|
||||
|
||||
const cellValues = (await db.query('SELECT * FROM user_cell_values WHERE row_id IN (SELECT id FROM user_rows WHERE table_id = $1)', [tableId])).rows;
|
||||
console.log(`[RAG] Found ${cellValues.length} cell values`);
|
||||
|
||||
const getColId = purpose => columns.find(col => col.options?.purpose === purpose)?.id;
|
||||
const questionColId = getColId('question');
|
||||
@@ -18,9 +25,19 @@ async function getTableData(tableId) {
|
||||
const priorityColId = getColId('priority');
|
||||
const dateColId = getColId('date');
|
||||
|
||||
console.log(`[RAG] Column IDs:`, {
|
||||
question: questionColId,
|
||||
answer: answerColId,
|
||||
userTags: userTagsColId,
|
||||
context: contextColId,
|
||||
product: productColId,
|
||||
priority: priorityColId,
|
||||
date: dateColId
|
||||
});
|
||||
|
||||
const data = rows.map(row => {
|
||||
const cells = cellValues.filter(cell => cell.row_id === row.id);
|
||||
return {
|
||||
const result = {
|
||||
id: row.id,
|
||||
question: cells.find(c => c.column_id === questionColId)?.value,
|
||||
answer: cells.find(c => c.column_id === answerColId)?.value,
|
||||
@@ -30,16 +47,29 @@ async function getTableData(tableId) {
|
||||
priority: cells.find(c => c.column_id === priorityColId)?.value,
|
||||
date: cells.find(c => c.column_id === dateColId)?.value,
|
||||
};
|
||||
console.log(`[RAG] Processed row ${row.id}:`, result);
|
||||
return result;
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
async function ragAnswer({ tableId, userQuestion, userTags = [], product = null, threshold = 0.3 }) {
|
||||
async function ragAnswer({ tableId, userQuestion, userTags = [], product = null, threshold = 10 }) {
|
||||
console.log(`[RAG] ragAnswer called: tableId=${tableId}, userQuestion="${userQuestion}"`);
|
||||
|
||||
const data = await getTableData(tableId);
|
||||
console.log(`[RAG] Got ${data.length} rows from database`);
|
||||
|
||||
// Подробное логирование данных
|
||||
data.forEach((row, index) => {
|
||||
console.log(`[RAG] Row ${index}:`, {
|
||||
id: row.id,
|
||||
question: row.question,
|
||||
answer: row.answer,
|
||||
userTags: row.userTags,
|
||||
product: row.product
|
||||
});
|
||||
});
|
||||
|
||||
const questions = data.map(row => row.question && typeof row.question === 'string' ? row.question.trim() : row.question);
|
||||
const rowsForUpsert = data.map(row => ({
|
||||
row_id: row.id,
|
||||
@@ -70,23 +100,53 @@ async function ragAnswer({ tableId, userQuestion, userTags = [], product = null,
|
||||
if (rowsForUpsert.length > 0) {
|
||||
results = await vectorSearch.search(tableId, userQuestion, 3);
|
||||
console.log(`[RAG] Search completed, got ${results.length} results`);
|
||||
|
||||
// Подробное логирование результатов поиска
|
||||
results.forEach((result, index) => {
|
||||
console.log(`[RAG] Search result ${index}:`, {
|
||||
row_id: result.row_id,
|
||||
score: result.score,
|
||||
metadata: result.metadata
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.log(`[RAG] No data in table, skipping search`);
|
||||
}
|
||||
|
||||
// Фильтрация по тегам/продукту
|
||||
let filtered = results;
|
||||
console.log(`[RAG] Before filtering: ${filtered.length} results`);
|
||||
|
||||
if (userTags.length) {
|
||||
console.log(`[RAG] Filtering by userTags:`, userTags);
|
||||
filtered = filtered.filter(row => row.metadata.userTags && userTags.some(tag => row.metadata.userTags.includes(tag)));
|
||||
}
|
||||
if (product) {
|
||||
filtered = filtered.filter(row => row.metadata.product === product);
|
||||
console.log(`[RAG] After userTags filtering: ${filtered.length} results`);
|
||||
}
|
||||
|
||||
// Берём лучший результат с учётом порога
|
||||
const best = filtered.find(row => row.score >= threshold);
|
||||
if (product) {
|
||||
console.log(`[RAG] Filtering by product:`, product);
|
||||
filtered = filtered.filter(row => row.metadata.product === product);
|
||||
console.log(`[RAG] After product filtering: ${filtered.length} results`);
|
||||
}
|
||||
|
||||
// Берём ближайший результат с учётом порога (по модулю)
|
||||
console.log(`[RAG] Looking for best result with abs(threshold): ${threshold}`);
|
||||
const best = filtered.reduce((acc, row) => {
|
||||
if (Math.abs(row.score) <= threshold && (acc === null || Math.abs(row.score) < Math.abs(acc.score))) {
|
||||
return row;
|
||||
}
|
||||
return acc;
|
||||
}, null);
|
||||
console.log(`[RAG] Best result:`, best);
|
||||
|
||||
// Логируем все результаты с их score для диагностики
|
||||
if (filtered.length > 0) {
|
||||
console.log(`[RAG] All filtered results with scores:`);
|
||||
filtered.forEach((result, index) => {
|
||||
console.log(`[RAG] ${index}: score=${result.score}, meets_threshold=${Math.abs(result.score) <= threshold}`);
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
answer: best?.metadata?.answer,
|
||||
context: best?.metadata?.context,
|
||||
|
||||
@@ -1684,13 +1684,6 @@ binary-extensions@^2.0.0, binary-extensions@^2.2.0:
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
|
||||
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
|
||||
|
||||
bindings@^1.5.0:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
|
||||
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
|
||||
dependencies:
|
||||
file-uri-to-path "1.0.0"
|
||||
|
||||
bl@^1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
|
||||
@@ -3168,11 +3161,6 @@ file-type@^3.9.0:
|
||||
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
||||
integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==
|
||||
|
||||
file-uri-to-path@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
||||
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
|
||||
|
||||
fill-range@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
|
||||
@@ -3799,14 +3787,6 @@ hmac-drbg@^1.0.1:
|
||||
minimalistic-assert "^1.0.0"
|
||||
minimalistic-crypto-utils "^1.0.1"
|
||||
|
||||
hnswlib-node@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/hnswlib-node/-/hnswlib-node-3.0.0.tgz#0ec5cedf082691a5e2bec7a8faa24f742077cc50"
|
||||
integrity sha512-fypn21qvVORassppC8/qNfZ5KAOspZpm/IbUkAtlqvbtDNnF5VVk5RWF7O5V6qwr7z+T3s1ePej6wQt5wRQ4Cg==
|
||||
dependencies:
|
||||
bindings "^1.5.0"
|
||||
node-addon-api "^8.0.0"
|
||||
|
||||
html-to-text@9.0.5:
|
||||
version "9.0.5"
|
||||
resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d"
|
||||
@@ -4900,11 +4880,6 @@ node-addon-api@^5.0.0:
|
||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
|
||||
integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
|
||||
|
||||
node-addon-api@^8.0.0:
|
||||
version "8.4.0"
|
||||
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.4.0.tgz#8cbc68ee1c216368921a8f63038a23a39cd8ba44"
|
||||
integrity sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==
|
||||
|
||||
node-cron@^3.0.3:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.3.tgz#c4bc7173dd96d96c50bdb51122c64415458caff2"
|
||||
@@ -5213,7 +5188,7 @@ parent-module@^1.0.0:
|
||||
dependencies:
|
||||
callsites "^3.0.0"
|
||||
|
||||
parse-duration@^1.0.0:
|
||||
parse-duration@^1.1.0:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
|
||||
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
|
||||
|
||||
Binary file not shown.
@@ -13,7 +13,12 @@
|
||||
<div v-for="(dle, index) in dleList" :key="index" class="dle-card"
|
||||
:class="{ 'active': selectedDleIndex === index }"
|
||||
@click="selectDle(index)">
|
||||
<h3>{{ dle.name }} ({{ dle.symbol }})</h3>
|
||||
<div class="dle-card-header">
|
||||
<h3>{{ dle.name }} ({{ dle.symbol }})</h3>
|
||||
<button v-if="isAdmin" class="delete-dle-btn" @click.stop="deleteDle(dle, index)" title="Удалить DLE">
|
||||
<i class="fas fa-trash"></i>
|
||||
</button>
|
||||
</div>
|
||||
<p><strong>Адрес:</strong> {{ shortenAddress(dle.tokenAddress) }}</p>
|
||||
<p><strong>Местонахождение:</strong> {{ dle.location }}</p>
|
||||
</div>
|
||||
@@ -195,11 +200,23 @@
|
||||
<div v-for="(module, index) in availableModules" :key="index" class="module-card">
|
||||
<h4>{{ module.name }}</h4>
|
||||
<p>{{ module.description }}</p>
|
||||
<div class="module-status" :class="{ 'installed': module.installed }">
|
||||
{{ module.installed ? 'Установлен' : 'Доступен' }}
|
||||
<div class="module-status" :class="{ 'installed': isModuleInstalled(module) }">
|
||||
{{ isModuleInstalled(module) ? 'Установлен' : 'Доступен' }}
|
||||
</div>
|
||||
<div v-if="module.name === 'Прием платежей' && paymentModuleTokens.length > 0" class="payment-tokens-list">
|
||||
<div v-for="token in paymentModuleTokens" :key="token.address + token.network" class="payment-token-entry">
|
||||
<span><b>{{ token.name }}</b> ({{ token.network }})</span>
|
||||
<span style="font-size:0.95em;color:#888">{{ token.address }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="module-actions">
|
||||
<button v-if="!module.installed" class="btn btn-success" @click="installModule(module)">
|
||||
<button v-if="module.name === 'Прием платежей' && !isModuleInstalled(module)" class="btn btn-success" @click="openPaymentTokensModal">
|
||||
<i class="fas fa-plus"></i> Настроить
|
||||
</button>
|
||||
<button v-else-if="module.name === 'Прием платежей' && isModuleInstalled(module)" class="btn btn-danger" @click="uninstallPaymentModule">
|
||||
<i class="fas fa-trash"></i> Удалить
|
||||
</button>
|
||||
<button v-else-if="!isModuleInstalled(module)" class="btn btn-success" @click="installModule(module)">
|
||||
<i class="fas fa-plus"></i> Установить
|
||||
</button>
|
||||
<button v-else class="btn btn-danger" @click="uninstallModule(module)">
|
||||
@@ -211,12 +228,58 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<BaseModal
|
||||
:show="showDeleteModal"
|
||||
:title="deleteSuccess ? 'Готово' : 'Подтвердите удаление DLE'"
|
||||
@close="closeDeleteModal"
|
||||
>
|
||||
<template #default>
|
||||
<div style="margin-bottom:18px;">
|
||||
<span v-if="!deleteSuccess">Удалить DLE <b>«{{ dleToDelete?.name }}»</b>? Это действие необратимо.</span>
|
||||
<span v-else>DLE успешно удалён</span>
|
||||
</div>
|
||||
</template>
|
||||
<template #actions>
|
||||
<template v-if="!deleteSuccess">
|
||||
<button class="modal-ok-btn delete-btn" @click="confirmDeleteDle" :disabled="isDeletingDle">
|
||||
{{ isDeletingDle ? 'Удаление...' : 'Удалить' }}
|
||||
</button>
|
||||
<button class="modal-ok-btn cancel-btn" @click="closeDeleteModal" :disabled="isDeletingDle">Отмена</button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<button class="modal-ok-btn" @click="closeDeleteModal">OK</button>
|
||||
</template>
|
||||
</template>
|
||||
</BaseModal>
|
||||
<BaseModal
|
||||
:show="showPaymentTokensModal"
|
||||
title="Выберите токены для приема платежей"
|
||||
@close="closePaymentTokensModal"
|
||||
>
|
||||
<template #default>
|
||||
<div v-if="authTokens.length === 0">Нет доступных токенов. Добавьте токены в настройках безопасности.</div>
|
||||
<div v-else>
|
||||
<div v-for="token in authTokens" :key="token.address + token.network" class="token-select-row">
|
||||
<label>
|
||||
<input type="checkbox" :value="token" v-model="paymentModuleTokens.value" />
|
||||
<b>{{ token.name }}</b> ({{ token.network }}) <span style="font-size:0.95em;color:#888">{{ token.address }}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #actions>
|
||||
<button class="modal-ok-btn" @click="closePaymentTokensModal">Отмена</button>
|
||||
<button class="modal-ok-btn btn-success" @click="closePaymentTokensModal">Сохранить</button>
|
||||
</template>
|
||||
</BaseModal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, defineProps, computed } from 'vue';
|
||||
import { ref, defineProps, computed, inject } from 'vue';
|
||||
import { useAuthContext } from '@/composables/useAuth';
|
||||
import dleService from '@/services/dleService';
|
||||
import BaseModal from './NoAccessModal.vue';
|
||||
|
||||
const props = defineProps({
|
||||
dleList: { type: Array, required: true },
|
||||
@@ -353,6 +416,62 @@ function uninstallModule(module) {
|
||||
module.installed = false;
|
||||
alert(`Модуль "${module.name}" удален.`);
|
||||
}
|
||||
function isModuleInstalled(module) {
|
||||
if (typeof module.installed === 'function') return module.installed();
|
||||
return !!module.installed;
|
||||
}
|
||||
const emit = defineEmits(['close', 'dle-updated']);
|
||||
const showDeleteModal = ref(false);
|
||||
const dleToDelete = ref(null);
|
||||
const isDeletingDle = ref(false);
|
||||
const deleteSuccess = ref(false);
|
||||
function deleteDle(dle, idx) {
|
||||
if (!isAdmin.value) return;
|
||||
dleToDelete.value = dle;
|
||||
showDeleteModal.value = true;
|
||||
deleteSuccess.value = false;
|
||||
}
|
||||
function closeDeleteModal() {
|
||||
showDeleteModal.value = false;
|
||||
dleToDelete.value = null;
|
||||
isDeletingDle.value = false;
|
||||
deleteSuccess.value = false;
|
||||
}
|
||||
async function confirmDeleteDle() {
|
||||
if (!dleToDelete.value) return;
|
||||
isDeletingDle.value = true;
|
||||
try {
|
||||
await dleService.deleteDLE(dleToDelete.value.tokenAddress);
|
||||
deleteSuccess.value = true;
|
||||
emit('dle-updated');
|
||||
isDeletingDle.value = false;
|
||||
} catch (e) {
|
||||
alert('Ошибка при удалении DLE: ' + (e?.message || e));
|
||||
isDeletingDle.value = false;
|
||||
}
|
||||
}
|
||||
const authTokens = inject('authTokens', ref([]));
|
||||
const paymentModuleTokens = ref([]);
|
||||
const showPaymentTokensModal = ref(false);
|
||||
function openPaymentTokensModal() {
|
||||
showPaymentTokensModal.value = true;
|
||||
}
|
||||
function closePaymentTokensModal() {
|
||||
showPaymentTokensModal.value = false;
|
||||
}
|
||||
function savePaymentTokens(selected) {
|
||||
paymentModuleTokens.value = selected;
|
||||
closePaymentTokensModal();
|
||||
// Можно добавить сохранение в API, если потребуется
|
||||
}
|
||||
function uninstallPaymentModule() {
|
||||
paymentModuleTokens.value = [];
|
||||
}
|
||||
availableModules.value.push({
|
||||
name: 'Прием платежей',
|
||||
description: 'Позволяет принимать оплату в выбранных токенах. Можно выбрать один или несколько токенов для приема платежей.',
|
||||
installed: computed(() => paymentModuleTokens.value.length > 0)
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@@ -406,6 +525,12 @@ function uninstallModule(module) {
|
||||
border-color: #17a2b8;
|
||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.dle-card-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.dle-card h3 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 10px;
|
||||
@@ -624,4 +749,81 @@ function uninstallModule(module) {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
.delete-dle-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
color: #dc3545;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
transition: background 0.15s;
|
||||
}
|
||||
.delete-dle-btn:hover {
|
||||
background: #ffeaea;
|
||||
color: #a71d2a;
|
||||
}
|
||||
.delete-btn {
|
||||
background: #dc3545;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 2rem;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.delete-btn:disabled {
|
||||
background: #e6a6ad;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.delete-btn:hover:not(:disabled) {
|
||||
background: #b52a37;
|
||||
}
|
||||
.cancel-btn {
|
||||
background: #f5f5f5;
|
||||
color: #333;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 2rem;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.cancel-btn:disabled {
|
||||
background: #eee;
|
||||
color: #aaa;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.cancel-btn:hover:not(:disabled) {
|
||||
background: #e0e0e0;
|
||||
}
|
||||
.payment-tokens-list {
|
||||
margin: 10px 0 0 0;
|
||||
padding: 8px 0 0 0;
|
||||
border-top: 1px solid #e5e7eb;
|
||||
}
|
||||
.payment-token-entry {
|
||||
font-size: 1.02em;
|
||||
margin-bottom: 4px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.token-select-row {
|
||||
margin-bottom: 8px;
|
||||
text-align: left;
|
||||
}
|
||||
.btn-success {
|
||||
background: #28a745;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
padding: 0.5rem 2rem;
|
||||
cursor: pointer;
|
||||
font-size: 1rem;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
.btn-success:hover {
|
||||
background: #218838;
|
||||
}
|
||||
</style>
|
||||
@@ -1,9 +1,15 @@
|
||||
<template>
|
||||
<div v-if="show" class="modal-backdrop">
|
||||
<div class="modal-window">
|
||||
<div class="modal-title">{{ title }}</div>
|
||||
<div class="modal-body">{{ message }}</div>
|
||||
<button class="modal-ok-btn" @click="$emit('close')">OK</button>
|
||||
<div v-if="title" class="modal-title">{{ title }}</div>
|
||||
<div class="modal-body">
|
||||
<slot>{{ message }}</slot>
|
||||
</div>
|
||||
<div class="modal-actions">
|
||||
<slot name="actions">
|
||||
<button class="modal-ok-btn" @click="$emit('close')">OK</button>
|
||||
</slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -11,8 +17,8 @@
|
||||
<script setup>
|
||||
defineProps({
|
||||
show: Boolean,
|
||||
title: { type: String, default: 'Нет доступа' },
|
||||
message: { type: String, default: 'Доступ к этим данным разрешён только администраторам.' }
|
||||
title: { type: String, default: '' },
|
||||
message: { type: String, default: '' }
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -43,6 +49,11 @@ defineProps({
|
||||
margin-bottom: 1.5rem;
|
||||
color: #444;
|
||||
}
|
||||
.modal-actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 18px;
|
||||
}
|
||||
.modal-ok-btn {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
:dle-list="dleList"
|
||||
:selected-dle-index="selectedDleIndex"
|
||||
@close="goBack"
|
||||
@dle-updated="reloadDleList"
|
||||
class="dle-management-root"
|
||||
/>
|
||||
</BaseLayout>
|
||||
@@ -28,8 +29,19 @@ function goBack() {
|
||||
}
|
||||
}
|
||||
|
||||
async function reloadDleList() {
|
||||
dleList.value = await dleService.getAllDLEs() || [];
|
||||
// Сбросить выбранный индекс, если список изменился
|
||||
if (dleList.value.length === 0) {
|
||||
selectedDleIndex.value = 0;
|
||||
} else if (selectedDleIndex.value >= dleList.value.length) {
|
||||
selectedDleIndex.value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
dleList.value = await dleService.getAllDLEs() || [];
|
||||
onMounted(reloadDleList);
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
</form>
|
||||
<RuleEditor v-if="showRuleEditor" :rule="editingRule" @close="onRuleEditorClose" />
|
||||
</div>
|
||||
|
||||
<!-- Системный мониторинг -->
|
||||
<SystemMonitoring />
|
||||
</div>
|
||||
</BaseLayout>
|
||||
</template>
|
||||
@@ -64,6 +67,7 @@ import { useRouter } from 'vue-router';
|
||||
import { ref, onMounted, computed, watch } from 'vue';
|
||||
import axios from 'axios';
|
||||
import RuleEditor from '@/components/ai-assistant/RuleEditor.vue';
|
||||
import SystemMonitoring from '@/components/ai-assistant/SystemMonitoring.vue';
|
||||
const router = useRouter();
|
||||
const goBack = () => router.push('/settings/ai');
|
||||
const settings = ref({ system_prompt: '', model: '', selected_rag_tables: [], rules_id: null });
|
||||
@@ -149,11 +153,11 @@ async function onRuleEditorClose(updated) {
|
||||
<style scoped>
|
||||
.ai-assistant-settings-block {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
max-width: 1200px;
|
||||
margin: 32px auto 0 auto;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
|
||||
@@ -111,12 +111,12 @@ const cancelEdit = () => {
|
||||
<style scoped>
|
||||
.db-settings-block {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 40px auto 0 auto;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
@@ -126,12 +126,12 @@ const cancelEdit = () => {
|
||||
<style scoped>
|
||||
.email-settings-block {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 40px auto 0 auto;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
@@ -28,12 +28,12 @@ const goBack = () => router.push('/settings/ai');
|
||||
<style scoped>
|
||||
.ollama-settings-block {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 40px auto 0 auto;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
@@ -28,12 +28,12 @@ const goBack = () => router.push('/settings/ai');
|
||||
<style scoped>
|
||||
.openai-settings-block {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 40px auto 0 auto;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
@@ -87,12 +87,12 @@ const cancelEdit = () => {
|
||||
<style scoped>
|
||||
.telegram-settings-block {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
margin: 40px auto 0 auto;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
@@ -2,59 +2,58 @@
|
||||
<div class="blockchain-settings settings-panel" style="position:relative">
|
||||
<button class="close-btn" @click="goBack">×</button>
|
||||
|
||||
<!-- Панель Создать новое DLE (Digital Legal Entity) -->
|
||||
<div class="sub-settings-panel">
|
||||
<h3>Создать новое DLE (Digital Legal Entity)</h3>
|
||||
<div class="setting-form">
|
||||
<p>Настройка и деплой нового DLE (Digital Legal Entity) с токеном управления и контрактом Governor.</p>
|
||||
<div class="settings-block">
|
||||
<h2>Создать новое DLE (Digital Legal Entity)</h2>
|
||||
|
||||
<!-- 1. Имя DLE -->
|
||||
<!-- 1. Создание DLE -->
|
||||
<div class="setting-form">
|
||||
|
||||
<!-- Имя DLE -->
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="dleName">Имя DLE (Digital Legal Entity) (и токена):</label>
|
||||
<label class="form-label" for="dleName">Имя DLE (Digital Legal Entity):</label>
|
||||
<input type="text" id="dleName" v-model="dleDeploymentSettings.name" class="form-control" placeholder="Например, My DLE">
|
||||
</div>
|
||||
|
||||
<!-- 2. Символ токена -->
|
||||
<!-- Символ токена -->
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="dleSymbol">Символ токена управления (GT):</label>
|
||||
<input type="text" id="dleSymbol" v-model="dleDeploymentSettings.symbol" class="form-control" placeholder="Например, MDGT (3-5 символов)">
|
||||
</div>
|
||||
|
||||
<!-- 3. Местонахождение -->
|
||||
<h4>Местонахождение</h4>
|
||||
<!-- Местонахождение -->
|
||||
<div class="address-grid">
|
||||
<div class="form-group address-index">
|
||||
<label class="form-label" for="locIndex">Индекс:</label>
|
||||
<div class="input-group">
|
||||
<input type="text" id="locIndex" v-model="dleDeploymentSettings.locationIndex" @input="checkIndexInput" class="form-control">
|
||||
<button class="btn btn-outline-secondary btn-sm" type="button" @click="fetchAddressByZipcode" :disabled="isFetchingByZipcode || !dleDeploymentSettings.locationIndex">
|
||||
<i class="fas fa-search"></i> {{ isFetchingByZipcode ? 'Поиск...' : 'Найти по индексу' }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="form-group address-index">
|
||||
<label class="form-label" for="locIndex">Местонахождение</label>
|
||||
<div class="input-icon-wrapper">
|
||||
<input type="text" id="locIndex" v-model="dleDeploymentSettings.locationIndex" @input="checkIndexInput" class="form-control" placeholder="Индекс">
|
||||
<span class="input-icon" :class="{disabled: !isAdmin || isFetchingByZipcode}" @click="isAdmin && !isFetchingByZipcode && fetchAddressByZipcode()">
|
||||
<i class="fas fa-search"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template v-if="addressFieldsVisible">
|
||||
<div class="form-group address-country">
|
||||
<label class="form-label" for="locCountry">Страна:</label>
|
||||
<input type="text" id="locCountry" v-model="dleDeploymentSettings.locationCountry" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-city">
|
||||
<label class="form-label" for="locCity">Населенный пункт:</label>
|
||||
<input type="text" id="locCity" v-model="dleDeploymentSettings.locationCity" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-street">
|
||||
<label class="form-label" for="locStreet">Улица:</label>
|
||||
<input type="text" id="locStreet" v-model="dleDeploymentSettings.locationStreet" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-house">
|
||||
<label class="form-label" for="locHouse">Дом:</label>
|
||||
<input type="text" id="locHouse" v-model="dleDeploymentSettings.locationHouse" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-office">
|
||||
<label class="form-label" for="locOffice">Офис/Кв.:</label>
|
||||
<input type="text" id="locOffice" v-model="dleDeploymentSettings.locationOffice" class="form-control">
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="addressFieldsVisible">
|
||||
<div class="form-group address-country">
|
||||
<label class="form-label" for="locCountry">Страна:</label>
|
||||
<input type="text" id="locCountry" v-model="dleDeploymentSettings.locationCountry" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-city">
|
||||
<label class="form-label" for="locCity">Населенный пункт:</label>
|
||||
<input type="text" id="locCity" v-model="dleDeploymentSettings.locationCity" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-street">
|
||||
<label class="form-label" for="locStreet">Улица:</label>
|
||||
<input type="text" id="locStreet" v-model="dleDeploymentSettings.locationStreet" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-house">
|
||||
<label class="form-label" for="locHouse">Дом:</label>
|
||||
<input type="text" id="locHouse" v-model="dleDeploymentSettings.locationHouse" class="form-control">
|
||||
</div>
|
||||
<div class="form-group address-office">
|
||||
<label class="form-label" for="locOffice">Офис/Кв.:</label>
|
||||
<input type="text" id="locOffice" v-model="dleDeploymentSettings.locationOffice" class="form-control">
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<div class="address-verification-section" v-if="addressFieldsVisible">
|
||||
@@ -74,257 +73,228 @@
|
||||
<summary>Детали от Nominatim</summary>
|
||||
<pre class="code-block">{{ JSON.stringify(verifiedAddressDetails, null, 2) }}</pre>
|
||||
</details>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 4. Код деятельности -->
|
||||
<h4>Код деятельности</h4>
|
||||
<div v-if="dleDeploymentSettings.selectedIsicCodes && dleDeploymentSettings.selectedIsicCodes.length > 0" class="isic-codes-list mt-3">
|
||||
<h5>Добавленные коды деятельности:</h5>
|
||||
<ul>
|
||||
<li v-for="(isic, index) in dleDeploymentSettings.selectedIsicCodes" :key="index" class="d-flex justify-content-between align-items-center mb-1">
|
||||
<span>{{ isic.text }} ({{ isic.code }})</span>
|
||||
<button @click="removeIsicCode(index)" class="btn btn-danger btn-xs">Удалить</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="isicSection">Выберите код деятельности:</label>
|
||||
<select id="isicSection" v-model="selectedSection" class="form-control" :disabled="isLoadingSections">
|
||||
<option value="">-- {{ isLoadingSections ? 'Загрузка секций...' : 'Выберите секцию' }} --</option>
|
||||
<option v-for="option in sectionOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" v-if="selectedSection">
|
||||
<label class="form-label" for="isicDivision">Раздел:</label>
|
||||
<select id="isicDivision" v-model="selectedDivision" class="form-control" :disabled="isLoadingDivisions">
|
||||
<option value="">-- {{ isLoadingDivisions ? 'Загрузка разделов...' : 'Выберите раздел' }} --</option>
|
||||
<option v-for="option in divisionOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" v-if="selectedDivision">
|
||||
<label class="form-label" for="isicGroup">Группа:</label>
|
||||
<select id="isicGroup" v-model="selectedGroup" class="form-control" :disabled="isLoadingGroups">
|
||||
<option value="">-- {{ isLoadingGroups ? 'Загрузка групп...' : 'Выберите группу' }} --</option>
|
||||
<option v-for="option in groupOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" v-if="selectedGroup">
|
||||
<label class="form-label" for="isicClass">Класс:</label>
|
||||
<select id="isicClass" v-model="selectedClass" class="form-control" :disabled="isLoadingClasses">
|
||||
<option value="">-- {{ isLoadingClasses ? 'Загрузка классов...' : 'Выберите класс' }} --</option>
|
||||
<option v-for="option in classOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div v-if="currentSelectedIsicText" class="current-isic-selection">
|
||||
<p><strong>Выбранный код:</strong> {{ currentSelectedIsicText }}</p>
|
||||
<button @click="addIsicCode" class="btn btn-success btn-sm" :disabled="!currentSelectedIsicCode">Добавить код деятельности</button>
|
||||
</div>
|
||||
|
||||
<!-- 5. Первоначальное распределение токенов -->
|
||||
<h4>Первоначальное распределение токенов управления</h4>
|
||||
<div v-for="(partner, index) in dleDeploymentSettings.partners" :key="index" class="partner-entry">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Адрес партнера {{ index + 1 }}:</label>
|
||||
<input type="text" v-model="partner.address" class="form-control" placeholder="0x...">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Сумма GT для партнера {{ index + 1 }}:</label>
|
||||
<input type="number" v-model="partner.amount" min="1" class="form-control">
|
||||
</div>
|
||||
<button class="btn btn-danger btn-sm" @click="removePartner(index)" :disabled="!isAdmin">Удалить партнера</button>
|
||||
</div>
|
||||
<button class="btn btn-secondary" @click="addPartner" :disabled="!isAdmin">Добавить партнера</button>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Общее количество выпускаемых GT: {{ totalInitialSupply }}</label>
|
||||
</div>
|
||||
|
||||
<!-- 6. Настройки Governor -->
|
||||
<h4>Настройки Governor</h4>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="proposalThreshold">Порог для создания предложений (кол-во GT):</label>
|
||||
<input type="number" id="proposalThreshold" v-model="dleDeploymentSettings.proposalThreshold" min="0" class="form-control">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="quorumPercentGovernor">Кворум (% от общего числа голосов):</label>
|
||||
<input type="number" id="quorumPercentGovernor" v-model="dleDeploymentSettings.quorumPercent" min="1" max="100" class="form-control">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="votingDelay">Задержка перед голосованием (в днях):</label>
|
||||
<input type="number" id="votingDelay" v-model="dleDeploymentSettings.votingDelayDays" min="0" class="form-control">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="votingPeriod">Период голосования (в днях):</label>
|
||||
<input type="number" id="votingPeriod" v-model="dleDeploymentSettings.votingPeriodDays" min="1" class="form-control">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="timelockMinDelay">Минимальная задержка Timelock (в днях):</label>
|
||||
<input type="number" id="timelockMinDelay" v-model="dleDeploymentSettings.timelockMinDelayDays" min="0" class="form-control">
|
||||
</div>
|
||||
|
||||
<!-- 7. RPC Провайдеры -->
|
||||
<h4>RPC Провайдеры</h4>
|
||||
<p>Конфигурации RPC для сетей, которые будут использоваться в приложении.</p>
|
||||
|
||||
<!-- Список добавленных RPC -->
|
||||
<div v-if="securitySettings.rpcConfigs.length > 0" class="rpc-list">
|
||||
<h5>Добавленные RPC конфигурации:</h5>
|
||||
<div v-for="(rpc, index) in securitySettings.rpcConfigs" :key="index" class="rpc-entry">
|
||||
<span><strong>ID Сети:</strong> {{ rpc.networkId }}</span>
|
||||
<span><strong>URL:</strong> {{ rpc.rpcUrlDisplay || rpc.rpcUrl }}</span>
|
||||
<div class="rpc-actions">
|
||||
<button class="btn btn-info btn-sm" @click="testRpcHandler(rpc)" :disabled="testingRpc && testingRpcId === rpc.networkId">
|
||||
<i class="fas" :class="testingRpc && testingRpcId === rpc.networkId ? 'fa-spinner fa-spin' : 'fa-check-circle'"></i>
|
||||
{{ testingRpc && testingRpcId === rpc.networkId ? 'Проверка...' : 'Тест' }}
|
||||
</button>
|
||||
<button
|
||||
class="btn btn-sm"
|
||||
:class="isAdmin ? 'btn-danger' : 'btn-secondary'"
|
||||
@click="isAdmin ? removeRpcConfig(index) : null"
|
||||
:disabled="!isAdmin"
|
||||
>
|
||||
<i class="fas fa-trash"></i> Удалить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p v-else>Нет добавленных RPC конфигураций.</p>
|
||||
|
||||
<!-- Форма добавления нового RPC -->
|
||||
<div class="setting-form add-rpc-form">
|
||||
<h5>Добавить новую RPC конфигурацию:</h5>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="newRpcNetworkId">ID Сети:</label>
|
||||
<select id="newRpcNetworkId" v-model="networkEntry.networkId" class="form-control">
|
||||
<optgroup v-for="(group, groupIndex) in networkGroups" :key="groupIndex" :label="group.label">
|
||||
<option v-for="option in group.options" :key="option.value" :value="option.value">
|
||||
{{ option.label }}
|
||||
</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
<div v-if="networkEntry.networkId === 'custom'" class="mt-2">
|
||||
<label class="form-label" for="customNetworkId">Пользовательский ID:</label>
|
||||
<input type="text" id="customNetworkId" v-model="networkEntry.customNetworkId" class="form-control" placeholder="Введите ID сети">
|
||||
|
||||
<label class="form-label mt-2" for="customChainId">Chain ID:</label>
|
||||
<input type="number" id="customChainId" v-model="networkEntry.customChainId" class="form-control" placeholder="Например, 1 для Ethereum">
|
||||
<small>Chain ID - уникальный идентификатор блокчейн-сети (целое число)</small>
|
||||
</div>
|
||||
<small>ID сети должен совпадать со значением в выпадающем списке сетей при создании DLE</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="newRpcUrl">RPC URL:</label>
|
||||
<input type="text" id="newRpcUrl" v-model="networkEntry.rpcUrl" class="form-control" placeholder="https://...">
|
||||
<!-- Предложение URL на основе выбранной сети -->
|
||||
<small v-if="defaultRpcUrlSuggestion" class="suggestion">
|
||||
Предложение: {{ defaultRpcUrlSuggestion }}
|
||||
<button class="btn-link" @click="useDefaultRpcUrl">Использовать</button>
|
||||
</small>
|
||||
</div>
|
||||
<button class="btn btn-secondary" @click="addRpcConfig" :disabled="!isAdmin">Добавить RPC</button>
|
||||
</div>
|
||||
|
||||
<!-- 8. Выбор сети для деплоя -->
|
||||
<h4>Сеть для деплоя</h4>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="deployNetwork">Выберите сеть блокчейн для деплоя:</label>
|
||||
<select id="deployNetwork" v-model="dleDeploymentSettings.blockchainNetwork" class="form-control">
|
||||
<option v-if="loadingNetworks" disabled>Загрузка сетей...</option>
|
||||
<option v-for="network in networks" :key="network.value" :value="network.value">
|
||||
{{ network.label }}
|
||||
<!-- 2. Коды деятельности (ISIC) -->
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="isicSection">Выберите код деятельности:</label>
|
||||
<select id="isicSection" v-model="selectedSection" class="form-control" :disabled="isLoadingSections">
|
||||
<option value="">-- {{ isLoadingSections ? 'Загрузка секций...' : 'Выберите секцию' }} --</option>
|
||||
<option v-for="option in sectionOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
<small class="text-warning" v-if="!dleDeploymentSettings.blockchainNetwork.includes('testnet') &&
|
||||
!['sepolia', 'goerli', 'mumbai'].includes(dleDeploymentSettings.blockchainNetwork)">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
Внимание! Для тестирования рекомендуется использовать тестовые сети (Sepolia, Goerli, Mumbai).
|
||||
</small>
|
||||
</div>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- 9. Ключ Деплоера -->
|
||||
<h4>Ключ Деплоера</h4>
|
||||
<div class="form-group" v-if="selectedSection">
|
||||
<label class="form-label" for="isicDivision">Раздел:</label>
|
||||
<select id="isicDivision" v-model="selectedDivision" class="form-control" :disabled="isLoadingDivisions">
|
||||
<option value="">-- {{ isLoadingDivisions ? 'Загрузка разделов...' : 'Выберите раздел' }} --</option>
|
||||
<option v-for="option in divisionOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" v-if="selectedDivision">
|
||||
<label class="form-label" for="isicGroup">Группа:</label>
|
||||
<select id="isicGroup" v-model="selectedGroup" class="form-control" :disabled="isLoadingGroups">
|
||||
<option value="">-- {{ isLoadingGroups ? 'Загрузка групп...' : 'Выберите группу' }} --</option>
|
||||
<option v-for="option in groupOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" v-if="selectedGroup">
|
||||
<label class="form-label" for="isicClass">Класс:</label>
|
||||
<select id="isicClass" v-model="selectedClass" class="form-control" :disabled="isLoadingClasses">
|
||||
<option value="">-- {{ isLoadingClasses ? 'Загрузка классов...' : 'Выберите класс' }} --</option>
|
||||
<option v-for="option in classOptions" :key="option.value" :value="option.value">
|
||||
{{ option.text }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div v-if="currentSelectedIsicText" class="current-isic-selection">
|
||||
<p><strong>Выбранный код:</strong> {{ currentSelectedIsicText }}</p>
|
||||
<button @click="addIsicCode" class="btn btn-success btn-sm" :disabled="!currentSelectedIsicCode">Добавить код деятельности</button>
|
||||
</div>
|
||||
|
||||
<!-- 3. Партнёры -->
|
||||
<div v-for="(partner, index) in dleDeploymentSettings.partners" :key="index" class="partner-entry">
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="deployerKey">Приватный ключ для деплоя:</label>
|
||||
<div class="input-group">
|
||||
<input :type="showDeployerKey ? 'text' : 'password'" id="deployerKey" v-model="securitySettings.deployerPrivateKey" class="form-control">
|
||||
<button class="btn btn-outline-secondary" @click="toggleShowDeployerKey">
|
||||
<i :class="showDeployerKey ? 'fas fa-eye-slash' : 'fas fa-eye'"></i>
|
||||
<label class="form-label">Адрес партнера {{ index + 1 }}:</label>
|
||||
<input type="text" v-model="partner.address" class="form-control" placeholder="0x...">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Сумма GT для партнера {{ index + 1 }}:</label>
|
||||
<input type="number" v-model="partner.amount" min="1" class="form-control">
|
||||
</div>
|
||||
<div class="partner-actions-row">
|
||||
<button class="btn btn-danger btn-sm" @click="removePartner(index)" :disabled="!isAdmin">Удалить партнера</button>
|
||||
<button class="btn btn-secondary" @click="addPartner" :disabled="!isAdmin">Добавить партнера</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group mb-gt-total">
|
||||
<label class="form-label">Общее количество выпускаемых GT: {{ totalInitialSupply }}</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="proposalThreshold">Порог для создания предложений (кол-во GT):</label>
|
||||
<input type="number" id="proposalThreshold" v-model="dleDeploymentSettings.proposalThreshold" min="0" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="quorumPercentGovernor">Кворум (% от общего числа голосов):</label>
|
||||
<input type="number" id="quorumPercentGovernor" v-model="dleDeploymentSettings.quorumPercent" min="1" max="100" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="votingDelay">Задержка перед голосованием (в днях):</label>
|
||||
<input type="number" id="votingDelay" v-model="dleDeploymentSettings.votingDelayDays" min="0" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="votingPeriod">Период голосования (в днях):</label>
|
||||
<input type="number" id="votingPeriod" v-model="dleDeploymentSettings.votingPeriodDays" min="1" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="timelockMinDelay">Минимальная задержка Timelock (в днях):</label>
|
||||
<input type="number" id="timelockMinDelay" v-model="dleDeploymentSettings.timelockMinDelayDays" min="0" class="form-control">
|
||||
</div>
|
||||
|
||||
<!-- 4. RPC Провайдеры -->
|
||||
<!-- <h3>RPC Провайдеры</h3> -->
|
||||
|
||||
<!-- Список добавленных RPC -->
|
||||
<div v-if="securitySettings.rpcConfigs.length > 0" class="rpc-list">
|
||||
<h5>Добавленные RPC конфигурации:</h5>
|
||||
<div v-for="(rpc, index) in securitySettings.rpcConfigs" :key="index" class="rpc-entry">
|
||||
<span><strong>ID Сети:</strong> {{ rpc.networkId }}</span>
|
||||
<span><strong>URL:</strong> {{ rpc.rpcUrlDisplay || rpc.rpcUrl }}</span>
|
||||
<div class="rpc-actions">
|
||||
<button class="btn btn-info btn-sm" @click="testRpcHandler(rpc)" :disabled="testingRpc && testingRpcId === rpc.networkId">
|
||||
<i class="fas" :class="testingRpc && testingRpcId === rpc.networkId ? 'fa-spinner fa-spin' : 'fa-check-circle'"></i>
|
||||
{{ testingRpc && testingRpcId === rpc.networkId ? 'Проверка...' : 'Тест' }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 10. Газовые настройки -->
|
||||
<div class="form-group">
|
||||
<h4>Газовые настройки</h4>
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" id="customGas" v-model="useCustomGas">
|
||||
<label class="custom-control-label" for="customGas">Использовать пользовательские настройки газа</label>
|
||||
<button
|
||||
class="btn btn-sm"
|
||||
:class="isAdmin ? 'btn-danger' : 'btn-secondary'"
|
||||
@click="isAdmin ? removeRpcConfig(index) : null"
|
||||
:disabled="!isAdmin"
|
||||
>
|
||||
<i class="fas fa-trash"></i> Удалить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p v-else>Нет добавленных RPC конфигураций.</p>
|
||||
|
||||
<div v-if="useCustomGas" class="gas-settings mt-3">
|
||||
<div class="form-group">
|
||||
<label for="gasLimit">Лимит газа (Gas Limit):</label>
|
||||
<input type="number" id="gasLimit" v-model="gasSettings.gasLimit" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="maxFeePerGas">Максимальная комиссия (Max Fee, gwei):</label>
|
||||
<input type="number" id="maxFeePerGas" v-model="gasSettings.maxFeePerGas" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="maxPriorityFee">Приоритетная комиссия (Priority Fee, gwei):</label>
|
||||
<input type="number" id="maxPriorityFee" v-model="gasSettings.maxPriorityFee" class="form-control">
|
||||
</div>
|
||||
<!-- Форма добавления нового RPC -->
|
||||
<div class="setting-form add-rpc-form">
|
||||
<h5>Добавить новую RPC конфигурацию:</h5>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="newRpcNetworkId">ID Сети:</label>
|
||||
<select id="newRpcNetworkId" v-model="networkEntry.networkId" class="form-control">
|
||||
<optgroup v-for="(group, groupIndex) in networkGroups" :key="groupIndex" :label="group.label">
|
||||
<option v-for="option in group.options" :key="option.value" :value="option.value">
|
||||
{{ option.label }}
|
||||
</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
<div v-if="networkEntry.networkId === 'custom'" class="mt-2">
|
||||
<label class="form-label" for="customNetworkId">Пользовательский ID:</label>
|
||||
<input type="text" id="customNetworkId" v-model="networkEntry.customNetworkId" class="form-control" placeholder="Введите ID сети">
|
||||
|
||||
<label class="form-label mt-2" for="customChainId">Chain ID:</label>
|
||||
<input type="number" id="customChainId" v-model="networkEntry.customChainId" class="form-control" placeholder="Например, 1 для Ethereum">
|
||||
<small>Chain ID - уникальный идентификатор блокчейн-сети (целое число)</small>
|
||||
</div>
|
||||
<small>ID сети должен совпадать со значением в выпадающем списке сетей при создании DLE</small>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="newRpcUrl">RPC URL:</label>
|
||||
<input type="text" id="newRpcUrl" v-model="networkEntry.rpcUrl" class="form-control" placeholder="https://...">
|
||||
<!-- Предложение URL на основе выбранной сети -->
|
||||
<small v-if="defaultRpcUrlSuggestion" class="suggestion">
|
||||
Предложение: {{ defaultRpcUrlSuggestion }}
|
||||
<button class="btn-link" @click="useDefaultRpcUrl">Использовать</button>
|
||||
</small>
|
||||
</div>
|
||||
<button class="btn btn-secondary" @click="addRpcConfig" :disabled="!isAdmin">Добавить RPC</button>
|
||||
</div>
|
||||
|
||||
<!-- 5. Настройки деплоя -->
|
||||
<!-- <h3>Настройки деплоя</h3> -->
|
||||
<!-- <h4>Сеть для деплоя</h4> -->
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="deployNetwork">Выберите сеть блокчейн для деплоя:</label>
|
||||
<select id="deployNetwork" v-model="dleDeploymentSettings.blockchainNetwork" class="form-control">
|
||||
<option v-if="loadingNetworks" disabled>Загрузка сетей...</option>
|
||||
<option v-for="network in networks" :key="network.value" :value="network.value">
|
||||
{{ network.label }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- <h4>Ключ Деплоера</h4> -->
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="deployerKey">Приватный ключ для деплоя:</label>
|
||||
<div class="input-icon-wrapper">
|
||||
<input :type="showDeployerKey ? 'text' : 'password'" id="deployerKey" v-model="securitySettings.deployerPrivateKey" class="form-control">
|
||||
<span class="input-icon" @click="toggleShowDeployerKey">
|
||||
<i :class="showDeployerKey ? 'fas fa-eye-slash' : 'fas fa-eye'"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <h4>Газовые настройки</h4> -->
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" id="customGas" v-model="useCustomGas">
|
||||
<label class="custom-control-label" for="customGas">Использовать пользовательские настройки газа</label>
|
||||
</div>
|
||||
<div v-if="useCustomGas" class="gas-settings mt-3">
|
||||
<div class="form-group">
|
||||
<label for="gasLimit">Лимит газа (Gas Limit):</label>
|
||||
<input type="number" id="gasLimit" v-model="gasSettings.gasLimit" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="maxFeePerGas">Максимальная комиссия (Max Fee, gwei):</label>
|
||||
<input type="number" id="maxFeePerGas" v-model="gasSettings.maxFeePerGas" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="maxPriorityFee">Приоритетная комиссия (Priority Fee, gwei):</label>
|
||||
<input type="number" id="maxPriorityFee" v-model="gasSettings.maxPriorityFee" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 10. Кнопка деплоя DLE -->
|
||||
<div class="deployment-actions mt-4">
|
||||
<button class="btn btn-primary" @click="deployDLE" :disabled="!isAdmin || isDeploying">
|
||||
<i class="fas fa-rocket"></i> {{ isDeploying ? 'Создание DLE...' : 'Создать и задеплоить DLE (Digital Legal Entity)' }}
|
||||
</button>
|
||||
<!-- Кнопка деплоя, результат, ошибки -->
|
||||
<div class="deployment-actions mt-4">
|
||||
<button class="btn btn-primary" @click="deployDLE" :disabled="!isAdmin || isDeploying">
|
||||
<i class="fas fa-rocket"></i> {{ isDeploying ? 'Создание DLE...' : 'Создать и задеплоить DLE (Digital Legal Entity)' }}
|
||||
</button>
|
||||
|
||||
<!-- Результат деплоя -->
|
||||
<div v-if="deployResult" class="deploy-result mt-3 alert alert-success">
|
||||
<h5>DLE успешно создано!</h5>
|
||||
<p><strong>Адрес токена:</strong> {{ deployResult.data?.tokenAddress }}</p>
|
||||
<p><strong>Адрес таймлока:</strong> {{ deployResult.data?.timelockAddress }}</p>
|
||||
<p><strong>Адрес контракта Governor:</strong> {{ deployResult.data?.governorAddress }}</p>
|
||||
</div>
|
||||
<!-- Результат деплоя -->
|
||||
<div v-if="deployResult" class="deploy-result mt-3 alert alert-success">
|
||||
<h5>DLE успешно создано!</h5>
|
||||
<p><strong>Адрес токена:</strong> {{ deployResult.data?.tokenAddress }}</p>
|
||||
<p><strong>Адрес таймлока:</strong> {{ deployResult.data?.timelockAddress }}</p>
|
||||
<p><strong>Адрес контракта Governor:</strong> {{ deployResult.data?.governorAddress }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Ошибка деплоя -->
|
||||
<div v-if="deployError" class="deploy-error mt-3 alert alert-danger">
|
||||
<h5>Ошибка при создании DLE</h5>
|
||||
<p>{{ deployError }}</p>
|
||||
</div>
|
||||
<!-- Ошибка деплоя -->
|
||||
<div v-if="deployError" class="deploy-error mt-3 alert alert-danger">
|
||||
<h5>Ошибка при создании DLE</h5>
|
||||
<p>{{ deployError }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<RpcTestModal
|
||||
:show="showRpcTestModal"
|
||||
:result="rpcTestResult"
|
||||
@close="closeRpcTestModal"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Модальное окно для результатов тестирования RPC -->
|
||||
<RpcTestModal
|
||||
:show="showRpcTestModal"
|
||||
:result="rpcTestResult"
|
||||
@close="closeRpcTestModal"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@@ -1043,11 +1013,16 @@ const goBack = () => router.push('/settings');
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.settings-panel {
|
||||
padding: var(--block-padding);
|
||||
background-color: var(--color-light);
|
||||
border-radius: var(--radius-md);
|
||||
margin-top: var(--spacing-lg);
|
||||
.settings-block {
|
||||
background: #fff;
|
||||
border-radius: var(--radius-lg, 16px);
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
animation: fadeIn var(--transition-normal);
|
||||
}
|
||||
h3 {
|
||||
@@ -1070,7 +1045,7 @@ h3 {
|
||||
gap: var(--spacing-md);
|
||||
}
|
||||
.form-group {
|
||||
margin-bottom: 0;
|
||||
margin-bottom: var(--spacing-md);
|
||||
}
|
||||
.form-label {
|
||||
display: flex;
|
||||
@@ -1078,7 +1053,7 @@ h3 {
|
||||
gap: var(--spacing-sm);
|
||||
}
|
||||
.form-control {
|
||||
max-width: 500px;
|
||||
/* max-width: 500px; */
|
||||
}
|
||||
.btn-primary {
|
||||
align-self: flex-start;
|
||||
@@ -1089,10 +1064,11 @@ h3 {
|
||||
}
|
||||
|
||||
.partner-entry {
|
||||
border: 1px solid var(--color-grey-light);
|
||||
padding: var(--spacing-md);
|
||||
border: none;
|
||||
padding: 0;
|
||||
margin-bottom: var(--spacing-md);
|
||||
border-radius: var(--radius-sm);
|
||||
border-radius: 0;
|
||||
background: none;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--spacing-sm);
|
||||
@@ -1119,15 +1095,15 @@ h3 {
|
||||
}
|
||||
|
||||
.address-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); /* Адаптивная сетка */
|
||||
gap: var(--spacing-md);
|
||||
/* margin-bottom: var(--spacing-lg); Убрано, т.к. есть блок верификации */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--spacing-md);
|
||||
}
|
||||
|
||||
/* Можно добавить специфичные стили для полей адреса, если нужно */
|
||||
.address-grid .form-group {
|
||||
margin-bottom: 0; /* Убрать лишний отступ у полей в сетке */
|
||||
.address-grid .form-group:first-child {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
.address-grid .form-control {
|
||||
/* max-width: 100%; */
|
||||
}
|
||||
|
||||
.code-list {
|
||||
@@ -1356,4 +1332,55 @@ h3 {
|
||||
cursor: not-allowed !important;
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
.index-inline-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 0;
|
||||
}
|
||||
.index-inline-group .form-control {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
.index-inline-group .btn {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
margin-left: -1px;
|
||||
}
|
||||
|
||||
.input-icon-wrapper {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
.input-icon-wrapper .form-control {
|
||||
padding-right: 2.5rem;
|
||||
}
|
||||
.input-icon {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 0.75rem;
|
||||
transform: translateY(-50%);
|
||||
color: #2196f3;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.input-icon.disabled {
|
||||
color: #bdbdbd;
|
||||
pointer-events: none;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.partner-actions-row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: var(--spacing-md);
|
||||
align-items: center;
|
||||
margin-bottom: var(--spacing-md);
|
||||
}
|
||||
|
||||
.mb-gt-total {
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
</style>
|
||||
@@ -51,12 +51,17 @@ function goBack() {
|
||||
|
||||
<style scoped>
|
||||
.create-table-container {
|
||||
max-width: 500px;
|
||||
margin: 2rem auto;
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 2px 16px rgba(0,0,0,0.07);
|
||||
padding: 2rem 1.5rem;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.create-table-form {
|
||||
display: flex;
|
||||
|
||||
@@ -51,13 +51,16 @@ function goToCreate() {
|
||||
<style scoped>
|
||||
.table-block-wrapper {
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 4px 32px rgba(0,0,0,0.12);
|
||||
padding: 32px 24px 24px 24px;
|
||||
max-width: 950px;
|
||||
margin: 40px auto;
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.tableview-header-row {
|
||||
display: flex;
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
echo "==== Содержимое /cloudflared.env ===="
|
||||
cat /cloudflared.env || echo "Файл не найден"
|
||||
echo "===="
|
||||
|
||||
# Получаем токен из переменной окружения или из файла
|
||||
if [ -z "$TUNNEL_TOKEN" ] && [ -f /cloudflared.env ]; then
|
||||
. /cloudflared.env
|
||||
fi
|
||||
|
||||
echo "TUNNEL_TOKEN=[$TUNNEL_TOKEN]"
|
||||
|
||||
# Функция для проверки сети
|
||||
check_network() {
|
||||
echo "Проверка сетевого соединения..."
|
||||
for addr in 1.1.1.1 8.8.8.8; do
|
||||
if ping -c 1 -W 5 "$addr" > /dev/null 2>&1; then
|
||||
echo "✓ Сеть доступна ($addr)"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
echo "✗ Сетевые проблемы"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Функция для проверки доступности backend
|
||||
check_backend() {
|
||||
echo "Проверка доступности backend..."
|
||||
if curl -s --connect-timeout 5 http://backend:8000 >/dev/null 2>&1; then
|
||||
echo "✓ Backend доступен"
|
||||
return 0
|
||||
else
|
||||
echo "✗ Backend недоступен"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверяем сеть перед запуском
|
||||
echo "=== Проверка подключений ==="
|
||||
check_network
|
||||
check_backend
|
||||
|
||||
# Проверяем наличие конфигурационного файла
|
||||
echo "=== Проверка конфигурации ==="
|
||||
if [ -f "/etc/cloudflared/config.yml" ]; then
|
||||
echo "✓ Конфигурационный файл найден"
|
||||
cat /etc/cloudflared/config.yml
|
||||
else
|
||||
echo "✗ Конфигурационный файл не найден"
|
||||
fi
|
||||
|
||||
if [ -f "/etc/cloudflared/a765a217-5312-48f8-9bb7-5a7ef56602b8.json" ]; then
|
||||
echo "✓ Credentials файл найден"
|
||||
else
|
||||
echo "✗ Credentials файл не найден"
|
||||
fi
|
||||
|
||||
# Проверим доступность frontend
|
||||
echo "=== Проверка frontend ==="
|
||||
if curl -s --connect-timeout 5 http://dapp-frontend:5173 >/dev/null 2>&1; then
|
||||
echo "✓ Frontend доступен"
|
||||
else
|
||||
echo "✗ Frontend недоступен, fallback на backend"
|
||||
fi
|
||||
|
||||
# Запускаем cloudflared с токеном вместо конфигурационного файла
|
||||
echo "=== Запуск cloudflared с токеном ==="
|
||||
echo "Используем токен туннеля: ${TUNNEL_TOKEN:0:20}..."
|
||||
exec cloudflared tunnel \
|
||||
--no-autoupdate \
|
||||
--edge-ip-version 4 \
|
||||
--protocol http2 \
|
||||
--retries 20 \
|
||||
--grace-period 60s \
|
||||
--loglevel info \
|
||||
--metrics 0.0.0.0:39693 \
|
||||
--proxy-connect-timeout 90s \
|
||||
--proxy-tls-timeout 90s \
|
||||
--proxy-tcp-keepalive 15s \
|
||||
--proxy-keepalive-timeout 120s \
|
||||
--proxy-keepalive-connections 10 \
|
||||
--proxy-no-happy-eyeballs \
|
||||
run --token "$TUNNEL_TOKEN"
|
||||
@@ -36,38 +36,67 @@ class VectorStore:
|
||||
self.index_cache[table_id] = (index, meta)
|
||||
|
||||
def upsert(self, table_id, rows: List[Dict]):
|
||||
print(f"[DEBUG] VectorStore.upsert called: table_id={table_id}, rows_count={len(rows)}")
|
||||
# rows: [{row_id, embedding, metadata}]
|
||||
index, meta = self.load(table_id)
|
||||
print(f"[DEBUG] Loaded existing index: {index is not None}, existing meta count: {len(meta) if meta else 0}")
|
||||
|
||||
if index is None:
|
||||
dim = len(rows[0]['embedding'])
|
||||
print(f"[DEBUG] Creating new index with dimension: {dim}")
|
||||
index = faiss.IndexFlatL2(dim)
|
||||
meta = []
|
||||
else:
|
||||
print(f"[DEBUG] Using existing index")
|
||||
|
||||
# Удаляем дубликаты row_id
|
||||
existing_ids = {m['row_id'] for m in meta}
|
||||
new_rows = [r for r in rows if r['row_id'] not in existing_ids]
|
||||
print(f"[DEBUG] Found {len(new_rows)} new rows to add (out of {len(rows)} total)")
|
||||
|
||||
if not new_rows:
|
||||
print(f"[DEBUG] No new rows to add")
|
||||
return
|
||||
|
||||
vectors = np.array([r['embedding'] for r in new_rows]).astype('float32')
|
||||
print(f"[DEBUG] Adding {len(vectors)} vectors to index")
|
||||
index.add(vectors)
|
||||
meta.extend(new_rows)
|
||||
print(f"[DEBUG] Total meta count after upsert: {len(meta)}")
|
||||
self.save(table_id, index, meta)
|
||||
print(f"[DEBUG] Index saved successfully")
|
||||
|
||||
def search(self, table_id, query_embedding, top_k=3):
|
||||
print(f"[DEBUG] VectorStore.search called: table_id={table_id}, top_k={top_k}")
|
||||
index, meta = self.load(table_id)
|
||||
print(f"[DEBUG] Loaded index: {index is not None}, meta count: {len(meta) if meta else 0}")
|
||||
|
||||
if index is None or not meta:
|
||||
print(f"[DEBUG] No index or meta found, returning empty results")
|
||||
return []
|
||||
|
||||
query = np.array([query_embedding]).astype('float32')
|
||||
print(f"[DEBUG] Query shape: {query.shape}")
|
||||
|
||||
D, I = index.search(query, top_k)
|
||||
print(f"[DEBUG] FAISS search results - D: {D}, I: {I}")
|
||||
|
||||
results = []
|
||||
for idx, dist in zip(I[0], D[0]):
|
||||
print(f"[DEBUG] Processing result: idx={idx}, dist={dist}")
|
||||
if idx < 0 or idx >= len(meta):
|
||||
print(f"[DEBUG] Invalid index {idx}, skipping")
|
||||
continue
|
||||
m = meta[idx]
|
||||
score = float(-dist) # FAISS: чем меньше dist, тем ближе
|
||||
print(f"[DEBUG] Valid result: row_id={m['row_id']}, score={score}, metadata={m['metadata']}")
|
||||
results.append({
|
||||
'row_id': m['row_id'],
|
||||
'score': float(-dist), # FAISS: чем меньше dist, тем ближе
|
||||
'score': score,
|
||||
'metadata': m['metadata']
|
||||
})
|
||||
|
||||
print(f"[DEBUG] Returning {len(results)} results")
|
||||
return results
|
||||
|
||||
def delete(self, table_id, row_ids: List[str]):
|
||||
|
||||
Reference in New Issue
Block a user