From 9e5a6fd76fb4a16d4e7e3cf88a857c3956963a36 Mon Sep 17 00:00:00 2001 From: bkellam Date: Wed, 8 Jan 2025 21:17:05 -0800 Subject: [PATCH 01/12] hacked together a example of using zoekt grpc api --- packages/web/hello.ts | 45 +++++ packages/web/package.json | 5 +- .../src/app/api/(server)/v2/search/route.ts | 67 +++++++ yarn.lock | 178 +++++++++++++++++- 4 files changed, 292 insertions(+), 3 deletions(-) create mode 100644 packages/web/hello.ts create mode 100644 packages/web/src/app/api/(server)/v2/search/route.ts diff --git a/packages/web/hello.ts b/packages/web/hello.ts new file mode 100644 index 00000000..95e03ac9 --- /dev/null +++ b/packages/web/hello.ts @@ -0,0 +1,45 @@ +import { credentials, loadPackageDefinition, Metadata } from "@grpc/grpc-js"; +import { loadSync } from "@grpc/proto-loader"; + +// Useful: https://github.com/badsyntax/grpc-js-typescript/tree/master + +// Load the protobuf definition +const packageDefinition = loadSync( + "../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto", + { + keepCase: false, + longs: String, + enums: String, + defaults: true, + oneofs: true, + includeDirs: ["../../vendor/zoekt/grpc/protos"], + }, +); + +const protoDescriptor = loadPackageDefinition(packageDefinition); +const zoekt = protoDescriptor.zoekt.webserver.v1; + +const stub = new zoekt.WebserverService("localhost:6070", credentials.createInsecure()); + +const metadata = new Metadata(); +metadata.add("x-Sourcegraph-Tenant-ID", "1"); + +stub.Search({ + "opts": { + "chunk_matches": true, + "num_context_lines": 5 + }, + "query": { + "and": { + "children": [ + { + "regexp": { + "regexp": "useEffect" + } + } + ] + } + } +}, metadata, (err, response) => { + console.log(JSON.stringify(response, null, 2)); +}) diff --git a/packages/web/package.json b/packages/web/package.json index 4878fc58..e4a9813d 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -7,7 +7,8 @@ "build": "next build", "start": "next start", "lint": "next lint", - "test": "vitest" + "test": "vitest", + "asdf": "tsx hello.ts" }, "dependencies": { "@codemirror/commands": "^6.6.0", @@ -36,6 +37,7 @@ "@codemirror/state": "^6.4.1", "@codemirror/view": "^6.33.0", "@floating-ui/react": "^0.27.2", + "@grpc/grpc-js": "^1.12.5", "@hookform/resolvers": "^3.9.0", "@iconify/react": "^5.1.0", "@iizukak/codemirror-lang-wgsl": "^0.3.0", @@ -120,6 +122,7 @@ "npm-run-all": "^4.1.5", "postcss": "^8", "tailwindcss": "^3.4.1", + "tsx": "^4.19.2", "typescript": "^5", "vite-tsconfig-paths": "^5.1.3", "vitest": "^2.1.5" diff --git a/packages/web/src/app/api/(server)/v2/search/route.ts b/packages/web/src/app/api/(server)/v2/search/route.ts new file mode 100644 index 00000000..5833180b --- /dev/null +++ b/packages/web/src/app/api/(server)/v2/search/route.ts @@ -0,0 +1,67 @@ +'use server'; + +import { schemaValidationError, serviceErrorResponse } from "@/lib/serviceError"; +import { NextRequest } from "next/server"; +import { credentials, loadPackageDefinition, Metadata } from "@grpc/grpc-js"; +import { loadSync } from "@grpc/proto-loader"; +import { z } from "zod"; + +const packageDefinition = loadSync( + "../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto", + { + keepCase: false, + longs: String, + enums: String, + defaults: true, + oneofs: true, + includeDirs: ["../../vendor/zoekt/grpc/protos"], + }, +); + +const protoDescriptor = loadPackageDefinition(packageDefinition); +const zoekt = protoDescriptor.zoekt.webserver.v1; +const stub = new zoekt.WebserverService("localhost:6070", credentials.createInsecure()); + +export const POST = async (request: NextRequest) => { + const body = await request.json(); + const requestSchema = z.object({ + tenantId: z.number(), + }); + + const parsed = await requestSchema.safeParseAsync(body); + if (!parsed.success) { + return serviceErrorResponse( + schemaValidationError(parsed.error) + ); + } + + const metadata = new Metadata(); + metadata.add("x-Sourcegraph-Tenant-ID", parsed.data.tenantId.toString()); + + const response = await new Promise((resolve, reject) => stub.Search({ + opts: { + chunk_matches: true, + num_context_lines: 1 + }, + // @todo : we will need to figure out how to parse a query into a AST. + query: { + and: { + children: [ + { + regexp: { + regexp: "useEffect" + } + } + ] + } + } + }, metadata, (err, response) => { + if (err) { + reject(err); + } + resolve(response); + })); + + + return Response.json(response); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 72b9d77d..21f3eb50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -690,6 +690,24 @@ "@gitbeaker/core" "^40.5.1" "@gitbeaker/requester-utils" "^40.5.1" +"@grpc/grpc-js@^1.12.5": + version "1.12.5" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.5.tgz#0064a28fe9b1ec54ac27e1c9bf70720aa01285e8" + integrity sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + "@hookform/resolvers@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-3.9.0.tgz#cf540ac21c6c0cd24a40cf53d8e6d64391fb753d" @@ -893,6 +911,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -1240,6 +1263,59 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@radix-ui/number@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" @@ -1801,6 +1877,13 @@ dependencies: "@types/braces" "*" +"@types/node@>=13.7.0": + version "22.10.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" + integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== + dependencies: + undici-types "~6.20.0" + "@types/node@^20": version "20.16.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.10.tgz#0cc3fdd3daf114a4776f54ba19726a01c907ef71" @@ -2534,6 +2617,15 @@ client-only@0.0.1, client-only@^0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + 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" + clsx@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" @@ -3236,6 +3328,11 @@ esbuild@~0.23.0: "@esbuild/win32-ia32" "0.23.1" "@esbuild/win32-x64" "0.23.1" +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3650,6 +3747,11 @@ fuse.js@^7.0.0: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -4388,6 +4490,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -4415,6 +4522,11 @@ logform@^2.6.0, logform@^2.6.1: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +long@^5.0.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -5008,6 +5120,24 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -5181,6 +5311,11 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.2" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -5536,7 +5671,7 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -5912,6 +6047,16 @@ tsx@^4.19.1: optionalDependencies: fsevents "~2.3.3" +tsx@^4.19.2: + version "4.19.2" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.2.tgz#2d7814783440e0ae42354d0417d9c2989a2ae92c" + integrity sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -5988,6 +6133,11 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" @@ -6291,7 +6441,8 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6334,11 +6485,34 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yaml@^2.3.4: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + 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" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 9a77ee01619574ea72870c22c44c4cab977bfc78 Mon Sep 17 00:00:00 2001 From: bkellam Date: Wed, 8 Jan 2025 21:44:09 -0800 Subject: [PATCH 02/12] provide tenant id to zoekt git indexer --- package.json | 2 +- packages/backend/src/github.ts | 1 + packages/backend/src/schemas/v2.ts | 1 + packages/backend/src/types.ts | 1 + packages/backend/src/zoekt.ts | 5 ++++- schemas/v2/index.json | 3 +++ 6 files changed, 11 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a14244a6..e173980a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "yarn workspaces run build", "test": "yarn workspaces run test", "dev": "npm-run-all --print-label --parallel dev:zoekt dev:backend dev:web", - "dev:zoekt": "export PATH=\"$PWD/bin:$PATH\" && zoekt-webserver -index .sourcebot/index -rpc", + "dev:zoekt": "export PATH=\"$PWD/bin:$PATH\" && export SRC_TENANT_ENFORCEMENT_MODE=strict && zoekt-webserver -index .sourcebot/index -rpc", "dev:backend": "yarn workspace @sourcebot/backend dev:watch", "dev:web": "yarn workspace @sourcebot/web dev" }, diff --git a/packages/backend/src/github.ts b/packages/backend/src/github.ts index 15f4b05a..f87c0588 100644 --- a/packages/backend/src/github.ts +++ b/packages/backend/src/github.ts @@ -95,6 +95,7 @@ export const getGitHubReposFromConfig = async (config: GitHubConfig, signal: Abo 'zoekt.fork': marshalBool(repo.fork), 'zoekt.public': marshalBool(repo.private === false) }, + tenantId: config.tenantId, sizeInBytes: repo.size ? repo.size * 1000 : undefined, branches: [], tags: [], diff --git a/packages/backend/src/schemas/v2.ts b/packages/backend/src/schemas/v2.ts index 67897cd8..86e8f2b0 100644 --- a/packages/backend/src/schemas/v2.ts +++ b/packages/backend/src/schemas/v2.ts @@ -72,6 +72,7 @@ export interface GitHubConfig { * @minItems 1 */ topics?: [string, ...string[]]; + tenantId?: number; exclude?: { /** * Exclude forked repositories from syncing. diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index 2b0eca3a..15d0e708 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -10,6 +10,7 @@ interface BaseRepository { codeHost?: string; topics?: string[]; sizeInBytes?: number; + tenantId?: number; } export interface GitRepository extends BaseRepository { diff --git a/packages/backend/src/zoekt.ts b/packages/backend/src/zoekt.ts index ffeadf7e..9b251786 100644 --- a/packages/backend/src/zoekt.ts +++ b/packages/backend/src/zoekt.ts @@ -9,8 +9,11 @@ export const indexGitRepository = async (repo: GitRepository, settings: Settings ...repo.branches ?? [], ...repo.tags ?? [], ]; + + const tenantId = repo.tenantId ?? 0; + const shardPrefix = `${tenantId}_${repo.id}`; - const command = `zoekt-git-index -allow_missing_branches -index ${ctx.indexPath} -file_limit ${settings.maxFileSize} -branches ${revisions.join(',')} ${repo.path}`; + const command = `zoekt-git-index -allow_missing_branches -index ${ctx.indexPath} -file_limit ${settings.maxFileSize} -branches ${revisions.join(',')} -tenant_id ${tenantId} -shard_prefix ${shardPrefix} ${repo.path}`; return new Promise<{ stdout: string, stderr: string }>((resolve, reject) => { exec(command, (error, stdout, stderr) => { diff --git a/schemas/v2/index.json b/schemas/v2/index.json index ffdcff56..40d4d2e7 100644 --- a/schemas/v2/index.json +++ b/schemas/v2/index.json @@ -141,6 +141,9 @@ ["docs", "core"] ] }, + "tenantId": { + "type": "number" + }, "exclude": { "type": "object", "properties": { From 8112153dd6ea1868c29a67d25b785e5b5d59dc43 Mon Sep 17 00:00:00 2001 From: bkellam Date: Thu, 9 Jan 2025 15:40:52 -0800 Subject: [PATCH 03/12] update zoekt version to point to multitenant branch --- .gitmodules | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitmodules b/.gitmodules index b6be7427..2da02413 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,5 @@ [submodule "vendor/zoekt"] path = vendor/zoekt url = https://github.com/sourcebot-dev/zoekt + # @nocheckin + branch = multi_tenancy_experiments From 338a3b648cc0845b41ae90866e72ef24da90cb1f Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 13:32:29 -0800 Subject: [PATCH 04/12] pipe tenant id through header to zoekt --- packages/web/hello.ts | 45 ------------------- .../web/src/app/api/(server)/search/route.ts | 10 ++++- packages/web/src/lib/schemas.ts | 1 + packages/web/src/lib/server/searchService.ts | 10 ++++- packages/web/src/lib/server/zoektClient.ts | 4 ++ vendor/zoekt | 2 +- yarn.lock | 2 +- 7 files changed, 25 insertions(+), 49 deletions(-) delete mode 100644 packages/web/hello.ts diff --git a/packages/web/hello.ts b/packages/web/hello.ts deleted file mode 100644 index 95e03ac9..00000000 --- a/packages/web/hello.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { credentials, loadPackageDefinition, Metadata } from "@grpc/grpc-js"; -import { loadSync } from "@grpc/proto-loader"; - -// Useful: https://github.com/badsyntax/grpc-js-typescript/tree/master - -// Load the protobuf definition -const packageDefinition = loadSync( - "../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto", - { - keepCase: false, - longs: String, - enums: String, - defaults: true, - oneofs: true, - includeDirs: ["../../vendor/zoekt/grpc/protos"], - }, -); - -const protoDescriptor = loadPackageDefinition(packageDefinition); -const zoekt = protoDescriptor.zoekt.webserver.v1; - -const stub = new zoekt.WebserverService("localhost:6070", credentials.createInsecure()); - -const metadata = new Metadata(); -metadata.add("x-Sourcegraph-Tenant-ID", "1"); - -stub.Search({ - "opts": { - "chunk_matches": true, - "num_context_lines": 5 - }, - "query": { - "and": { - "children": [ - { - "regexp": { - "regexp": "useEffect" - } - } - ] - } - } -}, metadata, (err, response) => { - console.log(JSON.stringify(response, null, 2)); -}) diff --git a/packages/web/src/app/api/(server)/search/route.ts b/packages/web/src/app/api/(server)/search/route.ts index fa9496b4..aa79b245 100644 --- a/packages/web/src/app/api/(server)/search/route.ts +++ b/packages/web/src/app/api/(server)/search/route.ts @@ -8,13 +8,21 @@ import { NextRequest } from "next/server"; export const POST = async (request: NextRequest) => { const body = await request.json(); - const parsed = await searchRequestSchema.safeParseAsync(body); + const tenantId = await request.headers.get("X-Tenant-ID"); + + console.log(tenantId); + + const parsed = await searchRequestSchema.safeParseAsync({ + ...body, + ...(tenantId && { tenantId: parseInt(tenantId) }), + }); if (!parsed.success) { return serviceErrorResponse( schemaValidationError(parsed.error) ); } + const response = await search(parsed.data); if (isServiceError(response)) { return serviceErrorResponse(response); diff --git a/packages/web/src/lib/schemas.ts b/packages/web/src/lib/schemas.ts index 25526f6b..4c6ef988 100644 --- a/packages/web/src/lib/schemas.ts +++ b/packages/web/src/lib/schemas.ts @@ -4,6 +4,7 @@ export const searchRequestSchema = z.object({ query: z.string(), maxMatchDisplayCount: z.number(), whole: z.boolean().optional(), + tenantId: z.number().optional(), }); diff --git a/packages/web/src/lib/server/searchService.ts b/packages/web/src/lib/server/searchService.ts index bc37de84..933ca99a 100644 --- a/packages/web/src/lib/server/searchService.ts +++ b/packages/web/src/lib/server/searchService.ts @@ -34,7 +34,7 @@ const aliasPrefixMappings: Record = { "revision:": zoektPrefixes.branch, } -export const search = async ({ query, maxMatchDisplayCount, whole }: SearchRequest): Promise => { +export const search = async ({ query, maxMatchDisplayCount, whole, tenantId }: SearchRequest): Promise => { // Replace any alias prefixes with their corresponding zoekt prefixes. for (const [prefix, zoektPrefix] of Object.entries(aliasPrefixMappings)) { query = query.replaceAll(prefix, zoektPrefix); @@ -53,9 +53,17 @@ export const search = async ({ query, maxMatchDisplayCount, whole }: SearchReque } }); + let header: Record = {}; + if (tenantId) { + header = { + "X-Tenant-ID": tenantId.toString() + }; + } + const searchResponse = await zoektFetch({ path: "/api/search", body, + header, method: "POST", }); diff --git a/packages/web/src/lib/server/zoektClient.ts b/packages/web/src/lib/server/zoektClient.ts index 7f3979c3..dba28f0a 100644 --- a/packages/web/src/lib/server/zoektClient.ts +++ b/packages/web/src/lib/server/zoektClient.ts @@ -1,3 +1,4 @@ +import { headers } from "next/headers"; import { ZOEKT_WEBSERVER_URL } from "../environment" @@ -5,6 +6,7 @@ interface ZoektRequest { path: string, body: string, method: string, + header?: Record, cache?: RequestCache, } @@ -12,6 +14,7 @@ export const zoektFetch = async ({ path, body, method, + header, cache, }: ZoektRequest) => { const response = await fetch( @@ -19,6 +22,7 @@ export const zoektFetch = async ({ { method, headers: { + ...header, "Content-Type": "application/json", }, body, diff --git a/vendor/zoekt b/vendor/zoekt index b51a2335..4fc698b0 160000 --- a/vendor/zoekt +++ b/vendor/zoekt @@ -1 +1 @@ -Subproject commit b51a2335d51b865e1ffe84aa549e85570da61463 +Subproject commit 4fc698b0e06a5159b775fa4672c7c1e4ea9131e4 diff --git a/yarn.lock b/yarn.lock index af9b5559..da690e71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5680,7 +5680,7 @@ string-argv@^0.3.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== From f0408c0e471b2db4075b622763ea631365240797 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 13:51:43 -0800 Subject: [PATCH 05/12] remove incorrect submodule reference and settings typo --- .gitmodules | 2 -- .vscode/settings.json | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 2da02413..b6be7427 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,5 +1,3 @@ [submodule "vendor/zoekt"] path = vendor/zoekt url = https://github.com/sourcebot-dev/zoekt - # @nocheckin - branch = multi_tenancy_experiments diff --git a/.vscode/settings.json b/.vscode/settings.json index 2422bd5d..f753e389 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,6 +18,5 @@ "cx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)" ] - ], - "github.copilot.inlineSuggest.enable": true + ] } \ No newline at end of file From f5a602ff6e9e511c43ac0b4453e343132eec6049 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 13:55:52 -0800 Subject: [PATCH 06/12] update zoekt commit --- vendor/zoekt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/zoekt b/vendor/zoekt index 4fc698b0..685a5d2f 160000 --- a/vendor/zoekt +++ b/vendor/zoekt @@ -1 +1 @@ -Subproject commit 4fc698b0e06a5159b775fa4672c7c1e4ea9131e4 +Subproject commit 685a5d2f20402ea7cedcddb7b23b55a98f22ad74 From 668e21b8ebb747c3bd5639ef673855a7f1ddb83d Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 13:57:13 -0800 Subject: [PATCH 07/12] remove unused yarn script --- packages/web/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index 4a1d9006..d665cd96 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -7,8 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "test": "vitest", - "asdf": "tsx hello.ts" + "test": "vitest" }, "dependencies": { "@codemirror/commands": "^6.6.0", From 8f38153bf541bc42f41c87b780313297ff96ca7e Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 13:58:49 -0800 Subject: [PATCH 08/12] remove unused grpc client in web server --- .../src/app/api/(server)/v2/search/route.ts | 67 ------------------- 1 file changed, 67 deletions(-) delete mode 100644 packages/web/src/app/api/(server)/v2/search/route.ts diff --git a/packages/web/src/app/api/(server)/v2/search/route.ts b/packages/web/src/app/api/(server)/v2/search/route.ts deleted file mode 100644 index 5833180b..00000000 --- a/packages/web/src/app/api/(server)/v2/search/route.ts +++ /dev/null @@ -1,67 +0,0 @@ -'use server'; - -import { schemaValidationError, serviceErrorResponse } from "@/lib/serviceError"; -import { NextRequest } from "next/server"; -import { credentials, loadPackageDefinition, Metadata } from "@grpc/grpc-js"; -import { loadSync } from "@grpc/proto-loader"; -import { z } from "zod"; - -const packageDefinition = loadSync( - "../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto", - { - keepCase: false, - longs: String, - enums: String, - defaults: true, - oneofs: true, - includeDirs: ["../../vendor/zoekt/grpc/protos"], - }, -); - -const protoDescriptor = loadPackageDefinition(packageDefinition); -const zoekt = protoDescriptor.zoekt.webserver.v1; -const stub = new zoekt.WebserverService("localhost:6070", credentials.createInsecure()); - -export const POST = async (request: NextRequest) => { - const body = await request.json(); - const requestSchema = z.object({ - tenantId: z.number(), - }); - - const parsed = await requestSchema.safeParseAsync(body); - if (!parsed.success) { - return serviceErrorResponse( - schemaValidationError(parsed.error) - ); - } - - const metadata = new Metadata(); - metadata.add("x-Sourcegraph-Tenant-ID", parsed.data.tenantId.toString()); - - const response = await new Promise((resolve, reject) => stub.Search({ - opts: { - chunk_matches: true, - num_context_lines: 1 - }, - // @todo : we will need to figure out how to parse a query into a AST. - query: { - and: { - children: [ - { - regexp: { - regexp: "useEffect" - } - } - ] - } - } - }, metadata, (err, response) => { - if (err) { - reject(err); - } - resolve(response); - })); - - - return Response.json(response); -} \ No newline at end of file From fa2981784d6d06b7b5923693c80caaf058a2a704 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 14:01:53 -0800 Subject: [PATCH 09/12] remove unneeded deps and improve tenant id log --- packages/web/package.json | 2 - .../web/src/app/api/(server)/search/route.ts | 2 +- yarn.lock | 184 +----------------- 3 files changed, 2 insertions(+), 186 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index d665cd96..706b4329 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -36,7 +36,6 @@ "@codemirror/state": "^6.4.1", "@codemirror/view": "^6.33.0", "@floating-ui/react": "^0.27.2", - "@grpc/grpc-js": "^1.12.5", "@hookform/resolvers": "^3.9.0", "@iconify/react": "^5.1.0", "@iizukak/codemirror-lang-wgsl": "^0.3.0", @@ -121,7 +120,6 @@ "npm-run-all": "^4.1.5", "postcss": "^8", "tailwindcss": "^3.4.1", - "tsx": "^4.19.2", "typescript": "^5", "vite-tsconfig-paths": "^5.1.3", "vitest": "^2.1.5" diff --git a/packages/web/src/app/api/(server)/search/route.ts b/packages/web/src/app/api/(server)/search/route.ts index aa79b245..9ba352a4 100644 --- a/packages/web/src/app/api/(server)/search/route.ts +++ b/packages/web/src/app/api/(server)/search/route.ts @@ -10,7 +10,7 @@ export const POST = async (request: NextRequest) => { const body = await request.json(); const tenantId = await request.headers.get("X-Tenant-ID"); - console.log(tenantId); + console.log(`Search request received. Tenant ID: ${tenantId}`); const parsed = await searchRequestSchema.safeParseAsync({ ...body, diff --git a/yarn.lock b/yarn.lock index da690e71..ab5985b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -690,24 +690,6 @@ "@gitbeaker/core" "^40.5.1" "@gitbeaker/requester-utils" "^40.5.1" -"@grpc/grpc-js@^1.12.5": - version "1.12.5" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.5.tgz#0064a28fe9b1ec54ac27e1c9bf70720aa01285e8" - integrity sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA== - dependencies: - "@grpc/proto-loader" "^0.7.13" - "@js-sdsl/ordered-map" "^4.4.2" - -"@grpc/proto-loader@^0.7.13": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" - integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.5" - yargs "^17.7.2" - "@hookform/resolvers@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-3.9.0.tgz#cf540ac21c6c0cd24a40cf53d8e6d64391fb753d" @@ -911,11 +893,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@js-sdsl/ordered-map@^4.4.2": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" - integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== - "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -1263,59 +1240,6 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - "@radix-ui/number@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" @@ -1877,13 +1801,6 @@ dependencies: "@types/braces" "*" -"@types/node@>=13.7.0": - version "22.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== - dependencies: - undici-types "~6.20.0" - "@types/node@^20": version "20.16.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.10.tgz#0cc3fdd3daf114a4776f54ba19726a01c907ef71" @@ -2617,15 +2534,6 @@ client-only@0.0.1, client-only@^0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - 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" - clsx@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" @@ -3328,11 +3236,6 @@ esbuild@~0.23.0: "@esbuild/win32-ia32" "0.23.1" "@esbuild/win32-x64" "0.23.1" -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3747,11 +3650,6 @@ fuse.js@^7.0.0: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.0.0.tgz#6573c9fcd4c8268e403b4fc7d7131ffcf99a9eb2" integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -4490,11 +4388,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -4522,11 +4415,6 @@ logform@^2.6.0, logform@^2.6.1: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -5120,24 +5008,6 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -protobufjs@^7.2.5: - version "7.4.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" - integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -5311,11 +5181,6 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.2" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -5680,7 +5545,7 @@ string-argv@^0.3.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6062,16 +5927,6 @@ tsx@^4.19.1: optionalDependencies: fsevents "~2.3.3" -tsx@^4.19.2: - version "4.19.2" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.19.2.tgz#2d7814783440e0ae42354d0417d9c2989a2ae92c" - integrity sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g== - dependencies: - esbuild "~0.23.0" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -6148,11 +6003,6 @@ undici-types@~6.19.2: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" @@ -6465,15 +6315,6 @@ word-wrap@^1.2.5: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -6508,34 +6349,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - yaml@^2.3.4: version "2.5.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - 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" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 3c9d36e699094033472cfaa7f5ad4227a0c9eeae Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 15:24:28 -0800 Subject: [PATCH 10/12] pass tenant id when creating repo in db --- packages/backend/src/config.ts | 3 +++ packages/backend/src/zoekt.ts | 2 +- vendor/zoekt | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 59206730..c81ddff4 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -35,6 +35,7 @@ export const syncConfig = async (configPath: string, db: PrismaClient, signal: A const gitHubRepos = await getGitHubReposFromConfig(repoConfig, signal, ctx); const hostUrl = repoConfig.url ?? 'https://github.com'; const hostname = repoConfig.url ? new URL(repoConfig.url).hostname : 'github.com'; + const tenantId = repoConfig.tenantId ?? 0; await Promise.all(gitHubRepos.map((repo) => { const repoName = `${hostname}/${repo.full_name}`; @@ -51,6 +52,7 @@ export const syncConfig = async (configPath: string, db: PrismaClient, signal: A name: repoName, isFork: repo.fork, isArchived: !!repo.archived, + tenantId: tenantId, metadata: { 'zoekt.web-url-type': 'github', 'zoekt.web-url': repo.html_url, @@ -101,6 +103,7 @@ export const syncConfig = async (configPath: string, db: PrismaClient, signal: A external_codeHostUrl: hostUrl, cloneUrl: cloneUrl.toString(), name: repoName, + tenantId: 0, // TODO: add support for tenantId in GitLab config isFork, isArchived: project.archived, metadata: { diff --git a/packages/backend/src/zoekt.ts b/packages/backend/src/zoekt.ts index ec94cedf..e5c7ffc5 100644 --- a/packages/backend/src/zoekt.ts +++ b/packages/backend/src/zoekt.ts @@ -15,7 +15,7 @@ export const indexGitRepository = async (repo: Repo, ctx: AppContext) => { const shardPrefix = `${tenantId}_${repo.id}`; const repoPath = getRepoPath(repo, ctx); - const command = `zoekt-git-index -allow_missing_branches -index ${ctx.indexPath} -file_limit ${DEFAULT_SETTINGS.maxFileSize} -branches ${revisions.join(',')} -tenant_id ${tenantId} -shard_prefix ${repo.id} ${repoPath}`; + const command = `zoekt-git-index -allow_missing_branches -index ${ctx.indexPath} -file_limit ${DEFAULT_SETTINGS.maxFileSize} -branches ${revisions.join(',')} -tenant_id ${tenantId} -shard_prefix ${shardPrefix} ${repoPath}`; return new Promise<{ stdout: string, stderr: string }>((resolve, reject) => { exec(command, (error, stdout, stderr) => { diff --git a/vendor/zoekt b/vendor/zoekt index 685a5d2f..b5863bda 160000 --- a/vendor/zoekt +++ b/vendor/zoekt @@ -1 +1 @@ -Subproject commit 685a5d2f20402ea7cedcddb7b23b55a98f22ad74 +Subproject commit b5863bda450633de4acab5af0494632fef0aa182 From 4fad4c5e7fdbe99c7af3fd6e84b7652660b04936 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 15:57:05 -0800 Subject: [PATCH 11/12] add mt yarn script --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e173980a..a663bf80 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "build": "yarn workspaces run build", "test": "yarn workspaces run test", "dev": "npm-run-all --print-label --parallel dev:zoekt dev:backend dev:web", - "dev:zoekt": "export PATH=\"$PWD/bin:$PATH\" && export SRC_TENANT_ENFORCEMENT_MODE=strict && zoekt-webserver -index .sourcebot/index -rpc", + "dev:mt": "npm-run-all --print-label --parallel dev:zoekt:mt dev:backend dev:web", + "dev:zoekt": "export PATH=\"$PWD/bin:$PATH\" && export SRC_TENANT_ENFORCEMENT_MODE=none && zoekt-webserver -index .sourcebot/index -rpc", + "dev:zoekt:mt": "export PATH=\"$PWD/bin:$PATH\" && export SRC_TENANT_ENFORCEMENT_MODE=strict && zoekt-webserver -index .sourcebot/index -rpc", "dev:backend": "yarn workspace @sourcebot/backend dev:watch", "dev:web": "yarn workspace @sourcebot/web dev" }, From d14d5a9cb1f630e0e2cfc9e5204ca48b799a5c53 Mon Sep 17 00:00:00 2001 From: msukkari Date: Tue, 14 Jan 2025 16:46:27 -0800 Subject: [PATCH 12/12] add nocheckin comment to tenant id in v2 schema --- packages/backend/src/schemas/v2.ts | 3 +++ schemas/v2/index.json | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/backend/src/schemas/v2.ts b/packages/backend/src/schemas/v2.ts index 28baaffe..4ada1870 100644 --- a/packages/backend/src/schemas/v2.ts +++ b/packages/backend/src/schemas/v2.ts @@ -72,6 +72,9 @@ export interface GitHubConfig { * @minItems 1 */ topics?: string[]; + /** + * @nocheckin + */ tenantId?: number; exclude?: { /** diff --git a/schemas/v2/index.json b/schemas/v2/index.json index 65b015fb..11a58acb 100644 --- a/schemas/v2/index.json +++ b/schemas/v2/index.json @@ -142,7 +142,8 @@ ] }, "tenantId": { - "type": "number" + "type": "number", + "description": "@nocheckin" }, "exclude": { "type": "object",