From 9f305f3203027265061a1684bd39a7e0defe40e8 Mon Sep 17 00:00:00 2001 From: BetaHuhn Date: Thu, 21 Sep 2023 15:16:27 +0200 Subject: [PATCH] feat: interop through app actions --- .gitignore | 3 +- Spacefile | 4 + backend/package-lock.json | 281 ++++++++++++++++- backend/package.json | 2 + backend/src/db.ts | 2 - backend/src/index.ts | 36 ++- backend/src/interop.ts | 36 +++ backend/src/openai.ts | 3 +- backend/src/types.ts | 1 + package-lock.json | 23 ++ package.json | 1 + public/assets/integrations/deta.png | Bin 0 -> 20441 bytes src/components/MessageItem.tsx | 28 +- src/components/SelectIntegrationModal.tsx | 231 ++++++++++++++ src/db/types.ts | 33 ++ src/hooks/contexts.ts | 11 +- src/layouts/Base.tsx | 348 +++++++++++----------- yarn.lock | 7 + 18 files changed, 862 insertions(+), 188 deletions(-) create mode 100644 backend/src/interop.ts create mode 100644 backend/src/types.ts create mode 100644 public/assets/integrations/deta.png create mode 100644 src/components/SelectIntegrationModal.tsx diff --git a/.gitignore b/.gitignore index eca4b26..b50e56f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ node_modules .parcel-cache dist notes.txt -lib \ No newline at end of file +lib +.env \ No newline at end of file diff --git a/Spacefile b/Spacefile index 6fc37b9..06fc891 100644 --- a/Spacefile +++ b/Spacefile @@ -22,3 +22,7 @@ micros: public_routes: - "/public/*" provide_actions: true + presets: + env: + - name: SPACE_ACCESS_TOKEN + description: Space Access Token used for optional interoperability features diff --git a/backend/package-lock.json b/backend/package-lock.json index ff134a8..aab44cb 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -11,6 +11,8 @@ "dependencies": { "deta": "^2.0.0", "deta-space-actions": "^0.1.9", + "deta-space-client": "^2.2.2", + "dotenv": "^16.3.1", "express": "^4.18.2", "nanoid": "^3.3.6" }, @@ -512,11 +514,18 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -745,11 +754,23 @@ "node": ">=6.0" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -760,8 +781,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { "version": "2.20.3", @@ -814,6 +834,14 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -888,6 +916,18 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/deta-space-client": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deta-space-client/-/deta-space-client-2.2.2.tgz", + "integrity": "sha512-xGficxfyJBHfQydr3qmNjaadmQfbYPfJWS/6qXM/hGLS8a8OQuJAhaASBPJTW5DXKopRHZAafqNTEu8IGgevyw==", + "dependencies": { + "cross-fetch": "^4.0.0", + "yargs": "^17.7.1" + }, + "bin": { + "space-client": "dist/cli/index.js" + } + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -897,6 +937,17 @@ "node": ">=0.3.1" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -909,6 +960,11 @@ "dev": true, "peer": true }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -941,8 +997,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -1169,6 +1223,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -1316,6 +1378,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1799,6 +1869,14 @@ "node": ">=8.10.0" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1968,6 +2046,30 @@ "node": ">= 0.8" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2338,12 +2440,61 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -2814,11 +2965,15 @@ "peer": true, "requires": {} }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -2968,11 +3123,20 @@ "dev": true, "peer": true }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -2980,8 +3144,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { "version": "2.20.3", @@ -3025,6 +3188,14 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "requires": { + "node-fetch": "^2.6.12" + } + }, "data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -3076,12 +3247,26 @@ } } }, + "deta-space-client": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deta-space-client/-/deta-space-client-2.2.2.tgz", + "integrity": "sha512-xGficxfyJBHfQydr3qmNjaadmQfbYPfJWS/6qXM/hGLS8a8OQuJAhaASBPJTW5DXKopRHZAafqNTEu8IGgevyw==", + "requires": { + "cross-fetch": "^4.0.0", + "yargs": "^17.7.1" + } + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3094,6 +3279,11 @@ "dev": true, "peer": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -3119,9 +3309,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -3291,6 +3479,11 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, "get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -3399,6 +3592,11 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3741,6 +3939,11 @@ "picomatch": "^2.2.1" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3867,6 +4070,24 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4103,12 +4324,46 @@ "webidl-conversions": "^3.0.0" } }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/backend/package.json b/backend/package.json index e1321ee..f7f69e2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -15,6 +15,8 @@ "dependencies": { "deta": "^2.0.0", "deta-space-actions": "^0.1.9", + "deta-space-client": "^2.2.2", + "dotenv": "^16.3.1", "express": "^4.18.2", "nanoid": "^3.3.6" }, diff --git a/backend/src/db.ts b/backend/src/db.ts index f3eb89d..63dbd8f 100644 --- a/backend/src/db.ts +++ b/backend/src/db.ts @@ -1,8 +1,6 @@ import { Deta } from 'deta' import { nanoid } from "nanoid" -export * from '../../src/db/types.js' - const deta = Deta() export const chats = deta.Base('chats') diff --git a/backend/src/index.ts b/backend/src/index.ts index 7810617..2829940 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,12 +1,16 @@ import express from 'express' import { CardType, createActions, Inputs } from 'deta-space-actions' +import dotenv from 'dotenv' +dotenv.config() import { chats, messages, prompts, settings, generateKey } from './db.js' -import type { Chat, Prompt, Settings } from './db.js' +import type { Chat, Prompt, Settings } from './types.js' import { createChatWithMessage } from './openai.js' +import { useInterop } from './interop.js' const app = express() const actions = createActions() +const interop = useInterop() const domain = process.env.DETA_SPACE_APP_HOSTNAME @@ -35,6 +39,36 @@ app.get('/public/chats/:key/messages', async (req, res) => { res.json(items) }) +app.get('/space/actions/config', async (req, res) => { + res.json({ + isSetup: interop.isSetup + }) +}) + +app.get('/space/actions', async (req, res) => { + const actions = await interop.listActions() + + console.log(actions) + + const filtered = actions.filter(action => { + const inputs = action.input + if (!inputs || inputs.length < 1) return false + + const textInputs = inputs.filter(input => input.type === 'string') + + return textInputs.length > 0 + }) + + res.json(filtered) +}) + +app.post('/space/actions/invoke', async (req, res) => { + const { instanceId, actionName, payload } = req.body + + const invocationRes = await interop.invokeAction(instanceId, actionName, payload) + res.json(invocationRes) +}) + actions.add<{ prompt?: string }>({ name: 'create_chat', title: 'Create Chat', diff --git a/backend/src/interop.ts b/backend/src/interop.ts new file mode 100644 index 0000000..be88309 --- /dev/null +++ b/backend/src/interop.ts @@ -0,0 +1,36 @@ +import { fetchFn } from "deta-space-client" +import { AppAction } from "./types" + +export const useInterop = (token?: string) => { + const authToken = token || process.env.SPACE_ACCESS_TOKEN || '' + const fetch = fetchFn(authToken) + + const request = async (path: string, body?: any, method = 'GET') => { + const res = await fetch(path, { + method, + body: JSON.stringify(body), + headers: { + 'Content-Type': 'application/json' + } + }) + + return res.json() + } + + const listActions = async () => { + const data = await request('/actions') + return data.actions as AppAction[] + } + + const invokeAction = async (instanceId: string, actionName: string, payload?: any) => { + const data = await request(`/actions/${instanceId}/${actionName}`, payload, 'POST') + return data + } + + return { + request, + listActions, + invokeAction, + isSetup: !!authToken + } +} diff --git a/backend/src/openai.ts b/backend/src/openai.ts index a1e8ce5..a498714 100644 --- a/backend/src/openai.ts +++ b/backend/src/openai.ts @@ -1,4 +1,5 @@ -import { chats, messages, prompts, generateKey, Prompt, Message, Chat, Settings } from './db.js' +import { chats, messages, prompts, generateKey } from './db.js' +import type { Prompt, Message, Chat, Settings } from './types.js' import { getSystemMessage, createChatCompletion } from '../../src/utils/openai.js' diff --git a/backend/src/types.ts b/backend/src/types.ts new file mode 100644 index 0000000..9d97991 --- /dev/null +++ b/backend/src/types.ts @@ -0,0 +1 @@ +export * from '../../src/db/types.js' \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8e64a63..689ff86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@mantine/hooks": "^6.0.1", "@mantine/next": "^6.0.1", "@mantine/notifications": "^6.0.1", + "@mantine/spotlight": "^6.0.2", "@tabler/icons-react": "^2.9.0", "@tanstack/react-location": "^3.7.4", "@types/node": "18.15.0", @@ -1275,6 +1276,20 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@mantine/spotlight": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@mantine/spotlight/-/spotlight-6.0.2.tgz", + "integrity": "sha512-MdC6qXivhrjiKPyM1WPwcaWIo8thfGpKMv9lNuzSKJRzF5n3Uiexucyrb1B+Ca6JqEWWMMuDJ4iNIijAQRhc/Q==", + "dependencies": { + "@mantine/utils": "6.0.2" + }, + "peerDependencies": { + "@mantine/core": "6.0.2", + "@mantine/hooks": "6.0.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@mantine/ssr": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@mantine/ssr/-/ssr-6.0.2.tgz", @@ -8427,6 +8442,14 @@ "react-transition-group": "4.4.2" } }, + "@mantine/spotlight": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@mantine/spotlight/-/spotlight-6.0.2.tgz", + "integrity": "sha512-MdC6qXivhrjiKPyM1WPwcaWIo8thfGpKMv9lNuzSKJRzF5n3Uiexucyrb1B+Ca6JqEWWMMuDJ4iNIijAQRhc/Q==", + "requires": { + "@mantine/utils": "6.0.2" + } + }, "@mantine/ssr": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@mantine/ssr/-/ssr-6.0.2.tgz", diff --git a/package.json b/package.json index 2bc408c..43bc331 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@emotion/react": "^11.10.6", "@emotion/server": "^11.10.0", "@mantine/core": "^6.0.1", + "@mantine/spotlight": "^6.0.2", "@mantine/hooks": "^6.0.1", "@mantine/next": "^6.0.1", "@mantine/notifications": "^6.0.1", diff --git a/public/assets/integrations/deta.png b/public/assets/integrations/deta.png new file mode 100644 index 0000000000000000000000000000000000000000..b9976547ae6a66c901d360c6067e58283e2cf500 GIT binary patch literal 20441 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 void, handleUseMessage?: (key: string) => void }) { const wordCount = useMemo(() => { @@ -29,9 +31,18 @@ export function MessageItem({ message, readOnly = false, onDeleted, handleUseMes return matches ? matches.length : 0; }, [message.content]); - const [isExpanded, setExpanded] = useState(false); const ref = useClickOutside(() => setExpanded(false)); const theme = useMantineTheme(); + const markdownRef = useRef(null) + + const { spaceAppActions } = useSpaceAppActions() + + const [isExpanded, setExpanded] = useState(false); + const [html, setHtml] = useState('') + + useEffect(() => { + setHtml(markdownRef.current?.innerHTML || '') + }, [ref]) const handleDelete = async () => { await detaDB.messages.delete(message.key); @@ -66,7 +77,7 @@ export function MessageItem({ message, readOnly = false, onDeleted, handleUseMes )} {message.role === "assistant" && } - + + {spaceAppActions !== null && ( + + + + {/* */} + + + + + )} + {!readOnly && handleUseMessage && ( <> diff --git a/src/components/SelectIntegrationModal.tsx b/src/components/SelectIntegrationModal.tsx new file mode 100644 index 0000000..8d90552 --- /dev/null +++ b/src/components/SelectIntegrationModal.tsx @@ -0,0 +1,231 @@ +import { notifications } from "@mantine/notifications"; +import { SpotlightProvider, spotlight } from '@mantine/spotlight'; +import { cloneElement, ReactElement, useEffect, useState } from "react"; +import { useChat, useSpaceAppActions } from "../hooks/contexts"; +import { IconBolt, IconSearch } from "@tabler/icons-react"; +import { AppAction } from "../db"; + +export function SelectIntegrationModal({ + contentText, + contentHtml, + children, +}: { + contentText: string; + contentHtml: string; + children: ReactElement; +}) { + const [open, setOpen] = useState(false); + + const { chat } = useChat() + const { setSpaceAppActions } = useSpaceAppActions() + + const [spotlightActions, setSpotlightActions] = useState([]); + + useEffect(() => { + const dataFetch = async () => { + const res = await fetch(`/api/space/actions`) + const items = await res.json() + const actions = items as unknown as AppAction[] + + setSpaceAppActions(actions) + + const spotlightActionsItems = actions.map(action => ({ + title: action.title, + description: action.instance_alias, + icon: action.icon_url ? {action.title} : , + onTrigger: async () => { + try { + if (action) { + const titleKeys = ['title', 'name'] + const contentKeys = ['content', 'description', 'text'] + + let payload: { [key: string]: string } = {} + for (const input of action.input!) { + if (titleKeys.includes(input.name)) { + payload[input.name] = chat?.description || 'Dialogue AI Chat' + } else if (contentKeys.includes(input.name)) { + payload[input.name] = action.app_name === 'Minima' ? contentHtml : contentText + } else if (input.name === 'html') { + payload[input.name] = contentHtml + } + } + + const res = await fetch(`/api/space/actions/invoke`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + instanceId: action.instance_id, + actionName: action.name, + payload: payload + }) + }) + + const invocation = await res.json() + console.log(invocation) + if (invocation.type === '@deta/raw') { + navigator.clipboard.writeText(invocation.data) + } else if (invocation.type === '@deta/detail') { + navigator.clipboard.writeText(invocation.data.ref || invocation.data.url || invocation.data.title || invocation.data.text) + } else { + navigator.clipboard.writeText(JSON.stringify(invocation.data)) + } + + notifications.show({ + title: "Success", + color: "green", + message: `Action "${action.title}" invoked successfully.`, + }) + } else { + notifications.show({ + title: "Error", + color: "red", + message: "Integration not found.", + }); + } + } catch (error: any) { + if (error.toJSON().message === "Network Error") { + notifications.show({ + title: "Error", + color: "red", + message: "No internet connection.", + }); + } + const message = error.response?.data?.error?.message; + if (message) { + notifications.show({ + title: "Error", + color: "red", + message, + }); + } + } + }, + })) + + setSpotlightActions(spotlightActionsItems) + spotlight.open() + } + if (open) { + dataFetch() + } + }, [open]) + + const handleOpen = () => { + setOpen(true) + } + + return ( + <> + {cloneElement(children, { onClick: handleOpen })} + {open && ( + } + searchPlaceholder="Search..." + shortcut={null} + nothingFoundMessage="Nothing found..." + onSpotlightOpen={() => setOpen(true)} + onSpotlightClose={() => setOpen(false)} + limit={Infinity} + > + + )} + {/* +
{ + try { + setSubmitting(true); + event.preventDefault(); + + const action = spaceAppActions?.find(i => { + const appName = selectedAppAction.split('__')[0] + const actionName = selectedAppAction.split('__')[1] + + return i.app_name === appName && i.name === actionName + }) + + if (action) { + + const titleKeys = ['title', 'name'] + const contentKeys = ['content', 'description', 'text'] + + let payload: { [key: string]: string } = {} + for (const input of action.input!) { + if (titleKeys.includes(input.name)) { + payload[input.name] = chat?.description || 'Dialogue AI Chat' + } else if (contentKeys.includes(input.name)) { + payload[input.name] = contentHtml + } + } + + const res = await fetch(`/api/space/actions/invoke`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + instanceId: action.instance_id, + actionName: action.name, + payload: payload + }) + }) + + console.log(res) + + navigator.clipboard.writeText('noteUrl') + + notifications.show({ + title: "Success", + color: "green", + message: "Message stored in Minima and link copied to clipboard.", + }) + } else { + notifications.show({ + title: "Error", + color: "red", + message: "Integration not found.", + }); + } + } catch (error: any) { + if (error.toJSON().message === "Network Error") { + notifications.show({ + title: "Error", + color: "red", + message: "No internet connection.", + }); + } + const message = error.response?.data?.error?.message; + if (message) { + notifications.show({ + title: "Error", + color: "red", + message, + }); + } + } finally { + setSubmitting(false); + setSelectedAppAction(''); + close(); + } + }} + > + +