From ba8ab45dc20665633ebe2e609097e0db9840e22c Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 24 Jan 2023 20:42:47 +0700 Subject: [PATCH] Configurable OpenAI (#2529) Signed-off-by: Andrey Sobolev --- .gitignore | 1 + .nvmrc | 2 +- .vscode/launch.json | 94 ++--- common/config/rush/pnpm-lock.yaml | 170 ++++++++- dev/client-resources/src/connection.ts | 3 +- dev/docker-compose.yaml | 55 +-- .../milvus-standalone-docker-compose.yml | 51 +++ dev/server/src/server.ts | 3 +- dev/tool/package.json | 3 +- dev/tool/src/index.ts | 26 ++ dev/tool/src/openai.ts | 34 ++ models/all/package.json | 4 +- models/all/src/index.ts | 7 +- models/attachment/src/index.ts | 1 + models/contact/src/index.ts | 4 +- models/core/src/core.ts | 31 +- models/core/src/index.ts | 8 +- models/document/src/index.ts | 1 + models/server-openai/.eslintrc.js | 7 + .../server-openai}/.npmignore | 0 models/server-openai/CHANGELOG.json | 17 + models/server-openai/CHANGELOG.md | 9 + models/server-openai/config/rig.json | 18 + models/server-openai/package.json | 35 ++ models/server-openai/src/index.ts | 47 +++ models/server-openai/tsconfig.json | 8 + models/server-translate/.eslintrc.js | 7 + models/server-translate/.npmignore | 4 + models/server-translate/CHANGELOG.json | 17 + models/server-translate/CHANGELOG.md | 9 + models/server-translate/config/rig.json | 18 + models/server-translate/package.json | 34 ++ models/server-translate/src/index.ts | 35 ++ models/server-translate/tsconfig.json | 8 + models/task/src/index.ts | 1 + models/view/package.json | 3 +- models/view/src/index.ts | 24 +- models/view/src/plugin.ts | 3 +- packages/core/src/classes.ts | 34 +- packages/core/src/component.ts | 16 +- packages/presentation/lang/en.json | 3 +- packages/presentation/lang/ru.json | 3 +- .../components/IndexedDocumentPreview.svelte | 75 ++-- .../src/components/ObjectSearchPopup.svelte | 4 +- .../src/components/SelectAvatarPopup.svelte | 4 +- packages/presentation/src/plugin.ts | 3 +- .../ui/src/components/PopupInstance.svelte | 1 + .../src/components/CommentPresenter.svelte | 2 +- .../activity/TxCommentCreate.svelte | 2 +- plugins/contact-assets/lang/en.json | 2 +- plugins/contact-assets/lang/ru.json | 2 +- plugins/tags-assets/lang/en.json | 2 +- plugins/tags-assets/lang/ru.json | 2 +- .../src/components/Table.svelte | 2 +- plugins/view-resources/src/index.ts | 5 +- .../src/components/SpecialView.svelte | 22 +- .../components/search/SourcePresenter.svelte | 9 +- pods/account/Dockerfile | 2 +- pods/backup/Dockerfile | 2 +- pods/collaborator/Dockerfile | 2 +- pods/embeddings/__index__.py | 0 pods/embeddings/model.py | 70 ++++ pods/embeddings/readme.md | 9 + pods/embeddings/requirenents.txt | 2 + pods/embeddings/server.py | 154 ++++++++ pods/front/Dockerfile | 2 +- pods/server/Dockerfile | 2 +- pods/server/package.json | 58 ++- pods/server/src/__start.ts | 32 +- pods/server/src/server.ts | 180 ++++++--- pods/server/tsconfig.json | 1 + rush.json | 14 +- .../openai/.eslintrc.js | 0 server-plugins/openai/.npmignore | 4 + .../openai/config/rig.json | 0 .../openai/package.json | 7 +- .../openai/src/encoder/encoder.json | 0 .../openai/src/encoder/encoder.ts | 24 ++ .../openai/src/encoder/vocab.json | 0 server-plugins/openai/src/index.ts | 5 + server-plugins/openai/src/openai.ts | 354 ++++++++++++++++++ server-plugins/openai/src/plugin.ts | 44 +++ server-plugins/openai/src/resources.ts | 203 ++++++++++ server-plugins/openai/src/types.ts | 33 ++ .../openai/tsconfig.json | 0 server/backup/src/index.ts | 1 - server/core/package.json | 6 +- server/core/src/fulltext.ts | 2 +- server/core/src/indexer/content.ts | 53 +-- server/core/src/indexer/field.ts | 36 +- server/core/src/indexer/fulltextPush.ts | 176 +++++++++ server/core/src/indexer/index.ts | 3 + server/core/src/indexer/indexer.ts | 226 ++++------- server/core/src/indexer/limitter.ts | 39 ++ server/core/src/indexer/summary.ts | 234 ++++++++++++ server/core/src/indexer/types.ts | 24 +- server/core/src/indexer/utils.ts | 4 - server/core/src/storage.ts | 62 ++- server/core/src/types.ts | 9 +- server/elastic/package.json | 4 + server/elastic/src/adapter.ts | 42 ++- server/middleware/src/configuration.ts | 94 +++++ server/middleware/src/index.ts | 1 + server/mongo/src/__tests__/storage.test.ts | 6 +- server/openai/src/index.ts | 1 - server/openai/src/openai.ts | 337 ----------------- server/token/package.json | 4 + server/translate/src/index.ts | 1 + server/translate/src/plugin.ts | 38 ++ server/translate/src/retranslate.ts | 55 ++- server/translate/src/types.ts | 10 + 111 files changed, 2784 insertions(+), 883 deletions(-) create mode 100644 dev/milvus/milvus-standalone-docker-compose.yml create mode 100644 dev/tool/src/openai.ts create mode 100644 models/server-openai/.eslintrc.js rename {server/openai => models/server-openai}/.npmignore (100%) create mode 100644 models/server-openai/CHANGELOG.json create mode 100644 models/server-openai/CHANGELOG.md create mode 100644 models/server-openai/config/rig.json create mode 100644 models/server-openai/package.json create mode 100644 models/server-openai/src/index.ts create mode 100644 models/server-openai/tsconfig.json create mode 100644 models/server-translate/.eslintrc.js create mode 100644 models/server-translate/.npmignore create mode 100644 models/server-translate/CHANGELOG.json create mode 100644 models/server-translate/CHANGELOG.md create mode 100644 models/server-translate/config/rig.json create mode 100644 models/server-translate/package.json create mode 100644 models/server-translate/src/index.ts create mode 100644 models/server-translate/tsconfig.json create mode 100644 pods/embeddings/__index__.py create mode 100644 pods/embeddings/model.py create mode 100644 pods/embeddings/readme.md create mode 100644 pods/embeddings/requirenents.txt create mode 100644 pods/embeddings/server.py rename {server => server-plugins}/openai/.eslintrc.js (100%) create mode 100644 server-plugins/openai/.npmignore rename {server => server-plugins}/openai/config/rig.json (100%) rename {server => server-plugins}/openai/package.json (86%) rename {server => server-plugins}/openai/src/encoder/encoder.json (100%) rename {server => server-plugins}/openai/src/encoder/encoder.ts (86%) rename {server => server-plugins}/openai/src/encoder/vocab.json (100%) create mode 100644 server-plugins/openai/src/index.ts create mode 100644 server-plugins/openai/src/openai.ts create mode 100644 server-plugins/openai/src/plugin.ts create mode 100644 server-plugins/openai/src/resources.ts create mode 100644 server-plugins/openai/src/types.ts rename {server => server-plugins}/openai/tsconfig.json (100%) create mode 100644 server/core/src/indexer/fulltextPush.ts create mode 100644 server/core/src/indexer/limitter.ts create mode 100644 server/core/src/indexer/summary.ts create mode 100644 server/middleware/src/configuration.ts delete mode 100644 server/openai/src/index.ts delete mode 100644 server/openai/src/openai.ts create mode 100644 server/translate/src/plugin.ts diff --git a/.gitignore b/.gitignore index 3bc7ee66c6..5a7f8e2dc4 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,4 @@ ingest-attachment-*.zip tsdoc-metadata.json pods/front/dist *.cpuprofile +*.pyc diff --git a/.nvmrc b/.nvmrc index d9f880069d..d939939b25 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.14.2 +18.13.0 diff --git a/.vscode/launch.json b/.vscode/launch.json index f36d6adba2..2982796caa 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,13 +4,23 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "Python: Embeddings", + "type": "python", + "request": "launch", + "program": "./pods/embeddings/server.py", + "args": ["--model", "sentence-transformers/all-MiniLM-L6-v2", "--device", "cpu"], + "console": "integratedTerminal", + "justMyCode": true, + "env": { + "PYTORCH_ENABLE_MPS_FALLBACK":"1" + } + }, { "name": "Debug server", "type": "node", "request": "launch", - "args": [ - "src/__start.ts" - ], + "args": ["src/__start.ts"], "env": { "ELASTIC_URL": "http://localhost:9200", "MONGO_URL": "mongodb://localhost:27017", @@ -21,16 +31,11 @@ "MINIO_SECRET_KEY": "minioadmin", "SERVER_SECRET": "secret", "REKONI_URL": "http://localhost:4004", - // "OPENAI_TOKEN": "", // "RETRANSLATE_URL": "http://127.0.0.1:4500", //"RETRANSLATE_URL": "https://208.167.249.201", // "RETRANSLATE_TOKEN": "" }, - "runtimeArgs": [ - "--nolazy", - "-r", - "ts-node/register" - ], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "showAsyncStacks": true, "sourceMaps": true, "cwd": "${workspaceRoot}/pods/server", @@ -40,20 +45,14 @@ "name": "Debug Account", "type": "node", "request": "launch", - "args": [ - "src/__start.ts" - ], + "args": ["src/__start.ts"], "env": { "MONGO_URL": "mongodb://localhost:27018", "SERVER_SECRET": "secret", "TRANSACTOR_URL": "ws:/localhost:3333", "ACCOUNT_PORT": "3000" }, - "runtimeArgs": [ - "--nolazy", - "-r", - "ts-node/register" - ], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "sourceMaps": true, "cwd": "${workspaceRoot}/pods/account", "protocol": "inspector" @@ -64,13 +63,7 @@ "name": "Debug Jest tests", "program": "${fileDirname}/../../node_modules/@rushstack/heft/lib/start.js", "cwd": "${fileDirname}/../../", - "args": [ - "--debug", - "test", - "--clean", - "--test-path-pattern", - "${file}" - ], + "args": ["--debug", "test", "--clean", "--test-path-pattern", "${file}"], "console": "integratedTerminal", "sourceMaps": true, "protocol": "inspector" @@ -79,23 +72,14 @@ "name": "Debug generator", "type": "node", "request": "launch", - "args": [ - "src/index.ts", - "gen-recruit", - "ws1", - "20" - ], + "args": ["src/index.ts", "gen-recruit", "ws1", "20"], "env": { "TRANSACTOR_URL": "ws:/localhost:3333", "MINIO_ACCESS_KEY": "minioadmin", "MINIO_SECRET_KEY": "minioadmin", "MINIO_ENDPOINT": "localhost" }, - "runtimeArgs": [ - "--nolazy", - "-r", - "ts-node/register" - ], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "sourceMaps": true, "cwd": "${workspaceRoot}/dev/generator", "protocol": "inspector" @@ -104,12 +88,7 @@ "name": "Debug tool import-lead-csv", "type": "node", "request": "launch", - "args": [ - "src/index.ts", - "import-lead-csv", - "ws1", - "../../../suho/COMPANIES_Agency_of_AlexeyS.csv" - ], + "args": ["src/index.ts", "import-lead-csv", "ws1", "../../../suho/COMPANIES_Agency_of_AlexeyS.csv"], "env": { "MINIO_ACCESS_KEY": "minioadmin", "MINIO_SECRET_KEY": "minioadmin", @@ -119,11 +98,7 @@ "TELEGRAM_DATABASE": "telegram-service", "ELASTIC_URL": "http://localhost:9200" }, - "runtimeArgs": [ - "--nolazy", - "-r", - "ts-node/register" - ], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "sourceMaps": true, "cwd": "${workspaceRoot}/dev/tool" }, @@ -131,10 +106,7 @@ "name": "Debug tool upgrade", "type": "node", "request": "launch", - "args": [ - "src/index.ts", - "upgrade" - ], + "args": ["src/index.ts", "upgrade"], "env": { "SERVER_SECRET": "secret", "MINIO_ACCESS_KEY": "minioadmin", @@ -146,11 +118,7 @@ "ELASTIC_URL": "http://localhost:9200", "REKONI_URL": "http://localhost:4004" }, - "runtimeArgs": [ - "--nolazy", - "-r", - "ts-node/register" - ], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "sourceMaps": true, "cwd": "${workspaceRoot}/dev/tool" }, @@ -158,23 +126,17 @@ "name": "Debug Collaborator", "type": "node", "request": "launch", - "args": [ - "src/__start.ts" - ], + "args": ["src/__start.ts"], "env": { "SECRET": "secret", "MINIO_ACCESS_KEY": "minioadmin", "MINIO_SECRET_KEY": "minioadmin", - "MINIO_ENDPOINT": "localhost", + "MINIO_ENDPOINT": "localhost" }, - "runtimeArgs": [ - "--nolazy", - "-r", - "ts-node/register" - ], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], "sourceMaps": true, "cwd": "${workspaceRoot}/pods/collaborator", "protocol": "inspector" - }, + } ] -} \ No newline at end of file +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d9e6baf00f..ac764607ff 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -101,6 +101,7 @@ specifiers: '@rush-temp/model-server-inventory': file:./projects/model-server-inventory.tgz '@rush-temp/model-server-lead': file:./projects/model-server-lead.tgz '@rush-temp/model-server-notification': file:./projects/model-server-notification.tgz + '@rush-temp/model-server-openai': file:./projects/model-server-openai.tgz '@rush-temp/model-server-recruit': file:./projects/model-server-recruit.tgz '@rush-temp/model-server-request': file:./projects/model-server-request.tgz '@rush-temp/model-server-setting': file:./projects/model-server-setting.tgz @@ -108,6 +109,7 @@ specifiers: '@rush-temp/model-server-task': file:./projects/model-server-task.tgz '@rush-temp/model-server-telegram': file:./projects/model-server-telegram.tgz '@rush-temp/model-server-tracker': file:./projects/model-server-tracker.tgz + '@rush-temp/model-server-translate': file:./projects/model-server-translate.tgz '@rush-temp/model-setting': file:./projects/model-setting.tgz '@rush-temp/model-tags': file:./projects/model-tags.tgz '@rush-temp/model-task': file:./projects/model-task.tgz @@ -243,6 +245,7 @@ specifiers: '@types/express-fileupload': ^1.1.7 '@types/faker': ~5.5.9 '@types/heft-jest': ^1.0.3 + '@types/html-to-text': ^8.1.1 '@types/jest': ~28.1.0 '@types/koa': ^2.13.4 '@types/koa-bodyparser': ^4.3.3 @@ -296,6 +299,7 @@ specifiers: file-loader: ^6.2.0 filesize: ^8.0.3 got: ^11.8.3 + html-to-text: ^9.0.3 html-webpack-plugin: ^5.5.0 intl-messageformat: ^9.7.1 jpeg-js: ~0.4.3 @@ -461,6 +465,7 @@ dependencies: '@rush-temp/model-server-inventory': file:projects/model-server-inventory.tgz_typescript@4.8.4 '@rush-temp/model-server-lead': file:projects/model-server-lead.tgz_typescript@4.8.4 '@rush-temp/model-server-notification': file:projects/model-server-notification.tgz_typescript@4.8.4 + '@rush-temp/model-server-openai': file:projects/model-server-openai.tgz_typescript@4.8.4 '@rush-temp/model-server-recruit': file:projects/model-server-recruit.tgz_typescript@4.8.4 '@rush-temp/model-server-request': file:projects/model-server-request.tgz_typescript@4.8.4 '@rush-temp/model-server-setting': file:projects/model-server-setting.tgz_typescript@4.8.4 @@ -468,6 +473,7 @@ dependencies: '@rush-temp/model-server-task': file:projects/model-server-task.tgz_typescript@4.8.4 '@rush-temp/model-server-telegram': file:projects/model-server-telegram.tgz_typescript@4.8.4 '@rush-temp/model-server-tracker': file:projects/model-server-tracker.tgz_typescript@4.8.4 + '@rush-temp/model-server-translate': file:projects/model-server-translate.tgz_typescript@4.8.4 '@rush-temp/model-setting': file:projects/model-setting.tgz_typescript@4.8.4 '@rush-temp/model-tags': file:projects/model-tags.tgz_typescript@4.8.4 '@rush-temp/model-task': file:projects/model-task.tgz_typescript@4.8.4 @@ -603,6 +609,7 @@ dependencies: '@types/express-fileupload': 1.4.1 '@types/faker': 5.5.9 '@types/heft-jest': 1.0.3 + '@types/html-to-text': 8.1.1 '@types/jest': 28.1.8 '@types/koa': 2.13.5 '@types/koa-bodyparser': 4.3.10 @@ -656,6 +663,7 @@ dependencies: file-loader: 6.2.0_webpack@5.75.0 filesize: 8.0.7 got: 11.8.5 + html-to-text: 9.0.3 html-webpack-plugin: 5.5.0_webpack@5.75.0 intl-messageformat: 9.13.0 jpeg-js: 0.4.4 @@ -2655,6 +2663,13 @@ packages: string-argv: 0.3.1 dev: false + /@selderee/plugin-htmlparser2/0.10.0: + resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} + dependencies: + domhandler: 5.0.3 + selderee: 0.10.0 + dev: false + /@sinclair/typebox/0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: false @@ -3270,6 +3285,10 @@ packages: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} dev: false + /@types/html-to-text/8.1.1: + resolution: {integrity: sha512-QFcqfc7TiVbvIX8Fc2kWUxakruI1Ay6uitaGCYHzI5M0WHQROV5D2XeSaVrK0FmvssivXum4yERVnJsiuH61Ww==} + dev: false + /@types/http-assert/1.5.3: resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} dev: false @@ -5040,6 +5059,16 @@ packages: nth-check: 2.1.1 dev: false + /css-select/5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.0.1 + nth-check: 2.1.1 + dev: false + /css-tree/1.1.3: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} @@ -5343,6 +5372,14 @@ packages: entities: 2.2.0 dev: false + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: false + /domelementtype/2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false @@ -5361,6 +5398,13 @@ packages: domelementtype: 2.3.0 dev: false + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + /domutils/2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -5369,6 +5413,14 @@ packages: domhandler: 4.3.1 dev: false + /domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + /dot-case/3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -5534,6 +5586,11 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: false + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: false + /envinfo/7.8.1: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} engines: {node: '>=4'} @@ -6664,6 +6721,17 @@ packages: terser: 5.15.1 dev: false + /html-to-text/9.0.3: + resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} + engines: {node: '>=14'} + dependencies: + '@selderee/plugin-htmlparser2': 0.10.0 + deepmerge: 4.2.2 + dom-serializer: 2.0.0 + htmlparser2: 8.0.1 + selderee: 0.10.0 + dev: false + /html-webpack-plugin/5.5.0_webpack@5.75.0: resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} @@ -6687,6 +6755,15 @@ packages: entities: 2.2.0 dev: false + /htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: false + /http-assert/1.5.0: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} @@ -7970,6 +8047,10 @@ packages: - supports-color dev: false + /leac/0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + dev: false + /level-codec/9.0.2: resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} engines: {node: '>=6'} @@ -8560,6 +8641,13 @@ packages: dev: false optional: true + /node-html-parser/6.1.4: + resolution: {integrity: sha512-3muP9Uy/Pz7bQa9TNYVQzWJhNZMqyCx7xJle8kz2/y1UgzAUyXXShc1IcPaJy6u07CE3K5rQcRwlvHzmlySRjg==} + dependencies: + css-select: 5.1.0 + he: 1.2.0 + dev: false + /node-int64/0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: false @@ -8882,6 +8970,13 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: false + /parseley/0.11.0: + resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} + dependencies: + leac: 0.6.0 + peberminta: 0.8.0 + dev: false + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -8946,6 +9041,10 @@ packages: png-js: 1.0.0 dev: false + /peberminta/0.8.0: + resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} + dev: false + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: false @@ -9744,6 +9843,12 @@ packages: resolution: {integrity: sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==} dev: false + /selderee/0.10.0: + resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} + dependencies: + parseley: 0.11.0 + dev: false + /select-hose/2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: false @@ -12979,7 +13084,7 @@ packages: dev: false file:projects/model-all.tgz_typescript@4.8.4: - resolution: {integrity: sha512-YJ24m8JisesWHIeu07W27itLMJx/1zvCWzMJJ9rG4uj84b5HWzTvKN7FH+0NVqCHAbWAYbI9YA4kulsXibMx+Q==, tarball: file:projects/model-all.tgz} + resolution: {integrity: sha512-AejnJ5pKXrdrHEdXX2AoOtbSX2mx0ceRbISCPyuvr1O9w8VKnmp43TGLOZEKVY3D+dmnjKj1+2+A+bAxMCUsQQ==, tarball: file:projects/model-all.tgz} id: file:projects/model-all.tgz name: '@rush-temp/model-all' version: 0.0.0 @@ -13385,7 +13490,7 @@ packages: dev: false file:projects/model-request.tgz_typescript@4.8.4: - resolution: {integrity: sha512-00s0oDh2VK4P0RC2clxG3ib9WL0uxHregVDglu62MFlx6bJYuoDfxXkohCXxQz22pMHTPw+8l+3pxh7l4+iiyA==, tarball: file:projects/model-request.tgz} + resolution: {integrity: sha512-qXH8qzGsB6WvZGrI31n6ZkpovnLiHXCK7eRaNiUADKFDiqJlGKvPf3EjQERG6ozuLcmsye69jOvmHFwavUdaoA==, tarball: file:projects/model-request.tgz} id: file:projects/model-request.tgz name: '@rush-temp/model-request' version: 0.0.0 @@ -13634,6 +13739,27 @@ packages: - typescript dev: false + file:projects/model-server-openai.tgz_typescript@4.8.4: + resolution: {integrity: sha512-p427LbMH/TgKUaWcXhn+2agHvOHvRxR3NYMorowkpSqe4VzS3A/IoKF/wlxZBxPSfqhke4wPa1vqRYehWvYBpg==, tarball: file:projects/model-server-openai.tgz} + id: file:projects/model-server-openai.tgz + name: '@rush-temp/model-server-openai' + version: 0.0.0 + dependencies: + '@rushstack/heft': 0.47.11 + '@types/heft-jest': 1.0.3 + '@typescript-eslint/eslint-plugin': 5.42.1_d506b9be61cb4ac2646ecbc6e0680464 + '@typescript-eslint/parser': 5.42.1_eslint@8.27.0+typescript@4.8.4 + eslint: 8.27.0 + eslint-config-standard-with-typescript: 23.0.0_c9fe9619f50f4e82337a86c3af25e566 + eslint-plugin-import: 2.26.0_eslint@8.27.0 + eslint-plugin-n: 15.5.1_eslint@8.27.0 + eslint-plugin-promise: 6.1.1_eslint@8.27.0 + prettier: 2.7.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + file:projects/model-server-recruit.tgz_typescript@4.8.4: resolution: {integrity: sha512-udSatCWhK7BkKIbEZFhCd1Hm4pzwwDw9poiOR8MXv6lNmHKz3elXPo2rkjaak03PDBSe7S0lqDwcja+UUaknHA==, tarball: file:projects/model-server-recruit.tgz} id: file:projects/model-server-recruit.tgz @@ -13781,6 +13907,27 @@ packages: - typescript dev: false + file:projects/model-server-translate.tgz_typescript@4.8.4: + resolution: {integrity: sha512-gD/Mrri41y0Ss7/f/wK5XuRNz+sjn3ZiaOoHM9cput5763rm0EmC5R5j5sL5fVqj+Uo5ECYO6gH6y0ewJZbbYg==, tarball: file:projects/model-server-translate.tgz} + id: file:projects/model-server-translate.tgz + name: '@rush-temp/model-server-translate' + version: 0.0.0 + dependencies: + '@rushstack/heft': 0.47.11 + '@types/heft-jest': 1.0.3 + '@typescript-eslint/eslint-plugin': 5.42.1_d506b9be61cb4ac2646ecbc6e0680464 + '@typescript-eslint/parser': 5.42.1_eslint@8.27.0+typescript@4.8.4 + eslint: 8.27.0 + eslint-config-standard-with-typescript: 23.0.0_c9fe9619f50f4e82337a86c3af25e566 + eslint-plugin-import: 2.26.0_eslint@8.27.0 + eslint-plugin-n: 15.5.1_eslint@8.27.0 + eslint-plugin-promise: 6.1.1_eslint@8.27.0 + prettier: 2.7.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + file:projects/model-setting.tgz_typescript@4.8.4: resolution: {integrity: sha512-VNYzzzsdvUfp71pgoPt52l+/VZ8/OV5JQJIDLOuT/2KkQEepZRaR+DZ2HXCg5v8Jvu/t/a9tQTPDN4juziuVew==, tarball: file:projects/model-setting.tgz} id: file:projects/model-setting.tgz @@ -13929,7 +14076,7 @@ packages: dev: false file:projects/model-view.tgz_typescript@4.8.4: - resolution: {integrity: sha512-fnQyZEHhMGWtr7Jn2J70q9Hn/5J+7H48QB1i/kQgq9emhR43qz1R7tNlfyDx0IKi4l4pSratkCc/k17CL5nUZA==, tarball: file:projects/model-view.tgz} + resolution: {integrity: sha512-xSdAkhRAW0NreiqzR/EeLXsGTLhzGMIjTyZ7wi07R/ee3gl7kAib1GMQIEcTqVAyFiDlDkmL9h+yTap51ltCvA==, tarball: file:projects/model-view.tgz} id: file:projects/model-view.tgz name: '@rush-temp/model-view' version: 0.0.0 @@ -14110,12 +14257,13 @@ packages: dev: false file:projects/openai.tgz: - resolution: {integrity: sha512-kj0S76WwqQt/Ntn+c7kK4ELOb5bYEkbfWBFlWyQe379574DHwDg69Qyk58XNrUveq7yMqyekWX9kJWO1sEac3w==, tarball: file:projects/openai.tgz} + resolution: {integrity: sha512-nplFlMK8VBiE2EBm11HhSpX74sZapWZ30sEWOHZfAv8AZqCINY0FOHP0Jwc+AVFtMzClx8NTCo6pgaNTLs0ixA==, tarball: file:projects/openai.tgz} name: '@rush-temp/openai' version: 0.0.0 dependencies: '@rushstack/heft': 0.47.11 '@types/heft-jest': 1.0.3 + '@types/html-to-text': 8.1.1 '@types/node': 16.11.68 '@typescript-eslint/eslint-plugin': 5.42.1_d506b9be61cb4ac2646ecbc6e0680464 '@typescript-eslint/parser': 5.42.1_eslint@8.27.0+typescript@4.8.4 @@ -14127,6 +14275,8 @@ packages: eslint-plugin-promise: 6.1.1_eslint@8.27.0 fast-equals: 2.0.4 got: 11.8.5 + html-to-text: 9.0.3 + node-html-parser: 6.1.4 prettier: 2.7.1 typescript: 4.8.4 transitivePeerDependencies: @@ -14362,7 +14512,7 @@ packages: dev: false file:projects/pod-server.tgz: - resolution: {integrity: sha512-Qxljr6dIG19YobZ8ejPW4lvpnweN0geci7Ra+Aa9vxPXxAlcGrQOi+0nW2+IeWDY1Sp3vX+eK8gD5OCqG6CpVg==, tarball: file:projects/pod-server.tgz} + resolution: {integrity: sha512-4IjhfCueH7UYdgcWfpeiciOQADpXCKj1C41rP6ZgHaIWzUErhMl2X/T5C2SQfp0nnbvpPWqWeqSPYYK2GGGkdw==, tarball: file:projects/pod-server.tgz} name: '@rush-temp/pod-server' version: 0.0.0 dependencies: @@ -14660,7 +14810,7 @@ packages: dev: false file:projects/request-resources.tgz_a1d864769aaf53d09b76fe134ab55e60: - resolution: {integrity: sha512-XxsNDKjd8LE9KTaTIx59hSkVt3hBmfrm/tVYjiwGccjU8Rlr6DrC8OIYEhiaJ9S1GeTr81ZuucMtdy8na+xcCA==, tarball: file:projects/request-resources.tgz} + resolution: {integrity: sha512-I5i+xjZnEMgt+sj1B4xRlsWV2vDHqB9RW1fJML/0DPQS8bs2JkNrJ4QhXtE8dl/ZZc8gCmjs187lwDGq4AjKlQ==, tarball: file:projects/request-resources.tgz} id: file:projects/request-resources.tgz name: '@rush-temp/request-resources' version: 0.0.0 @@ -14696,7 +14846,7 @@ packages: dev: false file:projects/request.tgz: - resolution: {integrity: sha512-Wk75CaPLTFw+DS2xYG9Ma6RnXh/hJTxsaENt4pCohrTtD2pLai6iEykmWumisNZszH/EJlOZLhXwXr46QfLB4A==, tarball: file:projects/request.tgz} + resolution: {integrity: sha512-y69rGft03euHUUNVPSEds55Mj4C7qIwSB59/K2zs4619mk4TaLFNx6plutOJtmMPzRPJR0IOtZQ+/k4EN4gSoQ==, tarball: file:projects/request.tgz} name: '@rush-temp/request' version: 0.0.0 dependencies: @@ -14905,12 +15055,13 @@ packages: dev: false file:projects/server-core.tgz: - resolution: {integrity: sha512-dOWEA7jD+yUtVWidEKaEbMsGXbB1+vXW25QYdWdChOKOIxL9vjX1QpgloF3K2f2d5IjjCPkEkRuAOZVDQqs9MA==, tarball: file:projects/server-core.tgz} + resolution: {integrity: sha512-6RQpWN9YCSt0vS35XBHo6BmT9mwEvYaRFX7MWi/uhZ2v0JvCw5OGoO1/mhW4wjkK30j56DtoRSG+kY3WZ5QzNA==, tarball: file:projects/server-core.tgz} name: '@rush-temp/server-core' version: 0.0.0 dependencies: '@rushstack/heft': 0.47.11 '@types/heft-jest': 1.0.3 + '@types/html-to-text': 8.1.1 '@types/minio': 7.0.14 '@types/node': 16.11.68 '@typescript-eslint/eslint-plugin': 5.42.1_d506b9be61cb4ac2646ecbc6e0680464 @@ -14921,6 +15072,7 @@ packages: eslint-plugin-n: 15.5.1_eslint@8.27.0 eslint-plugin-promise: 6.1.1_eslint@8.27.0 fast-equals: 2.0.4 + html-to-text: 9.0.3 minio: 7.0.32 prettier: 2.7.1 typescript: 4.8.4 @@ -16066,7 +16218,7 @@ packages: dev: false file:projects/tool.tgz: - resolution: {integrity: sha512-FOiaLAqv3oU/lf10gys5x53y4lM9AMhApwOR0NLoSrfDnupW/AojIe38D78Zm4UEqqdEtiHH9/iqY7XvddVNgg==, tarball: file:projects/tool.tgz} + resolution: {integrity: sha512-VVNc6+f2BssTik3I3y+lBrBVkMz6sHygnom2/PvO/ZwEVKeWDN2rwpzZxj6n+RlPeCCvvcII9sXpPOAoJAnxnA==, tarball: file:projects/tool.tgz} name: '@rush-temp/tool' version: 0.0.0 dependencies: diff --git a/dev/client-resources/src/connection.ts b/dev/client-resources/src/connection.ts index 0fbbdb5251..2294c6fada 100644 --- a/dev/client-resources/src/connection.ts +++ b/dev/client-resources/src/connection.ts @@ -115,7 +115,8 @@ export async function connect (handler: (tx: Tx) => void): Promise [] }, contentAdapter: { url: '', diff --git a/dev/docker-compose.yaml b/dev/docker-compose.yaml index 2cdb42a5c4..16c33692a8 100644 --- a/dev/docker-compose.yaml +++ b/dev/docker-compose.yaml @@ -19,6 +19,7 @@ services: - 9001:9001 volumes: - files:/data + restart: unless-stopped elastic: image: 'elasticsearch:7.14.2' command: | @@ -39,6 +40,7 @@ services: interval: 20s retries: 10 test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"' + restart: unless-stopped account: image: hardcoreeng/account links: @@ -56,6 +58,7 @@ services: - MINIO_ENDPOINT=minio - MINIO_ACCESS_KEY=minioadmin - MINIO_SECRET_KEY=minioadmin + restart: unless-stopped collaborator: image: hardcoreeng/collaborator links: @@ -68,6 +71,7 @@ services: - MINIO_ENDPOINT=minio - MINIO_ACCESS_KEY=minioadmin - MINIO_SECRET_KEY=minioadmin + restart: unless-stopped front: image: hardcoreeng/front links: @@ -89,6 +93,7 @@ services: - MINIO_ENDPOINT=minio - MINIO_ACCESS_KEY=minioadmin - MINIO_SECRET_KEY=minioadmin + restart: unless-stopped # tracker-front: # image: hardcoreeng/tracker-front # links: @@ -130,6 +135,7 @@ services: - MINIO_SECRET_KEY=minioadmin - REKONI_URL=http://rekoni:4004 # - APM_SERVER_URL=http://apm-server:8200 + restart: unless-stopped rekoni: image: hardcoreeng/rekoni-service restart: on-failure @@ -138,43 +144,22 @@ services: deploy: resources: limits: - memory: 1024M - # apm-server: - # image: docker.elastic.co/apm/apm-server:7.14.2 - # depends_on: - # - "elastic" - # - "kibana" - # cap_add: ["CHOWN", "DAC_OVERRIDE", "SETGID", "SETUID"] - # cap_drop: ["ALL"] - # ports: - # - 8200:8200 - # command: | - # apm-server -e - # -E apm-server.rum.enabled=true - # -E setup.kibana.host=kibana:5601 - # -E setup.template.settings.index.number_of_replicas=0 - # -E apm-server.kibana.enabled=true - # -E apm-server.kibana.host=kibana:5601 - # -E output.elasticsearch.hosts=["elastic:9200"] - # healthcheck: - # interval: 10s - # retries: 12 - # test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://localhost:8200/ - # kibana: - # image: docker.elastic.co/kibana/kibana:7.14.2 - # depends_on: - # - "elastic" + memory: 500M + restart: unless-stopped + # etcd: + # container_name: milvus-etcd + # image: quay.io/coreos/etcd:v3.5.0 # environment: - # ELASTICSEARCH_URL: http://elastic:9200 - # ELASTICSEARCH_HOSTS: http://elastic:9200 - # ports: - # - 5601:5601 - # healthcheck: - # interval: 10s - # retries: 20 - # test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://localhost:5601/api/status - + # - ETCD_AUTO_COMPACTION_MODE=revision + # - ETCD_AUTO_COMPACTION_RETENTION=1000 + # - ETCD_QUOTA_BACKEND_BYTES=4294967296 + # - ETCD_SNAPSHOT_COUNT=50000 + # volumes: + # - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd + # command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + # restart: unless-stopped volumes: db: files: elastic: + etcd: diff --git a/dev/milvus/milvus-standalone-docker-compose.yml b/dev/milvus/milvus-standalone-docker-compose.yml new file mode 100644 index 0000000000..90ac433b80 --- /dev/null +++ b/dev/milvus/milvus-standalone-docker-compose.yml @@ -0,0 +1,51 @@ +version: '3.5' + +services: + etcd: + container_name: milvus-etcd + image: quay.io/coreos/etcd:v3.5.0 + environment: + - ETCD_AUTO_COMPACTION_MODE=revision + - ETCD_AUTO_COMPACTION_RETENTION=1000 + - ETCD_QUOTA_BACKEND_BYTES=4294967296 + - ETCD_SNAPSHOT_COUNT=50000 + volumes: + - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd + command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd + + minio: + container_name: milvus-minio + image: minio/minio:RELEASE.2022-03-17T06-34-49Z + environment: + MINIO_ACCESS_KEY: minioadmin + MINIO_SECRET_KEY: minioadmin + ports: + - "9001:9001" + volumes: + - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 30s + timeout: 20s + retries: 3 + + standalone: + container_name: milvus-standalone + image: milvusdb/milvus:v2.2.2 + command: ["milvus", "run", "standalone"] + environment: + ETCD_ENDPOINTS: etcd:2379 + MINIO_ADDRESS: minio:9000 + volumes: + - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus + ports: + - "19530:19530" + - "9091:9091" + depends_on: + - "etcd" + - "minio" + +networks: + default: + name: milvus diff --git a/dev/server/src/server.ts b/dev/server/src/server.ts index 046905ed89..14fc316515 100644 --- a/dev/server/src/server.ts +++ b/dev/server/src/server.ts @@ -63,7 +63,8 @@ export async function start (port: number, host?: string): Promise { fulltextAdapter: { factory: createNullFullTextAdapter, url: '', - metrics: new MeasureMetricsContext('', {}) + metrics: new MeasureMetricsContext('', {}), + stages: () => [] }, contentAdapter: { url: '', diff --git a/dev/tool/package.json b/dev/tool/package.json index 92274b62ce..1a703a2b59 100644 --- a/dev/tool/package.json +++ b/dev/tool/package.json @@ -114,6 +114,7 @@ "email-addresses": "^5.0.0", "libphonenumber-js": "^1.9.46", "@hcengineering/setting": "^0.6.2", - "@hcengineering/minio": "^0.6.0" + "@hcengineering/minio": "^0.6.0", + "@hcengineering/openai": "^0.6.0" } } diff --git a/dev/tool/src/index.ts b/dev/tool/src/index.ts index 0d32b598f9..a1b9d89397 100644 --- a/dev/tool/src/index.ts +++ b/dev/tool/src/index.ts @@ -48,7 +48,9 @@ import { diffWorkspace, dumpWorkspace, restoreWorkspace } from './workspace' import { Data, getWorkspaceId, Tx, Version } from '@hcengineering/core' import { MinioService } from '@hcengineering/minio' import { MigrateOperation } from '@hcengineering/model' +import { openAIConfigDefaults } from '@hcengineering/openai' import { rebuildElastic } from './elastic' +import { openAIConfig } from './openai' /** * @public @@ -136,6 +138,30 @@ export function devTool ( }) }) + program + .command('openai ') + .description('assign workspace') + .requiredOption('-t, --token ', 'OpenAI token') + .option('-h, --host ', 'OpenAI API Host', openAIConfigDefaults.endpoint) + .option('--enable ', 'Enable or disable', true) + .option('--embeddings ', 'Enable or disable embeddings generation', true) + .option('--tokenLimit ', 'Acceptable token limit', `${openAIConfigDefaults.tokenLimit}`) + .action( + async ( + workspace: string, + cmd: { token: string, host: string, enable: string, tokenLimit: string, embeddings: string } + ) => { + console.log(`enabling OpenAI for workspace ${workspace}...`) + await openAIConfig(transactorUrl, workspace, productId, { + token: cmd.token, + endpoint: cmd.host, + enabled: cmd.enable === 'true', + tokenLimit: parseInt(cmd.tokenLimit), + embeddings: cmd.embeddings === 'true' + }) + } + ) + program .command('show-user ') .description('show user') diff --git a/dev/tool/src/openai.ts b/dev/tool/src/openai.ts new file mode 100644 index 0000000000..81d627a5f7 --- /dev/null +++ b/dev/tool/src/openai.ts @@ -0,0 +1,34 @@ +import core, { getWorkspaceId, TxOperations } from '@hcengineering/core' +import openai, { openAIConfigDefaults } from '@hcengineering/openai' +import { connect } from '@hcengineering/server-tool' + +export async function openAIConfig ( + transactorUrl: string, + workspace: string, + productId: string, + opt: { endpoint: string, token: string, enabled: boolean, tokenLimit: number, embeddings: boolean } +): Promise { + const connection = await connect(transactorUrl, getWorkspaceId(workspace, productId), '#configurator@hc.engineering') + try { + const ops = new TxOperations(connection, core.account.System) + + // Check if EmployeeAccoun is not exists + const config = await ops.findOne(openai.class.OpenAIConfiguration, {}) + + if (config === undefined) { + await ops.createDoc(openai.class.OpenAIConfiguration, core.space.Configuration, { + ...openAIConfigDefaults, + ...opt + }) + } else { + await ops.update(config, { + ...openAIConfigDefaults, + ...opt + }) + } + } catch (err: any) { + console.trace(err) + } finally { + await connection.close() + } +} diff --git a/models/all/package.json b/models/all/package.json index 2f97d6f4f6..452ed1ebbf 100644 --- a/models/all/package.json +++ b/models/all/package.json @@ -77,6 +77,8 @@ "@hcengineering/model-document": "^0.6.0", "@hcengineering/model-bitrix": "^0.6.0", "@hcengineering/model-request": "^0.6.0", - "@hcengineering/model-server-request": "^0.6.0" + "@hcengineering/model-server-request": "^0.6.0", + "@hcengineering/model-server-openai": "^0.6.0", + "@hcengineering/model-server-translate": "^0.6.0" } } diff --git a/models/all/src/index.ts b/models/all/src/index.ts index d75f01853e..c7c3dd1712 100644 --- a/models/all/src/index.ts +++ b/models/all/src/index.ts @@ -63,6 +63,9 @@ import { createModel as bitrixModel } from '@hcengineering/model-bitrix' import { createModel as requestModel } from '@hcengineering/model-request' import { createModel as serverRequestModel } from '@hcengineering/model-server-request' +import { createModel as serverTranslate } from '@hcengineering/model-server-translate' +import { createModel as serverOpenAI } from '@hcengineering/model-server-openai' + export const version: Data = jsonVersion as Data const builder = new Builder() @@ -113,7 +116,9 @@ const builders: [(b: Builder) => void, string][] = [ [serverHrModel, 'server-hr'], [serverNotificationModel, 'server-notification'], [serverRequestModel, 'server-request'], - [automationModel, 'automation'] + [automationModel, 'automation'], + [serverTranslate, 'translate'], + [serverOpenAI, 'openai'] ] for (const [b, id] of builders) { diff --git a/models/attachment/src/index.ts b/models/attachment/src/index.ts index 87dd56f0e3..b53ef4ba46 100644 --- a/models/attachment/src/index.ts +++ b/models/attachment/src/index.ts @@ -58,6 +58,7 @@ export class TAttachment extends TAttachedDoc implements Attachment { lastModified!: number @Prop(TypeString(), attachment.string.Description) + @Index(IndexKind.FullText) description!: string @Prop(TypeBoolean(), attachment.string.Pinned) diff --git a/models/contact/src/index.ts b/models/contact/src/index.ts index 55d297c384..3647e96e0f 100644 --- a/models/contact/src/index.ts +++ b/models/contact/src/index.ts @@ -524,8 +524,8 @@ export function createModel (builder: Builder): void { ) // Allow to use fuzzy search for mixins - builder.mixin(contact.class.Contact, core.class.Class, core.mixin.AISearchContext, { - index: true + builder.mixin(contact.class.Contact, core.class.Class, core.mixin.FullTextSearchContext, { + fullTextSummary: true }) } diff --git a/models/core/src/core.ts b/models/core/src/core.ts index 8d40eda48f..655f2493fc 100644 --- a/models/core/src/core.ts +++ b/models/core/src/core.ts @@ -15,7 +15,6 @@ import { Account, - AISearchContext, AnyAttribute, ArrOf, AttachedDoc, @@ -23,16 +22,20 @@ import { Class, ClassifierKind, Collection, + Configuration, + ConfigurationElement, Doc, DocIndexState, Domain, DOMAIN_BLOB, + DOMAIN_CONFIGURATION, DOMAIN_DOC_INDEX_STATE, DOMAIN_FULLTEXT_BLOB, DOMAIN_MODEL, Enum, EnumOf, FullTextData, + FullTextSearchContext, IndexKind, Interface, Mixin, @@ -48,14 +51,15 @@ import { import { Hidden, Index, + Mixin as MMixin, Model, Prop, + TypeBoolean, TypeIntlString, TypeRef, TypeString, TypeTimestamp, - UX, - Mixin as MMixin + UX } from '@hcengineering/model' import type { IntlString } from '@hcengineering/platform' import core from './component' @@ -250,7 +254,22 @@ export class TDocIndexState extends TDoc implements DocIndexState { stages!: Record } -@MMixin(core.mixin.AISearchContext, core.class.Class) -export class TAISearchContext extends TClass implements AISearchContext { - index!: boolean +@MMixin(core.mixin.FullTextSearchContext, core.class.Class) +export class TFullTextSearchContext extends TClass implements FullTextSearchContext { + fullTextSummary!: boolean +} + +@MMixin(core.mixin.ConfigurationElement, core.class.Class) +export class TConfigurationElement extends TClass implements ConfigurationElement { + @Prop(TypeIntlString(), core.string.Private) + title!: IntlString + + @Prop(TypeIntlString(), core.string.Private) + group!: IntlString +} + +@Model(core.class.Configuration, core.class.Doc, DOMAIN_CONFIGURATION) +export class TConfiguration extends TDoc implements Configuration { + @Prop(TypeBoolean(), core.string.Private) + enabled!: boolean } diff --git a/models/core/src/index.ts b/models/core/src/index.ts index 0f2b22d34f..77aca7991c 100644 --- a/models/core/src/index.ts +++ b/models/core/src/index.ts @@ -16,13 +16,15 @@ import { Builder } from '@hcengineering/model' import core from './component' import { - TAISearchContext, + TFullTextSearchContext, TArrOf, TAttachedDoc, TAttribute, TBlobData, TClass, TCollection, + TConfiguration, + TConfigurationElement, TDoc, TDocIndexState, TEnum, @@ -97,6 +99,8 @@ export function createModel (builder: Builder): void { TFulltextData, TTypeRelatedDocument, TDocIndexState, - TAISearchContext + TFullTextSearchContext, + TConfiguration, + TConfigurationElement ) } diff --git a/models/document/src/index.ts b/models/document/src/index.ts index 2aaba67af3..3aba60af06 100644 --- a/models/document/src/index.ts +++ b/models/document/src/index.ts @@ -66,6 +66,7 @@ export class TCollaboratorDocument extends TAttachment implements CollaboratorDo @UX(document.string.Version) export class TDocumentVersion extends TAttachedDoc implements DocumentVersion { @Prop(TypeNumber(), document.string.Version) + @Index(IndexKind.FullText) @ReadOnly() version!: number diff --git a/models/server-openai/.eslintrc.js b/models/server-openai/.eslintrc.js new file mode 100644 index 0000000000..59eb1482fa --- /dev/null +++ b/models/server-openai/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/model-rig/profiles/default/config/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +} diff --git a/server/openai/.npmignore b/models/server-openai/.npmignore similarity index 100% rename from server/openai/.npmignore rename to models/server-openai/.npmignore diff --git a/models/server-openai/CHANGELOG.json b/models/server-openai/CHANGELOG.json new file mode 100644 index 0000000000..200ec36b8d --- /dev/null +++ b/models/server-openai/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@hcengineering/model-server-core", + "entries": [ + { + "version": "0.6.0", + "tag": "@hcengineering/model-server-core_v0.6.0", + "date": "Sun, 08 Aug 2021 10:14:57 GMT", + "comments": { + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform\" from `~0.6.3` to `~0.6.4`" + } + ] + } + } + ] +} diff --git a/models/server-openai/CHANGELOG.md b/models/server-openai/CHANGELOG.md new file mode 100644 index 0000000000..500a56bf3d --- /dev/null +++ b/models/server-openai/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log - @hcengineering/model-server-core + +This log was last generated on Sun, 08 Aug 2021 10:14:57 GMT and should not be manually modified. + +## 0.6.0 +Sun, 08 Aug 2021 10:14:57 GMT + +_Initial release_ + diff --git a/models/server-openai/config/rig.json b/models/server-openai/config/rig.json new file mode 100644 index 0000000000..45672e5d25 --- /dev/null +++ b/models/server-openai/config/rig.json @@ -0,0 +1,18 @@ +// The "rig.json" file directs tools to look for their config files in an external package. +// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + /** + * (Required) The name of the rig package to inherit from. + * It should be an NPM package name with the "-rig" suffix. + */ + "rigPackageName": "@hcengineering/model-rig" + + /** + * (Optional) Selects a config profile from the rig package. The name must consist of + * lowercase alphanumeric words separated by hyphens, for example "sample-profile". + * If omitted, then the "default" profile will be used." + */ + // "rigProfile": "your-profile-name" +} diff --git a/models/server-openai/package.json b/models/server-openai/package.json new file mode 100644 index 0000000000..92c0cf00d4 --- /dev/null +++ b/models/server-openai/package.json @@ -0,0 +1,35 @@ +{ + "name": "@hcengineering/model-server-openai", + "version": "0.6.0", + "main": "lib/index.js", + "author": "Anticrm Platform Contributors", + "license": "EPL-2.0", + "scripts": { + "build": "heft build", + "build:watch": "tsc", + "lint:fix": "eslint --fix src", + "lint": "eslint src", + "format": "prettier --write src && eslint --fix src" + }, + "devDependencies": { + "@hcengineering/model-rig": "^0.6.0", + "@typescript-eslint/eslint-plugin": "^5.41.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.26.0", + "@types/heft-jest": "^1.0.3", + "@typescript-eslint/parser": "^5.41.0", + "eslint-config-standard-with-typescript": "^23.0.0", + "prettier": "^2.7.1", + "@rushstack/heft": "^0.47.9" + }, + "dependencies": { + "@hcengineering/core": "^0.6.20", + "@hcengineering/model": "^0.6.0", + "@hcengineering/platform": "^0.6.8", + "@hcengineering/model-core": "^0.6.0", + "@hcengineering/openai": "^0.6.0", + "@hcengineering/server-core": "^0.6.1" + } +} diff --git a/models/server-openai/src/index.ts b/models/server-openai/src/index.ts new file mode 100644 index 0000000000..f55a929d3a --- /dev/null +++ b/models/server-openai/src/index.ts @@ -0,0 +1,47 @@ +// +// Copyright © 2020, 2021 Anticrm Platform Contributors. +// Copyright © 2021 Hardcore Engineering Inc. +// +// Licensed under the Eclipse Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { Builder, Model, Prop, TypeBoolean, TypeNumber, TypeString, UX } from '@hcengineering/model' +import { TConfiguration } from '@hcengineering/model-core' +import { getEmbeddedLabel } from '@hcengineering/platform' + +import core, { DOMAIN_CONFIGURATION } from '@hcengineering/core' +import openai, { OpenAIConfiguration } from '@hcengineering/openai/src/plugin' +import serverCore from '@hcengineering/server-core' + +@Model(openai.class.OpenAIConfiguration, core.class.Configuration, DOMAIN_CONFIGURATION) +@UX(getEmbeddedLabel('OpenAI')) +export class TOpenAIConfiguration extends TConfiguration implements OpenAIConfiguration { + @Prop(TypeString(), getEmbeddedLabel('Token')) + token!: string + + @Prop(TypeString(), getEmbeddedLabel('Endpoint')) + endpoint!: string + + @Prop(TypeNumber(), getEmbeddedLabel('Token Limit')) + tokenLimit!: number + + @Prop(TypeBoolean(), getEmbeddedLabel('Use embeddings')) + embeddings!: boolean +} + +export function createModel (builder: Builder): void { + builder.createModel(TOpenAIConfiguration) + + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: openai.trigger.OnGPTRequest + }) +} diff --git a/models/server-openai/tsconfig.json b/models/server-openai/tsconfig.json new file mode 100644 index 0000000000..807a92c38c --- /dev/null +++ b/models/server-openai/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./node_modules/@hcengineering/model-rig/profiles/default/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + } +} \ No newline at end of file diff --git a/models/server-translate/.eslintrc.js b/models/server-translate/.eslintrc.js new file mode 100644 index 0000000000..59eb1482fa --- /dev/null +++ b/models/server-translate/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: ['./node_modules/@hcengineering/model-rig/profiles/default/config/eslint.config.json'], + parserOptions: { + tsconfigRootDir: __dirname, + project: './tsconfig.json' + } +} diff --git a/models/server-translate/.npmignore b/models/server-translate/.npmignore new file mode 100644 index 0000000000..e3ec093c38 --- /dev/null +++ b/models/server-translate/.npmignore @@ -0,0 +1,4 @@ +* +!/lib/** +!CHANGELOG.md +/lib/**/__tests__/ diff --git a/models/server-translate/CHANGELOG.json b/models/server-translate/CHANGELOG.json new file mode 100644 index 0000000000..200ec36b8d --- /dev/null +++ b/models/server-translate/CHANGELOG.json @@ -0,0 +1,17 @@ +{ + "name": "@hcengineering/model-server-core", + "entries": [ + { + "version": "0.6.0", + "tag": "@hcengineering/model-server-core_v0.6.0", + "date": "Sun, 08 Aug 2021 10:14:57 GMT", + "comments": { + "dependency": [ + { + "comment": "Updating dependency \"@hcengineering/platform\" from `~0.6.3` to `~0.6.4`" + } + ] + } + } + ] +} diff --git a/models/server-translate/CHANGELOG.md b/models/server-translate/CHANGELOG.md new file mode 100644 index 0000000000..500a56bf3d --- /dev/null +++ b/models/server-translate/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log - @hcengineering/model-server-core + +This log was last generated on Sun, 08 Aug 2021 10:14:57 GMT and should not be manually modified. + +## 0.6.0 +Sun, 08 Aug 2021 10:14:57 GMT + +_Initial release_ + diff --git a/models/server-translate/config/rig.json b/models/server-translate/config/rig.json new file mode 100644 index 0000000000..45672e5d25 --- /dev/null +++ b/models/server-translate/config/rig.json @@ -0,0 +1,18 @@ +// The "rig.json" file directs tools to look for their config files in an external package. +// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + /** + * (Required) The name of the rig package to inherit from. + * It should be an NPM package name with the "-rig" suffix. + */ + "rigPackageName": "@hcengineering/model-rig" + + /** + * (Optional) Selects a config profile from the rig package. The name must consist of + * lowercase alphanumeric words separated by hyphens, for example "sample-profile". + * If omitted, then the "default" profile will be used." + */ + // "rigProfile": "your-profile-name" +} diff --git a/models/server-translate/package.json b/models/server-translate/package.json new file mode 100644 index 0000000000..58cbb0305f --- /dev/null +++ b/models/server-translate/package.json @@ -0,0 +1,34 @@ +{ + "name": "@hcengineering/model-server-translate", + "version": "0.6.0", + "main": "lib/index.js", + "author": "Anticrm Platform Contributors", + "license": "EPL-2.0", + "scripts": { + "build": "heft build", + "build:watch": "tsc", + "lint:fix": "eslint --fix src", + "lint": "eslint src", + "format": "prettier --write src && eslint --fix src" + }, + "devDependencies": { + "@hcengineering/model-rig": "^0.6.0", + "@typescript-eslint/eslint-plugin": "^5.41.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-n": "^15.4.0", + "eslint": "^8.26.0", + "@types/heft-jest": "^1.0.3", + "@typescript-eslint/parser": "^5.41.0", + "eslint-config-standard-with-typescript": "^23.0.0", + "prettier": "^2.7.1", + "@rushstack/heft": "^0.47.9" + }, + "dependencies": { + "@hcengineering/core": "^0.6.20", + "@hcengineering/model": "^0.6.0", + "@hcengineering/platform": "^0.6.8", + "@hcengineering/model-core": "^0.6.0", + "@hcengineering/translate": "^0.6.0" + } +} diff --git a/models/server-translate/src/index.ts b/models/server-translate/src/index.ts new file mode 100644 index 0000000000..5769f98054 --- /dev/null +++ b/models/server-translate/src/index.ts @@ -0,0 +1,35 @@ +// +// Copyright © 2022 Hardcore Engineering Inc. +// +// Licensed under the Eclipse Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import { Builder, Model, Prop, TypeString, UX } from '@hcengineering/model' +import { TConfiguration } from '@hcengineering/model-core' +import { getEmbeddedLabel } from '@hcengineering/platform' + +import core, { DOMAIN_CONFIGURATION } from '@hcengineering/core' +import translate, { TranslateConfiguration } from '@hcengineering/translate/src/plugin' + +@Model(translate.class.TranslateConfiguration, core.class.Configuration, DOMAIN_CONFIGURATION) +@UX(getEmbeddedLabel('Retranslation')) +export class TTranslateConfiguration extends TConfiguration implements TranslateConfiguration { + @Prop(TypeString(), getEmbeddedLabel('Token')) + token!: string + + @Prop(TypeString(), getEmbeddedLabel('Token')) + endpoint!: string +} + +export function createModel (builder: Builder): void { + builder.createModel(TTranslateConfiguration) +} diff --git a/models/server-translate/tsconfig.json b/models/server-translate/tsconfig.json new file mode 100644 index 0000000000..807a92c38c --- /dev/null +++ b/models/server-translate/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./node_modules/@hcengineering/model-rig/profiles/default/tsconfig.json", + + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + } +} \ No newline at end of file diff --git a/models/task/src/index.ts b/models/task/src/index.ts index 5bee6066f8..5041dc9f50 100644 --- a/models/task/src/index.ts +++ b/models/task/src/index.ts @@ -120,6 +120,7 @@ export class TTask extends TAttachedDoc implements Task { doneState!: Ref | null @Prop(TypeString(), task.string.TaskNumber) + @Index(IndexKind.FullText) number!: number // @Prop(TypeRef(contact.class.Employee), task.string.TaskAssignee) diff --git a/models/view/package.json b/models/view/package.json index 4cd48bbe21..ca58313a2a 100644 --- a/models/view/package.json +++ b/models/view/package.json @@ -33,6 +33,7 @@ "@hcengineering/view-resources": "^0.6.0", "@hcengineering/model-core": "^0.6.0", "@hcengineering/preference": "^0.6.2", - "@hcengineering/model-preference": "^0.6.0" + "@hcengineering/model-preference": "^0.6.0", + "@hcengineering/model-presentation": "^0.6.0" } } diff --git a/models/view/src/index.ts b/models/view/src/index.ts index 31d12322fe..70e403c574 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -18,7 +18,9 @@ import { DOMAIN_MODEL } from '@hcengineering/core' import { Builder, Mixin, Model } from '@hcengineering/model' import core, { TClass, TDoc } from '@hcengineering/model-core' import preference, { TPreference } from '@hcengineering/model-preference' +import presenation from '@hcengineering/model-presentation' import type { Asset, IntlString, Resource, Status } from '@hcengineering/platform' +import { DOMAIN_PREFERENCE } from '@hcengineering/preference' import type { AnyComponent, Location } from '@hcengineering/ui' import type { Action, @@ -33,6 +35,7 @@ import type { CollectionEditor, CollectionPresenter, Filter, + FilteredView, FilterMode, IgnoreActions, InlineAttributEditor, @@ -57,11 +60,9 @@ import type { Viewlet, ViewletDescriptor, ViewletPreference, - ViewOptionsModel, - FilteredView + ViewOptionsModel } from '@hcengineering/view' import view from './plugin' -import { DOMAIN_PREFERENCE } from '@hcengineering/preference' export { viewOperation } from './migration' export { ViewAction, Viewlet } @@ -700,6 +701,23 @@ export function createModel (builder: Builder): void { ) classPresenter(builder, core.class.EnumOf, view.component.StringPresenter, view.component.EnumEditor) + + createAction(builder, { + action: view.actionImpl.ShowPopup, + actionProps: { + component: view.component.IndexedDocumentPreview, + fillProps: { + _id: 'objectId' + } + }, + label: presenation.string.DocumentPreview, + keyBinding: [''], + input: 'focus', + icon: view.icon.Open, + category: view.category.GeneralNavigation, + target: core.class.Doc, + context: { mode: ['context', 'browser', 'editor'] } + }) } export default view diff --git a/models/view/src/plugin.ts b/models/view/src/plugin.ts index 40470e8a7a..055893af58 100644 --- a/models/view/src/plugin.ts +++ b/models/view/src/plugin.ts @@ -63,7 +63,8 @@ export default mergeIds(viewId, view, { HTMLEditor: '' as AnyComponent, MarkupEditor: '' as AnyComponent, MarkupEditorPopup: '' as AnyComponent, - ListView: '' as AnyComponent + ListView: '' as AnyComponent, + IndexedDocumentPreview: '' as AnyComponent }, string: { Table: '' as IntlString, diff --git a/packages/core/src/classes.ts b/packages/core/src/classes.ts index 2ba01e64f2..1e55bc162d 100644 --- a/packages/core/src/classes.ts +++ b/packages/core/src/classes.ts @@ -245,6 +245,11 @@ export interface TypeHyperlink extends Type {} */ export const DOMAIN_MODEL = 'model' as Domain +/** + * @public + */ +export const DOMAIN_CONFIGURATION = '_configuration' as Domain + /** * @public */ @@ -351,6 +356,10 @@ export interface DocIndexState extends Doc { // Indexable attributes, including child ones. attributes: Record + + // Full Summary + fullSummary?: Markup | null + shortSummary?: Markup | null } /** @@ -358,8 +367,29 @@ export interface DocIndexState extends Doc { * * If defined for class, this class will be enabled for embedding search like openai. */ -export interface AISearchContext extends Class { - index: boolean +export interface FullTextSearchContext extends Class { + fullTextSummary: boolean +} + +/** + * @public + */ +export interface ConfigurationElement extends Class { + // Title will be presented to owner. + title: IntlString + // Group for groupping. + group: IntlString +} + +/** + * @public + * + * Define configuration value configuration for workspace. + * + * Configuration is accessble only for owners of workspace and underhood services. + */ +export interface Configuration extends Doc { + enabled: boolean } /** diff --git a/packages/core/src/component.ts b/packages/core/src/component.ts index 9a2b33a049..eb7bf34a64 100644 --- a/packages/core/src/component.ts +++ b/packages/core/src/component.ts @@ -25,7 +25,7 @@ import type { Collection, Doc, DocIndexState, - AISearchContext, + FullTextSearchContext, Enum, EnumOf, FullTextData, @@ -39,7 +39,9 @@ import type { Space, Timestamp, Type, - UserStatus + UserStatus, + Configuration, + ConfigurationElement } from './classes' import type { Tx, @@ -99,16 +101,20 @@ export default plugin(coreId, { BlobData: '' as Ref>, FulltextData: '' as Ref>, TypeRelatedDocument: '' as Ref>>, - DocIndexState: '' as Ref> + DocIndexState: '' as Ref>, + + Configuration: '' as Ref> }, mixin: { - AISearchContext: '' as Ref> + FullTextSearchContext: '' as Ref>, + ConfigurationElement: '' as Ref> }, space: { Tx: '' as Ref, DerivedTx: '' as Ref, Model: '' as Ref, - Space: '' as Ref + Space: '' as Ref, + Configuration: '' as Ref }, account: { System: '' as Ref diff --git a/packages/presentation/lang/en.json b/packages/presentation/lang/en.json index 4ef5b5816b..f0622212b7 100644 --- a/packages/presentation/lang/en.json +++ b/packages/presentation/lang/en.json @@ -34,6 +34,7 @@ "CategoryProjectLead": "Project lead", "CategoryProjectMembers": "Project members", "CategoryOther": "Other", - "InltPropsValue": "{value}" + "InltPropsValue": "{value}", + "DocumentPreview": "Preview" } } diff --git a/packages/presentation/lang/ru.json b/packages/presentation/lang/ru.json index b92cabd03e..64a43f9207 100644 --- a/packages/presentation/lang/ru.json +++ b/packages/presentation/lang/ru.json @@ -34,6 +34,7 @@ "CategoryProjectLead": "Руководитель проекта", "CategoryProjectMembers": "Участники проекта", "CategoryOther": "Прочие", - "InltPropsValue": "{value}" + "InltPropsValue": "{value}", + "DocumentPreview": "Предпросмотр" } } diff --git a/packages/presentation/src/components/IndexedDocumentPreview.svelte b/packages/presentation/src/components/IndexedDocumentPreview.svelte index c7755050cb..34f2d69f08 100644 --- a/packages/presentation/src/components/IndexedDocumentPreview.svelte +++ b/packages/presentation/src/components/IndexedDocumentPreview.svelte @@ -1,6 +1,7 @@ - -
-
- {#if indexDoc} - {#each attributes as attr} - {@const clOf = client.getHierarchy().getClass(attr[0].attributeOf)} -
- {#if clOf.icon} -
- -
- {/if} -
-
- {#each attr[1] as doc} -
1}> - {#each doc as line} - {@const hl = search.length > 0 && line.toLowerCase().includes(search.toLowerCase())} - {line} - {/each} -
- {/each} -
- {/each} - {/if} + + +
+
+ {#if summary} + Summary: + {#each summary.split('\n') as line} + {@const hl = search.length > 0 && line.toLowerCase().includes(search.toLowerCase())} + {line} + {/each} + {:else if indexDoc} + {#each attributes as attr} + {@const clOf = client.getHierarchy().getClass(attr[0].attributeOf)} +
+ {#if clOf.icon} +
+ +
+ {/if} +
+
+ {#each attr[1] as doc} +
1}> + {#each doc as line} + {@const hl = search.length > 0 && line.toLowerCase().includes(search.toLowerCase())} + {line} + {/each} +
+ {/each} +
+ {/each} + {/if} +
-
+