ваше сообщение коммита

This commit is contained in:
2025-07-04 01:11:15 +03:00
parent b1f0224952
commit 3adb469a37
26 changed files with 5029 additions and 495 deletions

View File

@@ -1 +0,0 @@
{"AccountTag":"a67861072a144cdd746e9c9bdd8476fe","TunnelSecret":"NCu/3BUoqAbF5kwXfs3rTjU9QUiVvXv7OM27BrUd/50Kf/wthq2rIH0G+Eu76LK8JQon/UQBUbQPoRPRY3qbtA==","TunnelID":"a765a217-5312-48f8-9bb7-5a7ef56602b8"}

View File

@@ -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

View File

@@ -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"]

View File

@@ -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

View File

@@ -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"}

View File

@@ -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",

View File

@@ -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 };
}

View File

@@ -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 });
}
});

View File

@@ -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,

View File

@@ -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.

View File

@@ -13,7 +13,12 @@
<div v-for="(dle, index) in dleList" :key="index" class="dle-card"
:class="{ 'active': selectedDleIndex === index }"
@click="selectDle(index)">
<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>

View File

@@ -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>
<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;

View File

@@ -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>

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -2,34 +2,33 @@
<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>
<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>
@@ -76,19 +75,9 @@
</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>
<!-- 2. Коды деятельности (ISIC) -->
<div class="form-group">
<label class="form-label" for="isicSection">Выберите код деятельности:</label>
<select id="isicSection" v-model="selectedSection" class="form-control" :disabled="isLoadingSections">
@@ -134,8 +123,7 @@
<button @click="addIsicCode" class="btn btn-success btn-sm" :disabled="!currentSelectedIsicCode">Добавить код деятельности</button>
</div>
<!-- 5. Первоначальное распределение токенов -->
<h4>Первоначальное распределение токенов управления</h4>
<!-- 3. Партнёры -->
<div v-for="(partner, index) in dleDeploymentSettings.partners" :key="index" class="partner-entry">
<div class="form-group">
<label class="form-label">Адрес партнера {{ index + 1 }}:</label>
@@ -145,43 +133,37 @@
<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>
</div>
<button class="btn btn-secondary" @click="addPartner" :disabled="!isAdmin">Добавить партнера</button>
<div class="form-group">
</div>
</div>
<div class="form-group mb-gt-total">
<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>
<!-- 4. RPC Провайдеры -->
<!-- <h3>RPC Провайдеры</h3> -->
<!-- Список добавленных RPC -->
<div v-if="securitySettings.rpcConfigs.length > 0" class="rpc-list">
@@ -241,8 +223,9 @@
<button class="btn btn-secondary" @click="addRpcConfig" :disabled="!isAdmin">Добавить RPC</button>
</div>
<!-- 8. Выбор сети для деплоя -->
<h4>Сеть для деплоя</h4>
<!-- 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">
@@ -251,33 +234,23 @@
{{ network.label }}
</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>
<!-- 9. Ключ Деплоера -->
<h4>Ключ Деплоера</h4>
<!-- <h4>Ключ Деплоера</h4> -->
<div class="form-group">
<label class="form-label" for="deployerKey">Приватный ключ для деплоя:</label>
<div class="input-group">
<div class="input-icon-wrapper">
<input :type="showDeployerKey ? 'text' : 'password'" id="deployerKey" v-model="securitySettings.deployerPrivateKey" class="form-control">
<button class="btn btn-outline-secondary" @click="toggleShowDeployerKey">
<span class="input-icon" @click="toggleShowDeployerKey">
<i :class="showDeployerKey ? 'fas fa-eye-slash' : 'fas fa-eye'"></i>
</button>
</span>
</div>
</div>
<!-- 10. Газовые настройки -->
<!-- <h4>Газовые настройки</h4> -->
<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>
</div>
<div v-if="useCustomGas" class="gas-settings mt-3">
<div class="form-group">
<label for="gasLimit">Лимит газа (Gas Limit):</label>
@@ -294,7 +267,7 @@
</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)' }}
@@ -315,16 +288,13 @@
</div>
</div>
</div>
</div>
</div>
<!-- Модальное окно для результатов тестирования RPC -->
<RpcTestModal
:show="showRpcTestModal"
:result="rpcTestResult"
@close="closeRpcTestModal"
/>
</div>
</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)); /* Адаптивная сетка */
display: flex;
flex-direction: column;
gap: var(--spacing-md);
/* margin-bottom: var(--spacing-lg); Убрано, т.к. есть блок верификации */
}
/* Можно добавить специфичные стили для полей адреса, если нужно */
.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>

View File

@@ -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;

View File

@@ -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;

View File

@@ -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"

View File

@@ -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]):