From c763bfa1f0212111b5aa472d4b1e53b8dd422e19 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 16 May 2024 18:22:07 -0700 Subject: [PATCH 01/81] init --- .editorconfig | 10 + .env.example | 8 + .eslintrc.json | 4 + .github/funding.yml | 1 + .github/workflows/main.yml | 50 + .gitignore | 39 + .husky/pre-commit | 1 + .npmrc | 2 + .prettierrc | 11 + license | 5 + package.json | 83 + pnpm-lock.yaml | 6372 +++++++++++++++++++++++++++ readme.md | 24 + src/config.ts | 5 + src/errors.ts | 5 + src/index.ts | 2 + src/parse-structured-output.test.ts | 273 ++ src/parse-structured-output.ts | 283 ++ src/reset.d.ts | 1 + src/services/dexa-client.ts | 37 + src/services/openai-client.ts | 5 + src/services/scraper-client.ts | 67 + src/services/serpapi.ts | 699 +++ src/services/serper.ts | 274 ++ src/services/twitter-client.ts | 95 + src/services/weather.ts | 143 + src/types.ts | 2 + src/utils.test.ts | 17 + src/utils.ts | 62 + tsconfig.json | 25 + tsup.config.ts | 16 + 31 files changed, 8621 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .github/funding.yml create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 .husky/pre-commit create mode 100644 .npmrc create mode 100644 .prettierrc create mode 100644 license create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 readme.md create mode 100644 src/config.ts create mode 100644 src/errors.ts create mode 100644 src/index.ts create mode 100644 src/parse-structured-output.test.ts create mode 100644 src/parse-structured-output.ts create mode 100644 src/reset.d.ts create mode 100644 src/services/dexa-client.ts create mode 100644 src/services/openai-client.ts create mode 100644 src/services/scraper-client.ts create mode 100644 src/services/serpapi.ts create mode 100644 src/services/serper.ts create mode 100644 src/services/twitter-client.ts create mode 100644 src/services/weather.ts create mode 100644 src/types.ts create mode 100644 src/utils.test.ts create mode 100644 src/utils.ts create mode 100644 tsconfig.json create mode 100644 tsup.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..aaaa7a4ba --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +tab_width = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..7622aa5df --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +# ------------------------------------------------------------------------------ +# This is an example .env file. +# +# All of these environment vars must be defined either in your environment or in +# a local .env file in order to run this project. +# ------------------------------------------------------------------------------ + +OPENAI_API_KEY= diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..7b1e9e832 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "root": true, + "extends": ["@fisch0920/eslint-config", "@fisch0920/eslint-config/node"] +} diff --git a/.github/funding.yml b/.github/funding.yml new file mode 100644 index 000000000..9377c232f --- /dev/null +++ b/.github/funding.yml @@ -0,0 +1 @@ +github: [transitive-bullshit] diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..c24925273 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,50 @@ +name: CI + +on: [push, pull_request] + +jobs: + test: + name: Test Node.js ${{ matrix.node-version }} + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + node-version: + - 20 + - 21 + - 22 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Install pnpm + uses: pnpm/action-setup@v3 + id: pnpm-install + with: + version: 8 + run_install: false + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run test + run: pnpm run test diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a06a32b14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +.next/ +out/ + +# production +build/ +dist/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +.env diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..f27575a8e --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm run precommit diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..605ae9cc9 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +enable-pre-post-scripts=true +package-manager-strict=false diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..af07fd262 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "singleQuote": true, + "jsxSingleQuote": true, + "semi": false, + "useTabs": false, + "tabWidth": 2, + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "always", + "trailingComma": "none" +} diff --git a/license b/license new file mode 100644 index 000000000..5ac9cf7be --- /dev/null +++ b/license @@ -0,0 +1,5 @@ +**PROPRIETARY LICENSE** + +Copyright (c) 2024 Travis Fischer + +All rights reserved. diff --git a/package.json b/package.json new file mode 100644 index 000000000..09fecbe5e --- /dev/null +++ b/package.json @@ -0,0 +1,83 @@ +{ + "name": "gptlint", + "private": true, + "version": "0.1.0", + "description": "TODO", + "author": "Travis Fischer ", + "license": "PROPRIETARY", + "homepage": "https://trywalter.ai", + "repository": { + "type": "git", + "url": "transitive-bullshit/walter" + }, + "packageManager": "pnpm@8.15.7", + "engines": { + "node": ">=18" + }, + "type": "module", + "source": "./src/gptlint.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "import": "./dist/src/index.js", + "default": "./dist/src/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "prebuild": "run-s clean", + "predev": "run-s clean", + "pretest": "run-s build", + "prepare": "husky", + "precommit": "lint-staged", + "test": "run-s test:*", + "test:format": "prettier --check \"**/*.{js,ts,tsx}\"", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit", + "test:unit": "vitest run" + }, + "dependencies": { + "@dexaai/dexter": "^2.0.0", + "dotenv": "^16.4.5", + "execa": "^8.0.1", + "exit-hook": "^4.0.0", + "jsonrepair": "^3.6.1", + "ky": "^1.2.4", + "openai": "^4.47.1", + "p-map": "^7.0.2", + "p-retry": "^6.2.0", + "tiny-invariant": "^1.3.3", + "type-fest": "^4.16.0", + "zod": "^3.23.3" + }, + "devDependencies": { + "@fisch0920/eslint-config": "^1.3.1", + "@total-typescript/ts-reset": "^0.5.1", + "@types/node": "^20.12.7", + "del-cli": "^5.1.0", + "eslint": "^8.57.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", + "np": "^10.0.5", + "npm-run-all2": "^6.1.2", + "prettier": "^3.2.5", + "tsup": "^8.0.2", + "tsx": "^4.7.2", + "typescript": "^5.4.5", + "vite": "^5.2.10", + "vitest": "^1.5.0" + }, + "lint-staged": { + "*.{ts,tsx}": [ + "eslint --fix", + "prettier --ignore-unknown --write" + ] + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..f9468042d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6372 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@dexaai/dexter': + specifier: ^2.0.0 + version: 2.0.2 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + execa: + specifier: ^8.0.1 + version: 8.0.1 + exit-hook: + specifier: ^4.0.0 + version: 4.0.0 + jsonrepair: + specifier: ^3.6.1 + version: 3.8.0 + ky: + specifier: ^1.2.4 + version: 1.2.4 + openai: + specifier: ^4.47.1 + version: 4.47.1 + p-map: + specifier: ^7.0.2 + version: 7.0.2 + p-retry: + specifier: ^6.2.0 + version: 6.2.0 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + type-fest: + specifier: ^4.16.0 + version: 4.18.2 + zod: + specifier: ^3.23.3 + version: 3.23.8 + +devDependencies: + '@fisch0920/eslint-config': + specifier: ^1.3.1 + version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) + '@total-typescript/ts-reset': + specifier: ^0.5.1 + version: 0.5.1 + '@types/node': + specifier: ^20.12.7 + version: 20.12.12 + del-cli: + specifier: ^5.1.0 + version: 5.1.0 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + husky: + specifier: ^9.0.11 + version: 9.0.11 + lint-staged: + specifier: ^15.2.2 + version: 15.2.2 + np: + specifier: ^10.0.5 + version: 10.0.5(typescript@5.4.5) + npm-run-all2: + specifier: ^6.1.2 + version: 6.1.2 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + tsup: + specifier: ^8.0.2 + version: 8.0.2(typescript@5.4.5) + tsx: + specifier: ^4.7.2 + version: 4.10.3 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite: + specifier: ^5.2.10 + version: 5.2.11(@types/node@20.12.12) + vitest: + specifier: ^1.5.0 + version: 1.6.0(@types/node@20.12.12) + +packages: + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.5 + picocolors: 1.0.1 + + /@babel/helper-validator-identifier@7.24.5: + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + + /@babel/highlight@7.24.5: + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + /@babel/runtime@7.24.5: + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@dexaai/dexter@2.0.2: + resolution: {integrity: sha512-21LOWGTM0eXB7d6+ytGv2Bg4sBVBv0uFMFgiUvkLiyDX+fi9A0lDqPXJuEnCrB7AH0WbwodXWtEGK6jCK4d3Dg==} + engines: {node: '>= 18'} + dependencies: + '@fastify/deepmerge': 1.3.0 + dedent: 1.5.3 + hash-object: 5.0.1 + jsonrepair: 3.8.0 + ky: 1.2.4 + openai-fetch: 2.0.2 + p-map: 7.0.2 + p-throttle: 6.1.0 + parse-json: 8.1.0 + pinecone-client: 2.0.0 + tiktoken: 1.0.15 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-validation-error: 3.3.0(zod@3.23.8) + transitivePeerDependencies: + - babel-plugin-macros + dev: false + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@fastify/deepmerge@1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false + + /@fisch0920/eslint-config@1.3.2(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-CUpMxCPWzoxvWFlmvH0OthooRlenqrezrVVleKEZv+NbibwgT4phyZadBLYsF8aB7Et2OoEzk4LKg8Xsdu5spA==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.0.0 + dependencies: + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.9.0)(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-jest-dom: 5.4.0(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.1(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + eslint-plugin-security: 2.1.1 + eslint-plugin-simple-import-sort: 12.1.0(eslint@8.57.0) + eslint-plugin-unicorn: 52.0.0(eslint@8.57.0) + typescript: 5.4.5 + transitivePeerDependencies: + - '@testing-library/dom' + - eslint + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - jest + - supports-color + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true + + /@inquirer/figures@1.0.1: + resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} + engines: {node: '>=18'} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@ljharb/through@2.3.13: + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: true + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: true + + /@rollup/rollup-android-arm-eabi@4.17.2: + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.17.2: + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.17.2: + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.17.2: + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.17.2: + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.17.2: + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.17.2: + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.17.2: + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.17.2: + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.17.2: + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.17.2: + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.17.2: + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.17.2: + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.17.2: + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/eslint-patch@1.10.3: + resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} + dev: true + + /@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7): + resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==} + engines: {node: '>=6'} + peerDependencies: + rxjs: '*' + zen-observable: '*' + peerDependenciesMeta: + rxjs: + optional: true + zen-observable: + optional: true + dependencies: + any-observable: 0.3.0(rxjs@6.6.7) + rxjs: 6.6.7 + transitivePeerDependencies: + - zenObservable + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: true + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@total-typescript/ts-reset@0.5.1: + resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + dependencies: + '@types/node': 20.12.12 + form-data: 4.0.0 + dev: false + + /@types/node@18.19.33: + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/node@20.12.12: + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + dependencies: + undici-types: 5.26.5 + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/retry@0.12.2: + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + dev: false + + /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/type-utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.9.0 + debug: 4.3.4 + eslint: 8.57.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@7.9.0: + resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + dev: true + + /@typescript-eslint/type-utils@7.9.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@7.9.0: + resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + + /@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5): + resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/visitor-keys': 7.9.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@7.9.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.9.0 + '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@7.9.0: + resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.9.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vitest/expect@1.6.0: + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.6.0: + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + + /aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: true + + /ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-observable@0.3.0(rxjs@6.6.7): + resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} + engines: {node: '>=6'} + peerDependencies: + rxjs: '*' + zenObservable: '*' + peerDependenciesMeta: + rxjs: + optional: true + zenObservable: + optional: true + dependencies: + rxjs: 6.6.7 + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: true + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001620 + electron-to-chromium: 1.4.773 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.0) + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: true + + /bundle-require@4.1.0(esbuild@0.19.12): + resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.19.12 + load-tsconfig: 0.2.5 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: true + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + dev: true + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: true + + /caniuse-lite@1.0.30001620: + resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + dev: true + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} + dependencies: + chalk: 5.3.0 + dev: true + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: true + + /clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: true + + /cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-truncate@0.2.1: + resolution: {integrity: sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==} + engines: {node: '>=0.10.0'} + dependencies: + slice-ansi: 0.0.4 + string-width: 1.0.2 + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: true + + /cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + dev: true + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + dev: true + + /core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + dependencies: + browserslist: 4.23.0 + dev: true + + /cosmiconfig@8.3.6(typescript@5.4.5): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.4.5 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /date-fns@1.30.1: + resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + dev: true + + /decircular@0.1.1: + resolution: {integrity: sha512-V2Vy+QYSXdgxRPmOZKQWCDf1KQNTUP/Eqswv/3W20gz7+6GB1HTosNrWqK3PqstVpFw/Dd/cGTmXSTKPeOiGVg==} + engines: {node: '>=18'} + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: false + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: true + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /del-cli@5.1.0: + resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + del: 7.1.0 + meow: 10.1.5 + dev: true + + /del@7.1.0: + resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} + engines: {node: '>=14.16'} + dependencies: + globby: 13.2.2 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 5.5.0 + rimraf: 3.0.2 + slash: 4.0.0 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /electron-to-chromium@1.4.773: + resolution: {integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==} + dev: true + + /elegant-spinner@1.0.1: + resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} + engines: {node: '>=0.10.0'} + dev: true + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + dev: true + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.57.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.1 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.5 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jest-dom@5.4.0(eslint@8.57.0): + resolution: {integrity: sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': ^8.0.0 || ^9.0.0 || ^10.0.0 + eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + '@testing-library/dom': + optional: true + dependencies: + '@babel/runtime': 7.24.5 + eslint: 8.57.0 + requireindex: 1.2.0 + dev: true + + /eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.9.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.24.5 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + dev: true + + /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-react@7.34.1(eslint@8.57.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + dev: true + + /eslint-plugin-security@2.1.1: + resolution: {integrity: sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==} + dependencies: + safe-regex: 2.1.1 + dev: true + + /eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): + resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-plugin-unicorn@52.0.0(eslint@8.57.0): + resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 + clean-regexp: 1.0.0 + core-js-compat: 3.37.1 + eslint: 8.57.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.2 + strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + /exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: true + + /figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + dev: true + + /figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + dev: false + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /github-url-from-git@1.5.0: + resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.3.15: + resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.1 + path-scurry: 1.11.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + dependencies: + ini: 4.1.1 + dev: true + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /hash-object@5.0.1: + resolution: {integrity: sha512-iaRY4jYOow1caHkXW7wotYRjZDQk2nq4U7904anGJj8l4x1SLId+vuR8RpGoywZz9puD769hNFVFLFH9t+baJw==} + engines: {node: '>=18'} + dependencies: + decircular: 0.1.1 + is-obj: 3.0.0 + sort-keys: 5.0.0 + type-fest: 4.18.2 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.2.2 + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.4 + dev: true + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@3.2.0: + resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} + engines: {node: '>=4'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + engines: {node: '>=18'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: true + + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /inquirer-autosubmit-prompt@0.2.0: + resolution: {integrity: sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==} + dependencies: + chalk: 2.4.2 + inquirer: 6.5.2 + rxjs: 6.6.7 + dev: true + + /inquirer@6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 3.1.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 2.1.1 + strip-ansi: 5.2.0 + through: 2.3.8 + dev: true + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /inquirer@9.2.21: + resolution: {integrity: sha512-c/dwDruM1FtzeISV+xMHm+JZTmhpmgWPEZI2bU3+Fwu5MhbAX0zMHHxj5warNfttE5NUID3aijrFUpDc2yBvcA==} + engines: {node: '>=18'} + dependencies: + '@inquirer/figures': 1.0.1 + '@ljharb/through': 2.3.13 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-in-ci@0.1.0: + resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: true + + /is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: true + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + dev: false + + /is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + dev: false + + /is-observable@1.1.0: + resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} + engines: {node: '>=4'} + dependencies: + symbol-observable: 1.2.0 + dev: true + + /is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-scoped@3.0.0: + resolution: {integrity: sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g==} + engines: {node: '>=12'} + dependencies: + scoped-regex: 3.0.0 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: true + + /is-url-superb@6.1.0: + resolution: {integrity: sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==} + engines: {node: '>=12'} + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /issue-regex@4.1.0: + resolution: {integrity: sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonrepair@3.8.0: + resolution: {integrity: sha512-89lrxpwp+IEcJ6kwglF0HH3Tl17J08JEpYfXnvvjdp4zV4rjSoGu2NdQHxBs7yTOk3ETjTn9du48pBy8iBqj1w==} + hasBin: true + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /ky@1.2.4: + resolution: {integrity: sha512-CfSrf4a0yj1n6WgPT6kQNQOopIGLkQzqSAXo05oKByaH7G3SiqW4a8jGox0p9whMXqO49H7ljgigivrMyycAVA==} + engines: {node: '>=18'} + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.1 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /listr-input@0.2.1: + resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==} + engines: {node: '>=6'} + dependencies: + inquirer: 7.3.3 + inquirer-autosubmit-prompt: 0.2.0 + rxjs: 6.6.7 + through: 2.3.8 + dev: true + + /listr-silent-renderer@1.1.1: + resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==} + engines: {node: '>=4'} + dev: true + + /listr-update-renderer@0.5.0(listr@0.14.3): + resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} + engines: {node: '>=6'} + peerDependencies: + listr: ^0.14.2 + dependencies: + chalk: 1.1.3 + cli-truncate: 0.2.1 + elegant-spinner: 1.0.1 + figures: 1.7.0 + indent-string: 3.2.0 + listr: 0.14.3 + log-symbols: 1.0.2 + log-update: 2.3.0 + strip-ansi: 3.0.1 + dev: true + + /listr-verbose-renderer@0.5.0: + resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} + engines: {node: '>=4'} + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + date-fns: 1.30.1 + figures: 2.0.0 + dev: true + + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + dev: true + + /listr@0.14.3: + resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} + engines: {node: '>=6'} + dependencies: + '@samverschueren/stream-to-observable': 0.3.1(rxjs@6.6.7) + is-observable: 1.1.0 + is-promise: 2.2.2 + is-stream: 1.1.0 + listr-silent-renderer: 1.1.1 + listr-update-renderer: 0.5.0(listr@0.14.3) + listr-verbose-renderer: 0.5.0 + p-map: 2.1.0 + rxjs: 6.6.7 + transitivePeerDependencies: + - zen-observable + - zenObservable + dev: true + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.0 + pkg-types: 1.1.1 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols@1.0.2: + resolution: {integrity: sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==} + engines: {node: '>=0.10.0'} + dependencies: + chalk: 1.1.3 + dev: true + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: true + + /log-update@2.3.0: + resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} + engines: {node: '>=4'} + dependencies: + ansi-escapes: 3.2.0 + cli-cursor: 2.1.0 + wrap-ansi: 3.0.1 + dev: true + + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /meow@10.1.5: + resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 7.0.2 + decamelize: 5.0.1 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 8.0.0 + redent: 4.0.0 + trim-newlines: 4.1.1 + type-fest: 1.4.0 + yargs-parser: 20.2.9 + dev: true + + /meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + /mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@7.1.1: + resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /mute-stream@0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + dev: true + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /new-github-release-url@2.0.0: + resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.19.0 + dev: true + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.6.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@6.0.1: + resolution: {integrity: sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.2 + is-core-module: 2.13.1 + semver: 7.6.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + dev: true + + /np@10.0.5(typescript@5.4.5): + resolution: {integrity: sha512-Tu270vVvsh92uh6XDXrGS6D94PhzxQYqM8uUxftYVp0B8qXl78dJRYwQ9wfYMOBB9ynlF79eWlUtPUxPzKGddQ==} + engines: {git: '>=2.11.0', node: '>=18', npm: '>=9', pnpm: '>=8', yarn: '>=1.7.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + chalk-template: 1.1.0 + cosmiconfig: 8.3.6(typescript@5.4.5) + del: 7.1.0 + escape-goat: 4.0.0 + escape-string-regexp: 5.0.0 + execa: 8.0.1 + exit-hook: 4.0.0 + github-url-from-git: 1.5.0 + hosted-git-info: 7.0.2 + ignore-walk: 6.0.5 + import-local: 3.1.0 + inquirer: 9.2.21 + is-installed-globally: 1.0.0 + is-interactive: 2.0.0 + is-scoped: 3.0.0 + issue-regex: 4.1.0 + listr: 0.14.3 + listr-input: 0.2.1 + log-symbols: 6.0.0 + meow: 13.2.0 + new-github-release-url: 2.0.0 + npm-name: 8.0.0 + onetime: 7.0.0 + open: 10.1.0 + p-memoize: 7.1.1 + p-timeout: 6.1.2 + path-exists: 5.0.0 + pkg-dir: 8.0.0 + read-package-up: 11.0.0 + read-pkg: 9.0.1 + rxjs: 7.8.1 + semver: 7.6.2 + symbol-observable: 4.0.0 + terminal-link: 3.0.0 + update-notifier: 7.0.0 + transitivePeerDependencies: + - typescript + - zen-observable + - zenObservable + dev: true + + /npm-name@8.0.0: + resolution: {integrity: sha512-DIuCGcKYYhASAZW6Xh/tiaGMko8IHOHe0n3zOA7SzTi0Yvy00x8L7sa5yNiZ75Ny58O/KeRtNouy8Ut6gPbKiw==} + engines: {node: '>=18'} + dependencies: + is-scoped: 3.0.0 + is-url-superb: 6.1.0 + ky: 1.2.4 + lodash.zip: 4.2.0 + org-regex: 1.0.0 + p-map: 7.0.2 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + validate-npm-package-name: 5.0.1 + dev: true + + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-run-all2@6.1.2: + resolution: {integrity: sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} + hasBin: true + dependencies: + ansi-styles: 6.2.1 + cross-spawn: 7.0.3 + memorystream: 0.3.1 + minimatch: 9.0.4 + pidtree: 0.6.0 + read-package-json-fast: 3.0.2 + shell-quote: 1.8.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + + /onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + dependencies: + mimic-function: 5.0.1 + dev: true + + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: true + + /openai-fetch@2.0.2: + resolution: {integrity: sha512-OBsuvW0TcWyvRoBLJW+4nrGwSXY7voEMclNFBvZRy1+flT54pS+VsdzILwiKQRM2MQJyh487Dza8xrGrxsASVA==} + engines: {node: '>=18'} + dependencies: + ky: 1.2.4 + dev: false + + /openai@4.47.1: + resolution: {integrity: sha512-WWSxhC/69ZhYWxH/OBsLEirIjUcfpQ5+ihkXKp06hmeYXgBBIUCa9IptMzYx6NdkiOCsSGYCnTIsxaic3AjRCQ==} + hasBin: true + dependencies: + '@types/node': 18.19.33 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + dev: false + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /org-regex@1.0.0: + resolution: {integrity: sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==} + engines: {node: '>=8'} + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + dependencies: + aggregate-error: 4.0.1 + dev: true + + /p-map@7.0.2: + resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} + engines: {node: '>=18'} + + /p-memoize@7.1.1: + resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} + engines: {node: '>=14.16'} + dependencies: + mimic-fn: 4.0.0 + type-fest: 3.13.1 + dev: true + + /p-retry@6.2.0: + resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + engines: {node: '>=16.17'} + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + dev: false + + /p-throttle@6.1.0: + resolution: {integrity: sha512-eQMdGTxk2+047La67wefUtt0tEHh7D+C8Jl7QXoFCuIiNYeQ9zWs2AZiJdIAs72rSXZ06t11me2bgalRNdy3SQ==} + engines: {node: '>=18'} + dev: false + + /p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.6.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.2 + index-to-position: 0.1.2 + type-fest: 4.18.2 + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.1 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pinecone-client@2.0.0: + resolution: {integrity: sha512-CxpKuck4zxi/LaGaTrnWQNs9NmXiMB3UtynOhD6dVDoWRKGEXmgRbSFipMUdqGyyQEKMFXzTKvzo4qMHi2Gj8Q==} + engines: {node: '>=18'} + dependencies: + ky: 1.2.4 + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-dir@8.0.0: + resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} + engines: {node: '>=18'} + dependencies: + find-up-simple: 1.0.0 + dev: true + + /pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + dependencies: + confbox: 0.1.7 + mlly: 1.7.0 + pathe: 1.1.2 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + dev: true + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: true + + /read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + dependencies: + find-up-simple: 1.0.0 + read-pkg: 9.0.1 + type-fest: 4.18.2 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg-up@8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + dependencies: + find-up: 5.0.0 + read-pkg: 6.0.0 + type-fest: 1.4.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-pkg@6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 1.4.0 + dev: true + + /read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.1 + parse-json: 8.1.0 + type-fest: 4.18.2 + unicorn-magic: 0.1.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + dependencies: + indent-string: 5.0.0 + strip-indent: 4.0.0 + dev: true + + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.3 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: true + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: true + + /regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: true + + /restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + dev: true + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + dependencies: + regexp-tree: 0.1.27 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scoped-regex@3.0.0: + resolution: {integrity: sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==} + engines: {node: '>=12'} + dev: true + + /semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.6.2 + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: true + + /slice-ansi@0.0.4: + resolution: {integrity: sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==} + engines: {node: '>=0.10.0'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + + /sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} + dependencies: + is-plain-obj: 4.1.0 + dev: false + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + dev: true + + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + dependencies: + js-tokens: 9.0.0 + dev: true + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.15 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + dev: true + + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /terminal-link@3.0.0: + resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} + engines: {node: '>=12'} + dependencies: + ansi-escapes: 5.0.0 + supports-hyperlinks: 2.3.0 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tiktoken@1.0.15: + resolution: {integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw==} + dev: false + + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false + + /tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + dev: true + + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + dev: true + + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.5 + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tsup@8.0.2(typescript@5.4.5): + resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 4.1.0(esbuild@0.19.12) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.4 + esbuild: 0.19.12 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2 + resolve-from: 5.0.0 + rollup: 4.17.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /tsx@4.10.3: + resolution: {integrity: sha512-f0g60aFSVRVkzcQkEflh8fPLRfmt+HJHgWi/plG5UgvVaV+9TcpOwJ0sZJSACXmwmjMPg9yQR0BhTLbhkfV2uA==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.20.2 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true + + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + + /type-fest@4.18.2: + resolution: {integrity: sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==} + engines: {node: '>=16'} + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: true + + /update-browserslist-db@1.0.16(browserslist@4.23.0): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: true + + /update-notifier@7.0.0: + resolution: {integrity: sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==} + engines: {node: '>=18'} + dependencies: + boxen: 7.1.1 + chalk: 5.3.0 + configstore: 6.0.0 + import-lazy: 4.0.0 + is-in-ci: 0.1.0 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.6.2 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /vite-node@1.6.0(@types/node@20.12.12): + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.2.11(@types/node@20.12.12) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.2.11(@types/node@20.12.12): + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.12.12 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.6.0(@types/node@20.12.12): + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 20.12.12 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.11(@types/node@20.12.12) + vite-node: 1.6.0(@types/node@20.12.12) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: false + + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: true + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi@3.0.1: + resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} + engines: {node: '>=4'} + dependencies: + string-width: 2.1.1 + strip-ansi: 4.0.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zod-to-json-schema@3.23.0(zod@3.23.8): + resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + peerDependencies: + zod: ^3.23.3 + dependencies: + zod: 3.23.8 + dev: false + + /zod-validation-error@3.3.0(zod@3.23.8): + resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + dependencies: + zod: 3.23.8 + dev: false + + /zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + dev: false diff --git a/readme.md b/readme.md new file mode 100644 index 000000000..fa362f6e2 --- /dev/null +++ b/readme.md @@ -0,0 +1,24 @@ +

+ Walter +

+ +

+ Agentic recommendations for AI-native products... +

+ +

+ Build Status + MIT License + Prettier Code Formatting + Discuss on Twitter +

+ +# Walter + +**Coming soon** + +## License + +PROPRIETARY © [Travis Fischer](https://twitter.com/transitive_bs) + +To stay up to date or learn more, follow [@transitive_bs](https://twitter.com/transitive_bs) on Twitter. diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 000000000..af02b98a7 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,5 @@ +import dotenv from 'dotenv' + +import type * as types from './types.js' + +dotenv.config() diff --git a/src/errors.ts b/src/errors.ts new file mode 100644 index 000000000..555bc0949 --- /dev/null +++ b/src/errors.ts @@ -0,0 +1,5 @@ +export { AbortError, type FailedAttemptError } from 'p-retry' + +export class RetryableError extends Error {} + +export class ParseError extends RetryableError {} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 000000000..6c9f33158 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,2 @@ +export type * from './types.js' +export * from './utils.js' diff --git a/src/parse-structured-output.test.ts b/src/parse-structured-output.test.ts new file mode 100644 index 000000000..63ffe61e4 --- /dev/null +++ b/src/parse-structured-output.test.ts @@ -0,0 +1,273 @@ +import { assert, expect, test } from 'vitest' +import { z } from 'zod' + +import { + extractJSONFromString, + parseArrayOutput, + parseBooleanOutput, + parseNumberOutput, + parseObjectOutput, + parseStructuredOutput +} from './parse-structured-output.js' + +test('extractJSONFromString should extract JSON object from string', () => { + let jsonStr = 'Some text {"name":"John Doe"} more text' + let result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { name: 'John Doe' }) + + jsonStr = + 'Some text {"name":"John Doe","age":42,"address":{"street":"Main Street","number":42}} more text' + result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { + name: 'John Doe', + age: 42, + address: { street: 'Main Street', number: 42 } + }) + + jsonStr = 'foo {"name":"John Doe","school":"St. John\'s"} bar' + result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { name: 'John Doe', school: "St. John's" }) +}) + +test('extractJSONFromString should extract an invalid JSON object from string', () => { + let jsonStr = 'Some text {"name":\'John Doe\'} more text' + let result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { name: 'John Doe' }) + + jsonStr = 'Some text {"name":"John Doe","age":42,} more text' + result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { name: 'John Doe', age: 42 }) +}) + +test('extractJSONFromString should extract multiple JSON objects from string', () => { + let jsonStr = 'Some text {"name":"John Doe"} more text {"name":"Jane Doe"}' + let result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { name: 'John Doe' }) + assert.deepEqual(result[1], { name: 'Jane Doe' }) + + jsonStr = + 'Some text {"name":"John Doe","age":42,"address":{"street":"Main Street","number":42}} more text {"name":"Jane Doe","age":42,"address":{"street":"Main Street","number":42}}' + result = extractJSONFromString(jsonStr, 'object') + assert.deepEqual(result[0], { + name: 'John Doe', + age: 42, + address: { street: 'Main Street', number: 42 } + }) + assert.deepEqual(result[1], { + name: 'Jane Doe', + age: 42, + address: { street: 'Main Street', number: 42 } + }) +}) + +test('extractJSONFromString should extract JSON array from string', () => { + let jsonString = 'Some text [1,2,3] more text' + let result = extractJSONFromString(jsonString, 'array') + assert.deepEqual(result[0], [1, 2, 3]) + + jsonString = 'Some text ["foo","bar","\'quoted\'"] more text' + result = extractJSONFromString(jsonString, 'array') + assert.deepEqual(result[0], ['foo', 'bar', "'quoted'"]) +}) + +test('extractJSONFromString should extract an invalid JSON array from string', () => { + let jsonString = 'Some text [1,2,3,] more text' + let result = extractJSONFromString(jsonString, 'array') + assert.deepEqual(result[0], [1, 2, 3]) + + jsonString = "Some text ['foo','bar'] more text" + result = extractJSONFromString(jsonString, 'array') + assert.deepEqual(result[0], ['foo', 'bar']) +}) + +test('extractJSONFromString should extract multiple JSON arrays from string', () => { + const jsonString = 'Some text [1,2,3] more text [4,5,6]' + const result = extractJSONFromString(jsonString, 'array') + assert.deepEqual(result[0], [1, 2, 3]) + assert.deepEqual(result[1], [4, 5, 6]) +}) + +test('extractJSONFromString should return an empty array if no JSON object is found', () => { + const jsonString = 'Some text' + const result = extractJSONFromString(jsonString, 'object') + assert.deepEqual(result, []) +}) + +test('extractJSONFromString should return an empty array if no JSON array is found', () => { + const jsonString = 'Some text' + const result = extractJSONFromString(jsonString, 'array') + assert.deepEqual(result, []) +}) + +test('parseArrayOutput - handles valid arrays correctly', () => { + const output1 = parseArrayOutput('[1,2,3]') + const output2 = parseArrayOutput('["a", "b", "c"]') + const output3 = parseArrayOutput('[{"a": 1}, {"b": 2}]') + + expect(output1).toMatchSnapshot('should return [1, 2, 3] for "[1,2,3]"') + expect(output2).toMatchSnapshot( + 'should return ["a", "b", "c"] for "["a", "b", "c"]' + ) + expect(output3).toMatchSnapshot( + 'should return [{"a": 1}, {"b": 2}] for [{"a": 1}, {"b": 2}]' + ) +}) + +test('parseArrayOutput - handles arrays surrounded by text correctly', () => { + const output1 = parseArrayOutput('The array is [1,2,3]') + const output2 = parseArrayOutput('Array: ["a", "b", "c"]. That\'s all!') + const output3 = parseArrayOutput( + 'This is the array [{"a": 1}, {"b": 2}] in the text' + ) + + expect(output1).toMatchSnapshot( + 'should return [1, 2, 3] for "The array is [1,2,3]"' + ) + expect(output2).toMatchSnapshot( + 'should return ["a", "b", "c"] for "Array: ["a", "b", "c"]. That\'s all!"' + ) + expect(output3).toMatchSnapshot( + 'should return [{"a": 1}, {"b": 2}] for "This is the array [{"a": 1}, {"b": 2}] in the text"' + ) +}) + +test('parseArrayOutput - throws error for invalid arrays', () => { + assert.throws(() => { + parseArrayOutput('not a valid array') + }) +}) + +test('parseObjectOutput - handles valid objects correctly', () => { + const output1 = parseObjectOutput('{"a":1,"b":2,"c":3}') + const output2 = parseObjectOutput( + '{"name":"John","age":30,"city":"New York"}' + ) + + expect(output1).toMatchSnapshot( + 'should return {"a":1,"b":2,"c":3} for {"a":1,"b":2,"c":3}' + ) + expect(output2).toMatchSnapshot( + 'should return {"name":"John","age":30,"city":"New York"} for {"name":"John","age":30,"city":"New York"}' + ) +}) + +test('parseObjectOutput - handles objects surrounded by text correctly', () => { + const output1 = parseObjectOutput('The object is {"a":1,"b":2,"c":3}') + const output2 = parseObjectOutput( + 'Object: {"name":"John","age":30,"city":"New York"}. That\'s all!' + ) + + expect(output1).toMatchSnapshot( + 'should return {"a":1,"b":2,"c":3} for "The object is {"a":1,"b":2,"c":3}"' + ) + expect(output2).toMatchSnapshot( + 'should return {"name":"John","age":30,"city":"New York"} for "Object: {"name":"John","age":30,"city":"New York"}. That\'s all!"' + ) +}) + +test('parseObjectOutput - handles JSON array of objects', () => { + const output = parseObjectOutput('[{"a":1,"b":2},{"c":3,"d":4}]') + + expect(output).toMatchSnapshot( + 'should return first object {"a":1,"b":2} for [{"a":1,"b":2},{"c":3,"d":4}]' + ) +}) + +test('parseObjectOutput - throws error for invalid objects', () => { + assert.throws(() => { + parseObjectOutput('not a valid object') + }) +}) + +test('parseBooleanOutput - handles `true` outputs correctly', () => { + const output1 = parseBooleanOutput('True') + const output2 = parseBooleanOutput('TRUE') + const output3 = parseBooleanOutput('true.') + + expect(output1).toMatchSnapshot('should return true for "True"') + expect(output2).toMatchSnapshot('should return true for "TRUE"') + expect(output3).toMatchSnapshot('should return true for "true."') +}) + +test('parseBooleanOutput - handles `false` outputs correctly', () => { + const output1 = parseBooleanOutput('False') + const output2 = parseBooleanOutput('FALSE') + const output3 = parseBooleanOutput('false!') + + expect(output1).toMatchSnapshot('should return false for "False"') + expect(output2).toMatchSnapshot('should return false for "FALSE"') + expect(output3).toMatchSnapshot('should return false for "false!"') +}) + +test('parseBooleanOutput - throws error for invalid outputs', () => { + assert.throws(() => { + parseBooleanOutput('NotBooleanValue') + }) +}) + +test('parseNumberOutput - handles integer outputs correctly', () => { + const output1 = parseNumberOutput('42', z.number().int()) + const output2 = parseNumberOutput(' -5 ', z.number().int()) + + expect(output1).toMatchSnapshot('should return 42 for "42"') + expect(output2).toMatchSnapshot('should return -5 for " -5 "') +}) + +test('parseNumberOutput - handles float outputs correctly', () => { + const output1 = parseNumberOutput('42.42', z.number()) + const output2 = parseNumberOutput(' -5.5 ', z.number()) + + expect(output1).toMatchSnapshot('should return 42.42 for "42.42"') + expect(output2).toMatchSnapshot('should return -5.5 for " -5.5 "') +}) + +test('parseNumberOutput - throws error for invalid outputs', () => { + assert.throws(() => { + parseNumberOutput('NotANumber', z.number()) + }) +}) + +test('parseStructuredOutput - handles arrays correctly', () => { + const arraySchema = z.array(z.number()) + const output = '[1, 2, 3]' + const result = parseStructuredOutput(output, arraySchema) + + expect(result).toMatchSnapshot( + 'should parse and return [1, 2, 3] for "[1, 2, 3]"' + ) +}) + +test('parseStructuredOutput - handles objects correctly', () => { + const objectSchema = z.object({ a: z.number(), b: z.string() }) + const output = '{"a": 1, "b": "two"}' + const result = parseStructuredOutput(output, objectSchema) + + expect(result).toMatchSnapshot( + 'should parse and return {"a": 1, "b": "two"} for "{"a": 1, "b": "two"}"' + ) +}) + +test('parseStructuredOutput - handles booleans correctly', () => { + const booleanSchema = z.boolean() + const output = 'True' + const result = parseStructuredOutput(output, booleanSchema) + + expect(result).toMatchSnapshot('should parse and return true for "True"') +}) + +test('parseStructuredOutput - handles numbers correctly', () => { + const numberSchema = z.number() + const output = '123.45' + const result = parseStructuredOutput(output, numberSchema) + + expect(result).toMatchSnapshot('should parse and return 123.45 for "123.45"') +}) + +test('parseStructuredOutput - throws error for invalid data', () => { + const numberSchema = z.number() + const output = 'not a number' + + assert.throws(() => { + parseStructuredOutput(output, numberSchema) + }) +}) diff --git a/src/parse-structured-output.ts b/src/parse-structured-output.ts new file mode 100644 index 000000000..f93bd471d --- /dev/null +++ b/src/parse-structured-output.ts @@ -0,0 +1,283 @@ +import type { JsonValue } from 'type-fest' +import { jsonrepair, JSONRepairError } from 'jsonrepair' +import { z, type ZodType } from 'zod' + +import { ParseError } from './errors.js' + +export type SafeParseResult = + | { + success: true + data: T + error?: never + } + | { + success: false + data?: never + error: string + } + +/** + * Parses a string which is expected to contain a structured JSON value. + * + * The JSON value is fuzzily parsed in order to support common issues like + * missing commas, trailing commas, and unquoted keys. + * + * The JSON value is then parsed against a `zod` schema to enforce the shape of + * the output. + * + * @param output - string to parse + * @param outputSchema - zod schema + * + * @returns parsed output + */ +export function parseStructuredOutput( + output: string, + outputSchema: ZodType +): T { + let result + if (outputSchema instanceof z.ZodArray) { + result = parseArrayOutput(output) + } else if (outputSchema instanceof z.ZodObject) { + result = parseObjectOutput(output) + } else if (outputSchema instanceof z.ZodBoolean) { + result = parseBooleanOutput(output) + } else if (outputSchema instanceof z.ZodNumber) { + result = parseNumberOutput(output, outputSchema) + } else { + // Default to string output... + result = output + } + + // TODO: fix typescript issue here with recursive types + const safeResult = (outputSchema.safeParse as any)(result) + + if (!safeResult.success) { + throw new ParseError(safeResult.error) + } + + return safeResult.data +} + +export function safeParseStructuredOutput( + output: string, + outputSchema: ZodType +): SafeParseResult { + try { + const data = parseStructuredOutput(output, outputSchema) + return { + success: true, + data + } + } catch (err: any) { + return { + success: false, + error: err.message + } + } +} + +/** + * Checks if character at the specified index in a string is escaped. + * + * @param str - string to check + * @param i - index of the character to check + * @returns whether the character is escaped + */ +function isEscaped(str: string, i: number): boolean { + return i > 0 && str[i - 1] === '\\' && !(i > 1 && str[i - 2] === '\\') +} + +/** + * Extracts JSON objects or arrays from a string. + * + * @param input - string to extract JSON from + * @param jsonStructureType - type of JSON structure to extract + * @returns array of extracted JSON objects or arrays + */ +export function extractJSONFromString( + input: string, + jsonStructureType: 'object' | 'array' +) { + const startChar = jsonStructureType === 'object' ? '{' : '[' + const endChar = jsonStructureType === 'object' ? '}' : ']' + const extractedJSONValues: JsonValue[] = [] + let nestingLevel = 0 + let startIndex = 0 + const isInsideQuoted = { '"': false, "'": false } + + for (let i = 0; i < input.length; i++) { + const ch = input.charAt(i) + switch (ch) { + case '"': + case "'": + if (!isInsideQuoted[ch === '"' ? "'" : '"'] && !isEscaped(input, i)) { + isInsideQuoted[ch] = !isInsideQuoted[ch] + } + + break + + default: + if (!isInsideQuoted['"'] && !isInsideQuoted["'"]) { + switch (ch) { + case startChar: + if (nestingLevel === 0) { + startIndex = i + } + + nestingLevel += 1 + + break + + case endChar: + nestingLevel -= 1 + if (nestingLevel === 0) { + const candidate = input.slice(startIndex, i + 1) + const parsed = JSON.parse(jsonrepair(candidate)) + if (parsed && typeof parsed === 'object') { + extractedJSONValues.push(parsed as JsonValue) + } + } else if (nestingLevel < 0) { + throw new ParseError( + `Invalid JSON string: unexpected ${endChar} at position ${i}` + ) + } + } + } + } + } + + if (nestingLevel !== 0) { + throw new ParseError( + 'Invalid JSON string: unmatched ' + startChar + ' or ' + endChar + ) + } + + return extractedJSONValues +} + +const BOOLEAN_OUTPUTS: Record = { + true: true, + false: false, + t: true, + f: false, + yes: true, + no: false, + y: true, + n: false, + '1': true, + '0': false +} + +/** + * Parses an array output from a string. + * + * @param output - string to parse + * @returns parsed array + */ +export function parseArrayOutput(output: string): Array { + try { + const arrayOutput = extractJSONFromString(output, 'array') + if (arrayOutput.length === 0) { + throw new ParseError(`Invalid JSON array: ${output}`) + } + + const parsedOutput = arrayOutput[0] + if (!Array.isArray(parsedOutput)) { + throw new ParseError( + `Invalid JSON array: ${JSON.stringify(parsedOutput)}` + ) + } + + return parsedOutput + } catch (err: any) { + if (err instanceof JSONRepairError) { + throw new ParseError(err.message, { cause: err }) + } else if (err instanceof SyntaxError) { + throw new ParseError(`Invalid JSON array: ${err.message}`, { cause: err }) + } else { + throw err + } + } +} + +/** + * Parses an object output from a string. + * + * @param output - string to parse + * @returns parsed object + */ +export function parseObjectOutput(output: string) { + try { + const arrayOutput = extractJSONFromString(output, 'object') + if (arrayOutput.length === 0) { + throw new ParseError(`Invalid JSON object: ${output}`) + } + + let parsedOutput = arrayOutput[0] + if (Array.isArray(parsedOutput)) { + // TODO + parsedOutput = parsedOutput[0] + } else if (typeof parsedOutput !== 'object') { + throw new ParseError( + `Invalid JSON object: ${JSON.stringify(parsedOutput)}` + ) + } + + return parsedOutput + } catch (err: any) { + if (err instanceof JSONRepairError) { + throw new ParseError(err.message, { cause: err }) + } else if (err instanceof SyntaxError) { + throw new ParseError(`Invalid JSON object: ${err.message}`, { + cause: err + }) + } else { + throw err + } + } +} + +/** + * Parses a boolean output from a string. + * + * @param output - string to parse + * @returns parsed boolean + */ +export function parseBooleanOutput(output: string): boolean { + output = output + .toLowerCase() + .trim() + .replace(/[!.?]+$/, '') + + const booleanOutput = BOOLEAN_OUTPUTS[output] + + if (booleanOutput === undefined) { + throw new ParseError(`Invalid boolean output: ${output}`) + } else { + return booleanOutput + } +} + +/** + * Parses a number output from a string. + * + * @param output - string to parse + * @param outputSchema - zod number schema + * @returns parsed number + */ +export function parseNumberOutput( + output: string, + outputSchema: z.ZodNumber +): number { + output = output.trim() + + const numberOutput = outputSchema.isInt + ? Number.parseInt(output) + : Number.parseFloat(output) + + if (Number.isNaN(numberOutput)) { + throw new ParseError(`Invalid number output: ${output}`) + } + + return numberOutput +} diff --git a/src/reset.d.ts b/src/reset.d.ts new file mode 100644 index 000000000..69fc8bf0a --- /dev/null +++ b/src/reset.d.ts @@ -0,0 +1 @@ +import '@total-typescript/ts-reset' diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts new file mode 100644 index 000000000..87b71a114 --- /dev/null +++ b/src/services/dexa-client.ts @@ -0,0 +1,37 @@ +import { type Prompt } from '@dexaai/dexter' +import defaultKy, { type KyInstance } from 'ky' + +import { assert, getEnv } from '../utils.js' + +export class DexaClient { + readonly apiKey: string + readonly apiBaseUrl: string + readonly ky: KyInstance + + constructor({ + apiKey = getEnv('DEXA_API_KEY'), + apiBaseUrl = getEnv('DEXA_API_BASE_URL') ?? 'https://dexa.ai', + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert(apiKey, 'DEXA_API_KEY is required') + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, timeout: 60_000 }) + } + + async generateResponse({ messages }: { messages: Prompt.Msg[] }) { + return this.ky + .post('api/ask-dexa', { + json: { + secret: this.apiKey, + messages + } + }) + .json() + } +} diff --git a/src/services/openai-client.ts b/src/services/openai-client.ts new file mode 100644 index 000000000..03c812fa5 --- /dev/null +++ b/src/services/openai-client.ts @@ -0,0 +1,5 @@ +import '../config.js' + +import { OpenAI } from 'openai' + +export const openaiClient = new OpenAI() diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts new file mode 100644 index 000000000..e21d7c6a5 --- /dev/null +++ b/src/services/scraper-client.ts @@ -0,0 +1,67 @@ +import defaultKy, { type KyInstance } from 'ky' + +export type ScrapeResult = { + author: string + byline: string + /** The HTML for the main content of the page. */ + content: string + description: string + imageUrl: string + lang: string + length: number + logoUrl: string + /** The text for the main content of the page in markdown format. */ + markdownContent: string + publishedTime: string + /** The raw HTML response from the server. */ + rawHtml: string + siteName: string + /** The text for the main content of the page. */ + textContent: string + title: string +} + +/** + * This is a single endpoint API for scraping websites. It returns the HTML, + * markdown, and plaintext for main body content of the page, as well as + * metadata like title and description. + * + * It tries the simplest and fastest methods first, and falls back to slower + * proxies and JavaScript rendering if needed. + */ +export class ScraperClient { + readonly apiBaseUrl: string + readonly ky: KyInstance + + constructor({ + apiBaseUrl = process.env.SCRAPER_API_BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + if (!apiBaseUrl) { + throw new Error('SCRAPER_API_BASE_URL is required') + } + + this.apiBaseUrl = apiBaseUrl + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl }) + } + + async scrapeUrl( + url: string, + { + timeout = 60_000 + }: { + timeout?: number + } = {} + ): Promise { + return this.ky + .post('scrape', { + json: { url }, + timeout + }) + .json() + } +} diff --git a/src/services/serpapi.ts b/src/services/serpapi.ts new file mode 100644 index 000000000..c275254b2 --- /dev/null +++ b/src/services/serpapi.ts @@ -0,0 +1,699 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { aiFunction, AIToolsProvider } from '../fns.js' +import { getEnv } from '../utils.js' + +/** + * All types have been exported from the `serpapi` package, which we're + * not using directly because it is bloated and has compatibility issues. + */ + +export namespace serpapi { + export type BaseResponse

> = { + search_metadata: { + id: string + status: string | 'Queued' | 'Processing' | 'Success' + json_endpoint: string + created_at: string + processed_at: string + raw_html_file: string + total_time_taken: number + } + search_parameters: { + engine: string + } & Omit + serpapi_pagination?: { + next: string + } + pagination?: { + next: string + } + [key: string]: any + } + + export type BaseParameters = { + /** + * Parameter defines the device to use to get the results. It can be set to + * `desktop` (default) to use a regular browser, `tablet` to use a tablet browser + * (currently using iPads), or `mobile` to use a mobile browser (currently + * using iPhones). + */ + device?: 'desktop' | 'tablet' | 'mobile' + + /** + * Parameter will force SerpApi to fetch the Google results even if a cached + * version is already present. A cache is served only if the query and all + * parameters are exactly the same. Cache expires after 1h. Cached searches + * are free, and are not counted towards your searches per month. It can be set + * to `false` (default) to allow results from the cache, or `true` to disallow + * results from the cache. `no_cache` and `async` parameters should not be used together. + */ + no_cache?: boolean + + /** + * Parameter defines the way you want to submit your search to SerpApi. It can + * be set to `false` (default) to open an HTTP connection and keep it open until + * you got your search results, or `true` to just submit your search to SerpApi + * and retrieve them later. In this case, you'll need to use our + * [Searches Archive API](https://serpapi.com/search-archive-api) to retrieve + * your results. `async` and `no_cache` parameters should not be used together. + * `async` should not be used on accounts with + * [Ludicrous Speed](https://serpapi.com/plan) enabled. + */ + async?: boolean + + /** + * Parameter defines the SerpApi private key to use. + */ + api_key?: string | null + + /** + * Specify the client-side timeout of the request. In milliseconds. + */ + timeout?: number + } + + export type GoogleParameters = BaseParameters & { + /** + * Search Query + * Parameter defines the query you want to search. You can use anything that you + * would use in a regular Google search. e.g. `inurl:`, `site:`, `intitle:`. We + * also support advanced search query parameters such as as_dt and as_eq. See the + * [full list](https://serpapi.com/advanced-google-query-parameters) of supported + * advanced search query parameters. + */ + q: string + + /** + * Location + * Parameter defines from where you want the search to originate. If several + * locations match the location requested, we'll pick the most popular one. Head to + * the [/locations.json API](https://serpapi.com/locations-api) if you need more + * precise control. location and uule parameters can't be used together. Avoid + * utilizing location when setting the location outside the U.S. when using Google + * Shopping and/or Google Product API. + */ + location?: string + + /** + * Encoded Location + * Parameter is the Google encoded location you want to use for the search. uule + * and location parameters can't be used together. + */ + uule?: string + + /** + * Google Place ID + * Parameter defines the id (`CID`) of the Google My Business listing you want to + * scrape. Also known as Google Place ID. + */ + ludocid?: string + + /** + * Additional Google Place ID + * Parameter that you might have to use to force the knowledge graph map view to + * show up. You can find the lsig ID by using our [Local Pack + * API](https://serpapi.com/local-pack) or [Places Results + * API](https://serpapi.com/places-results). + * lsig ID is also available via a redirect Google uses within [Google My + * Business](https://www.google.com/business/). + */ + lsig?: string + + /** + * Google Knowledge Graph ID + * Parameter defines the id (`KGMID`) of the Google Knowledge Graph listing you + * want to scrape. Also known as Google Knowledge Graph ID. Searches with kgmid + * parameter will return results for the originally encrypted search parameters. + * For some searches, kgmid may override all other parameters except start, and num + * parameters. + */ + kgmid?: string + + /** + * Google Cached Search Parameters ID + * Parameter defines the cached search parameters of the Google Search you want to + * scrape. Searches with si parameter will return results for the originally + * encrypted search parameters. For some searches, si may override all other + * parameters except start, and num parameters. si can be used to scrape Google + * Knowledge Graph Tabs. + */ + si?: string + + /** + * Domain + * Parameter defines the Google domain to use. It defaults to `google.com`. Head to + * the [Google domains page](https://serpapi.com/google-domains) for a full list of + * supported Google domains. + */ + google_domain?: string + + /** + * Country + * Parameter defines the country to use for the Google search. It's a two-letter + * country code. (e.g., `us` for the United States, `uk` for United Kingdom, or + * `fr` for France). Head to the [Google countries + * page](https://serpapi.com/google-countries) for a full list of supported Google + * countries. + */ + gl?: string + + /** + * Language + * Parameter defines the language to use for the Google search. It's a two-letter + * language code. (e.g., `en` for English, `es` for Spanish, or `fr` for French). + * Head to the [Google languages page](https://serpapi.com/google-languages) for a + * full list of supported Google languages. + */ + hl?: string + + /** + * Set Multiple Languages + * Parameter defines one or multiple languages to limit the search to. It uses + * `lang_{two-letter language code}` to specify languages and `|` as a delimiter. + * (e.g., `lang_fr|lang_de` will only search French and German pages). Head to the + * [Google lr languages page](https://serpapi.com/google-lr-languages) for a full + * list of supported languages. + */ + lr?: string + + /** + * as_dt + * Parameter controls whether to include or exclude results from the site named in + * the as_sitesearch parameter. + */ + as_dt?: string + + /** + * as_epq + * Parameter identifies a phrase that all documents in the search results must + * contain. You can also use the [phrase + * search](https://developers.google.com/custom-search/docs/xml_results#PhraseSearchqt) + * query term to search for a phrase. + */ + as_epq?: string + + /** + * as_eq + * Parameter identifies a word or phrase that should not appear in any documents in + * the search results. You can also use the [exclude + * query](https://developers.google.com/custom-search/docs/xml_results#Excludeqt) + * term to ensure that a particular word or phrase will not appear in the documents + * in a set of search results. + */ + as_eq?: string + + /** + * as_lq + * Parameter specifies that all search results should contain a link to a + * particular URL. You can also use the + * [link:](https://developers.google.com/custom-search/docs/xml_results#BackLinksqt) + * query term for this type of query. + */ + as_lq?: string + + /** + * as_nlo + * Parameter specifies the starting value for a search range. Use as_nlo and as_nhi + * to append an inclusive search range. + */ + as_nlo?: string + + /** + * as_nhi + * Parameter specifies the ending value for a search range. Use as_nlo and as_nhi + * to append an inclusive search range. + */ + as_nhi?: string + + /** + * as_oq + * Parameter provides additional search terms to check for in a document, where + * each document in the search results must contain at least one of the additional + * search terms. You can also use the [Boolean + * OR](https://developers.google.com/custom-search/docs/xml_results#BooleanOrqt) + * query term for this type of query. + */ + as_oq?: string + + /** + * as_q + * Parameter provides search terms to check for in a document. This parameter is + * also commonly used to allow users to specify additional terms to search for + * within a set of search results. + */ + as_q?: string + + /** + * as_qdr + * Parameter requests search results from a specified time period (quick date + * range). The following values are supported: + * `d[number]`: requests results from the specified number of past days. Example + * for the past 10 days: `as_qdr=d10` + * `w[number]`: requests results from the specified number of past weeks. + * `m[number]`: requests results from the specified number of past months. + * `y[number]`: requests results from the specified number of past years. Example + * for the past year: `as_qdr=y` + */ + as_qdr?: string + + /** + * as_rq + * Parameter specifies that all search results should be pages that are related to + * the specified URL. The parameter value should be a URL. You can also use the + * [related:](https://developers.google.com/custom-search/docs/xml_results#RelatedLinksqt) + * query term for this type of query. + */ + as_rq?: string + + /** + * as_sitesearch + * Parameter allows you to specify that all search results should be pages from a + * given site. By setting the as_dt parameter, you can also use it to exclude pages + * from a given site from your search resutls. + */ + as_sitesearch?: string + + /** + * Advanced Search Parameters + * (to be searched) parameter defines advanced search parameters that aren't + * possible in the regular query field. (e.g., advanced search for patents, dates, + * news, videos, images, apps, or text contents). + */ + tbs?: string + + /** + * Adult Content Filtering + * Parameter defines the level of filtering for adult content. It can be set to + * `active`, or `off` (default). + */ + safe?: string + + /** + * Exclude Auto-corrected Results + * Parameter defines the exclusion of results from an auto-corrected query that is + * spelled wrong. It can be set to `1` to exclude these results, or `0` to include + * them (default). + */ + nfpr?: string + + /** + * Results Filtering + * Parameter defines if the filters for 'Similar Results' and 'Omitted Results' are + * on or off. It can be set to `1` (default) to enable these filters, or `0` to + * disable these filters. + */ + filter?: string + + /** + * Search Type + * (to be matched) parameter defines the type of search you want to do. + * It can be set to: + * `(no tbm parameter)`: regular Google Search, + * `isch`: [Google Images API](https://serpapi.com/images-results), + * `lcl` - [Google Local API](https://serpapi.com/local-results) + * `vid`: [Google Videos API](https://serpapi.com/videos-results), + * `nws`: [Google News API](https://serpapi.com/news-results), + * `shop`: [Google Shopping API](https://serpapi.com/shopping-results), + * or any other Google service. + */ + tbm?: string + + /** + * Result Offset + * Parameter defines the result offset. It skips the given number of results. It's + * used for pagination. (e.g., `0` (default) is the first page of results, `10` is + * the 2nd page of results, `20` is the 3rd page of results, etc.). + * Google Local Results only accepts multiples of `20`(e.g. `20` for the second + * page results, `40` for the third page results, etc.) as the start value. + */ + start?: number + + /** + * Number of Results + * Parameter defines the maximum number of results to return. (e.g., `10` (default) + * returns 10 results, `40` returns 40 results, and `100` returns 100 results). + */ + num?: number + + /** + * Page Number (images) + * Parameter defines the page number for [Google + * Images](https://serpapi.com/images-results). There are 100 images per page. This + * parameter is equivalent to start (offset) = ijn * 100. This parameter works only + * for [Google Images](https://serpapi.com/images-results) (set tbm to `isch`). + */ + ijn?: string + } + + export interface SearchResult extends BaseResponse { + search_metadata: SearchMetadata + search_parameters: SearchParameters + search_information: SearchInformation + local_map?: LocalMap + local_results?: LocalResults + answer_box?: AnswerBox + knowledge_graph?: KnowledgeGraph + inline_images?: InlineImage[] + inline_people_also_search_for?: InlinePeopleAlsoSearchFor[] + related_questions?: SearchResultRelatedQuestion[] + organic_results?: OrganicResult[] + related_searches?: RelatedSearch[] + pagination: Pagination + serpapi_pagination: Pagination + twitter_results?: TwitterResults + } + + interface TwitterResults { + title: string + link: string + displayed_link: string + tweets: Tweet[] + } + + interface Tweet { + link: string + snippet: string + published_date: string + } + + interface AnswerBox { + type: string + title: string + link: string + displayed_link: string + snippet: string + snippet_highlighted_words: string[] + images: string[] + about_this_result: AboutThisResult + about_page_link: string + cached_page_link: string + } + + interface InlineImage { + link: string + source: string + thumbnail: string + original: string + source_name: string + title?: string + } + + interface InlinePeopleAlsoSearchFor { + title: string + items: SearchItem[] + see_more_link: string + see_more_serpapi_link: string + } + + interface SearchItem { + name: string + image: string + link: string + serpapi_link: string + } + + interface KnowledgeGraph { + type: string + kgmid: string + knowledge_graph_search_link: string + serpapi_knowledge_graph_search_link: string + header_images: HeaderImage[] + description: string + source: Source + buttons: Button[] + people_also_search_for: SearchItem[] + people_also_search_for_link: string + people_also_search_for_stick: string + list: { [key: string]: string[] } + } + + interface Button { + text: string + subtitle: string + title: string + link: string + displayed_link: string + snippet?: string + snippet_highlighted_words?: string[] + answer?: string + thumbnail: string + search_link: string + serpapi_search_link: string + date?: string + list?: string[] + } + + interface HeaderImage { + image: string + source: string + } + + interface Source { + name: string + link: string + } + + interface LocalMap { + link: string + image: string + gps_coordinates: LocalMapGpsCoordinates + } + + interface LocalMapGpsCoordinates { + latitude: number + longitude: number + altitude: number + } + + interface LocalResults { + places: Place[] + more_locations_link: string + } + + interface Place { + position: number + title: string + rating?: number + reviews_original?: string + reviews?: number + place_id: string + place_id_search: string + lsig: string + thumbnail: string + gps_coordinates: PlaceGpsCoordinates + service_options: ServiceOptions + address?: string + type?: string + hours?: string + } + + interface PlaceGpsCoordinates { + latitude: number + longitude: number + } + + interface ServiceOptions { + dine_in?: boolean + takeout: boolean + no_delivery?: boolean + } + + interface OrganicResult { + position: number + title: string + link: string + displayed_link: string + thumbnail?: string + favicon?: string + snippet: string + snippet_highlighted_words: string[] + sitelinks?: Sitelinks + rich_snippet?: RichSnippet + about_this_result: AboutThisResult + cached_page_link: string + related_pages_link?: string + source: string + related_results?: RelatedResult[] + date?: string + related_questions?: OrganicResultRelatedQuestion[] + } + + interface AboutThisResult { + keywords: string[] + languages: string[] + regions: string[] + } + + interface OrganicResultRelatedQuestion { + question: string + snippet: string + snippet_links: SnippetLink[] + } + + interface SnippetLink { + text: string + link: string + } + + interface RelatedResult { + position: number + title: string + link: string + displayed_link: string + snippet: string + snippet_highlighted_words: string[] + about_this_result: AboutThisResult + cached_page_link: string + } + + interface RichSnippet { + bottom: Bottom + } + + interface Bottom { + extensions?: string[] + questions?: string[] + } + + interface Sitelinks { + inline: Inline[] + } + + interface Inline { + title: string + link: string + } + + interface Pagination { + current: number + next: string + other_pages: { [key: string]: string } + next_link?: string + } + + interface SearchResultRelatedQuestion { + question: string + snippet: string + title: string + link: string + displayed_link: string + thumbnail: string + next_page_token: string + serpapi_link: string + date?: string + } + + interface RelatedSearch { + query: string + link: string + } + + interface SearchInformation { + organic_results_state: string + query_displayed: string + total_results: number + time_taken_displayed: number + menu_items: MenuItem[] + } + + interface MenuItem { + position: number + title: string + link: string + serpapi_link?: string + } + + interface SearchMetadata { + id: string + status: string + json_endpoint: string + created_at: string + processed_at: string + google_url: string + raw_html_file: string + total_time_taken: number + } + + interface SearchParameters { + engine: string + q: string + google_domain: string + device?: 'desktop' | 'tablet' | 'mobile' + } + + export type Params = Omit + + export interface ClientOptions extends Partial { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } + + export const BASE_URL = 'https://serpapi.com' +} + +/** + * Lightweight wrapper around SerpAPI for Google search. + * + * @see https://serpapi.com/search-api + */ +export class SerpAPIClient extends AIToolsProvider { + protected api: KyInstance + protected apiKey: string + protected apiBaseUrl: string + protected params: Partial + + constructor({ + apiKey = getEnv('SERPAPI_API_KEY') ?? getEnv('SERP_API_KEY'), + apiBaseUrl = serpapi.BASE_URL, + ky = defaultKy, + ...params + }: serpapi.ClientOptions = {}) { + if (!apiKey) { + throw new Error(`Error SerpAPIClient missing required "apiKey"`) + } + + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + this.params = params + + this.api = ky.extend({ + prefixUrl: this.apiBaseUrl + }) + } + + @aiFunction({ + name: 'serpapiGoogleSearch', + description: + 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', + schema: z.object({ + q: z.string().describe('search query'), + num: z.number().int().positive().default(5).optional() + }) + }) + async search(queryOrOpts: string | serpapi.GoogleParameters) { + const defaultGoogleParams: Partial = {} + const options: serpapi.GoogleParameters = + typeof queryOrOpts === 'string' + ? { ...defaultGoogleParams, q: queryOrOpts } + : queryOrOpts + const { timeout, ...rest } = this.params + + // console.log('SerpAPIClient.search', options) + return this.api + .get('search', { + searchParams: { + ...rest, + engine: 'google', + api_key: this.apiKey, + ...(options as any) // TODO + }, + timeout + }) + .json() + } +} diff --git a/src/services/serper.ts b/src/services/serper.ts new file mode 100644 index 000000000..1265d3a2c --- /dev/null +++ b/src/services/serper.ts @@ -0,0 +1,274 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { aiFunction, AIToolsProvider } from '../fns.js' +import { getEnv } from '../utils.js' + +export namespace serper { + export const BASE_URL = 'https://google.serper.dev' + + export const SearchParamsSchema = z.object({ + q: z.string().describe('search query'), + autocorrect: z.boolean().default(true).optional(), + gl: z.string().default('us').optional(), + hl: z.string().default('en').optional(), + page: z.number().int().positive().default(1).optional(), + num: z.number().int().positive().default(10).optional() + }) + export type SearchParams = z.infer + + export interface SearchResponse { + searchParameters: SearchParameters & { type: 'search' } + organic: Organic[] + answerBox?: AnswerBox + knowledgeGraph?: KnowledgeGraph + topStories?: TopStory[] + peopleAlsoAsk?: PeopleAlsoAsk[] + relatedSearches?: RelatedSearch[] + } + + export interface SearchImagesResponse { + searchParameters: SearchParameters & { type: 'images' } + images: Image[] + } + + export interface SearchVideosResponse { + searchParameters: SearchParameters & { type: 'videos' } + videos: Video[] + } + + export interface SearchPlacesResponse { + searchParameters: SearchParameters & { type: 'places' } + places: Place[] + } + + export interface SearchNewsResponse { + searchParameters: SearchParameters & { type: 'news' } + news: News[] + } + + export interface SearchShoppingResponse { + searchParameters: SearchParameters & { type: 'shopping' } + shopping: Shopping[] + } + + export type Response = + | SearchResponse + | SearchImagesResponse + | SearchVideosResponse + | SearchPlacesResponse + | SearchNewsResponse + | SearchShoppingResponse + + export interface KnowledgeGraph { + title: string + type: string + website: string + imageUrl: string + description: string + descriptionSource: string + descriptionLink: string + attributes: Record + } + + export interface Organic { + title: string + link: string + snippet: string + position: number + imageUrl?: string + sitelinks?: SiteLink[] + } + + export interface AnswerBox { + snippet: string + snippetHighlighted?: string[] + title: string + link: string + date?: string + position?: number + } + + export interface SiteLink { + title: string + link: string + } + + export interface PeopleAlsoAsk { + question: string + snippet: string + title: string + link: string + } + + export interface RelatedSearch { + query: string + } + + export interface SearchParameters { + q: string + gl: string + hl: string + num: number + autocorrect: boolean + page: number + type: string + engine: string + } + + export interface TopStory { + title: string + link: string + source: string + date: string + imageUrl: string + } + + export interface Image { + title: string + imageUrl: string + imageWidth: number + imageHeight: number + thumbnailUrl: string + thumbnailWidth: number + thumbnailHeight: number + source: string + domain: string + link: string + googleUrl: string + position: number + } + + export interface Video { + title: string + link: string + snippet: string + date: string + imageUrl: string + position: number + } + + export interface Place { + position: number + title: string + address: string + latitude: number + longitude: number + category: string + phoneNumber?: string + website: string + cid: string + rating?: number + ratingCount?: number + } + + export interface News { + title: string + link: string + snippet: string + date: string + source: string + imageUrl: string + position: number + } + + export interface Shopping { + title: string + source: string + link: string + price: string + imageUrl: string + delivery?: Record + rating?: number + ratingCount?: number + offers?: string + productId?: string + position: number + } + + export interface ClientOptions extends Omit, 'q'> { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } +} + +/** + * Lightweight wrapper around Serper for Google search. + * + * @see https://serper.dev + */ +export class SerperClient extends AIToolsProvider { + protected api: KyInstance + protected apiKey: string + protected apiBaseUrl: string + protected params: Omit, 'q'> + + constructor({ + apiKey = getEnv('SERPER_API_KEY'), + apiBaseUrl = serper.BASE_URL, + ky = defaultKy, + ...params + }: serper.ClientOptions = {}) { + if (!apiKey) { + throw new Error( + `SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)` + ) + } + + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + this.params = params + + this.api = ky.extend({ + prefixUrl: this.apiBaseUrl, + headers: { + 'X-API-KEY': this.apiKey + } + }) + } + + @aiFunction({ + name: 'serperGoogleSearch', + description: + 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', + schema: serper.SearchParamsSchema + }) + async search(queryOrOpts: string | serper.SearchParams) { + return this._fetch('search', queryOrOpts) + } + + async searchImages(queryOrOpts: string | serper.SearchParams) { + return this._fetch('images', queryOrOpts) + } + + async searchVideos(queryOrOpts: string | serper.SearchParams) { + return this._fetch('videos', queryOrOpts) + } + + async searchPlaces(queryOrOpts: string | serper.SearchParams) { + return this._fetch('places', queryOrOpts) + } + + async searchNews(queryOrOpts: string | serper.SearchParams) { + return this._fetch('news', queryOrOpts) + } + + async searchProducts(queryOrOpts: string | serper.SearchParams) { + return this._fetch('shopping', queryOrOpts) + } + + protected async _fetch( + endpoint: string, + queryOrOpts: string | serper.SearchParams + ) { + const params = { + ...this.params, + ...(typeof queryOrOpts === 'string' ? { q: queryOrOpts } : queryOrOpts) + } + + return this.api.post(endpoint, { json: params }).json() + } +} diff --git a/src/services/twitter-client.ts b/src/services/twitter-client.ts new file mode 100644 index 000000000..37d9b74b6 --- /dev/null +++ b/src/services/twitter-client.ts @@ -0,0 +1,95 @@ +import { Nango } from '@nangohq/node' +import { auth, Client as TwitterClient } from 'twitter-api-sdk' + +import * as config from '../config.js' +import { assert } from '../utils.js' + +// The Twitter+Nango client auth connection key +const nangoTwitterProviderConfigKey = 'twitter-v2' + +// The Twitter OAuth2User class requires a client id, which we don't have +// since we're using Nango for auth, so instead we just pass a dummy value +// and allow Nango to handle all auth/refresh/access token management. +const twitterClientId = 'xbot' + +const defaultRequiredTwitterOAuthScopes = new Set([ + 'tweet.read', + 'users.read', + 'offline.access', + 'tweet.write' +]) + +let _nango: Nango | null = null + +function getNango(): Nango { + if (!_nango) { + const secretKey = process.env.NANGO_SECRET_KEY?.trim() + if (!secretKey) { + throw new Error(`Missing required "NANGO_SECRET_KEY"`) + } + + _nango = new Nango({ secretKey }) + } + + return _nango +} + +async function getTwitterAuth({ + scopes = defaultRequiredTwitterOAuthScopes +}: { scopes?: Set } = {}): Promise { + const nango = getNango() + const connection = await nango.getConnection( + nangoTwitterProviderConfigKey, + config.nangoConnectionId + ) + + // console.debug('nango twitter connection', connection) + // connection.credentials.raw + // { + // token_type: 'bearer', + // expires_in: number, + // access_token: string + // scope: string + // expires_at: string + // } + const connectionScopes = new Set( + connection.credentials.raw.scope.split(' ') + ) + const missingScopes = new Set() + + for (const scope of scopes) { + if (!connectionScopes.has(scope)) { + missingScopes.add(scope) + } + } + + if (missingScopes.size > 0) { + throw new Error( + `Nango connection ${ + config.nangoConnectionId + } is missing required OAuth scopes: ${[...missingScopes.values()].join( + ', ' + )}` + ) + } + + const token = connection.credentials.raw + assert(token) + + return new auth.OAuth2User({ + client_id: twitterClientId, + callback: config.nangoCallbackUrl, + scopes: [...scopes.values()] as any, + token + }) +} + +export async function getTwitterClient({ + scopes = defaultRequiredTwitterOAuthScopes +}: { scopes?: Set } = {}): Promise { + // NOTE: Nango handles refreshing the oauth access token for us + const twitterAuth = await getTwitterAuth({ scopes }) + + // Twitter API v2 using OAuth 2.0 + return new TwitterClient(twitterAuth) +} diff --git a/src/services/weather.ts b/src/services/weather.ts new file mode 100644 index 000000000..b8271552f --- /dev/null +++ b/src/services/weather.ts @@ -0,0 +1,143 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { getEnv } from '../../utils/helpers.js' +import { aiFunction, AIToolsProvider } from '../fns.js' + +export namespace weatherapi { + export const BASE_URL = 'https://api.weatherapi.com/v1' + + export interface CurrentWeatherResponse { + current: CurrentWeather + location: WeatherLocation + } + + export interface CurrentWeather { + cloud: number + condition: WeatherCondition + feelslike_c: number + feelslike_f: number + gust_kph: number + gust_mph: number + humidity: number + is_day: number + last_updated: string + last_updated_epoch: number + precip_in: number + precip_mm: number + pressure_in: number + pressure_mb: number + temp_c: number + temp_f: number + uv: number + vis_km: number + vis_miles: number + wind_degree: number + wind_dir: string + wind_kph: number + wind_mph: number + } + + export interface WeatherCondition { + code: number + icon: string + text: string + } + + export interface WeatherLocation { + country: string + lat: number + localtime: string + localtime_epoch: number + lon: number + name: string + region: string + tz_id: string + } + + export interface WeatherIPInfoResponse { + ip: string + type: string + continent_code: string + continent_name: string + country_code: string + country_name: string + is_eu: string + geoname_id: number + city: string + region: string + lat: number + lon: number + tz_id: string + localtime_epoch: number + localtime: string + } +} + +export class WeatherClient extends AIToolsProvider { + protected api: KyInstance + protected apiKey: string + protected apiBaseUrl: string + + constructor({ + apiKey = getEnv('WEATHER_API_KEY'), + apiBaseUrl = weatherapi.BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + if (!apiKey) { + throw new Error(`Error WeatherClient missing required "apiKey"`) + } + + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.api = ky.extend({ prefixUrl: apiBaseUrl }) + } + + @aiFunction({ + name: 'getCurrentWeather', + description: 'Gets info about the current weather at a given location.', + schema: z.object({ + q: z + .string() + .describe( + 'Location to get the weather for. May be a city name, zipcode, IP address, or lat/lng coordinates. Example: "London"' + ) + }) + }) + async getCurrentWeather(queryOrOptions: string | { q: string }) { + const options = + typeof queryOrOptions === 'string' + ? { q: queryOrOptions } + : queryOrOptions + + return this.api + .get('current.json', { + searchParams: { + key: this.apiKey, + ...options + } + }) + .json() + } + + async ipInfo(ipOrOptions: string | { q: string }) { + const options = + typeof ipOrOptions === 'string' ? { q: ipOrOptions } : ipOrOptions + + return this.api + .get('ip.json', { + searchParams: { + key: this.apiKey, + ...options + } + }) + .json() + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 000000000..68deaf38e --- /dev/null +++ b/src/types.ts @@ -0,0 +1,2 @@ +// TODO +export type TODO = 'TODO' diff --git a/src/utils.test.ts b/src/utils.test.ts new file mode 100644 index 000000000..c135c4be0 --- /dev/null +++ b/src/utils.test.ts @@ -0,0 +1,17 @@ +import { expect, test } from 'vitest' + +import { omit, pick } from './utils.js' + +test('pick', () => { + expect(pick({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ a: 1, c: 3 }) + expect( + pick({ a: { b: 'foo' }, d: -1, foo: null } as any, 'b', 'foo') + ).toEqual({ foo: null }) +}) + +test('omit', () => { + expect(omit({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ b: 2 }) + expect( + omit({ a: { b: 'foo' }, d: -1, foo: null } as any, 'b', 'foo') + ).toEqual({ a: { b: 'foo' }, d: -1 }) +}) diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 000000000..f1eee7a4a --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,62 @@ +export { default as assert } from 'tiny-invariant' + +/** + * From `inputObj`, create a new object that does not include `keys`. + * + * @example + * ```js + * omit({ a: 1, b: 2, c: 3 }, 'a', 'c') // { b: 2 } + * ``` + */ +export const omit = < + T extends Record, + K extends keyof T = keyof T +>( + inputObj: T, + ...keys: K[] +): Omit => { + const keysSet = new Set(keys) + return Object.fromEntries( + Object.entries(inputObj).filter(([k]) => !keysSet.has(k as any)) + ) as any +} + +/** + * From `inputObj`, create a new object that only includes `keys`. + * + * @example + * ```js + * pick({ a: 1, b: 2, c: 3 }, 'a', 'c') // { a: 1, c: 3 } + * ``` + */ +export const pick = < + T extends Record, + K extends keyof T = keyof T +>( + inputObj: T, + ...keys: K[] +): Pick => { + const keysSet = new Set(keys) + return Object.fromEntries( + Object.entries(inputObj).filter(([k]) => keysSet.has(k as any)) + ) as any +} + +export function pruneUndefined>( + obj: T +): NonNullable { + return Object.fromEntries( + Object.entries(obj).filter(([, value]) => value !== undefined) + ) as NonNullable +} + +export function getEnv(name: string): string | undefined { + try { + return typeof process !== 'undefined' + ? // eslint-disable-next-line no-process-env + process.env?.[name] + : undefined + } catch { + return undefined + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..d2bbb306b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "lib": ["ESNext"], + "esModuleInterop": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "useDefineForClassFields": true, + "jsx": "preserve", + + "strict": true, + "noUncheckedIndexedAccess": true, + "forceConsistentCasingInFileNames": true, + + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "dist", + "sourceMap": true + }, + "include": ["src", "bin"] +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 000000000..bbb2d78b9 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'tsup' + +export default defineConfig([ + { + entry: ['src/index.ts'], + outDir: 'dist', + target: 'node18', + platform: 'node', + format: ['esm'], + splitting: false, + sourcemap: true, + minify: false, + shims: true, + dts: true + } +]) From 19706bfe18906a2590fe50245c459745bd8a9078 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 16 May 2024 18:38:36 -0700 Subject: [PATCH 02/81] =?UTF-8?q?=F0=9F=90=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + pnpm-lock.yaml | 11 + src/services/clearbit.ts | 660 +++++++++++++++++++++++++++++++++++++++ src/services/weather.ts | 7 +- src/types.ts | 4 +- src/utils.ts | 26 ++ 6 files changed, 703 insertions(+), 7 deletions(-) create mode 100644 src/services/clearbit.ts diff --git a/package.json b/package.json index 09fecbe5e..bd46a4b1b 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ }, "dependencies": { "@dexaai/dexter": "^2.0.0", + "delay": "^6.0.0", "dotenv": "^16.4.5", "execa": "^8.0.1", "exit-hook": "^4.0.0", @@ -53,6 +54,7 @@ "openai": "^4.47.1", "p-map": "^7.0.2", "p-retry": "^6.2.0", + "p-throttle": "^6.1.0", "tiny-invariant": "^1.3.3", "type-fest": "^4.16.0", "zod": "^3.23.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9468042d..165c2f92e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@dexaai/dexter': specifier: ^2.0.0 version: 2.0.2 + delay: + specifier: ^6.0.0 + version: 6.0.0 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -32,6 +35,9 @@ dependencies: p-retry: specifier: ^6.2.0 version: 6.2.0 + p-throttle: + specifier: ^6.1.0 + version: 6.1.0 tiny-invariant: specifier: ^1.3.3 version: 1.3.3 @@ -2056,6 +2062,11 @@ packages: slash: 4.0.0 dev: true + /delay@6.0.0: + resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} + engines: {node: '>=16'} + dev: false + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} diff --git a/src/services/clearbit.ts b/src/services/clearbit.ts new file mode 100644 index 000000000..b57d11ede --- /dev/null +++ b/src/services/clearbit.ts @@ -0,0 +1,660 @@ +import defaultKy from 'ky' +import pThrottle from 'p-throttle' + +import type * as types from '../types.js' +import { assert, delay, getEnv, throttleKy } from '../utils.js' + +const clearbitAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export interface CompanyEnrichmentOptions { + domain: string + webhook_url?: string + company_name?: string + linkedin?: string + twitter?: string + facebook?: string +} + +type CompanyNullableProps = { + name: string + legalName: string + domain: string + domainAliases: string[] + site: { + phoneNumbers: string[] + emailAddresses: string[] + } + category: { + sector: string + industryGroup: string + industry: string + subIndustry: string + gicsCode: string + sicCode: string + sic4Codes: string[] + naicsCode: string + naics6Codes: string[] + naics6Codes2022: string[] + } + tags: string[] + description: string + foundedYear: number + location: string + timeZone: string + utcOffset: number + geo: { + streetNumber: string + streetName: string + subPremise: string + streetAddress: string + city: string + postalCode: string + state: string + stateCode: string + country: string + countryCode: string + lat: number + lng: number + } + logo: string + facebook: { + handle: string + likes: number + } + linkedin: { + handle: string + } + twitter: { + handle: string + id: string + bio: string + followers: number + following: number + location: string + site: string + avatar: string + } + crunchbase: { + handle: string + } + emailProvider: boolean + type: string + ticker: string + identifiers: { + usEIN: string + usCIK: string + } + phone: string + metrics: { + alexaUsRank: number + alexaGlobalRank: number + trafficRank: string + employees: number + employeesRange: string + marketCap: string + raised: number + annualRevenue: string + estimatedAnnualRevenue: string + fiscalYearEnd: string + } + indexedAt: string + tech: string[] + techCategories: string[] + parent: { + domain: string + } + ultimateParent: { + domain: string + } +} + +type EmailLookupResponse = DeepNullable<{ + id: string + name: { + fullName: string + givenName: string + familyName: string + } + email: string + location: string + timeZone: string + utcOffset: number + geo: { + city: string + state: string + stateCode: string + country: string + countryCode: string + lat: number + lng: number + } + bio: string + site: string + avatar: string + employment: { + domain: string + name: string + title: string + role: string + subRole: string + seniority: string + } + facebook: { + handle: string + } + github: { + handle: string + id: string + avatar: string + company: string + blog: string + followers: number + following: number + } + twitter: { + handle: string + id: string + bio: string + followers: number + following: number + statuses: number + favorites: number + location: string + site: string + avatar: string + } + linkedin: { + handle: string + } + googleplus: { + handle: null + } + gravatar: { + handle: string + urls: { + value: string + title: string + }[] + avatar: string + avatars: { + url: string + type: string + }[] + } + fuzzy: boolean + emailProvider: boolean + indexedAt: string + phone: string + activeAt: string + inactiveAt: string +}> + +export type CompanyResponse = { + id: string +} & DeepNullable + +export interface CompanySearchOptions { + /** + * See clearbit docs: https://dashboard.clearbit.com/docs?shell#discovery-api-tech-queries + * Examples: + * tech:google_apps + * or:(twitter_followers:10000~ type:nonprofit) + */ + query: string + page?: number + page_size?: number + limit?: number + sort?: string +} + +export interface CompanySearchResponse { + total: number + page: number + results: CompanyResponse[] +} + +export interface BasicCompanyResponse { + domain: string + logo: string + name: string +} + +export interface PeopleSearchOptionsV2 { + domains?: string[] + names?: string[] + roles?: string[] + seniorities?: string[] + titles?: string[] + locations?: string[] + employees_ranges?: string[] + company_tags?: string[] + company_tech?: string[] + company_types?: string[] + industries?: string[] + revenue_ranges?: string[] + linkedin_profile_handles?: string[] + page?: number + page_size?: number + suppression?: string +} + +// Prospector types +export interface ProspectorResponseV2 { + page: number + page_size: number + total: number + results: PersonAttributesV2[] +} + +export interface EmploymentAttributes { + company: string + domain: string + linkedin: string + title: string + role: string + subRole: string + seniority: string + startDate: string + endDate: string + present: boolean + highlight: boolean +} + +export interface EmailAttributes { + address: string + type: string +} + +export interface PhoneAttributes { + number: string + type: string +} + +interface Name { + givenName: string + familyName: string + fullName: string +} + +export type PersonAttributesV2 = { + id: string +} & DeepNullable<{ + name: Name + avatar: string + location: string + linkedin: string + employments: EmploymentAttributes[] + emails: EmailAttributes[] + phones: PhoneAttributes[] +}> + +type PeopleSearchOptionsV1 = { + domain: string + role?: string + roles?: string[] + seniority?: string + seniorities?: string[] + title?: string + titles?: string[] + city?: string + cities?: string[] + state?: string + states?: string[] + country?: string + countries?: string[] + name?: string + query?: string + page?: number + page_size?: number + suppression?: string +} + +interface Company { + name: string +} + +interface PeopleSearchResponseV1 { + id: string + name: Name + title: string + role: string + subRole: string + seniority: string + company: Company + email: string + verified: boolean + phone: string +} + +export interface ProspectorResponseV1 { + page: number + page_size: number + total: number + results: PeopleSearchResponseV1[] +} + +interface GeoIP { + city: string + state: string + stateCode: string + country: string + countryCode: string +} + +interface CompanyRevealResponse { + ip: string + fuzzy: boolean + domain: string + type: string + company?: CompanyResponse + geoIP: GeoIP + confidenceScore: 'very_high' | 'high' | 'medium' | 'low' + role: string + seniority: string +} + +export class ClearbitClient { + api: typeof defaultKy + apiKey: string + _maxPageSize = 100 + + static PersonRoles = [ + 'communications', + 'customer_service', + 'education', + 'engineering', + 'finance', + 'health_professional', + 'human_resources', + 'information_technology', + 'leadership', + 'legal', + 'marketing', + 'operations', + 'product', + 'public_relations', + 'real_estate', + 'recruiting', + 'research', + 'sales' + ] + + static SenioritiesV2 = [ + 'Executive', + 'VP', + 'Owner', + 'Partner', + 'Director', + 'Manager', + 'Senior', + 'Entry' + ] + + static Seniorities = ['executive', 'director', 'manager'] + + static SubIndustries: string[] = [ + 'Automotive', + 'Consumer Discretionary', + 'Consumer Goods', + 'Consumer Electronics', + 'Household Appliances', + 'Photography', + 'Sporting Goods', + 'Apparel, Accessories & Luxury Goods', + 'Textiles', + 'Textiles, Apparel & Luxury Goods', + 'Consumer Services', + 'Education Services', + 'Specialized Consumer Services', + 'Casinos & Gaming', + 'Hotels, Restaurants & Leisure', + 'Leisure Facilities', + 'Restaurants', + 'Education', + 'Family Services', + 'Legal Services', + 'Advertising', + 'Broadcasting', + 'Media', + 'Movies & Entertainment', + 'Public Relations', + 'Publishing', + 'Distributors', + 'Retailing', + 'Home Improvement Retail', + 'Homefurnishing Retail', + 'Specialty Retail', + 'Consumer Staples', + 'Food Retail', + 'Beverages', + 'Agricultural Products', + 'Food', + 'Food Production', + 'Packaged Foods & Meats', + 'Tobacco', + 'Cosmetics', + 'Oil & Gas', + 'Banking & Mortgages', + 'Accounting', + 'Finance', + 'Financial Services', + 'Asset Management & Custody Banks', + 'Diversified Capital Markets', + 'Fundraising', + 'Investment Banking & Brokerage', + 'Payments', + 'Insurance', + 'Real Estate', + 'Eyewear', + 'Health & Wellness', + 'Health Care', + 'Health Care Services', + 'Biotechnology', + 'Life Sciences Tools & Services', + 'Pharmaceuticals', + 'Aerospace & Defense', + 'Capital Goods', + 'Civil Engineering', + 'Construction', + 'Construction & Engineering', + 'Mechanical Engineering', + 'Electrical', + 'Electrical Equipment', + 'Industrials & Manufacturing', + 'Industrial Machinery', + 'Machinery', + 'Trading Companies & Distributors', + 'Business Supplies', + 'Commercial Printing', + 'Corporate & Business', + 'Architecture', + 'Automation', + 'Consulting', + 'Design', + 'Human Resource & Employment Services', + 'Professional Services', + 'Research & Consulting Services', + 'Industrials', + 'Shipping & Logistics', + 'Airlines', + 'Marine', + 'Ground Transportation', + 'Transportation', + 'Semiconductors', + 'Cloud Services', + 'Internet', + 'Internet Software & Services', + 'Data Processing & Outsourced Services', + 'Graphic Design', + 'Communications', + 'Computer Networking', + 'Nanotechnology', + 'Computer Hardware', + 'Technology Hardware, Storage & Peripherals', + 'Building Materials', + 'Chemicals', + 'Commodity Chemicals', + 'Containers & Packaging', + 'Gold', + 'Metals & Mining', + 'Paper Products', + 'Integrated Telecommunication Services', + 'Wireless Telecommunication Services', + 'Renewable Energy', + 'Energy', + 'Utilities' + ] + + constructor({ + apiKey = getEnv('CLEARBIT_KEY'), + timeoutMs = 30_000, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + timeoutMs?: number + ky?: typeof defaultKy + } = {}) { + assert(apiKey, 'Error clearbit client missing required "apiKey"') + + this.apiKey = apiKey + + const throttledKy = throttleKy(ky, clearbitAPIThrottle) + + this.api = throttledKy.extend({ + timeout: timeoutMs, + headers: { + Authorization: `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}` + } + }) + } + + async companyEnrichment(options: CompanyEnrichmentOptions) { + return this.api + .get('https://company-stream.clearbit.com/v2/companies/find', { + searchParams: { ...options } + }) + .json() + .catch((_) => undefined) + } + + async companySearch(options: CompanySearchOptions) { + return this.api + .get('https://discovery.clearbit.com/v1/companies/search', { + searchParams: { ...options } + }) + .json() + } + + async companyAutocomplete(name: string) { + return this.api + .get('https://autocomplete.clearbit.com/v1/companies/suggest', { + searchParams: { query: name } + }) + .json() + } + + async prospectorPeopleV2(options: PeopleSearchOptionsV2) { + return this.api + .get('https://prospector.clearbit.com/v2/people/search', { + // @ts-expect-error location is a string[] and searchparams shows a TS error heres + searchParams: { + ...options, + page_size: Math.min( + this._maxPageSize, + options.page_size || this._maxPageSize + ) + } + }) + .json() + } + + async prospectorPeopleV1(options: PeopleSearchOptionsV1, loadEmail = false) { + return this.api + .get('https://prospector.clearbit.com/v1/people/search', { + // @ts-expect-error location is a string[] and searchparams shows a TS error heres + searchParams: { + ...options, + page_size: Math.min( + this._maxPageSize, + options.page_size || this._maxPageSize + ), + email: loadEmail + } + }) + .json() + } + + // TODO Status code = 202 means the response was queued. + // Implement webhook when needed. The polling works well, in most cases we need to try + // again once to get a 200 response. + async emailLookup({ + email, + maxRetries + }: { + email: string + maxRetries?: number + }) { + const url = 'https://person.clearbit.com/v2/people/find' + let response = await this.api.get(url, { + searchParams: { email } + }) + + if (response.status !== 202 || !maxRetries) { + return response.json() + } + + if (maxRetries && response.status === 202) { + let count = 0 + let running = true + while (running && count < maxRetries) { + console.log(`Email Lookup was queued, retry ${count + 1}.`) + await delay(1000) + response = await this.api.get(url, { + searchParams: { email } + }) + count++ + running = response.status === 202 + } + return response.json() + } + } + + async nameToDomain(name: string) { + return this.api + .get('https://company.clearbit.com/v1/domains/find', { + searchParams: { name } + }) + .json() + .catch((_) => undefined) + } + + async revealCompanyFromIp(ip: string) { + return this.api + .get('https://reveal.clearbit.com/v1/companies/find', { + searchParams: { ip } + }) + .json() + .catch((_) => undefined) + } + + static filterEmploymentProspectorV2( + companyName: string, + employments: Array | null> | null + ) { + if (employments && employments.length > 0) { + // We filter by employment endDate because some people could have multiple jobs at the same time. + // Here we want to filter by people that actively works at a specific company. + return employments + .filter((item) => !item?.endDate) + .some((item) => + item?.company?.toLowerCase().includes(companyName.toLowerCase()) + ) + } + return false + } +} diff --git a/src/services/weather.ts b/src/services/weather.ts index b8271552f..5222713ab 100644 --- a/src/services/weather.ts +++ b/src/services/weather.ts @@ -1,8 +1,8 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' -import { getEnv } from '../../utils/helpers.js' import { aiFunction, AIToolsProvider } from '../fns.js' +import { assert, getEnv } from '../utils.js' export namespace weatherapi { export const BASE_URL = 'https://api.weatherapi.com/v1' @@ -88,10 +88,7 @@ export class WeatherClient extends AIToolsProvider { apiBaseUrl?: string ky?: KyInstance } = {}) { - if (!apiKey) { - throw new Error(`Error WeatherClient missing required "apiKey"`) - } - + assert(apiKey, 'WEATHER_API_KEY is required') super() this.apiKey = apiKey diff --git a/src/types.ts b/src/types.ts index 68deaf38e..337a5c8ad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,2 +1,2 @@ -// TODO -export type TODO = 'TODO' +export type { KyInstance } from 'ky' +export type { ThrottledFunction } from 'p-throttle' diff --git a/src/utils.ts b/src/utils.ts index f1eee7a4a..b0575d9e0 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,3 +1,6 @@ +import type * as types from './types.js' + +export { default as delay } from 'delay' export { default as assert } from 'tiny-invariant' /** @@ -60,3 +63,26 @@ export function getEnv(name: string): string | undefined { return undefined } } + +/** + * Function that does nothing. + */ +export const noop = () => undefined + +/** + * Throttles HTTP requests made by a ky instance. + * + * Very useful for enforcing rate limits. + */ +export function throttleKy( + ky: types.KyInstance, + throttleFn: ( + function_: (...args_: Arguments) => ReturnValue + ) => types.ThrottledFunction<(...args_: Arguments) => ReturnValue> +) { + return ky.extend({ + hooks: { + beforeRequest: [throttleFn(noop)] + } + }) +} From 0953469e8dc667e1309e2a9e61a1f7fbe024bec1 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 21 May 2024 08:52:06 -0500 Subject: [PATCH 03/81] =?UTF-8?q?=F0=9F=94=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 23 + package.json | 2 + pnpm-lock.yaml | 15 +- src/_utils.ts | 44 ++ src/config.ts | 5 - src/fns.ts | 124 ++++++ src/function-set.ts | 70 ++++ src/index.ts | 5 + src/services/clearbit.ts | 717 ++++++++++++++++---------------- src/services/diffbot.ts | 453 ++++++++++++++++++++ src/services/index.ts | 9 + src/services/openai-client.ts | 6 +- src/services/scraper-client.ts | 8 +- src/services/serpapi.ts | 70 ++-- src/services/serper.ts | 27 +- src/services/twitter-client.ts | 46 +- src/services/weather.ts | 14 +- src/stringify-for-model.test.ts | 22 + src/stringify-for-model.ts | 18 + src/tool-set.ts | 85 ++++ src/types.ts | 14 + src/utils.test.ts | 35 +- src/zod-to-json-schema.test.ts | 63 +++ src/zod-to-json-schema.ts | 17 + tsconfig.json | 3 + 25 files changed, 1452 insertions(+), 443 deletions(-) create mode 100644 bin/scratch.ts create mode 100644 src/_utils.ts delete mode 100644 src/config.ts create mode 100644 src/fns.ts create mode 100644 src/function-set.ts create mode 100644 src/services/diffbot.ts create mode 100644 src/services/index.ts create mode 100644 src/stringify-for-model.test.ts create mode 100644 src/stringify-for-model.ts create mode 100644 src/tool-set.ts create mode 100644 src/zod-to-json-schema.test.ts create mode 100644 src/zod-to-json-schema.ts diff --git a/bin/scratch.ts b/bin/scratch.ts new file mode 100644 index 000000000..700816535 --- /dev/null +++ b/bin/scratch.ts @@ -0,0 +1,23 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { gracefulExit } from 'exit-hook' +import restoreCursor from 'restore-cursor' + +import type * as types from '@/types.js' + +/** + * Scratch for quick testing. + */ +async function main() { + restoreCursor() + + return gracefulExit(0) +} + +try { + await main() +} catch (err) { + console.error('unexpected error', err) + gracefulExit(1) +} diff --git a/package.json b/package.json index bd46a4b1b..42d966606 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ }, "dependencies": { "@dexaai/dexter": "^2.0.0", + "chalk": "^5.3.0", "delay": "^6.0.0", "dotenv": "^16.4.5", "execa": "^8.0.1", @@ -55,6 +56,7 @@ "p-map": "^7.0.2", "p-retry": "^6.2.0", "p-throttle": "^6.1.0", + "restore-cursor": "^5.0.0", "tiny-invariant": "^1.3.3", "type-fest": "^4.16.0", "zod": "^3.23.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 165c2f92e..e37eea3d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@dexaai/dexter': specifier: ^2.0.0 version: 2.0.2 + chalk: + specifier: ^5.3.0 + version: 5.3.0 delay: specifier: ^6.0.0 version: 6.0.0 @@ -38,6 +41,9 @@ dependencies: p-throttle: specifier: ^6.1.0 version: 6.1.0 + restore-cursor: + specifier: ^5.0.0 + version: 5.0.0 tiny-invariant: specifier: ^1.3.3 version: 1.3.3 @@ -1659,7 +1665,6 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -5170,6 +5175,14 @@ packages: signal-exit: 3.0.7 dev: true + /restore-cursor@5.0.0: + resolution: {integrity: sha512-Hp93f349DvdEqJFHiPyzNzVjT7lDDFtQJWRotQVQNl3CHr4j7oMHStQB9UH/CJSHTrevAZXFvomgzy8lXjrK0w==} + engines: {node: '>=18'} + dependencies: + onetime: 6.0.0 + signal-exit: 4.1.0 + dev: false + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} diff --git a/src/_utils.ts b/src/_utils.ts new file mode 100644 index 000000000..81c492626 --- /dev/null +++ b/src/_utils.ts @@ -0,0 +1,44 @@ +import 'dotenv/config' + +import defaultKy, { + type AfterResponseHook, + type BeforeRequestHook, + type KyInstance +} from 'ky' + +const AGENTIC_TEST_MOCK_HEADER = 'x-agentic-test-mock' + +function defaultBeforeRequest(request: Request): Response { + return new Response( + JSON.stringify({ + url: request.url, + method: request.method, + headers: request.headers + }), + { + status: 200, + headers: { + 'Content-Type': 'application/json', + [AGENTIC_TEST_MOCK_HEADER]: '1' + } + } + ) +} + +export function mockKyInstance( + ky: KyInstance = defaultKy, + { + beforeRequest = defaultBeforeRequest, + afterResponse + }: { + beforeRequest?: BeforeRequestHook + afterResponse?: AfterResponseHook + } = {} +): KyInstance { + return ky.extend({ + hooks: { + beforeRequest: beforeRequest ? [beforeRequest] : [], + afterResponse: afterResponse ? [afterResponse] : [] + } + }) +} diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index af02b98a7..000000000 --- a/src/config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import dotenv from 'dotenv' - -import type * as types from './types.js' - -dotenv.config() diff --git a/src/fns.ts b/src/fns.ts new file mode 100644 index 000000000..8a4feaf84 --- /dev/null +++ b/src/fns.ts @@ -0,0 +1,124 @@ +import 'reflect-metadata' + +import type { z } from 'zod' + +import type * as types from './types.js' +import { FunctionSet } from './function-set.js' +import { ToolSet } from './tool-set.js' +import { zodToJsonSchema } from './zod-to-json-schema.js' + +export const invocableMetadataKey = Symbol('invocable') + +export interface Invocable { + name: string + description?: string + inputSchema?: z.AnyZodObject + callback: (args: Record) => Promise +} + +export abstract class AIToolsProvider { + private _tools?: ToolSet + private _functions?: FunctionSet + + get namespace() { + return this.constructor.name + } + + get tools(): ToolSet { + if (!this._tools) { + this._tools = ToolSet.fromFunctionSet(this.functions) + } + + return this._tools + } + + get functions(): FunctionSet { + if (!this._functions) { + const invocables = getInvocables(this) + const functions = invocables.map(getFunctionSpec) + this._functions = new FunctionSet(functions) + } + + return this._functions + } +} + +export function getFunctionSpec(invocable: Invocable): types.AIFunctionSpec { + const { name, description, inputSchema } = invocable + + return { + name, + description, + parameters: inputSchema + ? zodToJsonSchema(inputSchema) + : { + type: 'object', + properties: {} + } + } +} + +/** + * Constraints: + * - params must be an object, so the underlying function should only expect a + * single parameter + * - for the return value type `T | MaybePromise`, `T` must be serializable + * to JSON + */ +export function aiFunction({ + name, + description, + inputSchema +}: { + name?: string + description?: string + + // params must be an object, so the underlying function should only expect a + // single parameter + inputSchema?: z.AnyZodObject +}) { + return function ( + target: object, + propertyKey: string, + descriptor: PropertyDescriptor + ) { + const existingInvocables = getPrivateInvocables(target) + + existingInvocables.push({ + propertyKey, + description, + name, + inputSchema + }) + + setPrivateInvocables(target, existingInvocables) + + return descriptor.get ?? descriptor.value + } +} + +export function getInvocables(target: object): Invocable[] { + const invocables = getPrivateInvocables(target) + const namespace = target.constructor.name + + return invocables.map((invocable) => ({ + ...invocable, + name: invocable.name ?? `${namespace}_${invocable.propertyKey}`, + callback: (target as any)[invocable.propertyKey].bind(target) + })) +} + +interface PrivateInvocable { + propertyKey: string + name?: string + description?: string + inputSchema?: z.AnyZodObject +} + +function getPrivateInvocables(target: object): PrivateInvocable[] { + return Reflect.getMetadata(invocableMetadataKey, target) ?? [] +} + +function setPrivateInvocables(target: object, invocables: PrivateInvocable[]) { + Reflect.defineMetadata(invocableMetadataKey, invocables, target) +} diff --git a/src/function-set.ts b/src/function-set.ts new file mode 100644 index 000000000..0f6085c4f --- /dev/null +++ b/src/function-set.ts @@ -0,0 +1,70 @@ +import type { ToolSet } from './tool-set.js' +import type * as types from './types.ts' + +export class FunctionSet implements Iterable { + protected _map: Map + + constructor(functions?: readonly types.AIFunctionSpec[] | null) { + this._map = new Map(functions ? functions.map((fn) => [fn.name, fn]) : null) + } + + get size(): number { + return this._map.size + } + + add(fn: types.AIFunctionSpec): this { + this._map.set(fn.name, fn) + return this + } + + get(name: string): types.AIFunctionSpec | undefined { + return this._map.get(name) + } + + set(name: string, fn: types.AIFunctionSpec): this { + this._map.set(name, fn) + return this + } + + has(name: string): boolean { + return this._map.has(name) + } + + clear(): void { + this._map.clear() + } + + delete(name: string): boolean { + return this._map.delete(name) + } + + pick(...keys: string[]): FunctionSet { + const keysToIncludeSet = new Set(keys) + return new FunctionSet( + Array.from(this).filter((fn) => keysToIncludeSet.has(fn.name)) + ) + } + + omit(...keys: string[]): FunctionSet { + const keysToExcludeSet = new Set(keys) + return new FunctionSet( + Array.from(this).filter((fn) => !keysToExcludeSet.has(fn.name)) + ) + } + + get entries(): IterableIterator { + return this._map.values() + } + + [Symbol.iterator](): Iterator { + return this.entries + } + + static fromToolSet(toolSet: ToolSet): FunctionSet { + return new FunctionSet( + Array.from(toolSet) + .filter((tool) => tool.type === 'function') + .map((tool) => tool.function) + ) + } +} diff --git a/src/index.ts b/src/index.ts index 6c9f33158..6c52ac25b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1,7 @@ +export * from './fns.js' +export * from './function-set.js' +export * from './parse-structured-output.js' +export * from './services/index.js' +export * from './tool-set.js' export type * from './types.js' export * from './utils.js' diff --git a/src/services/clearbit.ts b/src/services/clearbit.ts index b57d11ede..9674ed875 100644 --- a/src/services/clearbit.ts +++ b/src/services/clearbit.ts @@ -1,368 +1,372 @@ import defaultKy from 'ky' import pThrottle from 'p-throttle' -import type * as types from '../types.js' +import type { DeepNullable } from '../types.js' import { assert, delay, getEnv, throttleKy } from '../utils.js' +// Only allow 20 clearbit API requests per 60s const clearbitAPIThrottle = pThrottle({ limit: 20, interval: 60 * 1000, strict: true }) -export interface CompanyEnrichmentOptions { - domain: string - webhook_url?: string - company_name?: string - linkedin?: string - twitter?: string - facebook?: string -} - -type CompanyNullableProps = { - name: string - legalName: string - domain: string - domainAliases: string[] - site: { - phoneNumbers: string[] - emailAddresses: string[] - } - category: { - sector: string - industryGroup: string - industry: string - subIndustry: string - gicsCode: string - sicCode: string - sic4Codes: string[] - naicsCode: string - naics6Codes: string[] - naics6Codes2022: string[] - } - tags: string[] - description: string - foundedYear: number - location: string - timeZone: string - utcOffset: number - geo: { - streetNumber: string - streetName: string - subPremise: string - streetAddress: string - city: string - postalCode: string - state: string - stateCode: string - country: string - countryCode: string - lat: number - lng: number - } - logo: string - facebook: { - handle: string - likes: number +export namespace clearbit { + export interface CompanyEnrichmentOptions { + domain: string + webhook_url?: string + company_name?: string + linkedin?: string + twitter?: string + facebook?: string } - linkedin: { - handle: string + + export type CompanyNullableProps = { + name: string + legalName: string + domain: string + domainAliases: string[] + site: { + phoneNumbers: string[] + emailAddresses: string[] + } + category: { + sector: string + industryGroup: string + industry: string + subIndustry: string + gicsCode: string + sicCode: string + sic4Codes: string[] + naicsCode: string + naics6Codes: string[] + naics6Codes2022: string[] + } + tags: string[] + description: string + foundedYear: number + location: string + timeZone: string + utcOffset: number + geo: { + streetNumber: string + streetName: string + subPremise: string + streetAddress: string + city: string + postalCode: string + state: string + stateCode: string + country: string + countryCode: string + lat: number + lng: number + } + logo: string + facebook: { + handle: string + likes: number + } + linkedin: { + handle: string + } + twitter: { + handle: string + id: string + bio: string + followers: number + following: number + location: string + site: string + avatar: string + } + crunchbase: { + handle: string + } + emailProvider: boolean + type: string + ticker: string + identifiers: { + usEIN: string + usCIK: string + } + phone: string + metrics: { + alexaUsRank: number + alexaGlobalRank: number + trafficRank: string + employees: number + employeesRange: string + marketCap: string + raised: number + annualRevenue: string + estimatedAnnualRevenue: string + fiscalYearEnd: string + } + indexedAt: string + tech: string[] + techCategories: string[] + parent: { + domain: string + } + ultimateParent: { + domain: string + } } - twitter: { - handle: string + + export type EmailLookupResponse = DeepNullable<{ id: string - bio: string - followers: number - following: number + name: { + fullName: string + givenName: string + familyName: string + } + email: string location: string + timeZone: string + utcOffset: number + geo: { + city: string + state: string + stateCode: string + country: string + countryCode: string + lat: number + lng: number + } + bio: string site: string avatar: string + employment: { + domain: string + name: string + title: string + role: string + subRole: string + seniority: string + } + facebook: { + handle: string + } + github: { + handle: string + id: string + avatar: string + company: string + blog: string + followers: number + following: number + } + twitter: { + handle: string + id: string + bio: string + followers: number + following: number + statuses: number + favorites: number + location: string + site: string + avatar: string + } + linkedin: { + handle: string + } + googleplus: { + handle: null + } + gravatar: { + handle: string + urls: { + value: string + title: string + }[] + avatar: string + avatars: { + url: string + type: string + }[] + } + fuzzy: boolean + emailProvider: boolean + indexedAt: string + phone: string + activeAt: string + inactiveAt: string + }> + + export type CompanyResponse = { + id: string + } & DeepNullable + + export interface CompanySearchOptions { + /** + * See clearbit docs: https://dashboard.clearbit.com/docs?shell#discovery-api-tech-queries + * Examples: + * tech:google_apps + * or:(twitter_followers:10000~ type:nonprofit) + */ + query: string + page?: number + page_size?: number + limit?: number + sort?: string } - crunchbase: { - handle: string - } - emailProvider: boolean - type: string - ticker: string - identifiers: { - usEIN: string - usCIK: string - } - phone: string - metrics: { - alexaUsRank: number - alexaGlobalRank: number - trafficRank: string - employees: number - employeesRange: string - marketCap: string - raised: number - annualRevenue: string - estimatedAnnualRevenue: string - fiscalYearEnd: string - } - indexedAt: string - tech: string[] - techCategories: string[] - parent: { - domain: string + + export interface CompanySearchResponse { + total: number + page: number + results: CompanyResponse[] } - ultimateParent: { + + export interface BasicCompanyResponse { domain: string + logo: string + name: string } -} -type EmailLookupResponse = DeepNullable<{ - id: string - name: { - fullName: string - givenName: string - familyName: string + export interface PeopleSearchOptionsV2 { + domains?: string[] + names?: string[] + roles?: string[] + seniorities?: string[] + titles?: string[] + locations?: string[] + employees_ranges?: string[] + company_tags?: string[] + company_tech?: string[] + company_types?: string[] + industries?: string[] + revenue_ranges?: string[] + linkedin_profile_handles?: string[] + page?: number + page_size?: number + suppression?: string } - email: string - location: string - timeZone: string - utcOffset: number - geo: { - city: string - state: string - stateCode: string - country: string - countryCode: string - lat: number - lng: number + + // Prospector types + export interface ProspectorResponseV2 { + page: number + page_size: number + total: number + results: PersonAttributesV2[] } - bio: string - site: string - avatar: string - employment: { + + export interface EmploymentAttributes { + company: string domain: string - name: string + linkedin: string title: string role: string subRole: string seniority: string + startDate: string + endDate: string + present: boolean + highlight: boolean } - facebook: { - handle: string - } - github: { - handle: string - id: string - avatar: string - company: string - blog: string - followers: number - following: number - } - twitter: { - handle: string - id: string - bio: string - followers: number - following: number - statuses: number - favorites: number - location: string - site: string - avatar: string - } - linkedin: { - handle: string - } - googleplus: { - handle: null - } - gravatar: { - handle: string - urls: { - value: string - title: string - }[] - avatar: string - avatars: { - url: string - type: string - }[] - } - fuzzy: boolean - emailProvider: boolean - indexedAt: string - phone: string - activeAt: string - inactiveAt: string -}> - -export type CompanyResponse = { - id: string -} & DeepNullable - -export interface CompanySearchOptions { - /** - * See clearbit docs: https://dashboard.clearbit.com/docs?shell#discovery-api-tech-queries - * Examples: - * tech:google_apps - * or:(twitter_followers:10000~ type:nonprofit) - */ - query: string - page?: number - page_size?: number - limit?: number - sort?: string -} - -export interface CompanySearchResponse { - total: number - page: number - results: CompanyResponse[] -} -export interface BasicCompanyResponse { - domain: string - logo: string - name: string -} - -export interface PeopleSearchOptionsV2 { - domains?: string[] - names?: string[] - roles?: string[] - seniorities?: string[] - titles?: string[] - locations?: string[] - employees_ranges?: string[] - company_tags?: string[] - company_tech?: string[] - company_types?: string[] - industries?: string[] - revenue_ranges?: string[] - linkedin_profile_handles?: string[] - page?: number - page_size?: number - suppression?: string -} - -// Prospector types -export interface ProspectorResponseV2 { - page: number - page_size: number - total: number - results: PersonAttributesV2[] -} - -export interface EmploymentAttributes { - company: string - domain: string - linkedin: string - title: string - role: string - subRole: string - seniority: string - startDate: string - endDate: string - present: boolean - highlight: boolean -} + export interface EmailAttributes { + address: string + type: string + } -export interface EmailAttributes { - address: string - type: string -} + export interface PhoneAttributes { + number: string + type: string + } -export interface PhoneAttributes { - number: string - type: string -} + interface Name { + givenName: string + familyName: string + fullName: string + } -interface Name { - givenName: string - familyName: string - fullName: string -} + export type PersonAttributesV2 = { + id: string + } & DeepNullable<{ + name: Name + avatar: string + location: string + linkedin: string + employments: EmploymentAttributes[] + emails: EmailAttributes[] + phones: PhoneAttributes[] + }> -export type PersonAttributesV2 = { - id: string -} & DeepNullable<{ - name: Name - avatar: string - location: string - linkedin: string - employments: EmploymentAttributes[] - emails: EmailAttributes[] - phones: PhoneAttributes[] -}> - -type PeopleSearchOptionsV1 = { - domain: string - role?: string - roles?: string[] - seniority?: string - seniorities?: string[] - title?: string - titles?: string[] - city?: string - cities?: string[] - state?: string - states?: string[] - country?: string - countries?: string[] - name?: string - query?: string - page?: number - page_size?: number - suppression?: string -} + export type PeopleSearchOptionsV1 = { + domain: string + role?: string + roles?: string[] + seniority?: string + seniorities?: string[] + title?: string + titles?: string[] + city?: string + cities?: string[] + state?: string + states?: string[] + country?: string + countries?: string[] + name?: string + query?: string + page?: number + page_size?: number + suppression?: string + email?: boolean + } -interface Company { - name: string -} + export interface Company { + name: string + } -interface PeopleSearchResponseV1 { - id: string - name: Name - title: string - role: string - subRole: string - seniority: string - company: Company - email: string - verified: boolean - phone: string -} + export interface PeopleSearchResponseV1 { + id: string + name: Name + title: string + role: string + subRole: string + seniority: string + company: Company + email: string + verified: boolean + phone: string + } -export interface ProspectorResponseV1 { - page: number - page_size: number - total: number - results: PeopleSearchResponseV1[] -} + export interface ProspectorResponseV1 { + page: number + page_size: number + total: number + results: PeopleSearchResponseV1[] + } -interface GeoIP { - city: string - state: string - stateCode: string - country: string - countryCode: string -} + export interface GeoIP { + city: string + state: string + stateCode: string + country: string + countryCode: string + } -interface CompanyRevealResponse { - ip: string - fuzzy: boolean - domain: string - type: string - company?: CompanyResponse - geoIP: GeoIP - confidenceScore: 'very_high' | 'high' | 'medium' | 'low' - role: string - seniority: string + export interface CompanyRevealResponse { + ip: string + fuzzy: boolean + domain: string + type: string + company?: CompanyResponse + geoIP: GeoIP + confidenceScore: 'very_high' | 'high' | 'medium' | 'low' + role: string + seniority: string + } } export class ClearbitClient { - api: typeof defaultKy - apiKey: string - _maxPageSize = 100 + readonly ky: typeof defaultKy + readonly apiKey: string + readonly _maxPageSize = 100 - static PersonRoles = [ + static readonly PersonRoles = [ 'communications', 'customer_service', 'education', @@ -383,7 +387,7 @@ export class ClearbitClient { 'sales' ] - static SenioritiesV2 = [ + static readonly SenioritiesV2 = [ 'Executive', 'VP', 'Owner', @@ -394,9 +398,9 @@ export class ClearbitClient { 'Entry' ] - static Seniorities = ['executive', 'director', 'manager'] + static readonly Seniorities = ['executive', 'director', 'manager'] - static SubIndustries: string[] = [ + static readonly SubIndustries = [ 'Automotive', 'Consumer Discretionary', 'Consumer Goods', @@ -510,12 +514,11 @@ export class ClearbitClient { ] constructor({ - apiKey = getEnv('CLEARBIT_KEY'), + apiKey = getEnv('CLEARBIT_API_KEY'), timeoutMs = 30_000, ky = defaultKy }: { apiKey?: string - apiBaseUrl?: string timeoutMs?: number ky?: typeof defaultKy } = {}) { @@ -525,7 +528,7 @@ export class ClearbitClient { const throttledKy = throttleKy(ky, clearbitAPIThrottle) - this.api = throttledKy.extend({ + this.ky = throttledKy.extend({ timeout: timeoutMs, headers: { Authorization: `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}` @@ -533,33 +536,33 @@ export class ClearbitClient { }) } - async companyEnrichment(options: CompanyEnrichmentOptions) { - return this.api + async companyEnrichment(options: clearbit.CompanyEnrichmentOptions) { + return this.ky .get('https://company-stream.clearbit.com/v2/companies/find', { searchParams: { ...options } }) - .json() + .json() .catch((_) => undefined) } - async companySearch(options: CompanySearchOptions) { - return this.api + async companySearch(options: clearbit.CompanySearchOptions) { + return this.ky .get('https://discovery.clearbit.com/v1/companies/search', { searchParams: { ...options } }) - .json() + .json() } async companyAutocomplete(name: string) { - return this.api + return this.ky .get('https://autocomplete.clearbit.com/v1/companies/suggest', { searchParams: { query: name } }) - .json() + .json() } - async prospectorPeopleV2(options: PeopleSearchOptionsV2) { - return this.api + async prospectorPeopleV2(options: clearbit.PeopleSearchOptionsV2) { + return this.ky .get('https://prospector.clearbit.com/v2/people/search', { // @ts-expect-error location is a string[] and searchparams shows a TS error heres searchParams: { @@ -570,42 +573,42 @@ export class ClearbitClient { ) } }) - .json() + .json() } - async prospectorPeopleV1(options: PeopleSearchOptionsV1, loadEmail = false) { - return this.api + async prospectorPeopleV1(options: clearbit.PeopleSearchOptionsV1) { + return this.ky .get('https://prospector.clearbit.com/v1/people/search', { // @ts-expect-error location is a string[] and searchparams shows a TS error heres searchParams: { + email: false, ...options, page_size: Math.min( this._maxPageSize, options.page_size || this._maxPageSize - ), - email: loadEmail + ) } }) - .json() + .json() } // TODO Status code = 202 means the response was queued. - // Implement webhook when needed. The polling works well, in most cases we need to try - // again once to get a 200 response. + // Implement webhook when needed. The polling works well, in most cases we need + // to try again once to get a 200 response. async emailLookup({ email, - maxRetries + maxRetries = 2 }: { email: string maxRetries?: number - }) { + }): Promise { const url = 'https://person.clearbit.com/v2/people/find' - let response = await this.api.get(url, { + let response = await this.ky.get(url, { searchParams: { email } }) if (response.status !== 202 || !maxRetries) { - return response.json() + return response.json() } if (maxRetries && response.status === 202) { @@ -614,37 +617,39 @@ export class ClearbitClient { while (running && count < maxRetries) { console.log(`Email Lookup was queued, retry ${count + 1}.`) await delay(1000) - response = await this.api.get(url, { + response = await this.ky.get(url, { searchParams: { email } }) count++ running = response.status === 202 } - return response.json() + return response.json() } + + throw new Error('clearbit email lookup error 202', { cause: response }) } async nameToDomain(name: string) { - return this.api + return this.ky .get('https://company.clearbit.com/v1/domains/find', { searchParams: { name } }) - .json() + .json() .catch((_) => undefined) } async revealCompanyFromIp(ip: string) { - return this.api + return this.ky .get('https://reveal.clearbit.com/v1/companies/find', { searchParams: { ip } }) - .json() + .json() .catch((_) => undefined) } static filterEmploymentProspectorV2( companyName: string, - employments: Array | null> | null + employments: Array | null> | null ) { if (employments && employments.length > 0) { // We filter by employment endDate because some people could have multiple jobs at the same time. diff --git a/src/services/diffbot.ts b/src/services/diffbot.ts new file mode 100644 index 000000000..d02787ffc --- /dev/null +++ b/src/services/diffbot.ts @@ -0,0 +1,453 @@ +import defaultKy, { type KyInstance } from 'ky' +import { AbortError } from 'p-retry' +import pThrottle from 'p-throttle' + +import { assert, getEnv, throttleKy } from '../utils.js' + +const diffbotAPIThrottle = pThrottle({ + limit: 5, + interval: 1000, + strict: true +}) + +export namespace diffbot { + export const API_BASE_URL = 'https://api.diffbot.com' + export const KNOWLEDGE_GRAPH_API_BASE_URL = 'https://kg.diffbot.com' + + export interface DiffbotExtractOptions { + /** Specify optional fields to be returned from any fully-extracted pages, e.g.: &fields=querystring,links. See available fields within each API's individual documentation pages. + * @see https://docs.diffbot.com/reference/extract-optional-fields + */ + fields?: string[] + + /** (*Undocumented*) Pass paging=false to disable automatic concatenation of multiple-page articles. (By default, Diffbot will concatenate up to 20 pages of a single article.) */ + paging?: boolean + + /** Pass discussion=false to disable automatic extraction of comments or reviews from pages identified as articles or products. This will not affect pages identified as discussions. */ + discussion?: boolean + + /** Sets a value in milliseconds to wait for the retrieval/fetch of content from the requested URL. The default timeout for the third-party response is 30 seconds (30000). */ + timeout?: number + + /** Used to specify the IP address of a custom proxy that will be used to fetch the target page, instead of Diffbot's default IPs/proxies. (Ex: &proxy=168.212.226.204) */ + proxy?: string + + /** Used to specify the authentication parameters that will be used with the proxy specified in the &proxy parameter. (Ex: &proxyAuth=username:password) */ + proxyAuth?: string + + /** `none` will instruct Extract to not use proxies, even if proxies have been enabled for this particular URL globally. */ + useProxy?: string + + /** @see https://docs.diffbot.com/reference/extract-custom-javascript */ + customJs?: string + + /** @see https://docs.diffbot.com/reference/extract-custom-headers */ + customHeaders?: Record + } + + export interface DiffbotExtractAnalyzeOptions extends DiffbotExtractOptions { + /** Web page URL of the analyze to process */ + url: string + + /** By default the Analyze API will fully extract all pages that match an existing Automatic API -- articles, products or image pages. Set mode to a specific page-type (e.g., mode=article) to extract content only from that specific page-type. All other pages will simply return the default Analyze fields. */ + mode?: string + + /** Force any non-extracted pages (those with a type of "other") through a specific API. For example, to route all "other" pages through the Article API, pass &fallback=article. Pages that utilize this functionality will return a fallbackType field at the top-level of the response and a originalType field within each extracted object, both of which will indicate the fallback API used. */ + fallback?: string + } + + export interface DiffbotExtractArticleOptions extends DiffbotExtractOptions { + /** Web page URL of the analyze to process */ + url: string + + /** Set the maximum number of automatically-generated tags to return. By default a maximum of ten tags will be returned. */ + maxTags?: number + + /** Set the minimum relevance score of tags to return, between 0.0 and 1.0. By default only tags with a score equal to or above 0.5 will be returned. */ + tagConfidence?: number + + /** Used to request the output of the Diffbot Natural Language API in the field naturalLanguage. Example: &naturalLanguage=entities,facts,categories,sentiment. */ + naturalLanguage?: string[] + } + + export interface DiffbotExtractResponse { + request: DiffbotRequest + objects: DiffbotObject[] + } + + export type DiffbotExtractArticleResponse = DiffbotExtractResponse + + export interface DiffbotExtractAnalyzeResponse + extends DiffbotExtractResponse { + type: string + title: string + humanLanguage: string + } + + export interface DiffbotObject { + date: string + sentiment: number + images: DiffbotImage[] + author: string + estimatedDate: string + publisherRegion: string + icon: string + diffbotUri: string + siteName: string + type: string + title: string + tags: DiffbotTag[] + publisherCountry: string + humanLanguage: string + authorUrl: string + pageUrl: string + html: string + text: string + categories?: DiffbotCategory[] + authors: DiffbotAuthor[] + breadcrumb?: DiffbotBreadcrumb[] + items?: DiffbotListItem[] + meta?: any + } + + interface DiffbotListItem { + title: string + link: string + summary: string + image?: string + } + + interface DiffbotAuthor { + name: string + link: string + } + + interface DiffbotCategory { + score: number + name: string + id: string + } + + export interface DiffbotBreadcrumb { + link: string + name: string + } + + interface DiffbotImage { + url: string + diffbotUri: string + + naturalWidth: number + naturalHeight: number + width: number + height: number + + isCached?: boolean + primary?: boolean + } + + interface DiffbotTag { + score: number + sentiment: number + count: number + label: string + uri: string + rdfTypes: string[] + } + + interface DiffbotRequest { + pageUrl: string + api: string + version: number + } + + export interface Image { + naturalHeight: number + diffbotUri: string + url: string + naturalWidth: number + primary: boolean + } + + export interface Tag { + score: number + sentiment: number + count: number + label: string + uri: string + rdfTypes: string[] + } + + export interface Request { + pageUrl: string + api: string + version: number + } + + export interface DiffbotKnowledgeGraphSearchOptions { + type?: 'query' | 'text' | 'queryTextFallback' | 'crawl' + query: string + col?: string + from?: number + size?: number + + // NOTE: we only support `json`, so these options are not needed + // We can always convert from json to another format if needed. + // format?: 'json' | 'jsonl' | 'csv' | 'xls' | 'xlsx' + // exportspec?: string + // exportseparator?: string + // exportfile?: string + + filter?: string + jsonmode?: 'extended' | 'id' + nonCanonicalFacts?: boolean + noDedupArticles?: boolean + cluster?: 'all' | 'best' | 'dedupe' + report?: boolean + } + + export interface DiffbotKnowledgeGraphEnhanceOptions { + type: 'Person' | 'Organization' + + id?: string + name?: string + url?: string + phone?: string + email?: string + employer?: string + title?: string + school?: string + location?: string + ip?: string + customId?: string + + size?: number + threshold?: number + + refresh?: boolean + search?: boolean + useCache?: boolean + + filter?: string + jsonmode?: 'extended' | 'id' + nonCanonicalFacts?: boolean + } + + export interface DiffbotKnowledgeGraphResponse { + data: DiffbotKnowledgeGraphNode[] + version: number + hits: number + results: number + kgversion: string + diffbot_type: string + facet?: boolean + errors?: any[] + } + + export interface DiffbotKnowledgeGraphNode { + score: number + esscore?: number + entity: DiffbotKnowledgeGraphEntity + entity_ctx: any + errors: string[] + callbackQuery: string + upperBound: number + lowerBound: number + count: number + value: string + uri: string + } + + export interface DiffbotKnowledgeGraphEntity { + id: string + diffbotUri: string + type?: string + name: string + images: DiffbotImage[] + origins: string[] + nbOrigins?: number + + gender?: DiffbotGender + githubUri?: string + importance?: number + description?: string + homepageUri?: string + allNames?: string[] + skills?: DiffbotSkill[] + crawlTimestamp?: number + summary?: string + image?: string + types?: string[] + nbIncomingEdges?: number + allUris?: string[] + employments?: DiffbotEmployment[] + locations?: DiffbotLocation[] + location?: DiffbotLocation + allOriginHashes?: string[] + nameDetail?: DiffbotNameDetail + } + + interface DiffbotEmployment { + employer: Entity + } + + interface Entity { + image?: string + types?: string[] + name: string + diffbotUri?: string + type: EntityType + summary?: string + } + + type EntityType = 'Organization' | 'Place' + + interface DiffbotGender { + normalizedValue: string + } + + interface DiffbotLocation { + country: Entity + isCurrent: boolean + address: string + latitude: number + precision: number + surfaceForm: string + region: Entity + longitude: number + } + + interface DiffbotNameDetail { + firstName: string + lastName: string + } + + interface DiffbotSkill { + name: string + diffbotUri: string + } +} + +export class DiffbotClient { + readonly ky: KyInstance + readonly kyKnowledgeGraph: typeof defaultKy + + readonly apiKey: string + readonly apiBaseUrl: string + readonly apiKnowledgeGraphBaseUrl: string + + constructor({ + apiKey = getEnv('DIFFBOT_API_KEY'), + apiBaseUrl = diffbot.API_BASE_URL, + apiKnowledgeGraphBaseUrl = diffbot.KNOWLEDGE_GRAPH_API_BASE_URL, + timeoutMs = 30_000, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + apiKnowledgeGraphBaseUrl?: string + timeoutMs?: number + ky?: KyInstance + } = {}) { + assert(apiKey, `Error DiffbotClient missing required "apiKey"`) + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + this.apiKnowledgeGraphBaseUrl = apiKnowledgeGraphBaseUrl + + const throttledKy = throttleKy(ky, diffbotAPIThrottle) + + this.ky = throttledKy.extend({ + prefixUrl: apiBaseUrl, + timeout: timeoutMs + }) + + this.kyKnowledgeGraph = throttledKy.extend({ + prefixUrl: apiKnowledgeGraphBaseUrl, + timeout: timeoutMs + }) + } + + protected async _extract< + T extends diffbot.DiffbotExtractResponse = diffbot.DiffbotExtractResponse + >(endpoint: string, options: diffbot.DiffbotExtractOptions): Promise { + const { customJs, customHeaders, ...rest } = options + const searchParams: Record = { + ...rest, + token: this.apiKey + } + const headers = { + ...Object.fromEntries( + [['X-Forward-X-Evaluate', customJs]].filter(([, value]) => value) + ), + ...customHeaders + } + + for (const [key, value] of Object.entries(rest)) { + if (Array.isArray(value)) { + searchParams[key] = value.join(',') + } + } + + // TODO + const { url } = searchParams + if (url) { + const parsedUrl = new URL(url) + if (parsedUrl.hostname.includes('theguardian.com')) { + throw new AbortError( + `Diffbot does not support URLs from domain "${parsedUrl.hostname}"` + ) + } + } + + // console.log(`DiffbotClient._extract: ${endpoint}`, searchParams) + + return this.ky + .get(endpoint, { + searchParams, + headers, + retry: 1 + }) + .json() + } + + async extractAnalyze(options: diffbot.DiffbotExtractAnalyzeOptions) { + return this._extract( + 'v3/analyze', + options + ) + } + + async extractArticle(options: diffbot.DiffbotExtractArticleOptions) { + return this._extract( + 'v3/article', + options + ) + } + + async knowledgeGraphSearch( + options: diffbot.DiffbotKnowledgeGraphSearchOptions + ) { + return this.kyKnowledgeGraph + .get('kg/v3/dql', { + searchParams: { + ...options, + token: this.apiKey + } + }) + .json() + } + + async knowledgeGraphEnhance( + options: diffbot.DiffbotKnowledgeGraphEnhanceOptions + ) { + return this.kyKnowledgeGraph + .get('kg/v3/enhance', { + searchParams: { + ...options, + token: this.apiKey + } + }) + .json() + } +} diff --git a/src/services/index.ts b/src/services/index.ts new file mode 100644 index 000000000..e1570d819 --- /dev/null +++ b/src/services/index.ts @@ -0,0 +1,9 @@ +export * from './clearbit.js' +export * from './dexa-client.js' +export * from './diffbot.js' +export * from './openai-client.js' +export * from './scraper-client.js' +export * from './serpapi.js' +export * from './serper.js' +export * from './twitter-client.js' +export * from './weather.js' diff --git a/src/services/openai-client.ts b/src/services/openai-client.ts index 03c812fa5..70bf0a399 100644 --- a/src/services/openai-client.ts +++ b/src/services/openai-client.ts @@ -1,5 +1 @@ -import '../config.js' - -import { OpenAI } from 'openai' - -export const openaiClient = new OpenAI() +export * from 'openai' diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts index e21d7c6a5..27960e4d7 100644 --- a/src/services/scraper-client.ts +++ b/src/services/scraper-client.ts @@ -1,5 +1,7 @@ import defaultKy, { type KyInstance } from 'ky' +import { assert, getEnv } from '../utils.js' + export type ScrapeResult = { author: string byline: string @@ -34,16 +36,14 @@ export class ScraperClient { readonly ky: KyInstance constructor({ - apiBaseUrl = process.env.SCRAPER_API_BASE_URL, + apiBaseUrl = getEnv('SCRAPER_API_BASE_URL'), ky = defaultKy }: { apiKey?: string apiBaseUrl?: string ky?: KyInstance } = {}) { - if (!apiBaseUrl) { - throw new Error('SCRAPER_API_BASE_URL is required') - } + assert(apiBaseUrl, 'SCRAPER_API_BASE_URL is required') this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: this.apiBaseUrl }) diff --git a/src/services/serpapi.ts b/src/services/serpapi.ts index c275254b2..6cefe568b 100644 --- a/src/services/serpapi.ts +++ b/src/services/serpapi.ts @@ -10,6 +10,8 @@ import { getEnv } from '../utils.js' */ export namespace serpapi { + export const BASE_URL = 'https://serpapi.com' + export type BaseResponse

> = { search_metadata: { id: string @@ -365,20 +367,20 @@ export namespace serpapi { twitter_results?: TwitterResults } - interface TwitterResults { + export interface TwitterResults { title: string link: string displayed_link: string tweets: Tweet[] } - interface Tweet { + export interface Tweet { link: string snippet: string published_date: string } - interface AnswerBox { + export interface AnswerBox { type: string title: string link: string @@ -391,7 +393,7 @@ export namespace serpapi { cached_page_link: string } - interface InlineImage { + export interface InlineImage { link: string source: string thumbnail: string @@ -400,21 +402,21 @@ export namespace serpapi { title?: string } - interface InlinePeopleAlsoSearchFor { + export interface InlinePeopleAlsoSearchFor { title: string items: SearchItem[] see_more_link: string see_more_serpapi_link: string } - interface SearchItem { + export interface SearchItem { name: string image: string link: string serpapi_link: string } - interface KnowledgeGraph { + export interface KnowledgeGraph { type: string kgmid: string knowledge_graph_search_link: string @@ -429,7 +431,7 @@ export namespace serpapi { list: { [key: string]: string[] } } - interface Button { + export interface Button { text: string subtitle: string title: string @@ -445,34 +447,34 @@ export namespace serpapi { list?: string[] } - interface HeaderImage { + export interface HeaderImage { image: string source: string } - interface Source { + export interface Source { name: string link: string } - interface LocalMap { + export interface LocalMap { link: string image: string gps_coordinates: LocalMapGpsCoordinates } - interface LocalMapGpsCoordinates { + export interface LocalMapGpsCoordinates { latitude: number longitude: number altitude: number } - interface LocalResults { + export interface LocalResults { places: Place[] more_locations_link: string } - interface Place { + export interface Place { position: number title: string rating?: number @@ -489,18 +491,18 @@ export namespace serpapi { hours?: string } - interface PlaceGpsCoordinates { + export interface PlaceGpsCoordinates { latitude: number longitude: number } - interface ServiceOptions { + export interface ServiceOptions { dine_in?: boolean takeout: boolean no_delivery?: boolean } - interface OrganicResult { + export interface OrganicResult { position: number title: string link: string @@ -520,24 +522,24 @@ export namespace serpapi { related_questions?: OrganicResultRelatedQuestion[] } - interface AboutThisResult { + export interface AboutThisResult { keywords: string[] languages: string[] regions: string[] } - interface OrganicResultRelatedQuestion { + export interface OrganicResultRelatedQuestion { question: string snippet: string snippet_links: SnippetLink[] } - interface SnippetLink { + export interface SnippetLink { text: string link: string } - interface RelatedResult { + export interface RelatedResult { position: number title: string link: string @@ -548,32 +550,32 @@ export namespace serpapi { cached_page_link: string } - interface RichSnippet { + export interface RichSnippet { bottom: Bottom } - interface Bottom { + export interface Bottom { extensions?: string[] questions?: string[] } - interface Sitelinks { + export interface Sitelinks { inline: Inline[] } - interface Inline { + export interface Inline { title: string link: string } - interface Pagination { + export interface Pagination { current: number next: string other_pages: { [key: string]: string } next_link?: string } - interface SearchResultRelatedQuestion { + export interface SearchResultRelatedQuestion { question: string snippet: string title: string @@ -585,12 +587,12 @@ export namespace serpapi { date?: string } - interface RelatedSearch { + export interface RelatedSearch { query: string link: string } - interface SearchInformation { + export interface SearchInformation { organic_results_state: string query_displayed: string total_results: number @@ -598,14 +600,14 @@ export namespace serpapi { menu_items: MenuItem[] } - interface MenuItem { + export interface MenuItem { position: number title: string link: string serpapi_link?: string } - interface SearchMetadata { + export interface SearchMetadata { id: string status: string json_endpoint: string @@ -616,7 +618,7 @@ export namespace serpapi { total_time_taken: number } - interface SearchParameters { + export interface SearchParameters { engine: string q: string google_domain: string @@ -630,8 +632,6 @@ export namespace serpapi { apiBaseUrl?: string ky?: KyInstance } - - export const BASE_URL = 'https://serpapi.com' } /** @@ -670,7 +670,7 @@ export class SerpAPIClient extends AIToolsProvider { name: 'serpapiGoogleSearch', description: 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', - schema: z.object({ + inputSchema: z.object({ q: z.string().describe('search query'), num: z.number().int().positive().default(5).optional() }) diff --git a/src/services/serper.ts b/src/services/serper.ts index 1265d3a2c..f94c2c209 100644 --- a/src/services/serper.ts +++ b/src/services/serper.ts @@ -2,7 +2,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' import { aiFunction, AIToolsProvider } from '../fns.js' -import { getEnv } from '../utils.js' +import { assert, getEnv } from '../utils.js' export namespace serper { export const BASE_URL = 'https://google.serper.dev' @@ -199,10 +199,10 @@ export namespace serper { * @see https://serper.dev */ export class SerperClient extends AIToolsProvider { - protected api: KyInstance - protected apiKey: string - protected apiBaseUrl: string - protected params: Omit, 'q'> + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string + readonly params: Omit, 'q'> constructor({ apiKey = getEnv('SERPER_API_KEY'), @@ -210,11 +210,10 @@ export class SerperClient extends AIToolsProvider { ky = defaultKy, ...params }: serper.ClientOptions = {}) { - if (!apiKey) { - throw new Error( - `SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)` - ) - } + assert( + apiKey, + `SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)` + ) super() @@ -222,7 +221,7 @@ export class SerperClient extends AIToolsProvider { this.apiBaseUrl = apiBaseUrl this.params = params - this.api = ky.extend({ + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, headers: { 'X-API-KEY': this.apiKey @@ -234,7 +233,7 @@ export class SerperClient extends AIToolsProvider { name: 'serperGoogleSearch', description: 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', - schema: serper.SearchParamsSchema + inputSchema: serper.SearchParamsSchema }) async search(queryOrOpts: string | serper.SearchParams) { return this._fetch('search', queryOrOpts) @@ -263,12 +262,12 @@ export class SerperClient extends AIToolsProvider { protected async _fetch( endpoint: string, queryOrOpts: string | serper.SearchParams - ) { + ): Promise { const params = { ...this.params, ...(typeof queryOrOpts === 'string' ? { q: queryOrOpts } : queryOrOpts) } - return this.api.post(endpoint, { json: params }).json() + return this.ky.post(endpoint, { json: params }).json() } } diff --git a/src/services/twitter-client.ts b/src/services/twitter-client.ts index 37d9b74b6..668d9661a 100644 --- a/src/services/twitter-client.ts +++ b/src/services/twitter-client.ts @@ -1,8 +1,7 @@ import { Nango } from '@nangohq/node' import { auth, Client as TwitterClient } from 'twitter-api-sdk' -import * as config from '../config.js' -import { assert } from '../utils.js' +import { assert, getEnv } from '../utils.js' // The Twitter+Nango client auth connection key const nangoTwitterProviderConfigKey = 'twitter-v2' @@ -23,7 +22,7 @@ let _nango: Nango | null = null function getNango(): Nango { if (!_nango) { - const secretKey = process.env.NANGO_SECRET_KEY?.trim() + const secretKey = getEnv('NANGO_SECRET_KEY')?.trim() if (!secretKey) { throw new Error(`Missing required "NANGO_SECRET_KEY"`) } @@ -35,12 +34,18 @@ function getNango(): Nango { } async function getTwitterAuth({ - scopes = defaultRequiredTwitterOAuthScopes -}: { scopes?: Set } = {}): Promise { + scopes, + nangoConnectionId, + nangoCallbackUrl +}: { + scopes: Set + nangoConnectionId: string + nangoCallbackUrl: string +}): Promise { const nango = getNango() const connection = await nango.getConnection( nangoTwitterProviderConfigKey, - config.nangoConnectionId + nangoConnectionId ) // console.debug('nango twitter connection', connection) @@ -65,11 +70,9 @@ async function getTwitterAuth({ if (missingScopes.size > 0) { throw new Error( - `Nango connection ${ - config.nangoConnectionId - } is missing required OAuth scopes: ${[...missingScopes.values()].join( - ', ' - )}` + `Nango connection ${nangoConnectionId} is missing required OAuth scopes: ${[ + ...missingScopes.values() + ].join(', ')}` ) } @@ -78,17 +81,30 @@ async function getTwitterAuth({ return new auth.OAuth2User({ client_id: twitterClientId, - callback: config.nangoCallbackUrl, + callback: nangoCallbackUrl, scopes: [...scopes.values()] as any, token }) } export async function getTwitterClient({ - scopes = defaultRequiredTwitterOAuthScopes -}: { scopes?: Set } = {}): Promise { + scopes = defaultRequiredTwitterOAuthScopes, + nangoConnectionId = getEnv('NANGO_CONNECTION_ID'), + nangoCallbackUrl = getEnv('NANGO_CALLBACK_URL') +}: { + scopes?: Set + nangoConnectionId?: string + nangoCallbackUrl?: string +} = {}): Promise { + assert(nangoConnectionId, 'twitter client missing nangoConnectionId') + assert(nangoCallbackUrl, 'twitter client missing nangoCallbackUrl') + // NOTE: Nango handles refreshing the oauth access token for us - const twitterAuth = await getTwitterAuth({ scopes }) + const twitterAuth = await getTwitterAuth({ + scopes, + nangoConnectionId, + nangoCallbackUrl + }) // Twitter API v2 using OAuth 2.0 return new TwitterClient(twitterAuth) diff --git a/src/services/weather.ts b/src/services/weather.ts index 5222713ab..384a007a1 100644 --- a/src/services/weather.ts +++ b/src/services/weather.ts @@ -75,9 +75,9 @@ export namespace weatherapi { } export class WeatherClient extends AIToolsProvider { - protected api: KyInstance - protected apiKey: string - protected apiBaseUrl: string + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string constructor({ apiKey = getEnv('WEATHER_API_KEY'), @@ -94,13 +94,13 @@ export class WeatherClient extends AIToolsProvider { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl - this.api = ky.extend({ prefixUrl: apiBaseUrl }) + this.ky = ky.extend({ prefixUrl: apiBaseUrl }) } @aiFunction({ name: 'getCurrentWeather', description: 'Gets info about the current weather at a given location.', - schema: z.object({ + inputSchema: z.object({ q: z .string() .describe( @@ -114,7 +114,7 @@ export class WeatherClient extends AIToolsProvider { ? { q: queryOrOptions } : queryOrOptions - return this.api + return this.ky .get('current.json', { searchParams: { key: this.apiKey, @@ -128,7 +128,7 @@ export class WeatherClient extends AIToolsProvider { const options = typeof ipOrOptions === 'string' ? { q: ipOrOptions } : ipOrOptions - return this.api + return this.ky .get('ip.json', { searchParams: { key: this.apiKey, diff --git a/src/stringify-for-model.test.ts b/src/stringify-for-model.test.ts new file mode 100644 index 000000000..be6a68995 --- /dev/null +++ b/src/stringify-for-model.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest' + +import { stringifyForModel } from './stringify-for-model.js' + +describe('stringifyForModel', () => { + it('handles basic objects', () => { + const input = { + foo: 'bar', + nala: ['is', 'cute'], + kittens: null, + cats: undefined, + paws: 4.3 + } + const result = stringifyForModel(input) + expect(result).toEqual(JSON.stringify(input, null)) + }) + + it('handles empty input', () => { + const result = stringifyForModel() + expect(result).toEqual('') + }) +}) diff --git a/src/stringify-for-model.ts b/src/stringify-for-model.ts new file mode 100644 index 000000000..4e6b555c6 --- /dev/null +++ b/src/stringify-for-model.ts @@ -0,0 +1,18 @@ +import type { Jsonifiable } from 'type-fest' + +/** + * Stringifies a JSON value in a way that's optimized for use with LLM prompts. + * + * This is intended to be used with `function` and `tool` arguments and responses. + */ +export function stringifyForModel(jsonObject?: Jsonifiable): string { + if (jsonObject === undefined) { + return '' + } + + if (typeof jsonObject === 'string') { + return jsonObject + } + + return JSON.stringify(jsonObject, null, 0) +} diff --git a/src/tool-set.ts b/src/tool-set.ts new file mode 100644 index 000000000..b0250df6c --- /dev/null +++ b/src/tool-set.ts @@ -0,0 +1,85 @@ +import type * as types from './types.ts' +import { FunctionSet } from './function-set.js' + +export class ToolSet implements Iterable { + protected _map: Map + + constructor(tools?: readonly types.AIToolSpec[] | null) { + this._map = new Map( + tools ? tools.map((tool) => [tool.function.name, tool]) : null + ) + } + + get size(): number { + return this._map.size + } + + add(tool: types.AIToolSpec): this { + this._map.set(tool.function.name, tool) + return this + } + + get(name: string): types.AIToolSpec | undefined { + return this._map.get(name) + } + + set(name: string, tool: types.AIToolSpec): this { + this._map.set(name, tool) + return this + } + + has(name: string): boolean { + return this._map.has(name) + } + + clear(): void { + this._map.clear() + } + + delete(name: string): boolean { + return this._map.delete(name) + } + + pick(...keys: string[]): ToolSet { + const keysToIncludeSet = new Set(keys) + return new ToolSet( + Array.from(this).filter((tool) => + keysToIncludeSet.has(tool.function.name) + ) + ) + } + + omit(...keys: string[]): ToolSet { + const keysToExcludeSet = new Set(keys) + return new ToolSet( + Array.from(this).filter( + (tool) => !keysToExcludeSet.has(tool.function.name) + ) + ) + } + + get entries(): IterableIterator { + return this._map.values() + } + + [Symbol.iterator](): Iterator { + return this.entries + } + + static fromFunctionSet(functionSet: FunctionSet): ToolSet { + return new ToolSet( + Array.from(functionSet).map((fn) => ({ + type: 'function' as const, + function: fn + })) + ) + } + + static fromFunctionSpecs(functionSpecs: types.AIFunctionSpec[]): ToolSet { + return ToolSet.fromFunctionSet(new FunctionSet(functionSpecs)) + } + + static fromToolSpecs(toolSpecs: types.AIToolSpec[]): ToolSet { + return new ToolSet(toolSpecs) + } +} diff --git a/src/types.ts b/src/types.ts index 337a5c8ad..d30bbdbbb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,2 +1,16 @@ export type { KyInstance } from 'ky' export type { ThrottledFunction } from 'p-throttle' + +// TODO +export type DeepNullable = T | null + +export interface AIFunctionSpec { + name: string + description?: string + parameters: Record +} + +export interface AIToolSpec { + type: 'function' + function: AIFunctionSpec +} diff --git a/src/utils.test.ts b/src/utils.test.ts index c135c4be0..77e2c353f 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -1,6 +1,9 @@ +import ky from 'ky' +import pThrottle from 'p-throttle' import { expect, test } from 'vitest' -import { omit, pick } from './utils.js' +import { mockKyInstance } from './_utils.js' +import { omit, pick, throttleKy } from './utils.js' test('pick', () => { expect(pick({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ a: 1, c: 3 }) @@ -15,3 +18,33 @@ test('omit', () => { omit({ a: { b: 'foo' }, d: -1, foo: null } as any, 'b', 'foo') ).toEqual({ a: { b: 'foo' }, d: -1 }) }) + +test('throttleKy should rate-limit requests to ky properly', async () => { + // TODO: set timeout + + const interval = 1000 + const throttle = pThrottle({ + limit: 1, + interval, + strict: true + }) + + const ky2 = mockKyInstance(throttleKy(ky, throttle)) + + const url = 'https://httpbin.org/get' + + for (let i = 0; i < 10; i++) { + const before = Date.now() + const res = await ky2.get(url) + const after = Date.now() + + const duration = after - before + // console.log(duration, res.status) + expect(res.status).toBe(200) + + // leave a bit of wiggle room for the interval + if (i > 0) { + expect(duration >= interval - interval / 5).toBeTruthy() + } + } +}) diff --git a/src/zod-to-json-schema.test.ts b/src/zod-to-json-schema.test.ts new file mode 100644 index 000000000..24f8c2fa0 --- /dev/null +++ b/src/zod-to-json-schema.test.ts @@ -0,0 +1,63 @@ +import { describe, expect, it } from 'vitest' +import { z } from 'zod' + +import { zodToJsonSchema } from './zod-to-json-schema.js' + +describe('zodToJsonSchema', () => { + it('handles basic objects', () => { + const params = zodToJsonSchema( + z.object({ + name: z.string().min(1).describe('Name of the person'), + age: z.number().int().optional().describe('Age in years') + }) + ) + + expect(params).toEqual({ + additionalProperties: false, + type: 'object', + required: ['name'], + properties: { + name: { + type: 'string', + description: 'Name of the person', + minLength: 1 + }, + age: { + type: 'integer', + description: 'Age in years' + } + } + }) + }) + + it('handles enums and unions', () => { + const params = zodToJsonSchema( + z.object({ + name: z.string().min(1).describe('Name of the person'), + sexEnum: z.enum(['male', 'female']), + sexUnion: z.union([z.literal('male'), z.literal('female')]) + }) + ) + + expect(params).toEqual({ + additionalProperties: false, + type: 'object', + required: ['name', 'sexEnum', 'sexUnion'], + properties: { + name: { + type: 'string', + description: 'Name of the person', + minLength: 1 + }, + sexEnum: { + type: 'string', + enum: ['male', 'female'] + }, + sexUnion: { + type: 'string', + enum: ['male', 'female'] + } + } + }) + }) +}) diff --git a/src/zod-to-json-schema.ts b/src/zod-to-json-schema.ts new file mode 100644 index 000000000..8767f36ed --- /dev/null +++ b/src/zod-to-json-schema.ts @@ -0,0 +1,17 @@ +import type { z } from 'zod' +import { zodToJsonSchema as zodToJsonSchemaImpl } from 'zod-to-json-schema' + +import { omit } from './utils.js' + +/** Generate a JSON Schema from a Zod schema. */ +export function zodToJsonSchema(schema: z.ZodType): Record { + return omit( + zodToJsonSchemaImpl(schema, { $refStrategy: 'none' }), + '$schema', + 'default', + 'definitions', + 'description', + 'markdownDescription', + 'additionalProperties' + ) +} diff --git a/tsconfig.json b/tsconfig.json index d2bbb306b..c4a144fbb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,9 @@ "useDefineForClassFields": true, "jsx": "preserve", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "strict": true, "noUncheckedIndexedAccess": true, "forceConsistentCasingInFileNames": true, From 0d96cef7571879669828af34f5ed16f1ed540893 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 22 May 2024 03:11:36 -0500 Subject: [PATCH 04/81] =?UTF-8?q?=F0=9F=93=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 16 +- json-schema.json | 11603 ++++++++++++++++ package.json | 14 +- pnpm-lock.yaml | 556 +- proxycurl-openapi.json | 11380 +++++++++++++++ proxycurl-openapi.yaml | 9978 +++++++++++++ src/fns.ts | 108 +- src/index.ts | 1 - .../{clearbit.ts => clearbit-client.ts} | 0 src/services/dexa-client.ts | 2 +- .../{diffbot.ts => diffbot-client.ts} | 0 src/services/index.ts | 11 +- src/services/proxycurl-client.ts | 2113 +++ src/services/scraper-client.ts | 42 +- .../{serpapi.ts => serpapi-client.ts} | 0 src/services/{serper.ts => serper-client.ts} | 0 .../{weather.ts => weather-client.ts} | 0 src/symbol-polyfill.ts | 21 + src/types.ts | 102 + src/zod-to-json-schema.ts | 3 +- 20 files changed, 35762 insertions(+), 188 deletions(-) create mode 100644 json-schema.json create mode 100644 proxycurl-openapi.json create mode 100644 proxycurl-openapi.yaml rename src/services/{clearbit.ts => clearbit-client.ts} (100%) rename src/services/{diffbot.ts => diffbot-client.ts} (100%) create mode 100644 src/services/proxycurl-client.ts rename src/services/{serpapi.ts => serpapi-client.ts} (100%) rename src/services/{serper.ts => serper-client.ts} (100%) rename src/services/{weather.ts => weather-client.ts} (100%) create mode 100644 src/symbol-polyfill.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index 700816535..2419ce60f 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -4,7 +4,8 @@ import 'dotenv/config' import { gracefulExit } from 'exit-hook' import restoreCursor from 'restore-cursor' -import type * as types from '@/types.js' +// import { ClearbitClient } from '../src/index.js' +import { ProxycurlClient } from '../src/services/proxycurl-client.js' /** * Scratch for quick testing. @@ -12,6 +13,19 @@ import type * as types from '@/types.js' async function main() { restoreCursor() + // const clearbit = new ClearbitClient() + // const res = await clearbit.companyEnrichment({ + // domain: 'https://clay.com' + // }) + // console.log(JSON.stringify(res, null, 2)) + + const proxycurl = new ProxycurlClient() + const res = await proxycurl.getLinkedInPerson({ + linkedin_profile_url: 'https://linkedin.com/in/fisch2' + // personal_email: 'fisch0920@gmail.com' + }) + console.log(JSON.stringify(res, null, 2)) + return gracefulExit(0) } diff --git a/json-schema.json b/json-schema.json new file mode 100644 index 000000000..264f3489f --- /dev/null +++ b/json-schema.json @@ -0,0 +1,11603 @@ +{ + "servers": [ + { + "url": "https://nubela.co/proxycurl", + "description": "With SSL Proxycurl Server" + }, + { + "url": "http://nubela.co/proxycurl", + "description": "Without SSL Proxycurl Server" + } + ], + "security": [ + { + "BearerAuth": [ + "client" + ] + } + ], + "paths": { + "/api/linkedin/school": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet structured data of a LinkedIn School Profile", + "parameters": [ + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn School Profile to crawl.\n\n URL should be in the format of `https://www.linkedin.com/school/`\n ", + "example": "https://www.linkedin.com/school/national-university-of-singapore", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "`if-present` The default behavior. Fetches profile from cache regardless of age of profile. If profile is not available in cache, API will attempt to source profile externally.\n\n`if-recent` API will make a best effort to return a fresh profile no older than 29 days.Costs an extra `1` credit on top of the cost of the base endpoint.", + "example": "if-present", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkedinSchool" + }, + "example": { + "linkedin_internal_id": "5524", + "description": "At NUS, we are shaping the future through our people and our pursuit of new frontiers in knowledge. In a single century, we have become a university of global influence and an Asian thought leader. Our location at the crossroads of Asia informs our mission and gives us a tremendous vantage point to help create opportunities and address the pressing issues facing Singapore, Asia and the world.\r\rAt NUS, we believe in education, research and service that change lives.", + "website": "http://nus.edu.sg", + "industry": "Higher Education", + "company_size": [ + 5001, + 10000 + ], + "company_size_on_linkedin": 16084, + "hq": { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + }, + "company_type": "EDUCATIONAL_INSTITUTION", + "founded_year": 1905, + "specialities": [ + "education", + "research" + ], + "locations": [ + { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + } + ], + "name": "National University of Singapore", + "tagline": null, + "universal_name_id": "national-university-of-singapore", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140", + "search_id": "5524", + "similar_companies": [ + { + "name": "NUS Business School", + "link": "https://www.linkedin.com/school/nus-business-school/", + "industry": "Higher Education", + "location": null + }, + { + "name": "NUS Faculty of Arts and Social Sciences", + "link": "https://www.linkedin.com/school/nusfass/", + "industry": "Higher Education", + "location": null + } + ], + "affiliated_companies": [], + "updates": [], + "follower_count": 539321 + } + } + }, + "description": "Profile data with profile picture, school location, etc" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "School API" + ], + "operationId": "School Profile Endpoint" + }, + "summary": "School Profile Endpoint" + }, + "/api/linkedin/company": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet structured data of a Company Profile", + "parameters": [ + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Company Profile to crawl.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", + "example": "https://www.linkedin.com/company/google/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator.\n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb).\n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n\n This parameter accepts the following values:\n - `false` - Will not resolve numerical IDs.\n - `true` (default value) - Enable support for Company Profile URLs with numerical IDs.\n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "true", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "categories", + "required": false, + "description": "\n Appends categories data of this company.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_data", + "required": false, + "description": "\n Returns a list of funding rounds that this company has received.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "exit_data", + "required": false, + "description": "\n Returns a list of investment portfolio exits.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "acquisitions", + "required": false, + "description": "\n Provides further enriched data on acquisitions made by this company from external sources.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these acquisition data (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "extra", + "required": false, + "description": "\n Enriches the Company Profile with extra details from external sources.\n Details include Crunchbase ranking, contact email, phone number, Facebook account, Twitter account, funding rounds and amount, IPO status, investor information, etc.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these extra details (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "\n `if-present` The default behavior.\n Fetches profile from cache regardless of age of profile.\n If profile is not available in cache, API will attempt to source profile externally.\n\n `if-recent` API will make a best effort to return a fresh profile no older than 29 days.\"\n Costs an extra `1` credit on top of the cost of the base endpoint.\n ", + "example": "if-present", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "fallback_to_cache", + "required": false, + "description": "\n Tweaks the fallback behavior if an error arises from fetching a fresh profile.\n\n This parameter accepts the following values:\n * `on-error` (default value) - Fallback to reading the profile from cache if an error arises.\n * `never` - Do not ever read profile from cache.\n ", + "example": "on-error", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkedinCompany" + }, + "example": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "search", + "ads" + ], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": false, + "state": "NY" + } + ], + "name": "Google", + "tagline": null, + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792 + } + } + }, + "description": "Profile data with profile picture, office locations, etc" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Company API" + ], + "operationId": "Company Profile Endpoint" + }, + "summary": "Company Profile Endpoint" + }, + "/api/v2/linkedin": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet structured data of a Personal Profile", + "parameters": [ + { + "in": "query", + "name": "extra", + "required": false, + "description": "\n Enriches the Person Profile with extra details from external sources.\n Extra details include gender, birth date, industry and interests.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide extra data field.\n - `include` - Append extra data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "github_profile_id", + "required": false, + "description": "\n Enriches the Person Profile with Github Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Github Id data field.\n - `include` - Append Github Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_id", + "required": false, + "description": "\n Enriches the Person Profile with Facebook Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Facebook Id data field.\n - `include` - Append Facebook Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_id", + "required": false, + "description": "\n Enriches the Person Profile with Twitter Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Twitter Id data field.\n - `include` - Append Twitter Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "personal_contact_number", + "required": false, + "description": "\n Enriches the Person Profile with personal numbers from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide personal numbers data field.\n - `include` - Append personal numbers data to the person profile object.\n Costs an extra `1` credit per email returned on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "personal_email", + "required": false, + "description": "\n Enriches the Person Profile with personal emails from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide personal emails data field.\n - `include` - Append personal emails data to the person profile object.\n Costs an extra `1` credit per email returned on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "inferred_salary", + "required": false, + "description": "\n Include inferred salary range from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide inferred salary data field.\n - `include` - Append inferred salary range data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "skills", + "required": false, + "description": "\n Include skills data from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide skills data field.\n - `include` - Append skills data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "\n `if-present` The default behavior.\n Fetches profile from cache regardless of age of profile.\n If profile is not available in cache, API will attempt to source profile externally.\n\n `if-recent` API will make a best effort to return a fresh profile no older than 29 days.\"\n Costs an extra `1` credit on top of the cost of the base endpoint.\n ", + "example": "if-present", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "fallback_to_cache", + "required": false, + "description": "\n Tweaks the fallback behavior if an error arises from fetching a fresh profile.\n\n This parameter accepts the following values:\n * `on-error` (default value) - Fallback to reading the profile from cache if an error arises.\n * `never` - Do not ever read profile from cache.\n ", + "example": "on-error", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://x.com/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://x.com/johnrmarty/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_url", + "required": false, + "description": "\n The Facebook Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://facebook.com/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://facebook.com/johnrmarty/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://linkedin.com/in/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://linkedin.com/in/johnrmarty/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonEndpointResponse" + }, + "example": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + } + } + }, + "description": "Profile data with profile picture, job history, etc." + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "People API" + ], + "operationId": "Person Profile Endpoint" + }, + "summary": "Person Profile Endpoint" + }, + "/api/customers": { + "get": { + "description": "Cost: 10 credits / result for users on an annual subscription or Enterprise plan.\nGet a list of probable corporate customers of a target company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of customers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/watsons", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of customers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/watsonsproperty", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results of customer companies returned per API call.\n\n The default value of this parameter is 10.\n\n Accepted values for this parameter is an integer ranging from 0 to 1000.\n ", + "example": "10", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerList" + }, + "example": { + "companies": [ + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", + "twitter_profile_url": "https://twitter.com/spirellp", + "email": "info@spiresolicitors.co.uk" + }, + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/mall-wood-insurance-services-ltd", + "twitter_profile_url": "https://twitter.com/draytonins", + "email": null + } + ], + "next_page": null + } + } + }, + "description": "A list of probable customers of the target company." + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Customer API `EXPERIMENTAL`" + ], + "operationId": "Customer Listing Endpoint `EXPERIMENTAL`" + }, + "summary": "Customer Listing Endpoint `EXPERIMENTAL`" + }, + "/api/customers/count/": { + "get": { + "description": "Cost: 1 credit / result for users on an annual subscription or Enterprise plan.\nGet the total count of probable corporate customers of a target company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of customers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/watsons", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of customers of.\n\n URL should be in the format of https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/watsonsproperty", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerCount" + }, + "example": { + "company_count": 125 + } + } + }, + "description": "Number of probable customers of the target company." + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Customer API `EXPERIMENTAL`" + ], + "operationId": "Customer Listing Count Endpoint `EXPERIMENTAL`" + }, + "summary": "Customer Listing Count Endpoint `EXPERIMENTAL`" + }, + "/api/linkedin/company/employees/": { + "get": { + "description": "Cost: 3 credits / employee returned.\nGet a list of employees of a Company.\n\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our comprehensive dataset of people and company profiles.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US. Or you can set the parameter to `country=us,sg` if you want employees from both the US and Singapore.\n\n This parameter accepts a comma-separated case-insensitive values of [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the full profile of employees instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists employee's profile url\n * `enrich`: lists full profile of employees\n\n Calling this API endpoint with this parameter would add `1` credit per employee returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "role_search", + "required": false, + "description": "\n Filter employees by their title by matching the employee's title against a *regular expression*.\n\n The default value of this parameter is `null`.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n\n (The base cost of calling this API endpoint with this parameter would be `10` credits.\n Each employee matched and returned would cost 3 extra credits.)\n ", + "example": "(co)?-?founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results returned per API call.\n\n The default value of this parameter is `10`.\n\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employment_status", + "required": false, + "description": "\n Parameter to tell the API to return past or current employees.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : lists current employees\n * `past` : lists past employees\n * `all` : lists current & past employees\n ", + "example": "current", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "required": false, + "description": "\n Sort employees by recency.\n\n Valid values are:\n * `recently-joined` - Sort employees by their join date. The most recent employee is on the top of the list.\n * `recently-left` - Sort employees by their departure date. The most recent employee who had just left is on the top of this list.\n * `oldest` - Returns the oldest employees first. The oldest employee who had joined this company historically is on the top of this list.\n * `none` - The default value. Do not sort.\n\n If this parameter is supplied with a value other than `none`, will add `50` credits to the base cost of the API endpoint regardless number of results returned. It will also add an additional cost of `10` credits per employee returned.\n ", + "example": "recently-joined", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for Company Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "false", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Company Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", + "example": "https://www.linkedin.com/company/microsoft", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeList" + }, + "example": { + "employees": [ + { + "profile_url": "https://www.linkedin.com/in/williamhgates", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw" + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ" + } + ], + "languages": [], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [], + "connections": null, + "people_also_viewed": [], + "recommendations": [], + "activities": [], + "similarly_named_profiles": [], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + } + }, + "description": "List of employees" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Company API" + ], + "operationId": "Employee Listing Endpoint" + }, + "summary": "Employee Listing Endpoint" + }, + "/api/linkedin/company/employees/count": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet a number of total employees of a Company.\n\nGet an employee count of this company from various sources.", + "parameters": [ + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "\n `if-present`: The default behavior. Fetches data from LinkDB cache regardless of age of profile.\n\n `if-recent`: API will make a best effort to return a fresh data no older than 29 days. Costs an extra 1 credit on top of the cost of the base endpoint.\n ", + "example": "if-present", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_employee_count", + "required": false, + "description": "\n Option to include a scraped employee count value from the target company's LinkedIn profile.\n\n Valid values are `include` and `exclude`:\n\n * `exclude` (default) : To exclude the scraped employee count.\n * `include` : To include the scraped employee count.\n\n Costs an extra `1` credit on top of the base cost of the endpoint.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employment_status", + "required": false, + "description": "\n Parameter to tell the API to filter past or current employees.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : count current employees\n * `past` : count past employees\n * `all` : count current & past employees\n ", + "example": "current", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Company Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", + "example": "https://www.linkedin.com/company/apple/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeCount" + }, + "example": { + "linkedin_employee_count": 529274, + "linkdb_employee_count": 3 + } + } + }, + "description": "Number of employees in a company" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Company API" + ], + "operationId": "Employee Count Endpoint" + }, + "summary": "Employee Count Endpoint" + }, + "/api/linkedin/person/profile-picture": { + "get": { + "description": "Cost: 0 credit / successful request.\nGet the profile picture of a person.\n\nProfile pictures are served from cached people profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb).\nIf the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), then the API will return a `404` status code.", + "parameters": [ + { + "in": "query", + "name": "linkedin_person_profile_url", + "required": true, + "description": "\n LinkedIn Profile URL of the person that you are trying to get the profile picture of.\n ", + "example": "https://www.linkedin.com/in/williamhgates/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProfilePicture" + }, + "example": { + "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" + } + } + }, + "description": "Profile picture of a person" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "People API" + ], + "operationId": "Person Profile Picture Endpoint" + }, + "summary": "Person Profile Picture Endpoint" + }, + "/api/linkedin/company/profile-picture": { + "get": { + "description": "Cost: 0 credit / successful request.\nGet the profile picture of a company.\n\nProfile pictures are served from cached company profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb).\nIf the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), then the API will return a `404` status code.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": true, + "description": "\n LinkedIn Profile URL of the company that you are trying to get the profile picture of.\n ", + "example": "https://www.linkedin.com/company/apple/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProfilePicture" + }, + "example": { + "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" + } + } + }, + "description": "Profile picture of a company" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Company API" + ], + "operationId": "Company Profile Picture Endpoint" + }, + "summary": "Company Profile Picture Endpoint" + }, + "/api/linkedin/profile/resolve": { + "get": { + "description": "Cost: 2 credits / successful request.\nLook up a person with a name and company information.", + "parameters": [ + { + "in": "query", + "name": "similarity_checks", + "required": false, + "description": "\n Controls whether the API endpoint performs\n similarity comparisons between the input parameters\n and the results or simply returns the closest match.\n For instance, if you are searching for a person named\n \"Ben Chad\", and the closest result we have is \"Chavvy\n Plum\", our similarity checks will discard the obviously\n incorrect result and return `null` instead of a false\n positive.\n\n Include similarity checks to eliminate false positives.\n However, be aware that this might yield fewer results\n as false positives are discarded. Credits will still be\n deducted even if we return `null`.\n\n You can choose to skip similarity checks, in which\n case no credits will be charged if we return `null`.\n\n This parameter accepts the following values:\n * `include` (default) - Perform similarity checks and\n discard false positives. Credits will be deducted even\n if we return null .\n * `skip` - Bypass similarity checks. No credits will be\n deducted if no results are returned.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [People Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_domain", + "required": true, + "description": "Company name or domain", + "example": "gatesfoundation.org", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "location", + "required": false, + "description": "\n The location of this user.\n\n Name of country, city or state.\n ", + "example": "Seattle", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "title", + "required": false, + "description": "Title that user is holding at his/her current job", + "example": "Co-chair", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "last_name", + "required": false, + "description": "Last name of the user", + "example": "Gates", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "first_name", + "required": true, + "description": "First name of the user", + "example": "Bill", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonLookupUrlEnrichResult" + }, + "example": { + "url": "https://www.linkedin.com/in/senatormarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + } + }, + "description": "LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "People API" + ], + "operationId": "Person Lookup Endpoint" + }, + "summary": "Person Lookup Endpoint" + }, + "/api/v2/linkedin/company/job": { + "get": { + "description": "Cost: 2 credits / successful request.\nList jobs posted by a company on LinkedIn", + "parameters": [ + { + "in": "query", + "name": "job_type", + "required": false, + "description": "\n The nature of the job.\n It accepts the following 7 case-insensitive values only:\n - `full-time`\n - `part-time`\n - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n - `anything` (default)\n ", + "example": "anything", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "experience_level", + "required": false, + "description": "\n The experience level needed for the job.\n It accepts the following 6 case-insensitive values only:\n - `internship`\n - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n - `anything` (default)\n ", + "example": "entry_level", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "when", + "required": false, + "description": "\n The time when the job is posted,\n It accepts the following case-insensitive values only:\n - `yesterday`\n - `past-week`\n - `past-month`\n - `anytime` (default)\n ", + "example": "past-month", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "flexibility", + "required": false, + "description": "\n The flexibility of the job.\n It accepts the following 3 case insensitive values only:\n - `remote`\n - `on-site`\n - `hybrid`\n - `anything` (default)\n ", + "example": "remote", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "geo_id", + "required": false, + "description": "\n The `geo_id` of the location to search for.\n For example, `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article) as to how you may be able to match regions to `geo_id` input values.\n ", + "example": "92000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "keyword", + "required": false, + "description": "\n The keyword to search for.\n ", + "example": "software engineer", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search_id", + "required": false, + "description": "\n The `search_id` of the company on LinkedIn.\n You can get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n ", + "example": "1035", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobListPage" + }, + "example": { + "job": [ + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Product Management: Intern Opportunities for University Students", + "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", + "list_date": "2022-10-09", + "location": "New York, NY" + }, + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Content Strategist", + "job_url": "https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764", + "list_date": "2022-10-21", + "location": "United States" + } + ], + "next_page_no": 1, + "next_page_api_url": "http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035", + "previous_page_no": null, + "previous_page_api_url": null + } + } + }, + "description": "List of open job position" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Jobs API" + ], + "operationId": "Job Search Endpoint" + }, + "summary": "Job Search Endpoint" + }, + "/api/v2/linkedin/company/job/count": { + "get": { + "description": "Cost: 2 credits / successful request.\nCount number of jobs posted by a company on LinkedIn", + "parameters": [ + { + "in": "query", + "name": "job_type", + "required": false, + "description": "\n The nature of the job.\n It accepts the following 7 case-insensitive values only:\n - `full-time`\n - `part-time`\n - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n - `anything` (default)\n ", + "example": "entry_level", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "experience_level", + "required": false, + "description": "\n The experience level needed for the job.\n It accepts the following 6 case-insensitive values only:\n - `internship`\n - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n - `anything` (default)\n ", + "example": "entry_level", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "when", + "required": false, + "description": "\n The time when the job is posted,\n It accepts the following case-insensitive values only:\n - `yesterday`\n - `past-week`\n - `past-month`\n - `anytime` (default)\n ", + "example": "past-month", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "flexibility", + "required": false, + "description": "\n The flexibility of the job.\n It accepts the following 3 case insensitive values only:\n - `remote`\n - `on-site`\n - `hybrid`\n - `anything` (default)\n ", + "example": "remote", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "geo_id", + "required": false, + "description": "\n The `geo_id` of the location to search for.\n For example, `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article) as to how you may be able to match regions to `geo_id` input values.\n ", + "example": "92000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "keyword", + "required": false, + "description": "\n The keyword to search for.\n ", + "example": "software engineer", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search_id", + "required": false, + "description": "\n The `search_id` of the company on LinkedIn.\n You can get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n ", + "example": "1035", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobListCount" + }, + "example": { + "count": 887622 + } + } + }, + "description": "Count number of jobs posted" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Jobs API" + ], + "operationId": "Jobs Listing Count Endpoint" + }, + "summary": "Jobs Listing Count Endpoint" + }, + "/api/find/company/role/": { + "get": { + "description": "Cost: 3 credits / successful request.\nReturns the profile of a person who most closely matches a specified role\nin a company. For instance, it can be used to identify the \"CTO\" of\n\"Apple\". The endpoint yields a single result that represents the closest\nmatch. For a detailed comparison between this API endpoint and the\n[Employee Search Endpoint](#company-api-employee-search-endpoint)\nor the [Person Search Endpoint](#search-api-person-search-endpoint),\nrefer to [this article](\n https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).", + "parameters": [ + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [Person Profile Endpoint](#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "role", + "required": true, + "description": "Role of the profile that you are lookin up", + "example": "ceo", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_name", + "required": true, + "description": "Name of the company that you are searching for", + "example": "nubela", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleSearchEnrichedResult" + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + } + }, + "description": "LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "People API" + ], + "operationId": "Role Lookup Endpoint" + }, + "summary": "Role Lookup Endpoint" + }, + "/api/linkedin/company/resolve": { + "get": { + "description": "Cost: 2 credits / successful request.\nResolve Company LinkedIn Profile from company name,\n domain name and location.", + "parameters": [ + { + "in": "query", + "name": "company_location", + "required": false, + "description": "\n The location / region of company.\n ISO 3166-1 alpha-2 codes\n ", + "example": "sg", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_domain", + "required": false, + "description": "Company website or Company domain\nRequires either `company_domain` or `company_name`", + "example": "accenture.com", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_name", + "required": false, + "description": "Company Name\nRequires either `company_domain` or `company_name`", + "example": "Accenture", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [Company Profile Endpoint](https://nubela.co/proxycurl/docs#company-api-company-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanyUrlEnrichResult" + }, + "example": { + "url": "https://www.linkedin.com/company/accenture", + "profile": { + "linkedin_internal_id": "1033", + "description": "Accenture is a global professional services company with leading capabilities in digital, cloud, and security. Combining unmatched experience and specialized skills across more than 40 industries, we offer Strategy and Consulting, Technology and Operations Services, and Accenture Song—all powered by the world’s largest network of Advanced Technology and Intelligent Operations centers. \n\nOur people deliver on the promise of technology and human ingenuity every day, serving clients in more than 120 countries. We embrace the power of change to create value and shared success for our clients, people, shareholders, partners, and communities. \n\nVisit us at accenture.com.", + "website": "http://www.accenture.com", + "industry": "Business Consulting and Services", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 541251, + "hq": { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "Management Consulting", + "Systems Integration and Technology" + ], + "locations": [ + { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + { + "country": "US", + "city": "San Francisco", + "postal_code": "94105", + "line_1": "415 Mission Street Floor 31-34", + "is_hq": false, + "state": "California" + } + ], + "name": "Accenture", + "tagline": null, + "universal_name_id": "accenture", + "profile_pic_url": "https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY", + "background_cover_image_url": "https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0", + "search_id": "1033", + "similar_companies": [ + { + "name": "Deloitte", + "link": "https://www.linkedin.com/company/deloitte", + "industry": "Business Consulting and Services", + "location": null + }, + { + "name": "Tata Consultancy Services", + "link": "https://in.linkedin.com/company/tata-consultancy-services", + "industry": "IT Services and IT Consulting", + "location": "Mumbai, Maharashtra" + } + ], + "affiliated_companies": [ + { + "name": "Accenture in India", + "link": "https://in.linkedin.com/company/accentureindia", + "industry": "IT Services and IT Consulting", + "location": "Bengaluru, Karnatka" + }, + { + "name": "Accenture Brasil", + "link": "https://br.linkedin.com/company/accenturebrasil", + "industry": "IT Services and IT Consulting", + "location": "São Paulo, São Paulo" + } + ], + "updates": [ + { + "article_link": null, + "image": null, + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4", + "total_likes": 325 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA", + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "The ability to learn new things, without forgetting those that came before, is a huge differentiator between the #AI we're familiar with, and the #GenerativeAI powered by foundation models that we're seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n \n#TechVision2023", + "total_likes": 541 + } + ], + "follower_count": 11125167, + "acquisitions": null, + "exit_data": null, + "extra": null, + "funding_data": null, + "categories": null + }, + "last_updated": "2023-10-26T11:33:24Z" + } + } + }, + "description": "LinkedIn (Company) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Company API" + ], + "operationId": "Company Lookup Endpoint" + }, + "summary": "Company Lookup Endpoint" + }, + "/api/linkedin/company/employee/search/": { + "get": { + "description": "Cost: 10 credits / successful request.\nSearch employees of a target by their job title. This API endpoint is syntactic\nsugar for the role_search parameter under the [Employee Listing Endpoint](#company-api-employee-listing-endpoint).\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our comprehensive dataset of people\nand company profiles. For a detailed comparison between this API endpoint\nand the [Role Lookup Endpoint](#people-api-role-lookup-endpoint) or the [Person Search Endpoint](#search-api-person-search-endpoint), refer to [this article](https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).", + "parameters": [ + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Tune the maximum results returned per API call.\n The default value of this parameter is `200000`.\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `100`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": true, + "description": "\n LinkedIn Profile URL of the target company.\n ", + "example": "https://www.linkedin.com/company/microsoft/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "keyword_regex", + "required": true, + "description": "\n Job title keyword to search for in regular expression format.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n ", + "example": "ceo|cto", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the full profile of employees instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists employee's profile url\n * `enrich`: lists full profile of employees\n\n Calling this API endpoint with this parameter would add `1` credit per employee returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for Company Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "false", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeList" + }, + "example": { + "employees": [ + { + "profile_url": "https://www.linkedin.com/in/satyanadella", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw" + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ" + } + ], + "languages": [], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [], + "connections": null, + "people_also_viewed": [], + "recommendations": [], + "activities": [], + "similarly_named_profiles": [], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + } + }, + "description": "List of employees" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Company API" + ], + "operationId": "Employee Search Endpoint" + }, + "summary": "Employee Search Endpoint" + }, + "/api/linkedin/school/students/": { + "get": { + "description": "Cost: 3 credits / student returned.\nGet a list of students of a school or university.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the full profile of students instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists student's profile url\n * `enrich`: lists full profile of students\n\n *Calling this API endpoint with this parameter would add `1` credit per student returned.*\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search_keyword", + "required": false, + "description": "\n Filter students by their major by matching the student's major against a *regular expression*.\n\n The default value of this parameter is `null`.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n\n (The base cost of calling this API endpoint with this parameter would be `10` credits.\n Each student matched and returned would cost `6` credits per student returned.)\n ", + "example": "computer*|cs", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results returned per API call.\n\n The default value of this parameter is `10`.\n\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "student_status", + "required": false, + "description": "\n Parameter to tell the API to return past or current students.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : lists current students\n * `past` : lists past students\n * `all` : lists current & past students\n ", + "example": "current", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "required": false, + "description": "\n Sort students by matriculation or graduation dates.\n\n Valid values are:\n * `recently-matriculated` - Sort students by their matriculation date. Students who had had most recently started school is on the top of the list.\n * `recently-graduated` - Sort students by their graduation date. The most recently graduated student is on the top of this list.\n * `none` - The default value. Do not sort.\n\n If this parameter is supplied with a value other than `none`, will add `50` credits to the base cost of the API endpoint regardless number of results returned. It will also add an additional cost of `10` credits per student returned.\n ", + "example": "recently-matriculated", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for School Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/school/1234567890` to `https://www.linkedin.com/school/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for School Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "false", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_school_url", + "required": true, + "description": "\n URL of the LinkedIn School Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/school/`\n ", + "example": "https://www.linkedin.com/school/stanford-university", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StudentList" + }, + "example": { + "students": [ + { + "profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + } + }, + "description": "List of students" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "School API" + ], + "operationId": "Student Listing Endpoint" + }, + "summary": "Student Listing Endpoint" + }, + "/api/linkedin/profile/resolve/email": { + "get": { + "description": "Cost: 3 credits / successful request.\nResolve social media profiles correlated from an email address.\nThis API endpoint works with both personal and work emails.", + "parameters": [ + { + "in": "query", + "name": "email", + "required": false, + "description": "Email address of the user you want to look up.\nyes", + "example": "danial@nubela.co", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "lookup_depth", + "required": false, + "description": "\n This parameter describes the depth options for our API lookup function. This endpoint can execute either a superficial or a deep lookup.\n\n A **superficial lookup** involves comparing the provided email with entries in our database. This approach tends to yield fewer results and is typically less effective for work-related email addresses. However, it does not consume any credits if no results are returned.\n\n On the other hand, a **deep lookup** extends beyond our database to utilize advanced heuristics and identify the individual associated with a given email. This method is particularly recommended for work emails.\n\n Please note the following valid values for the depth of the lookup:\n\n * `superficial`: No credits are consumed if no results are found.\n * `deep` (default): Credits are used regardless of whether any results are returned.\n \nyes", + "example": "deep", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached LinkedIn profile of the LinkedIn Profile URL result (if any).\n\n Valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data.\n * `enrich`: enriches the result with cached profile data. \n\n Calling this API endpoint with this parameter would add `1` additional credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/), please chain this API call with the `linkedin_profile_url` result with the [Person Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n \nno", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReverseEmailUrlEnrichResult" + }, + "example": { + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + } + }, + "description": "Twitter, Facebook, and LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Contact API" + ], + "operationId": "Reverse Email Lookup Endpoint" + }, + "summary": "Reverse Email Lookup Endpoint" + }, + "/api/resolve/phone": { + "get": { + "description": "Cost: 3 credits / successful request.\nFind social media profiles from a contact phone number.", + "parameters": [ + { + "in": "query", + "name": "phone_number", + "required": true, + "description": "[E.164 formatted](https://www.twilio.com/docs/glossary/what-e164) phone number of the person you want to identify social media profiles of.", + "example": "+14155552671", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReverseContactNumberResult" + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "twitter_profile_url": "https://www.twitter.com/proxycurl", + "facebook_profile_url": "https://www.facebook.com/zuck" + } + } + }, + "description": "Twitter, Facebook, and LinkedIn Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Contact API" + ], + "operationId": "Reverse Contact Number Lookup Endpoint" + }, + "summary": "Reverse Contact Number Lookup Endpoint" + }, + "/api/linkedin/profile/email": { + "get": { + "description": "Cost: 3 credits / request.\nLookup work email address of a LinkedIn Person Profile.\n\nEmail addresses returned are verified to not be role-based or catch-all emails. Email addresses\nreturned by our API endpoint come with a 95+% deliverability guarantee\n\n**Endpoint behavior**\n\n*This endpoint* **_may not_** *return results immediately.*\n\nIf you provided a webhook in your request parameter, our application will call your webhook with\nthe result once. See `Webhook request` below.", + "parameters": [ + { + "in": "query", + "name": "linkedin_profile_url", + "required": true, + "description": "\n Linkedin Profile URL of the person you want to\n extract work email address from.\n ", + "example": "https://sg.linkedin.com/in/williamhgates", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "callback_url", + "required": false, + "description": "\n Webhook to notify your application when\n the request has finished processing.\n ", + "example": "https://webhook.site/29e12f17-d5a2-400a-9d08-42ee9d83600a", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExtractionEmailResult" + }, + "example": { + "email_queue_count": 0 + } + } + }, + "description": "Work Email Address" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Contact API" + ], + "operationId": "Work Email Lookup Endpoint" + }, + "summary": "Work Email Lookup Endpoint" + }, + "/api/linkedin/job": { + "get": { + "description": "Cost: 2 credits / successful request.\nGet structured data of a LinkedIn Job Profile", + "parameters": [ + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Job Profile to target.\n\n URL should be in the format of\n `https://www.linkedin.com/jobs/view/`.\n [Jobs Listing Endpoint](#jobs-api-jobs-listing-endpoint)\n can be used to retrieve a job URL.\n ", + "example": "https://www.linkedin.com/jobs/view/3667167926/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobProfile" + }, + "example": { + "linkedin_internal_id": "content-strategist-at-microsoft-3257696537", + "job_description": "The Global Demand Center (GDC) within the Cloud Marketing group is leading the marketing transformation of Microsoft’s largest and fastest growing commercial businesses. Our always-on integrated marketing programs work to nurture and acquire new customers across segments, targeting business and technical audiences across our commercial cloud portfolio, with programs available in 42 markets and 30 languages. The GDC team is modernizing and integrating these channels through advanced analytics, marketing automation, and digital marketing. We are on a mission to drive market share, consumption, and consistent double-digit+ revenue growth. Content is the fuel that drives the digitally connected customer journeys at the core of the GDC engine, and we’re looking for a skilled, self-motivated, data-driven content strategist to build the content that motivates customers to take action. The Content Strategist will develop and execute content strategies for the ever-critical security space. You will be accountable for understanding the business priorities, getting close to our target audiences, defining the content journeys that attract, nurture, inspire, and retain customers, and manage quality execution and delivery of the content. You will work closely with your counterparts, the integrated marketing strategists, to drive business outcomes. Your network will include product marketers, integrated marketers, relationship marketers, sales, engineering, and agency partners to develop and execute on your plan. Our team: The Lifecycle Programs team is a fast-paced digital marketing organization. We put a focus on getting things done, simplifying anything and everything, and having fun while doing it. We all believe in connecting with customers at scale, supporting them at each stage of the customer journey, from early awareness and consideration, through onboarding and post purchase engagement. You will be in the middle of it all helping to identify the right content that delivers what customers want—where they want it, when they want it, and how they want it. \n \n**_Responsibilities \n_**\n * Define content journeys for Security and IT professionals across industries.\n * Build the resulting content strategies designed to accelerate the customer through the lifecycle.\n * Create a content plan to address the insights in the customer journey and strategy, ensuring the content is aligned to what the customer needs at each stage.\n * Deliver the content through our internal Studio or with select agency partners.\n * Be a customer advocate. Relentlessly champion the customer and the experiences they have with the content you create—how they find it, how they consume it, how they use it to make decisions.\n * Leverage data and market insights for decision making including content optimization and new concept development. \n\n\n**_Qualifications \n \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 1+ year(s) integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 3+ years integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience.\n * Strong customer centric mindset and demonstrated ability to put the customer first.\n * Clear and persuasive communication skills, both written and verbal.\n * Experience with program performance tracking and communications.\n * Recognized as a self-starter with a bias for action.\n * Creative problem-solving skills, and a growth mindset approach\n * Experience managing across highly matrixed organizations, often with competing priorities.\n * A demonstrated track record of business impact through content\n * Well-versed in digital marketing best practices, including journey mapping.\n * Understanding of content disciplines, including SEO, content strategy, and execution.\n * Preferred, but not required: experience with commercial technology sales process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The typical base pay range for this role across the U.S. is USD $80,900 - $162,200 per year. There is a different range applicable to specific work locations, within the San Francisco Bay area and New York City metropolitan area, and the base pay range for this role in those locations is USD $105,300 - $176,900 per year. \n \nMicrosoft has different base pay ranges for different work locations within the United States, which allows us to pay employees competitively and consistently in different geographic markets (see below). The range above reflects the potential base pay across the U.S. for this role (except as noted below); the applicable base pay range will depend on what ultimately is determined to be the candidate’s primary work location. Individual base pay depends on various factors, in addition to primary work location, such as complexity and responsibility of role, job duties/requirements, and relevant experience and skills. Base pay ranges are reviewed and typically updated each year. Offers are made within the base pay range applicable at the time. \n \nAt Microsoft certain roles are eligible for additional rewards, including merit increases, annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed here may vary depending on the nature of employment with Microsoft and the country work location. U.S.-based employees have access to healthcare benefits, a 401(k) plan and company match, short-term and long-term disability coverage, basic life insurance, wellbeing benefits, paid vacation time, paid sick and mental health time, and several paid holidays, among others. \n \nOur commitment to pay equity \n \nWe are committed to the principle of pay equity – paying employees equitably for substantially similar work. To learn more about pay equity and our other commitments to increase representation and strengthen our culture of inclusion, check out our annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page displays the role for which the base pay ranges apply – Integrated Marketing IC3. The way we define roles includes two things: discipline (the type of work) and career stage (scope and complexity). The career stage has two parts – the first identifies whether the role is a manager (M), an individual contributor (IC), an admin-technician-retail (ATR) job, or an intern. The second part identifies the relative seniority of the role – a higher number (or later letter alphabetically in the case of ATR) indicates greater scope and complexity. \n \nMicrosoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. If you need assistance and/or a reasonable accommodation due to a disability during the application or the recruiting process, please send a request via the Accommodation request form. \n \nThe salary for this role in the state of Colorado is between $108,200 and $162,200. \n \nAt Microsoft, certain roles are eligible for additional rewards, including annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work. \n", + "apply_url": "https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite", + "title": "Content Strategist", + "location": { + "country": "United States", + "region": "Hawaii", + "city": null, + "postal_code": null, + "latitude": null, + "longitude": null, + "street": null + }, + "company": { + "name": "Microsoft", + "url": "https://www.linkedin.com/company/microsoft", + "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" + }, + "seniority_level": "Mid-Senior level", + "industry": [ + "IT Services and IT Consulting, Computer Hardware Manufacturing, and Software Development" + ], + "employment_type": "Full-time", + "job_functions": [ + "Marketing" + ], + "total_applicants": 200 + } + } + }, + "description": "Detailed job data" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Jobs API" + ], + "operationId": "Job Profile Endpoint" + }, + "summary": "Job Profile Endpoint" + }, + "/api/followers": { + "get": { + "description": "Cost: 10 credits / result for users on an annual subscription or Enterprise plan.\nGet a list of individual followers of a company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of followers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/henry-schein", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of followers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/henryschein", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results of followers returned per API call.\n\n The default value of this parameter is 10.\n\n Accepted values for this parameter is an integer ranging from 0 to 1000.\n ", + "example": "10", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FollowerList" + }, + "example": { + "followers": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", + "twitter_profile_url": "https://www.x.com/agilio_software", + "email": null + }, + { + "linkedin_profile_url": "https://www.linkedin.com/in/air-techniques", + "twitter_profile_url": "https://www.x.com/airtechniques", + "email": null + } + ], + "next_page": null + } + } + }, + "description": "A list of individual followers of the company" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Customer API `EXPERIMENTAL`" + ], + "operationId": "Follower Listing Endpoint `EXPERIMENTAL`" + }, + "summary": "Follower Listing Endpoint `EXPERIMENTAL`" + }, + "/api/followers/count": { + "get": { + "description": "Cost: 1 credit / result for users on an annual subscription or Enterprise plan.\nGet the count of followers of a company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of followers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/henry-schein", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of followers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/henryschein", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FollowerListCount" + }, + "example": { + "follower_count": 74 + } + } + }, + "description": "Count individuals of that company's followers" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Customer API `EXPERIMENTAL`" + ], + "operationId": "Follower Listing Count Endpoint `EXPERIMENTAL`" + }, + "summary": "Follower Listing Count Endpoint `EXPERIMENTAL`" + }, + "/api/v2/search/company": { + "get": { + "description": "Cost: 3 credits / result returned.\nSearch for companies that meet a set of criteria within\n our exhaustive dataset of company profiles.\n\n This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our exhaustive dataset of company profiles.\n\n This API endpoint can return at most of 10,000 results per search.\n\n Each search expression for a parameter is limited to a maximum of 255 characters.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Filter companies with an office based in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "US", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "region", + "required": false, + "description": "\n Filter companies with an office based in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "United States", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "required": false, + "description": "\n Filter companies based in cities matching the provided search expression.\n ", + "example": "new AND york", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "type", + "required": false, + "description": "\n Filter companies of the provided LinkedIn type.\n\n Possible values:\n\n * `EDUCATIONAL`: Educational Institution\n * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT` : Nonprofit\n * `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY` : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED` : Sole Proprietorship\n ", + "example": "PRIVATELY_HELD", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "follower_count_min", + "required": false, + "description": "\n Filter companies with a LinkedIn follower count **more than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "follower_count_max", + "required": false, + "description": "\n Filter companies with a LinkedIn follower count **less than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name", + "required": false, + "description": "\n Filter companies with a name matching the provided search expression.\n ", + "example": "google OR apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "industry", + "required": false, + "description": "\n Filter companies belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n ", + "example": "technology", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employee_count_max", + "required": false, + "description": "\n Filter companies with **at most** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employee_count_min", + "required": false, + "description": "\n Filter companies with **at least** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "description", + "required": false, + "description": "\n Filter companies with a description matching the provided search expression.\n ", + "example": "medical device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "founded_after_year", + "required": false, + "description": "\n Filter companies founded **after** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "founded_before_year", + "required": false, + "description": "\n Filter companies founded **before** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_amount_max", + "required": false, + "description": "\n Filter companies that have raised **at most** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_amount_min", + "required": false, + "description": "\n Filter companies that have raised **at least** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_raised_after", + "required": false, + "description": "\n Filter companies that have raised funding **after** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_raised_before", + "required": false, + "description": "\n Filter companies that have raised funding **before** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the company’s profile URL).\n The target company’s identifier must be a member of this list.\n ", + "example": "stripe,amazon", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_not_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the company’s profile URL).\n The target company’s identifier must **not** be a member of this list.\n ", + "example": "stripe,amazon", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Tune the maximum results returned per API call.\n\n The default value of this parameter is 100.\n\n Accepted values for this parameter is an integer ranging from 1 to 100.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the company's complete profile data rather than just the URLs to their LinkedIn profiles.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n\n - skip (default): lists company's profile url\n - enrich: include company's profile data in the list\n\n Calling this API endpoint with this parameter would add 1 credit per result returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanySearchResult" + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple/", + "profile": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "search", + "ads" + ], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": false, + "state": "NY" + } + ], + "name": "Google", + "tagline": null, + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792 + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + } + }, + "description": "List of companies" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Search API" + ], + "operationId": "Company Search Endpoint" + }, + "summary": "Company Search Endpoint" + }, + "/api/v2/search/person/": { + "get": { + "description": "Cost: 3 credits / result returned.\nSearch for people who meet a set of criteria within our exhaustive dataset of people profiles.\n\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our exhaustive dataset of people and company profiles.\n\nThis API endpoint can return at most 10,000 results per search.\n\nEach search expression for a parameter is limited to a maximum of 255 characters.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": true, + "description": "\n Filter people located in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "US", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "first_name", + "required": false, + "description": "\n Filter people whose first names match the provided search expression.\n ", + "example": "Sarah", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "last_name", + "required": false, + "description": "\n Filter people whose last names match the provided search expression.\n ", + "example": "Jackson OR Johnson", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_field_of_study", + "required": false, + "description": "\n Filter people with a field of study matching the provided search expression, based on education history.\n ", + "example": "computer science", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_degree_name", + "required": false, + "description": "\n Filter people who earned a degree matching the provided search expression, based on education history.\n ", + "example": "MBA", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_school_name", + "required": false, + "description": "\n Filter people who have attended a school whose name matches the provided search expression, based on education history.\n ", + "example": "Caltech OR Massachusetts Institute of Technology", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_school_linkedin_profile_url", + "required": false, + "description": "\n Filter people who have attended a school with a specific LinkedIn profile URL, based on education history.\n ", + "example": "https://www.linkedin.com/school/national-university-of-singapore/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_role_title", + "required": false, + "description": "\n Filter people who are **currently** working as a role whose title matches the provided search expression. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_role_title", + "required": false, + "description": "\n Filter people who have **in the past** worked as a role whose title matches the provided search expression.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_role_before", + "required": false, + "description": "\n Filter people who started their current role **before** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n\n This parameter takes a ISO8601 date. Default value of this parameter is `null`.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_role_after", + "required": false, + "description": "\n Filter people who started their current role **after** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n\n This parameter takes a ISO8601 date. Default value of this parameter is `null`.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_linkedin_profile_url", + "required": false, + "description": "\n Filter people who are **currently** working at a company represented by this LinkedIn Company Profile URL.\n\n Default value of this parameter is `null`.\n ", + "example": "https://www.linkedin.com/company/apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_company_linkedin_profile_url", + "required": false, + "description": "\n Filter people who have **in the past** worked at the company represented by this LinkedIn Company Profile URL.\n\n This parameter takes a LinkedIn Company Profile URL. Default value of this parameter is `null`.\n ", + "example": "https://www.linkedin.com/company/apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_job_description", + "required": false, + "description": "\n Filter people with **current** job descriptions matching the provided search expression.\n ", + "example": "education", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_job_description", + "required": false, + "description": "\n Filter people with **past** job descriptions matching the provided search expression.\n ", + "example": "education", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_name", + "required": false, + "description": "\n Filter people who are **currently** working at a company whose name matches the provided search expression.\n ", + "example": "Stripe OR Apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_company_name", + "required": false, + "description": "\n Filter people who **have previously** worked at a company whose name matches the provided search expression.\n ", + "example": "Stripe OR Apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_groups", + "required": false, + "description": "\n Filter people who are members of LinkedIn groups whose names match the provided search expression.\n ", + "example": "haskell", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "languages", + "required": false, + "description": "\n Filter people who list a language matching the provided search expression.\n ", + "example": "Mandarin OR Chinese", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "region", + "required": false, + "description": "\n Filter people located in a region matching the provided search expression.\n A “region” in this context means “state,” “province,” or similar political division, depending on what country you’re querying.\n ", + "example": "California", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "required": false, + "description": "\n Filter people located in a city matching the provided search expression.\n ", + "example": "Seattle OR Los Angeles", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "headline", + "required": false, + "description": "\n Filter people whose LinkedIn headline fields match the provided search expression.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "summary", + "required": false, + "description": "\n Filter people whose LinkedIn summary fields match the provided search expression.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "industries", + "required": false, + "description": "\n Person's inferred industry. May sometimes exist when `current_company_industry` does not, but `current_company_industry` should be preferred when it exists.\n ", + "example": "automotive", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "interests", + "required": false, + "description": "\n Filter people whose Linkedin interest fields match the provided search expression.\n ", + "example": "technology", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "skills", + "required": false, + "description": "\n Filter people whose Linkedin skill fields match the provided search expression.\n ", + "example": "accounting", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_country", + "required": false, + "description": "\n Filter people who are currently working at a company with an office based in this country.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_region", + "required": false, + "description": "\n Filter people who are currently working at a company based in a region matching the provided search expression.\n ", + "example": "United States", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_city", + "required": false, + "description": "\n Filter people who are currently working at a company based in a city matching the provided search expression.\n ", + "example": "Seattle OR Los Angeles", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_type", + "required": false, + "description": "\n Filter people who are currently working at a company of the provided LinkedIn type.\n\n Possible values:\n\n * `EDUCATIONAL`: Educational Institution\n * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT` : Nonprofit\n * `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY` : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED` : Sole Proprietorship\n ", + "example": "NON_PROFIT", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_follower_count_min", + "required": false, + "description": "\n Filter people who are currently working at a company with a LinkedIn follower count **more than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_follower_count_max", + "required": false, + "description": "\n Filter people who are currently working at a company with a LinkedIn follower count **less than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_industry", + "required": false, + "description": "\n Filter people who are currently working at a company belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n ", + "example": "higher AND education", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_employee_count_min", + "required": false, + "description": "\n Filter people who are currently working at a company with **at least** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_employee_count_max", + "required": false, + "description": "\n Filter people who are currently working at a company with **at most** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_description", + "required": false, + "description": "\n Filter people who are currently working at a company with a description matching the provided search expression.\n ", + "example": "medical device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_founded_after_year", + "required": false, + "description": "\n Filter people who are currently working at a company that was founded **after** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_founded_before_year", + "required": false, + "description": "\n Filter people who are currently working at a company that was founded **before** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_amount_min", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised **at least** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_amount_max", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised **at most** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_raised_after", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised funding **after** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_raised_before", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised funding **before** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the person’s profile URL).\n The target person’s identifier must be a member of this list.\n ", + "example": "williamhgates,johnrmarty", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_not_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the person’s profile URL).\n The target person’s identifier must **not** be a member of this list.\n ", + "example": "williamhgates,johnrmarty", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Tune the maximum results returned per API call.\n\n The default value of this parameter is `100`.\n\n Accepted values for this parameter is an integer ranging from `1` to `100`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the person's complete profile data rather than just the URLs to their LinkedIn profiles.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n\n * `skip` (default): lists person's profile url only\n * `enrich`: include person's profile data in the list\n\n Calling this API endpoint with this parameter would add `1` credit per result returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonSearchResult" + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + } + }, + "description": "LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Search API" + ], + "operationId": "Person Search Endpoint" + }, + "summary": "Person Search Endpoint" + }, + "/api/credit-balance": { + "get": { + "description": "Cost: 0 credit / successful request.\nGet your current credit(s) balance", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreditBalance" + }, + "example": { + "credit_balance": 100000 + } + } + }, + "description": "Balance of credits" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Meta API" + ], + "operationId": "View Credit Balance Endpoint" + }, + "summary": "View Credit Balance Endpoint" + }, + "/api/disposable-email": { + "get": { + "description": "Cost: 0 credit / successful request.\nGiven an email address, checks if the email address belongs to a disposable email service.", + "parameters": [ + { + "in": "query", + "name": "email", + "required": true, + "description": "Email address to check", + "example": "steven@nubela.co", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisposableEmail" + }, + "example": { + "is_disposable_email": false, + "is_free_email": false + } + } + }, + "description": "Disposable Email Check" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Contact API" + ], + "operationId": "Disposable Email Address Check Endpoint" + }, + "summary": "Disposable Email Address Check Endpoint" + }, + "/api/contact-api/personal-contact": { + "get": { + "description": "Cost: 1 credit / contact number returned.\nFind personal phone numbers associated with a given social media profile.", + "parameters": [ + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n This controls the maximum number of numbers returned per API call.\n It's useful for limiting credit consumption as the number of numbers\n per identity can vary. The default value is 0, meaning there's no limit\n to the number of returned results.\n ", + "example": "0", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", + "example": "https://x.com/proxycurl", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_url", + "required": false, + "description": "\n The Facebook Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", + "example": "https://www.facebook.com/zuck", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", + "example": "https://linkedin.com/in/steven-goh-6738131b", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonalContactNumbers" + }, + "example": { + "numbers": [ + "+1123123123" + ] + } + } + }, + "description": "List of Personal Contact Numbers" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Contact API" + ], + "operationId": "Personal Contact Number Lookup Endpoint" + }, + "summary": "Personal Contact Number Lookup Endpoint" + }, + "/api/contact-api/personal-email": { + "get": { + "description": "Cost: 1 credit / email returned.\nFind personal email addresses associated with a given social media profile.", + "parameters": [ + { + "in": "query", + "name": "email_validation", + "required": false, + "description": "\n How to validate each email.\n \n Takes the following values:\n * `none` (default) - Do not perform email validation.\n * `fast` - Perform fast email validation (does not cost extra credit).\n * `precise` - Perform deliverability validation (costs 1 extra credit per email found).\n\n For backward-compatibility these are also accepted:\n * `include` - Equivalent to `precise`\n * `exclude` - Equivalent to `none`\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "This controls the maximum number of emails returned per API call. It's useful for limiting credit consumption as the number of emails per identity can vary. The default value is `0`, meaning there's no limit to the number of returned results.", + "example": 0, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "The Twitter/X Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://x.com/proxycurl", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_url", + "required": false, + "description": "The Facebook Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://www.facebook.com/zuck", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_profile_url", + "required": false, + "description": "The LinkedIn Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://linkedin.com/in/steven-goh-6738131b", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PDLEmailResult" + }, + "example": { + "emails": [ + "random@gmail.com", + "random2@yahoo.com" + ], + "invalid_emails": [ + "random3@gmail.com" + ] + } + } + }, + "description": "List of Personal Emails" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": [ + "Contact API" + ], + "operationId": "Personal Email Lookup Endpoint" + }, + "summary": "Personal Email Lookup Endpoint" + } + }, + "info": { + "title": "Proxycurl API", + "version": "1.0.0" + }, + "openapi": "3.0.0", + "components": { + "schemas": { + "CompanyLocation": { + "type": "object", + "properties": { + "country": { + "type": "string", + "nullable": true + }, + "city": { + "type": "string", + "nullable": true + }, + "postal_code": { + "type": "string", + "nullable": true + }, + "line_1": { + "type": "string", + "nullable": true + }, + "is_hq": { + "type": "boolean" + }, + "state": { + "type": "string", + "nullable": true + } + }, + "example": { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + } + }, + "CompanyType": { + "type": "string", + "enum": [ + "EDUCATIONAL", + "GOVERNMENT_AGENCY", + "NON_PROFIT", + "PARTNERSHIP", + "PRIVATELY_HELD", + "PUBLIC_COMPANY", + "SELF_EMPLOYED", + "SELF_OWNED" + ] + }, + "SimilarCompany": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "industry": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "name": "NUS Business School", + "link": "https://www.linkedin.com/school/nus-business-school/", + "industry": "Higher Education", + "location": null + } + }, + "AffiliatedCompany": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "industry": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "name": "LinkedIn", + "link": "https://www.linkedin.com/company/linkedin", + "industry": "Internet", + "location": "Sunnyvale, California" + } + }, + "Date": { + "type": "object", + "properties": { + "day": { + "type": "integer", + "nullable": true + }, + "month": { + "type": "integer", + "nullable": true + }, + "year": { + "type": "integer" + } + }, + "example": { + "day": 30, + "month": 9, + "year": 2021 + } + }, + "CompanyUpdate": { + "type": "object", + "properties": { + "article_link": { + "type": "string", + "nullable": true, + "description": "The URL for which the post links out to" + }, + "image": { + "type": "string", + "nullable": true, + "description": "The URL to the image to the post (if it exists)" + }, + "posted_on": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "text": { + "type": "string", + "nullable": true, + "description": "The body of the update" + }, + "total_likes": { + "type": "integer", + "nullable": true, + "description": "The total likes a post has received" + } + }, + "example": { + "article_link": "https://lnkd.in/gr7cb5by", + "image": "https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c", + "posted_on": { + "day": 30, + "month": 9, + "year": 2021 + }, + "text": "Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by", + "total_likes": 3 + } + }, + "LinkedinSchool": { + "type": "object", + "properties": { + "linkedin_internal_id": { + "type": "string", + "description": "\n LinkedIn's Internal and immutable ID of this Company profile.\n " + }, + "description": { + "type": "string", + "nullable": true, + "description": "A textual description of the company." + }, + "website": { + "type": "string", + "nullable": true, + "description": "The URL of the company's website." + }, + "industry": { + "type": "string", + "nullable": true, + "description": "The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link)." + }, + "company_size": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "integer", + "nullable": true + } + ] + }, + "minItems": 2, + "maxItems": 2, + "description": "Sequenceed range of company head count" + }, + "company_size_on_linkedin": { + "type": "integer", + "nullable": true, + "description": "The size of the company as indicated on LinkedIn." + }, + "hq": { + "$ref": "#/components/schemas/CompanyLocation", + "nullable": true + }, + "company_type": { + "$ref": "#/components/schemas/CompanyType", + "nullable": true, + "description": "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT` : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`: Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" + }, + "founded_year": { + "type": "integer", + "nullable": true, + "description": "The year the company was founded." + }, + "specialities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of specialities.\n " + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyLocation" + } + }, + "name": { + "type": "string", + "nullable": true, + "description": "The name of the company." + }, + "tagline": { + "type": "string", + "nullable": true, + "description": "A short, catchy phrase that represents the company's mission or brand." + }, + "universal_name_id": { + "type": "string", + "nullable": true, + "description": "A unique numerical identifier for the company used in the LinkedIn platform." + }, + "profile_pic_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's profile picture." + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's background cover image." + }, + "search_id": { + "type": "string", + "description": "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n " + }, + "similar_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarCompany" + } + }, + "affiliated_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AffiliatedCompany" + } + }, + "updates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyUpdate" + }, + "description": "A list of post updates made by the company. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "follower_count": { + "type": "integer", + "nullable": true, + "description": "The number of followers the company has on LinkedIn." + } + }, + "example": { + "linkedin_internal_id": "5524", + "description": "At NUS, we are shaping the future through our people and our pursuit of new frontiers in knowledge. In a single century, we have become a university of global influence and an Asian thought leader. Our location at the crossroads of Asia informs our mission and gives us a tremendous vantage point to help create opportunities and address the pressing issues facing Singapore, Asia and the world.\r\rAt NUS, we believe in education, research and service that change lives.", + "website": "http://nus.edu.sg", + "industry": "Higher Education", + "company_size": [ + 5001, + 10000 + ], + "company_size_on_linkedin": 16084, + "hq": { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + }, + "company_type": "EDUCATIONAL_INSTITUTION", + "founded_year": 1905, + "specialities": [ + "education", + "research" + ], + "locations": [ + { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + } + ], + "name": "National University of Singapore", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "national-university-of-singapore", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140", + "search_id": "5524", + "similar_companies": [ + { + "name": "NUS Business School", + "link": "https://www.linkedin.com/school/nus-business-school/", + "industry": "Higher Education", + "location": null + }, + { + "name": "NUS Faculty of Arts and Social Sciences", + "link": "https://www.linkedin.com/school/nusfass/", + "industry": "Higher Education", + "location": null + } + ], + "affiliated_companies": [ + { + "name": "LinkedIn", + "link": "https://www.linkedin.com/company/linkedin", + "industry": "Internet", + "location": "Sunnyvale, California" + } + ], + "updates": [ + { + "article_link": "https://lnkd.in/gr7cb5by", + "image": "https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c", + "posted_on": { + "day": 30, + "month": 9, + "year": 2021 + }, + "text": "Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by", + "total_likes": 3 + } + ], + "follower_count": 539321 + } + }, + "AcquiredCompany": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n LinkedIn Company Profile URL of company that was involved\n " + }, + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of company that was involved" + }, + "announced_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date by which this event was announced" + }, + "price": { + "type": "integer", + "nullable": true, + "description": "Price of acquisition" + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + }, + "Acquisitor": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n LinkedIn Company Profile URL of company that was involved\n " + }, + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of company that was involved" + }, + "announced_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date by which this event was announced" + }, + "price": { + "type": "integer", + "nullable": true, + "description": "Price of acquisition" + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "Acquisition": { + "type": "object", + "properties": { + "acquired": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AcquiredCompany" + } + }, + "acquired_by": { + "$ref": "#/components/schemas/Acquisitor", + "nullable": true + } + }, + "example": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + } + }, + "Exit": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "LinkedIn Profile URL of the company that has exited" + }, + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of the company that has exited" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of the company" + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + }, + "CompanyDetails": { + "type": "object", + "properties": { + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of the company" + }, + "ipo_status": { + "type": "string", + "nullable": true, + "description": "IPO status of the company" + }, + "crunchbase_rank": { + "type": "integer", + "nullable": true, + "description": "A measure of prominence of this company by Crunchbase" + }, + "founding_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of founding" + }, + "operating_status": { + "type": "string", + "nullable": true, + "description": "Status of the company's operational status" + }, + "company_type": { + "type": "string", + "nullable": true, + "description": "Type of company" + }, + "contact_email": { + "type": "string", + "nullable": true, + "description": "General contact email of the company" + }, + "phone_number": { + "type": "string", + "nullable": true, + "description": "General contact number of the company" + }, + "facebook_id": { + "type": "string", + "nullable": true, + "description": "ID of the company's official Facebook account" + }, + "twitter_id": { + "type": "string", + "nullable": true, + "description": "ID of the company's official Twitter account" + }, + "number_of_funding_rounds": { + "type": "integer", + "nullable": true, + "description": "Total rounds of funding that this company has raised" + }, + "total_funding_amount": { + "type": "integer", + "nullable": true, + "description": "Total venture capital raised by this company" + }, + "stock_symbol": { + "type": "string", + "nullable": true, + "description": "Stock symbol of this public company" + }, + "ipo_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "The date by which this public company went public" + }, + "number_of_lead_investors": { + "type": "integer", + "nullable": true, + "description": "Total lead investors" + }, + "number_of_investors": { + "type": "integer", + "nullable": true, + "description": "Total investors" + }, + "total_fund_raised": { + "type": "integer", + "nullable": true, + "description": "\n The total amount of funds raised (by this VC firm) to be deployed as\n subsidiary investments (applicable only for VC firms)\n " + }, + "number_of_investments": { + "type": "integer", + "nullable": true, + "description": "\n Total investments made by this VC firm (applicable only for VC firms)\n " + }, + "number_of_lead_investments": { + "type": "integer", + "nullable": true, + "description": "\n Total investments that was led by this VC firm\n (applicable only for VC firms)\n " + }, + "number_of_exits": { + "type": "integer", + "nullable": true, + "description": "Total exits by this VC (applicable only for VC firms)" + }, + "number_of_acquisitions": { + "type": "integer", + "nullable": true, + "description": "Total companies acquired by this company" + } + }, + "example": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + } + }, + "Investor": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "LinkedIn Profile URL of investor" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of investor" + }, + "type": { + "type": "string", + "nullable": true, + "description": "Type of investor" + } + }, + "example": { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + }, + "Funding": { + "type": "object", + "properties": { + "funding_type": { + "type": "string", + "nullable": true, + "description": "Type of funding" + }, + "money_raised": { + "type": "integer", + "nullable": true, + "description": "Amount of money raised" + }, + "announced_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of announcement" + }, + "number_of_investor": { + "type": "integer", + "nullable": true, + "description": "Number of investors in this round" + }, + "investor_list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Investor" + }, + "nullable": true + } + }, + "example": { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + }, + "LinkedinCompany": { + "type": "object", + "properties": { + "linkedin_internal_id": { + "type": "string", + "description": "\n LinkedIn's Internal and immutable ID of this Company profile.\n " + }, + "description": { + "type": "string", + "nullable": true, + "description": "A textual description of the company." + }, + "website": { + "type": "string", + "nullable": true, + "description": "The URL of the company's website." + }, + "industry": { + "type": "string", + "nullable": true, + "description": "The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link)." + }, + "company_size": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "integer", + "nullable": true + } + ] + }, + "minItems": 2, + "maxItems": 2, + "description": "Sequenceed range of company head count" + }, + "company_size_on_linkedin": { + "type": "integer", + "nullable": true, + "description": "The size of the company as indicated on LinkedIn." + }, + "hq": { + "$ref": "#/components/schemas/CompanyLocation", + "nullable": true + }, + "company_type": { + "$ref": "#/components/schemas/CompanyType", + "nullable": true, + "description": "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT` : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`: Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" + }, + "founded_year": { + "type": "integer", + "nullable": true, + "description": "The year the company was founded." + }, + "specialities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of specialities.\n " + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyLocation" + } + }, + "name": { + "type": "string", + "nullable": true, + "description": "The name of the company." + }, + "tagline": { + "type": "string", + "nullable": true, + "description": "A short, catchy phrase that represents the company's mission or brand." + }, + "universal_name_id": { + "type": "string", + "nullable": true, + "description": "A unique numerical identifier for the company used in the LinkedIn platform." + }, + "profile_pic_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's profile picture." + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's background cover image." + }, + "search_id": { + "type": "string", + "description": "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n " + }, + "similar_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarCompany" + } + }, + "affiliated_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AffiliatedCompany" + } + }, + "updates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyUpdate" + }, + "description": "A list of post updates made by the company. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "follower_count": { + "type": "integer", + "nullable": true, + "description": "The number of followers the company has on LinkedIn." + }, + "acquisitions": { + "$ref": "#/components/schemas/Acquisition", + "nullable": true + }, + "exit_data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Exit" + }, + "nullable": true + }, + "extra": { + "$ref": "#/components/schemas/CompanyDetails", + "nullable": true, + "description": "Company extra when `extra=include`" + }, + "funding_data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Funding" + }, + "description": "Company Funding data when `funding_data=include`" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "description": "The `categories` attribute is fetched from the company's Crunchbase profile. Values for this attribute are free-form text, and there is no exhaustive list of categories. Consider the categories attribute as \"hints\" regarding the products or services offered by the company." + }, + "customer_list": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + } + }, + "example": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "search", + "ads" + ], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": null, + "state": "NY" + } + ], + "name": "Google", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": [ + "artificial-intelligence", + "virtual-reality" + ] + } + }, + "Experience": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "company": { + "type": "string", + "nullable": true, + "description": "The company's display name." + }, + "company_linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The company's profile URL on Linkedin.\n If present, could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint) for more info.\n " + }, + "company_facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The company's profile URL on Facebook.\n " + }, + "title": { + "type": "string", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + }, + "logo_url": { + "type": "string", + "nullable": true, + "description": "URL of the logo of the organisation." + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + } + }, + "Education": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "field_of_study": { + "type": "string", + "nullable": true + }, + "degree_name": { + "type": "string", + "nullable": true + }, + "school": { + "type": "string", + "nullable": true + }, + "school_linkedin_profile_url": { + "type": "string", + "nullable": true + }, + "school_facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The school's profile URL on Facebook.\n " + }, + "description": { + "type": "string", + "nullable": true + }, + "logo_url": { + "type": "string", + "nullable": true + }, + "grade": { + "type": "string" + }, + "activities_and_societies": { + "type": "string" + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + } + }, + "AccomplishmentOrg": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "org_name": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + }, + "Publication": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "Name of the publication." + }, + "publisher": { + "type": "string", + "nullable": true, + "description": "The publishing organisation body." + }, + "published_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of publication." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the publication." + }, + "url": { + "type": "string", + "nullable": true, + "description": "URL of the publication." + } + }, + "example": { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + }, + "HonourAward": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true, + "description": "Title of the honour/award." + }, + "issuer": { + "type": "string", + "nullable": true, + "description": "The organisation body issuing this honour/award." + }, + "issued_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date that this honour/awared was issued." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the honour/award." + } + }, + "example": { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + }, + "Patent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true, + "description": "Title of the patent." + }, + "issuer": { + "type": "string", + "nullable": true, + "description": "The organisation body that issued the patent." + }, + "issued_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of patent issuance." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the patent." + }, + "application_number": { + "type": "string", + "nullable": true, + "description": "Numerical representation that identifies the patent." + }, + "patent_number": { + "type": "string", + "nullable": true, + "description": "Application number of the patent." + }, + "url": { + "type": "string", + "nullable": true + } + }, + "example": { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + }, + "Course": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "Name of the course" + }, + "number": { + "type": "string", + "nullable": true, + "description": "The numerical representation of the course" + } + }, + "example": { + "name": "The course about ABCs", + "number": "123" + } + }, + "Project": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true, + "description": "\n Name of the project that has been or is currently being worked on.\n " + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the project." + }, + "url": { + "type": "string", + "nullable": true, + "description": "A web location related to the project." + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + } + }, + "TestScore": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "\n Title of the course for which test score was derived from.\n " + }, + "score": { + "type": "string", + "nullable": true, + "description": "Test score" + }, + "date_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of test was assesed." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the test score." + } + }, + "example": { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + }, + "VolunteeringExperience": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true, + "description": "Name of volunteer activity." + }, + "cause": { + "type": "string", + "nullable": true + }, + "company": { + "type": "string", + "nullable": true, + "description": "The company's display name." + }, + "company_linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The company's profile URL.\n If present, could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint) for more info.\n " + }, + "description": { + "type": "string", + "nullable": true + }, + "logo_url": { + "type": "string", + "nullable": true, + "description": "URL of the logo of the organisation." + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + }, + "Certification": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of the course or program." + }, + "license_number": { + "type": "string", + "nullable": true + }, + "display_source": { + "type": "string", + "nullable": true + }, + "authority": { + "type": "string", + "nullable": true, + "description": "The organisation body issuing this certificate." + }, + "url": { + "type": "string", + "nullable": true + } + }, + "example": { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + } + }, + "PeopleAlsoViewed": { + "type": "object", + "properties": { + "link": { + "type": "string", + "nullable": true, + "description": "\n URL of the profile.\n Useable with [Person profile endpoint](#people-api-person-profile-endpoint)\n " + }, + "name": { + "type": "string", + "nullable": true + }, + "summary": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + }, + "Activity": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "activity_status": { + "type": "string", + "nullable": true + } + }, + "example": { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + }, + "SimilarProfile": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "summary": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + } + }, + "Article": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "published_date": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "author": { + "type": "string", + "nullable": true + }, + "image_url": { + "type": "string", + "nullable": true + } + }, + "example": { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + }, + "PersonGroup": { + "type": "object", + "properties": { + "profile_pic_url": { + "type": "string", + "nullable": true, + "description": "The URL to the profile picture of this LinkedIn Group" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of LinkedIn group for which this user is in" + }, + "url": { + "type": "string", + "nullable": true, + "description": "URL to the LinkedIn Group" + } + }, + "example": { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + }, + "InferredSalary": { + "type": "object", + "properties": { + "min": { + "type": "number", + "nullable": true + }, + "max": { + "type": "number", + "nullable": true + } + }, + "example": { + "min": 35000, + "max": 45000 + } + }, + "PersonExtra": { + "type": "object", + "properties": { + "github_profile_id": { + "type": "string", + "nullable": true, + "description": "This profile's Github account." + }, + "facebook_profile_id": { + "type": "string", + "nullable": true, + "description": "This profile's Facebook account." + }, + "twitter_profile_id": { + "type": "string", + "nullable": true, + "description": "This profile's twitter account." + }, + "website": { + "type": "string", + "nullable": true, + "description": "This account's website listed on his profile." + } + }, + "example": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + } + }, + "PersonEndpointResponse": { + "type": "object", + "properties": { + "public_identifier": { + "type": "string", + "nullable": true, + "description": "\n The vanity identifier of the public LinkedIn profile.\n The vanity identifier comes after the `/in/` part of the LinkedIn Profile URL\n in the following format: `https://www.linkedin.com/in/`\n " + }, + "profile_pic_url": { + "type": "string", + "description": "\n A temporary link to the user's profile picture that is valid for 30 minutes. \n The temporal nature of the link is by design to prevent having Proxycurl be the mirror for the images.\n The developer is expected to handle these images by downloading the image and re-hosting the image.\n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n Some profile pictures might be of the standard LinkedIn's profile picture placeholder. It is so because. See [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/) for context.\n " + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "\n A temporary link to the user's background cover picture\n that is valid for 30 minutes.\n The temporal nature of the link is by design to prevent\n having Proxycurl be the mirror for the images.\n The developer is expected to handle these images \n by downloading the image and re-hosting the image. \n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n " + }, + "first_name": { + "type": "string", + "nullable": true, + "description": "First name of the user." + }, + "last_name": { + "type": "string", + "nullable": true, + "description": "Last name of the user." + }, + "full_name": { + "type": "string", + "nullable": true, + "description": "\n Full name of the user (`first_name` + `last_name`)\n " + }, + "follower_count": { + "type": "integer", + "description": "Follower count for this profile" + }, + "occupation": { + "type": "string", + "nullable": true, + "description": "\n The title and company name of the user's current employment.\n " + }, + "headline": { + "type": "string", + "nullable": true, + "description": "\n The tagline written by the user for his profile.\n " + }, + "summary": { + "type": "string", + "nullable": true, + "description": "\n A blurb (longer than the tagline) written by the user for his profile.\n " + }, + "country": { + "type": "string", + "nullable": true, + "description": "\n The user's country of residence depicted by\n a 2-letter country code (ISO 3166-1 alpha-2).\n " + }, + "country_full_name": { + "type": "string", + "nullable": true, + "description": "The user's country of residence, in English words." + }, + "city": { + "type": "string", + "nullable": true, + "description": "The city that the user is living at." + }, + "state": { + "type": "string", + "nullable": true, + "description": "The state that the user is living at." + }, + "experiences": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Experience" + }, + "description": "The user's list of historic work experiences." + }, + "education": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Education" + }, + "description": "The user's list of education background." + }, + "languages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of languages that the user claims to be familiar with,\n and has added to his/her profile.\n Do note that we do not have the proficiency level as\n that data point is not available on a public LinkedIn profile.\n " + }, + "accomplishment_organisations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccomplishmentOrg" + }, + "description": "\n List of noteworthy organizations that this user is part of.\n " + }, + "accomplishment_publications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Publication" + }, + "description": "\n List of noteworthy publications that this user has partook in.\n " + }, + "accomplishment_honors_awards": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HonourAward" + }, + "description": "\n List of noteworthy honours and awards that this user has won.\n " + }, + "accomplishment_patents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Patent" + }, + "description": "List of noteworthy patents won by this user." + }, + "accomplishment_courses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Course" + }, + "description": "List of noteworthy courses partook by this user." + }, + "accomplishment_projects": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + }, + "description": "\n List of noteworthy projects undertaken by this user.\n " + }, + "accomplishment_test_scores": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestScore" + }, + "description": "\n List of noteworthy test scores accomplished by this user.\n " + }, + "volunteer_work": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VolunteeringExperience" + }, + "description": "List of historic volunteer work experiences." + }, + "certifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Certification" + }, + "description": "\n List of noteworthy certifications accomplished by this user.\n " + }, + "connections": { + "type": "integer", + "nullable": true, + "description": "Total *count* of LinkedIn connections." + }, + "people_also_viewed": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PeopleAlsoViewed" + }, + "description": "\n A list of other LinkedIn profiles closely related to this user.\n " + }, + "recommendations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n List of recommendations made by other users about this profile.\n " + }, + "activities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Activity" + }, + "description": "A list of LinkedIn status activities. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "similarly_named_profiles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarProfile" + }, + "description": "\n A list of other LinkedIn profiles with similar names.\n " + }, + "articles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Article" + }, + "description": "\n A list of content-based articles posted by this user. This field is not guaranteed to be returned. Do not rely on this attribute in production.\n " + }, + "groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonGroup" + }, + "description": "\n A list of LinkedIn groups that this user is a part of.\",\n " + }, + "skills": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of keyword-based skills that this user boasts of on his LinkedIn profile." + }, + "inferred_salary": { + "$ref": "#/components/schemas/InferredSalary", + "nullable": true, + "description": "A salary range inferred from the user's current job title and company." + }, + "gender": { + "type": "string", + "nullable": true, + "description": "Gender of the user." + }, + "birth_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Birth date of the user." + }, + "industry": { + "type": "string", + "nullable": true, + "description": "Industry that the user works in." + }, + "extra": { + "$ref": "#/components/schemas/PersonExtra", + "nullable": true, + "description": "A bundle of extra data on this user." + }, + "interests": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of interests that the user has." + }, + "personal_emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of personal emails associated with this user." + }, + "personal_numbers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of personal mobile phone numbers associated with this user." + } + }, + "example": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": [ + "education", + "health", + "human rights" + ], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": [ + "+6512345678", + "+6285123450953", + "+6502300340" + ] + } + }, + "CompanyCustomer": { + "type": "object", + "properties": { + "linkedin_company_profile_url": { + "type": "string", + "description": "LinkedIn Company Profile URL of a probable customer" + }, + "twitter_profile_url": { + "type": "string", + "nullable": true, + "description": "Twitter Profile URL of a probable customer" + }, + "email": { + "type": "string", + "nullable": true, + "description": "General Email address of company (if any)" + } + }, + "example": { + "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", + "twitter_profile_url": "https://twitter.com/spirellp", + "email": "info@spiresolicitors.co.uk" + } + }, + "CustomerList": { + "type": "object", + "properties": { + "companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyCustomer" + }, + "description": "A list of companies that are probable customers." + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "companies": [ + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", + "twitter_profile_url": "https://twitter.com/spirellp", + "email": "info@spiresolicitors.co.uk" + }, + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/mall-wood-insurance-services-ltd", + "twitter_profile_url": "https://twitter.com/draytonins", + "email": "hello@example.com" + } + ], + "next_page": null + } + }, + "CustomerCount": { + "type": "object", + "properties": { + "company_count": { + "type": "integer", + "nullable": true, + "description": "A count of of companies that are probable customers." + } + }, + "example": { + "company_count": 125 + } + }, + "PublicPerson": { + "type": "object", + "properties": { + "public_identifier": { + "type": "string", + "nullable": true, + "description": "\n The vanity identifier of the public LinkedIn profile.\n The vanity identifier comes after the `/in/` part of the LinkedIn Profile URL\n in the following format: `https://www.linkedin.com/in/`\n " + }, + "profile_pic_url": { + "type": "string", + "description": "\n A temporary link to the user's profile picture that is valid for 30 minutes. \n The temporal nature of the link is by design to prevent having Proxycurl be the mirror for the images.\n The developer is expected to handle these images by downloading the image and re-hosting the image.\n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n Some profile pictures might be of the standard LinkedIn's profile picture placeholder. It is so because. See [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/) for context.\n " + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "\n A temporary link to the user's background cover picture\n that is valid for 30 minutes.\n The temporal nature of the link is by design to prevent\n having Proxycurl be the mirror for the images.\n The developer is expected to handle these images \n by downloading the image and re-hosting the image. \n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n " + }, + "first_name": { + "type": "string", + "nullable": true, + "description": "First name of the user." + }, + "last_name": { + "type": "string", + "nullable": true, + "description": "Last name of the user." + }, + "full_name": { + "type": "string", + "nullable": true, + "description": "\n Full name of the user (`first_name` + `last_name`)\n " + }, + "follower_count": { + "type": "integer", + "description": "Follower count for this profile" + }, + "occupation": { + "type": "string", + "nullable": true, + "description": "\n The title and company name of the user's current employment.\n " + }, + "headline": { + "type": "string", + "nullable": true, + "description": "\n The tagline written by the user for his profile.\n " + }, + "summary": { + "type": "string", + "nullable": true, + "description": "\n A blurb (longer than the tagline) written by the user for his profile.\n " + }, + "country": { + "type": "string", + "nullable": true, + "description": "\n The user's country of residence depicted by\n a 2-letter country code (ISO 3166-1 alpha-2).\n " + }, + "country_full_name": { + "type": "string", + "nullable": true, + "description": "The user's country of residence, in English words." + }, + "city": { + "type": "string", + "nullable": true, + "description": "The city that the user is living at." + }, + "state": { + "type": "string", + "nullable": true, + "description": "The state that the user is living at." + }, + "experiences": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Experience" + }, + "description": "The user's list of historic work experiences." + }, + "education": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Education" + }, + "description": "The user's list of education background." + }, + "languages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of languages that the user claims to be familiar with,\n and has added to his/her profile.\n Do note that we do not have the proficiency level as\n that data point is not available on a public LinkedIn profile.\n " + }, + "accomplishment_organisations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccomplishmentOrg" + }, + "description": "\n List of noteworthy organizations that this user is part of.\n " + }, + "accomplishment_publications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Publication" + }, + "description": "\n List of noteworthy publications that this user has partook in.\n " + }, + "accomplishment_honors_awards": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HonourAward" + }, + "description": "\n List of noteworthy honours and awards that this user has won.\n " + }, + "accomplishment_patents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Patent" + }, + "description": "List of noteworthy patents won by this user." + }, + "accomplishment_courses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Course" + }, + "description": "List of noteworthy courses partook by this user." + }, + "accomplishment_projects": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + }, + "description": "\n List of noteworthy projects undertaken by this user.\n " + }, + "accomplishment_test_scores": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestScore" + }, + "description": "\n List of noteworthy test scores accomplished by this user.\n " + }, + "volunteer_work": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VolunteeringExperience" + }, + "description": "List of historic volunteer work experiences." + }, + "certifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Certification" + }, + "description": "\n List of noteworthy certifications accomplished by this user.\n " + }, + "connections": { + "type": "integer", + "nullable": true, + "description": "Total *count* of LinkedIn connections." + }, + "people_also_viewed": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PeopleAlsoViewed" + }, + "description": "\n A list of other LinkedIn profiles closely related to this user.\n " + }, + "recommendations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n List of recommendations made by other users about this profile.\n " + }, + "activities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Activity" + }, + "description": "A list of LinkedIn status activities. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "similarly_named_profiles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarProfile" + }, + "description": "\n A list of other LinkedIn profiles with similar names.\n " + }, + "articles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Article" + }, + "description": "\n A list of content-based articles posted by this user. This field is not guaranteed to be returned. Do not rely on this attribute in production.\n " + }, + "groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonGroup" + }, + "description": "\n A list of LinkedIn groups that this user is a part of.\",\n " + }, + "skills": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of keyword-based skills that this user boasts of on his LinkedIn profile." + } + }, + "example": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "follower_count": null, + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "company_facebook_profile_url": null, + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "company_facebook_profile_url": null, + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Chinese", + "Japanese" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [], + "connections": null, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Professional and dedicated approach towards clients and collegues." + ], + "activities": [ + { + "title": "I am hiring!", + "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", + "activity_status": "posted" + } + ], + "similarly_named_profiles": null, + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + } + }, + "Employee": { + "type": "object", + "properties": { + "profile_url": { + "type": "string", + "description": "\n LinkedIn Profile URL of the employee.\n " + }, + "profile": { + "$ref": "#/components/schemas/PublicPerson", + "nullable": true, + "description": "\n Enriched profile data of the employee.\n " + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "profile_url": "https://www.linkedin.com/in/williamhgates", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "follower_count": null, + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "company_facebook_profile_url": null, + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "company_facebook_profile_url": null, + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Chinese", + "Japanese" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [], + "connections": null, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Professional and dedicated approach towards clients and collegues." + ], + "activities": [ + { + "title": "I am hiring!", + "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", + "activity_status": "posted" + } + ], + "similarly_named_profiles": null, + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "EmployeeList": { + "type": "object", + "properties": { + "employees": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Employee" + }, + "description": "\n A list of employee profiles (if enriched) and their associated profile URL.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "employees": [ + { + "profile_url": "https://www.linkedin.com/in/williamhgates", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "follower_count": null, + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "company_facebook_profile_url": null, + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "company_facebook_profile_url": null, + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Chinese", + "Japanese" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [], + "connections": null, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Professional and dedicated approach towards clients and collegues." + ], + "activities": [ + { + "title": "I am hiring!", + "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", + "activity_status": "posted" + } + ], + "similarly_named_profiles": null, + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + }, + "EmployeeCount": { + "type": "object", + "properties": { + "total_employee": { + "type": "integer" + }, + "linkedin_employee_count": { + "type": "integer", + "nullable": true, + "description": "The scraped value of employee count of this company from it's LinkedIn profile. This value does not respect `employement_status` parameter. It will always return the curent employee count of this company from LinkedIn." + }, + "linkdb_employee_count": { + "type": "integer", + "description": "The total number of employees found in LinkDB for this company. This value is limited by pre-crawled LinkedIn profiles stored in [LinkDB](https://nubela.co/proxycurl/linkdb)" + }, + "regression_notice": { + "type": "string" + } + }, + "example": { + "linkedin_employee_count": 529274, + "linkdb_employee_count": 3 + } + }, + "ProfilePicture": { + "type": "object", + "properties": { + "tmp_profile_pic_url": { + "type": "string", + "description": "\n Temporary URL to the profile picture (valid for just 30 minutes).\n See this [blog post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for more information." + } + }, + "example": { + "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" + } + }, + "PersonLookupUrlEnrichResult": { + "type": "object", + "properties": { + "url": { + "type": "string", + "nullable": true, + "description": "The LinkedIn profile URL" + }, + "name_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input name is to the name in the returned profile. Values can range from `0` to `1` , with `0` indicating no similarity and `1` implying high similarity. In cases where a current profile for comparison is not available in our dataset, the result may be `null`." + }, + "company_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input company name/domain is to the name/domain of past or present companies in the returned profile. The score ranges from `0` to `1` , with `0` signifying no similarity and `1` denoting high similarity. If a relevant profile is unavailable in our dataset for comparison, a `null` score may be returned." + }, + "title_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input title is to the returned profile's past or present titles. Scores vary from `0` to `1` , where `0` means no similarity and `1` indicates high similarity. If a relevant profile for comparison isn't available in our dataset, a `null` result may occur." + }, + "location_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input location is to the returned profile's current location. The range is from `0` to `1` , with `0` representing no similarity and `1` signifying high similarity. If there isn't a relevant profile in our dataset for comparison, the score might be `null`. " + }, + "profile": { + "$ref": "#/components/schemas/PersonEndpointResponse" + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "url": "https://www.linkedin.com/in/senatormarty", + "name_similarity_score": 0.5, + "company_similarity_score": 0.5, + "title_similarity_score": 0.5, + "location_similarity_score": 0.5, + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": [ + "education", + "health", + "human rights" + ], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": [ + "+6512345678", + "+6285123450953", + "+6502300340" + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "JobListEntry": { + "type": "object", + "properties": { + "company": { + "type": "string", + "nullable": true, + "description": "\n The name of the company that posted this job.\n " + }, + "company_url": { + "type": "string", + "nullable": true, + "description": "\n The LinkedIn Company Profile URL that posted this job.\n " + }, + "job_title": { + "type": "string", + "nullable": true, + "description": "\n Job title of the posted job.\n " + }, + "job_url": { + "type": "string", + "nullable": true, + "description": "\n Job Profile URL. You can fetch details about this job using this URL via the [Job Profile API Endpoint](https://nubela.co/proxycurl/docs#jobs-api-job-profile-endpoint).\n " + }, + "list_date": { + "type": "string", + "nullable": true, + "description": "\n The date that this job was listed.\n " + }, + "location": { + "type": "string", + "nullable": true, + "description": "\n The job location.\n " + } + }, + "example": { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Product Management: Intern Opportunities for University Students", + "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", + "list_date": "2022-10-09", + "location": "New York, NY" + } + }, + "JobListPage": { + "type": "object", + "properties": { + "job": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JobListEntry" + } + }, + "next_page_no": { + "type": "integer", + "nullable": true + }, + "next_page_api_url": { + "type": "string", + "nullable": true, + "description": "\n The URL to the next page of results. This will be null for the final page.\n " + }, + "previous_page_no": { + "type": "integer", + "nullable": true + }, + "previous_page_api_url": { + "type": "string", + "nullable": true, + "description": "\n The URL to the previous page of results. This will be null for the first page.\n " + } + }, + "example": { + "job": [ + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Product Management: Intern Opportunities for University Students", + "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", + "list_date": "2022-10-09", + "location": "New York, NY" + }, + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Content Strategist", + "job_url": "https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764", + "list_date": "2022-10-21", + "location": "United States" + } + ], + "next_page_no": 1, + "next_page_api_url": "http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035", + "previous_page_no": null, + "previous_page_api_url": "https://nubela.co/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035" + } + }, + "JobListCount": { + "type": "object", + "properties": { + "count": { + "type": "integer" + } + }, + "example": { + "count": 887622 + } + }, + "RoleSearchEnrichedResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "LinkedIn Profile URL of the person that most closely matches the role" + }, + "profile": { + "$ref": "#/components/schemas/PersonEndpointResponse" + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": [ + "education", + "health", + "human rights" + ], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": [ + "+6512345678", + "+6285123450953", + "+6502300340" + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "CompanyUrlEnrichResult": { + "type": "object", + "properties": { + "url": { + "type": "string", + "nullable": true, + "description": "The LinkedIn profile URL" + }, + "profile": { + "$ref": "#/components/schemas/LinkedinCompany" + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "url": "https://www.linkedin.com/company/accenture", + "profile": { + "linkedin_internal_id": "1033", + "description": "Accenture is a global professional services company with leading capabilities in digital, cloud, and security. Combining unmatched experience and specialized skills across more than 40 industries, we offer Strategy and Consulting, Technology and Operations Services, and Accenture Song—all powered by the world’s largest network of Advanced Technology and Intelligent Operations centers. \n\nOur people deliver on the promise of technology and human ingenuity every day, serving clients in more than 120 countries. We embrace the power of change to create value and shared success for our clients, people, shareholders, partners, and communities. \n\nVisit us at accenture.com.", + "website": "http://www.accenture.com", + "industry": "Business Consulting and Services", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 541251, + "hq": { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "Management Consulting", + "Systems Integration and Technology" + ], + "locations": [ + { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + { + "country": "US", + "city": "San Francisco", + "postal_code": "94105", + "line_1": "415 Mission Street Floor 31-34", + "is_hq": null, + "state": "California" + } + ], + "name": "Accenture", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "accenture", + "profile_pic_url": "https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY", + "background_cover_image_url": "https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0", + "search_id": "1033", + "similar_companies": [ + { + "name": "Deloitte", + "link": "https://www.linkedin.com/company/deloitte", + "industry": "Business Consulting and Services", + "location": null + }, + { + "name": "Tata Consultancy Services", + "link": "https://in.linkedin.com/company/tata-consultancy-services", + "industry": "IT Services and IT Consulting", + "location": "Mumbai, Maharashtra" + } + ], + "affiliated_companies": [ + { + "name": "Accenture in India", + "link": "https://in.linkedin.com/company/accentureindia", + "industry": "IT Services and IT Consulting", + "location": "Bengaluru, Karnatka" + }, + { + "name": "Accenture Brasil", + "link": "https://br.linkedin.com/company/accenturebrasil", + "industry": "IT Services and IT Consulting", + "location": "São Paulo, São Paulo" + } + ], + "updates": [ + { + "article_link": null, + "image": null, + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4", + "total_likes": 325 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA", + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "The ability to learn new things, without forgetting those that came before, is a huge differentiator between the #AI we're familiar with, and the #GenerativeAI powered by foundation models that we're seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n \n#TechVision2023", + "total_likes": 541 + } + ], + "follower_count": 11125167, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": [ + "artificial-intelligence", + "virtual-reality" + ] + }, + "last_updated": "2023-10-26T11:33:24Z" + } + }, + "Student": { + "type": "object", + "properties": { + "profile_url": { + "type": "string" + }, + "profile": { + "$ref": "#/components/schemas/PublicPerson", + "nullable": true + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "StudentList": { + "type": "object", + "properties": { + "students": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Student" + }, + "description": "\n A list of student profiles (if enriched) and their associated profile URL.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "students": [ + { + "profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + }, + "ReverseEmailUrlEnrichResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the closest match of the LinkedIn profile that belongs to this email address." + }, + "twitter_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Twitter Profile URL that belongs to this email address." + }, + "facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Facebook Profile URL that belongs to this email address." + }, + "url": { + "type": "string", + "nullable": true + }, + "similarity_score": { + "type": "number", + "nullable": true, + "description": "This metric quantifies the degree of resemblance between the queried profile and the retrieved one. Scores range from `0` (no similarity) to `1` (high similarity). In the event that our dataset lacks a pertinent profile for comparison, the assigned score might be `null`." + }, + "backwards_compatibility_notes": { + "type": "string", + "nullable": true + }, + "profile": { + "$ref": "#/components/schemas/PersonEndpointResponse", + "nullable": true + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "twitter_profile_url": "https://www.twitter.com/proxycurl", + "facebook_profile_url": "https://www.facebook.com/zuck", + "similarity_score": 0.82, + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": [ + "education", + "health", + "human rights" + ], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": [ + "+6512345678", + "+6285123450953", + "+6502300340" + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "ReverseContactNumberResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the closest match of the LinkedIn profile that belongs to this phone number." + }, + "twitter_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Twitter Profile URL that belongs to this phone number." + }, + "facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Facebook Profile URL that belongs to this phone number." + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "twitter_profile_url": "https://www.twitter.com/proxycurl", + "facebook_profile_url": "https://www.facebook.com/zuck" + } + }, + "ExtractionEmailResult": { + "type": "object", + "properties": { + "email_queue_count": { + "type": "integer", + "description": "Total queue in the email extraction process" + } + }, + "example": { + "email_queue_count": null + } + }, + "JobLocation": { + "type": "object", + "properties": { + "country": { + "type": "string", + "nullable": true, + "description": "\n Full country name.\n " + }, + "region": { + "type": "string", + "nullable": true, + "description": "\n Region.\n " + }, + "city": { + "type": "string", + "nullable": true, + "description": "\n The city for the job.\n " + }, + "postal_code": { + "type": "string", + "nullable": true, + "description": "\n Postal code of the business location for the job.\n " + }, + "latitude": { + "type": "number", + "nullable": true, + "description": "\n Latitude coordinates of the business location for the job.\n " + }, + "longitude": { + "type": "number", + "nullable": true, + "description": "\n Longitude coordinates of the business location for the job.\n " + }, + "street": { + "type": "string", + "nullable": true, + "description": "\n Street address of the business location for the job.\n " + } + }, + "example": { + "country": "United States", + "region": "Hawaii", + "city": null, + "postal_code": null, + "latitude": null, + "longitude": null, + "street": null + } + }, + "JobCompany": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "\n The name of the company.\n " + }, + "url": { + "type": "string", + "nullable": true, + "description": "\n The LinkedIn Company Profile URL of the job posting company.\n " + }, + "logo": { + "type": "string", + "nullable": true, + "description": "\n The URL to the logo of this company.\n " + } + }, + "example": { + "name": "Microsoft", + "url": "https://www.linkedin.com/company/microsoft", + "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" + } + }, + "JobProfile": { + "type": "object", + "properties": { + "linkedin_internal_id": { + "type": "string", + "nullable": true, + "description": "\n The internal ID representation of this job that LinkedIn has for this job.\n " + }, + "job_description": { + "type": "string", + "nullable": true, + "description": "\n Description of the posted job.\n " + }, + "apply_url": { + "type": "string", + "nullable": true, + "description": "\n The URL to apply for this job.\n " + }, + "title": { + "type": "string", + "nullable": true, + "description": "\n Title of the posted job.\n " + }, + "location": { + "$ref": "#/components/schemas/JobLocation" + }, + "company": { + "$ref": "#/components/schemas/JobCompany" + }, + "seniority_level": { + "type": "string", + "nullable": true, + "description": "\n The seniority level for this role.\n " + }, + "industry": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of industries that the company which posted this job lies in.\n " + }, + "employment_type": { + "type": "string", + "nullable": true, + "description": "\n Type of employment.\n " + }, + "job_functions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of job functions that this role is expected to cover.\n " + }, + "total_applicants": { + "type": "integer", + "nullable": true, + "description": "\n Total applicants for this job so far.\n " + } + }, + "example": { + "linkedin_internal_id": "content-strategist-at-microsoft-3257696537", + "job_description": "The Global Demand Center (GDC) within the Cloud Marketing group is leading the marketing transformation of Microsoft’s largest and fastest growing commercial businesses. Our always-on integrated marketing programs work to nurture and acquire new customers across segments, targeting business and technical audiences across our commercial cloud portfolio, with programs available in 42 markets and 30 languages. The GDC team is modernizing and integrating these channels through advanced analytics, marketing automation, and digital marketing. We are on a mission to drive market share, consumption, and consistent double-digit+ revenue growth. Content is the fuel that drives the digitally connected customer journeys at the core of the GDC engine, and we’re looking for a skilled, self-motivated, data-driven content strategist to build the content that motivates customers to take action. The Content Strategist will develop and execute content strategies for the ever-critical security space. You will be accountable for understanding the business priorities, getting close to our target audiences, defining the content journeys that attract, nurture, inspire, and retain customers, and manage quality execution and delivery of the content. You will work closely with your counterparts, the integrated marketing strategists, to drive business outcomes. Your network will include product marketers, integrated marketers, relationship marketers, sales, engineering, and agency partners to develop and execute on your plan. Our team: The Lifecycle Programs team is a fast-paced digital marketing organization. We put a focus on getting things done, simplifying anything and everything, and having fun while doing it. We all believe in connecting with customers at scale, supporting them at each stage of the customer journey, from early awareness and consideration, through onboarding and post purchase engagement. You will be in the middle of it all helping to identify the right content that delivers what customers want—where they want it, when they want it, and how they want it. \n \n**_Responsibilities \n_**\n * Define content journeys for Security and IT professionals across industries.\n * Build the resulting content strategies designed to accelerate the customer through the lifecycle.\n * Create a content plan to address the insights in the customer journey and strategy, ensuring the content is aligned to what the customer needs at each stage.\n * Deliver the content through our internal Studio or with select agency partners.\n * Be a customer advocate. Relentlessly champion the customer and the experiences they have with the content you create—how they find it, how they consume it, how they use it to make decisions.\n * Leverage data and market insights for decision making including content optimization and new concept development. \n\n\n**_Qualifications \n \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 1+ year(s) integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 3+ years integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience.\n * Strong customer centric mindset and demonstrated ability to put the customer first.\n * Clear and persuasive communication skills, both written and verbal.\n * Experience with program performance tracking and communications.\n * Recognized as a self-starter with a bias for action.\n * Creative problem-solving skills, and a growth mindset approach\n * Experience managing across highly matrixed organizations, often with competing priorities.\n * A demonstrated track record of business impact through content\n * Well-versed in digital marketing best practices, including journey mapping.\n * Understanding of content disciplines, including SEO, content strategy, and execution.\n * Preferred, but not required: experience with commercial technology sales process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The typical base pay range for this role across the U.S. is USD $80,900 - $162,200 per year. There is a different range applicable to specific work locations, within the San Francisco Bay area and New York City metropolitan area, and the base pay range for this role in those locations is USD $105,300 - $176,900 per year. \n \nMicrosoft has different base pay ranges for different work locations within the United States, which allows us to pay employees competitively and consistently in different geographic markets (see below). The range above reflects the potential base pay across the U.S. for this role (except as noted below); the applicable base pay range will depend on what ultimately is determined to be the candidate’s primary work location. Individual base pay depends on various factors, in addition to primary work location, such as complexity and responsibility of role, job duties/requirements, and relevant experience and skills. Base pay ranges are reviewed and typically updated each year. Offers are made within the base pay range applicable at the time. \n \nAt Microsoft certain roles are eligible for additional rewards, including merit increases, annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed here may vary depending on the nature of employment with Microsoft and the country work location. U.S.-based employees have access to healthcare benefits, a 401(k) plan and company match, short-term and long-term disability coverage, basic life insurance, wellbeing benefits, paid vacation time, paid sick and mental health time, and several paid holidays, among others. \n \nOur commitment to pay equity \n \nWe are committed to the principle of pay equity – paying employees equitably for substantially similar work. To learn more about pay equity and our other commitments to increase representation and strengthen our culture of inclusion, check out our annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page displays the role for which the base pay ranges apply – Integrated Marketing IC3. The way we define roles includes two things: discipline (the type of work) and career stage (scope and complexity). The career stage has two parts – the first identifies whether the role is a manager (M), an individual contributor (IC), an admin-technician-retail (ATR) job, or an intern. The second part identifies the relative seniority of the role – a higher number (or later letter alphabetically in the case of ATR) indicates greater scope and complexity. \n \nMicrosoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. If you need assistance and/or a reasonable accommodation due to a disability during the application or the recruiting process, please send a request via the Accommodation request form. \n \nThe salary for this role in the state of Colorado is between $108,200 and $162,200. \n \nAt Microsoft, certain roles are eligible for additional rewards, including annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work. \n", + "apply_url": "https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite", + "title": "Content Strategist", + "location": { + "country": "United States", + "region": "Hawaii", + "city": null, + "postal_code": null, + "latitude": null, + "longitude": null, + "street": null + }, + "company": { + "name": "Microsoft", + "url": "https://www.linkedin.com/company/microsoft", + "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" + }, + "seniority_level": "Mid-Senior level", + "industry": [ + "IT Services and IT Consulting, Computer Hardware Manufacturing, and Software Development" + ], + "employment_type": "Full-time", + "job_functions": [ + "Marketing" + ], + "total_applicants": 200 + } + }, + "Follower": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true + }, + "twitter_profile_url": { + "type": "string" + }, + "email": { + "type": "string", + "nullable": true + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", + "twitter_profile_url": "https://www.x.com/agilio_software", + "email": null + } + }, + "FollowerList": { + "type": "object", + "properties": { + "followers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Follower" + }, + "description": "\n A list of individual followers of a company.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "followers": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", + "twitter_profile_url": "https://www.x.com/agilio_software", + "email": null + }, + { + "linkedin_profile_url": "https://www.linkedin.com/in/air-techniques", + "twitter_profile_url": "https://www.x.com/airtechniques", + "email": null + } + ], + "next_page": null + } + }, + "FollowerListCount": { + "type": "object", + "properties": { + "follower_count": { + "type": "integer", + "description": "A count of all individuals that are probable customers or followers." + } + }, + "example": { + "follower_count": 74 + } + }, + "CSearchResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "description": "\n The LinkedIn Profile URL of the company\n " + }, + "profile": { + "$ref": "#/components/schemas/LinkedinCompany", + "nullable": true, + "description": "\n If `enrich_profiles=enrich` is specified, the company's entire profile\n is returned. Otherwise this field will return `null`.\n " + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/apple/", + "profile": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "search", + "ads" + ], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": null, + "state": "NY" + } + ], + "name": "Google", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": [ + "artificial-intelligence", + "virtual-reality" + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "CompanySearchResult": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CSearchResult" + }, + "description": "\n A list of SearchResult objects.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The URL to the next page of search results. This will be null for the final page.\n " + }, + "total_result_count": { + "type": "integer", + "description": "Total results found." + } + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple/", + "profile": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [ + 10001, + null + ], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "search", + "ads" + ], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": null, + "state": "NY" + } + ], + "name": "Google", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": [ + "artificial-intelligence", + "virtual-reality" + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + }, + "SearchResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "description": "\n The LinkedIn Profile URL of the person\n " + }, + "profile": { + "$ref": "#/components/schemas/PublicPerson", + "nullable": true, + "description": "\n If `enrich_profiles=enrich` is specified, the person's entire profile\n is returned. Otherwise this field will return `null`.\n " + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "PersonSearchResult": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchResult" + }, + "description": "\n A list of SearchResult objects\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The URL to the next page of search results. This will be null for the final page.\n " + }, + "total_result_count": { + "type": "integer", + "description": "Total results found." + } + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": [ + "English", + "Spanish" + ], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + }, + "CreditBalance": { + "type": "object", + "properties": { + "credit_balance": { + "type": "integer", + "description": "Your current credit(s)" + } + }, + "example": { + "credit_balance": 100000 + } + }, + "DisposableEmail": { + "type": "object", + "properties": { + "is_disposable_email": { + "type": "boolean", + "description": "Returns a boolean value of the disposable nature of the given email address" + }, + "is_free_email": { + "type": "boolean", + "description": "Returns a boolean value of the free status of the given email address" + } + }, + "example": { + "is_disposable_email": null, + "is_free_email": null + } + }, + "PersonalContactNumbers": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of contact numbers" + } + }, + "example": { + "numbers": [ + "+1123123123" + ] + } + }, + "PDLEmailResult": { + "type": "object", + "properties": { + "emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of personal emails" + }, + "invalid_emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of invalid personal emails" + } + }, + "example": { + "emails": [ + "random@gmail.com", + "random2@yahoo.com" + ], + "invalid_emails": [ + "random3@gmail.com" + ] + } + } + }, + "securitySchemes": { + "BearerAuth": { + "type": "http", + "scheme": "bearer" + } + } + }, + "$schema": "http://json-schema.org/draft-04/schema#" +} \ No newline at end of file diff --git a/package.json b/package.json index 42d966606..4aed72a63 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,10 @@ }, "dependencies": { "@dexaai/dexter": "^2.0.0", + "@nangohq/node": "^0.39.30", "chalk": "^5.3.0", "delay": "^6.0.0", "dotenv": "^16.4.5", - "execa": "^8.0.1", "exit-hook": "^4.0.0", "jsonrepair": "^3.6.1", "ky": "^1.2.4", @@ -56,10 +56,14 @@ "p-map": "^7.0.2", "p-retry": "^6.2.0", "p-throttle": "^6.1.0", + "proxycurl-js-linkedin-profile-scraper": "^1.0.2", + "reflect-metadata": "^0.2.2", "restore-cursor": "^5.0.0", "tiny-invariant": "^1.3.3", + "twitter-api-sdk": "^1.2.1", "type-fest": "^4.16.0", - "zod": "^3.23.3" + "zod": "^3.23.3", + "zod-to-json-schema": "^3.23.0" }, "devDependencies": { "@fisch0920/eslint-config": "^1.3.1", @@ -68,12 +72,12 @@ "del-cli": "^5.1.0", "eslint": "^8.57.0", "husky": "^9.0.11", - "lint-staged": "^15.2.2", + "lint-staged": "^15.2.4", "np": "^10.0.5", - "npm-run-all2": "^6.1.2", + "npm-run-all2": "^6.2.0", "prettier": "^3.2.5", "tsup": "^8.0.2", - "tsx": "^4.7.2", + "tsx": "^4.10.5", "typescript": "^5.4.5", "vite": "^5.2.10", "vitest": "^1.5.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e37eea3d4..fdde1678f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@dexaai/dexter': specifier: ^2.0.0 version: 2.0.2 + '@nangohq/node': + specifier: ^0.39.30 + version: 0.39.30 chalk: specifier: ^5.3.0 version: 5.3.0 @@ -17,9 +20,6 @@ dependencies: dotenv: specifier: ^16.4.5 version: 16.4.5 - execa: - specifier: ^8.0.1 - version: 8.0.1 exit-hook: specifier: ^4.0.0 version: 4.0.0 @@ -41,18 +41,30 @@ dependencies: p-throttle: specifier: ^6.1.0 version: 6.1.0 + proxycurl-js-linkedin-profile-scraper: + specifier: ^1.0.2 + version: 1.0.2(@babel/core@7.24.5) + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 restore-cursor: specifier: ^5.0.0 version: 5.0.0 tiny-invariant: specifier: ^1.3.3 version: 1.3.3 + twitter-api-sdk: + specifier: ^1.2.1 + version: 1.2.1 type-fest: specifier: ^4.16.0 version: 4.18.2 zod: specifier: ^3.23.3 version: 3.23.8 + zod-to-json-schema: + specifier: ^3.23.0 + version: 3.23.0(zod@3.23.8) devDependencies: '@fisch0920/eslint-config': @@ -74,14 +86,14 @@ devDependencies: specifier: ^9.0.11 version: 9.0.11 lint-staged: - specifier: ^15.2.2 - version: 15.2.2 + specifier: ^15.2.4 + version: 15.2.4 np: specifier: ^10.0.5 version: 10.0.5(typescript@5.4.5) npm-run-all2: - specifier: ^6.1.2 - version: 6.1.2 + specifier: ^6.2.0 + version: 6.2.0 prettier: specifier: ^3.2.5 version: 3.2.5 @@ -89,8 +101,8 @@ devDependencies: specifier: ^8.0.2 version: 8.0.2(typescript@5.4.5) tsx: - specifier: ^4.7.2 - version: 4.10.3 + specifier: ^4.10.5 + version: 4.10.5 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -103,6 +115,34 @@ devDependencies: packages: + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@babel/cli@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.5 + '@jridgewell/trace-mapping': 0.3.25 + commander: 4.1.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + dev: false + /@babel/code-frame@7.24.2: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} @@ -110,10 +150,135 @@ packages: '@babel/highlight': 7.24.5 picocolors: 1.0.1 + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.24.5: + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.24.5: + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 + dev: false + + /@babel/helper-simple-access@7.24.5: + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-split-export-declaration@7.24.5: + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: false + + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-identifier@7.24.5: resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.24.5: + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/highlight@7.24.5: resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} @@ -123,6 +288,14 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.1 + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.5 + dev: false + /@babel/runtime@7.24.5: resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} @@ -130,6 +303,42 @@ packages: regenerator-runtime: 0.14.1 dev: true + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + dev: false + + /@babel/traverse@7.24.5: + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.24.5: + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + dev: false + /@dexaai/dexter@2.0.2: resolution: {integrity: sha512-21LOWGTM0eXB7d6+ytGv2Bg4sBVBv0uFMFgiUvkLiyDX+fi9A0lDqPXJuEnCrB7AH0WbwodXWtEGK6jCK4d3Dg==} engines: {node: '>= 18'} @@ -689,28 +898,23 @@ packages: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - dev: true /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /@ljharb/through@2.3.13: resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} @@ -719,6 +923,21 @@ packages: call-bind: 1.0.7 dev: true + /@nangohq/node@0.39.30: + resolution: {integrity: sha512-ZHi3yZp4/osP8oNmlzXrASmXPHWj+AijD8TWO4uDrQL5lr87GcSRtFYLYVOEQ0hASuXEPD1eXcT3lX3AHnD1+A==} + engines: {node: '>=18.0'} + dependencies: + axios: 1.7.2 + transitivePeerDependencies: + - debug + dev: false + + /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + requiresBuild: true + dev: false + optional: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1308,7 +1527,6 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1451,6 +1669,16 @@ packages: engines: {node: '>=4'} dev: true + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -1459,7 +1687,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1468,7 +1695,6 @@ packages: /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1497,7 +1723,6 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1509,7 +1734,13 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 dev: true /browserslist@4.23.0: @@ -1521,7 +1752,6 @@ packages: electron-to-chromium: 1.4.773 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) - dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1584,7 +1814,6 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1613,7 +1842,6 @@ packages: /caniuse-lite@1.0.30001620: resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} - dev: true /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} @@ -1689,7 +1917,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true /ci-info@4.0.0: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} @@ -1811,19 +2038,21 @@ packages: delayed-stream: 1.0.0 dev: false - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} + /commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} dev: true /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: true + + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: false /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true /confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} @@ -1847,6 +2076,14 @@ packages: xdg-basedir: 5.1.0 dev: true + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + + /cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + dev: false + /core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} dependencies: @@ -1876,6 +2113,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true /crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} @@ -1940,7 +2178,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -2028,7 +2265,6 @@ packages: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: true /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} @@ -2126,7 +2362,6 @@ packages: /electron-to-chromium@1.4.773: resolution: {integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==} - dev: true /elegant-spinner@1.0.1: resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} @@ -2216,12 +2451,10 @@ packages: engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 - dev: true /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dev: true /es-iterator-helpers@1.0.19: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} @@ -2339,7 +2572,6 @@ packages: /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} - dev: true /escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} @@ -2741,6 +2973,7 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 + dev: true /exit-hook@4.0.0: resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} @@ -2778,6 +3011,10 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -2813,12 +3050,11 @@ packages: flat-cache: 3.2.0 dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - dev: true /find-up-simple@1.0.0: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} @@ -2854,6 +3090,16 @@ packages: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -2877,6 +3123,15 @@ packages: engines: {node: '>= 14.17'} dev: true + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -2894,21 +3149,27 @@ packages: web-streams-polyfill: 4.0.0-beta.3 dev: false + /formidable@1.2.6: + resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} + deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' + dev: false + + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: false + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: true optional: true /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} @@ -2924,6 +3185,11 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + /get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} @@ -2942,7 +3208,6 @@ packages: has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -2952,6 +3217,7 @@ packages: /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + dev: true /get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} @@ -2977,7 +3243,6 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - dev: true /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -3007,7 +3272,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -3023,6 +3287,11 @@ packages: ini: 2.0.0 dev: true + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + /globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -3065,7 +3334,6 @@ packages: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 - dev: true /got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} @@ -3125,17 +3393,14 @@ packages: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 - dev: true /has-proto@1.0.3: resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} - dev: true /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: true /has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} @@ -3159,7 +3424,6 @@ packages: engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - dev: true /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -3199,6 +3463,7 @@ packages: /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + dev: true /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -3286,11 +3551,9 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -3412,7 +3675,6 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.3.0 - dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -3463,7 +3725,6 @@ packages: /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - dev: true /is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} @@ -3512,7 +3773,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - dev: true /is-in-ci@0.1.0: resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} @@ -3584,7 +3844,6 @@ packages: /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - dev: true /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} @@ -3672,6 +3931,7 @@ packages: /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -3745,6 +4005,7 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true /issue-regex@4.1.0: resolution: {integrity: sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==} @@ -3794,6 +4055,12 @@ packages: hasBin: true dev: true + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + /jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -3828,6 +4095,12 @@ packages: minimist: 1.2.8 dev: true + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + /jsonrepair@3.8.0: resolution: {integrity: sha512-89lrxpwp+IEcJ6kwglF0HH3Tl17J08JEpYfXnvvjdp4zV4rjSoGu2NdQHxBs7yTOk3ETjTn9du48pBy8iBqj1w==} hasBin: true @@ -3884,11 +4157,6 @@ packages: type-check: 0.4.0 dev: true - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true - /lilconfig@3.1.1: resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} engines: {node: '>=14'} @@ -3898,21 +4166,21 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged@15.2.2: - resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + /lint-staged@15.2.4: + resolution: {integrity: sha512-3F9KRQIS2fVDGtCkBp4Bx0jswjX7zUcKx6OF0ZeY1prksUyKPRIIUqZhIUYAstJfvj6i48VFs4dwVIbCYwvTYQ==} engines: {node: '>=18.12.0'} hasBin: true dependencies: chalk: 5.3.0 - commander: 11.1.0 + commander: 12.1.0 debug: 4.3.4 execa: 8.0.1 - lilconfig: 3.0.0 - listr2: 8.0.1 - micromatch: 4.0.5 + lilconfig: 3.1.1 + listr2: 8.2.1 + micromatch: 4.0.6 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.3.4 + yaml: 2.4.2 transitivePeerDependencies: - supports-color dev: true @@ -3959,8 +4227,8 @@ packages: figures: 2.0.0 dev: true - /listr2@8.0.1: - resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + /listr2@8.2.1: + resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} engines: {node: '>=18.0.0'} dependencies: cli-truncate: 4.0.0 @@ -4098,6 +4366,12 @@ packages: engines: {node: 14 || >=16.14} dev: true + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -4111,6 +4385,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: false + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -4151,12 +4433,18 @@ packages: /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4165,6 +4453,14 @@ packages: picomatch: 2.3.1 dev: true + /micromatch@4.0.6: + resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 4.0.2 + dev: true + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -4177,6 +4473,12 @@ packages: mime-db: 1.52.0 dev: false + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: false + /mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -4215,7 +4517,6 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - dev: true /minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} @@ -4253,7 +4554,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4315,7 +4615,6 @@ packages: /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -4349,7 +4648,6 @@ packages: /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - dev: true /normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} @@ -4423,8 +4721,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /npm-run-all2@6.1.2: - resolution: {integrity: sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==} + /npm-run-all2@6.2.0: + resolution: {integrity: sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} hasBin: true dependencies: @@ -4449,6 +4747,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 + dev: true /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} @@ -4462,7 +4761,6 @@ packages: /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -4529,7 +4827,6 @@ packages: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - dev: true /onetime@2.0.1: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} @@ -4764,15 +5061,16 @@ packages: /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + dev: true /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + dev: true /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -4805,6 +5103,10 @@ packages: /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + + /picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} dev: true /pidtree@0.6.0: @@ -4813,6 +5115,11 @@ packages: hasBin: true dev: true + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + /pinecone-client@2.0.0: resolution: {integrity: sha512-CxpKuck4zxi/LaGaTrnWQNs9NmXiMB3UtynOhD6dVDoWRKGEXmgRbSFipMUdqGyyQEKMFXzTKvzo4qMHi2Gj8Q==} engines: {node: '>=18'} @@ -4914,6 +5221,20 @@ packages: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /proxycurl-js-linkedin-profile-scraper@1.0.2(@babel/core@7.24.5): + resolution: {integrity: sha512-aT2RgS4yDU4LeZgpLWJ0x95EkTt4FKNqWtHFnMw5y2CN5287ylgYr+s1YR0A6te28aqQ7jBfz4+Y/J8Pj2TjkA==} + dependencies: + '@babel/cli': 7.24.5(@babel/core@7.24.5) + superagent: 5.3.1 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: false + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4926,6 +5247,13 @@ packages: escape-goat: 4.0.0 dev: true + /qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -5026,14 +5354,12 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - dev: true /redent@4.0.0: resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} @@ -5043,6 +5369,10 @@ packages: strip-indent: 4.0.0 dev: true + /reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + dev: false + /reflect.getprototypeof@1.0.6: resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} @@ -5276,7 +5606,6 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true /safe-regex-test@1.0.3: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} @@ -5312,18 +5641,15 @@ packages: /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: true /semver@7.6.2: resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true - dev: true /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -5335,7 +5661,6 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true /set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} @@ -5352,10 +5677,12 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + dev: true /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} @@ -5369,7 +5696,6 @@ packages: es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -5383,6 +5709,11 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + /slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5561,7 +5892,6 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - dev: true /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} @@ -5611,6 +5941,7 @@ packages: /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + dev: true /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} @@ -5656,6 +5987,26 @@ packages: ts-interface-checker: 0.1.13 dev: true + /superagent@5.3.1: + resolution: {integrity: sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==} + engines: {node: '>= 7.0.0'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.4 + fast-safe-stringify: 2.1.1 + form-data: 3.0.1 + formidable: 1.2.6 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.12.1 + readable-stream: 3.6.2 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + dev: false + /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -5760,12 +6111,16 @@ packages: os-tmpdir: 1.0.2 dev: true + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - dev: true /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -5856,8 +6211,8 @@ packages: - ts-node dev: true - /tsx@4.10.3: - resolution: {integrity: sha512-f0g60aFSVRVkzcQkEflh8fPLRfmt+HJHgWi/plG5UgvVaV+9TcpOwJ0sZJSACXmwmjMPg9yQR0BhTLbhkfV2uA==} + /tsx@4.10.5: + resolution: {integrity: sha512-twDSbf7Gtea4I2copqovUiNTEDrT8XNFXsuHpfGbdpW/z9ZW4fTghzzhAG0WfrCuJmJiOEY1nLIjq4u3oujRWQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: @@ -5867,6 +6222,16 @@ packages: fsevents: 2.3.3 dev: true + /twitter-api-sdk@1.2.1: + resolution: {integrity: sha512-tNQ6DGYucFk94JlnUMsHCkHg5o1wnCdHh71Y2ukygNVssOdD1gNVjOpaojJrdwbEAhoZvcWdGHerCa55F8HKxQ==} + engines: {node: '>=14'} + dependencies: + abort-controller: 3.0.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6011,7 +6376,6 @@ packages: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.1 - dev: true /update-notifier@7.0.0: resolution: {integrity: sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==} @@ -6039,7 +6403,6 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -6260,6 +6623,7 @@ packages: hasBin: true dependencies: isexe: 2.0.0 + dev: true /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} @@ -6328,7 +6692,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} @@ -6344,15 +6707,14 @@ packages: engines: {node: '>=12'} dev: true + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true - /yaml@2.4.2: resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} engines: {node: '>= 14'} diff --git a/proxycurl-openapi.json b/proxycurl-openapi.json new file mode 100644 index 000000000..ef94ab6e8 --- /dev/null +++ b/proxycurl-openapi.json @@ -0,0 +1,11380 @@ +{ + "servers": [ + { + "url": "https://nubela.co/proxycurl", + "description": "With SSL Proxycurl Server" + }, + { + "url": "http://nubela.co/proxycurl", + "description": "Without SSL Proxycurl Server" + } + ], + "security": [ + { + "BearerAuth": ["client"] + } + ], + "paths": { + "/api/linkedin/school": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet structured data of a LinkedIn School Profile", + "parameters": [ + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn School Profile to crawl.\n\n URL should be in the format of `https://www.linkedin.com/school/`\n ", + "example": "https://www.linkedin.com/school/national-university-of-singapore", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "`if-present` The default behavior. Fetches profile from cache regardless of age of profile. If profile is not available in cache, API will attempt to source profile externally.\n\n`if-recent` API will make a best effort to return a fresh profile no older than 29 days.Costs an extra `1` credit on top of the cost of the base endpoint.", + "example": "if-present", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkedinSchool" + }, + "example": { + "linkedin_internal_id": "5524", + "description": "At NUS, we are shaping the future through our people and our pursuit of new frontiers in knowledge. In a single century, we have become a university of global influence and an Asian thought leader. Our location at the crossroads of Asia informs our mission and gives us a tremendous vantage point to help create opportunities and address the pressing issues facing Singapore, Asia and the world.\r\rAt NUS, we believe in education, research and service that change lives.", + "website": "http://nus.edu.sg", + "industry": "Higher Education", + "company_size": [5001, 10000], + "company_size_on_linkedin": 16084, + "hq": { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + }, + "company_type": "EDUCATIONAL_INSTITUTION", + "founded_year": 1905, + "specialities": ["education", "research"], + "locations": [ + { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + } + ], + "name": "National University of Singapore", + "tagline": null, + "universal_name_id": "national-university-of-singapore", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140", + "search_id": "5524", + "similar_companies": [ + { + "name": "NUS Business School", + "link": "https://www.linkedin.com/school/nus-business-school/", + "industry": "Higher Education", + "location": null + }, + { + "name": "NUS Faculty of Arts and Social Sciences", + "link": "https://www.linkedin.com/school/nusfass/", + "industry": "Higher Education", + "location": null + } + ], + "affiliated_companies": [], + "updates": [], + "follower_count": 539321 + } + } + }, + "description": "Profile data with profile picture, school location, etc" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["School API"], + "operationId": "School Profile Endpoint" + }, + "summary": "School Profile Endpoint" + }, + "/api/linkedin/company": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet structured data of a Company Profile", + "parameters": [ + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Company Profile to crawl.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", + "example": "https://www.linkedin.com/company/google/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator.\n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb).\n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n\n This parameter accepts the following values:\n - `false` - Will not resolve numerical IDs.\n - `true` (default value) - Enable support for Company Profile URLs with numerical IDs.\n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "true", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "categories", + "required": false, + "description": "\n Appends categories data of this company.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_data", + "required": false, + "description": "\n Returns a list of funding rounds that this company has received.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "exit_data", + "required": false, + "description": "\n Returns a list of investment portfolio exits.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "acquisitions", + "required": false, + "description": "\n Provides further enriched data on acquisitions made by this company from external sources.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these acquisition data (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "extra", + "required": false, + "description": "\n Enriches the Company Profile with extra details from external sources.\n Details include Crunchbase ranking, contact email, phone number, Facebook account, Twitter account, funding rounds and amount, IPO status, investor information, etc.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these extra details (if available) for `1` extra credit.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "\n `if-present` The default behavior.\n Fetches profile from cache regardless of age of profile.\n If profile is not available in cache, API will attempt to source profile externally.\n\n `if-recent` API will make a best effort to return a fresh profile no older than 29 days.\"\n Costs an extra `1` credit on top of the cost of the base endpoint.\n ", + "example": "if-present", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "fallback_to_cache", + "required": false, + "description": "\n Tweaks the fallback behavior if an error arises from fetching a fresh profile.\n\n This parameter accepts the following values:\n * `on-error` (default value) - Fallback to reading the profile from cache if an error arises.\n * `never` - Do not ever read profile from cache.\n ", + "example": "on-error", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LinkedinCompany" + }, + "example": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [10001, null], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": ["search", "ads"], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": false, + "state": "NY" + } + ], + "name": "Google", + "tagline": null, + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792 + } + } + }, + "description": "Profile data with profile picture, office locations, etc" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Company API"], + "operationId": "Company Profile Endpoint" + }, + "summary": "Company Profile Endpoint" + }, + "/api/v2/linkedin": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet structured data of a Personal Profile", + "parameters": [ + { + "in": "query", + "name": "extra", + "required": false, + "description": "\n Enriches the Person Profile with extra details from external sources.\n Extra details include gender, birth date, industry and interests.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide extra data field.\n - `include` - Append extra data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "github_profile_id", + "required": false, + "description": "\n Enriches the Person Profile with Github Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Github Id data field.\n - `include` - Append Github Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_id", + "required": false, + "description": "\n Enriches the Person Profile with Facebook Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Facebook Id data field.\n - `include` - Append Facebook Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_id", + "required": false, + "description": "\n Enriches the Person Profile with Twitter Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Twitter Id data field.\n - `include` - Append Twitter Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "personal_contact_number", + "required": false, + "description": "\n Enriches the Person Profile with personal numbers from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide personal numbers data field.\n - `include` - Append personal numbers data to the person profile object.\n Costs an extra `1` credit per email returned on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "personal_email", + "required": false, + "description": "\n Enriches the Person Profile with personal emails from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide personal emails data field.\n - `include` - Append personal emails data to the person profile object.\n Costs an extra `1` credit per email returned on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "inferred_salary", + "required": false, + "description": "\n Include inferred salary range from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide inferred salary data field.\n - `include` - Append inferred salary range data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "skills", + "required": false, + "description": "\n Include skills data from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide skills data field.\n - `include` - Append skills data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "\n `if-present` The default behavior.\n Fetches profile from cache regardless of age of profile.\n If profile is not available in cache, API will attempt to source profile externally.\n\n `if-recent` API will make a best effort to return a fresh profile no older than 29 days.\"\n Costs an extra `1` credit on top of the cost of the base endpoint.\n ", + "example": "if-present", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "fallback_to_cache", + "required": false, + "description": "\n Tweaks the fallback behavior if an error arises from fetching a fresh profile.\n\n This parameter accepts the following values:\n * `on-error` (default value) - Fallback to reading the profile from cache if an error arises.\n * `never` - Do not ever read profile from cache.\n ", + "example": "on-error", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://x.com/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://x.com/johnrmarty/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_url", + "required": false, + "description": "\n The Facebook Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://facebook.com/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://facebook.com/johnrmarty/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://linkedin.com/in/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://linkedin.com/in/johnrmarty/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonEndpointResponse" + }, + "example": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + } + } + }, + "description": "Profile data with profile picture, job history, etc." + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["People API"], + "operationId": "Person Profile Endpoint" + }, + "summary": "Person Profile Endpoint" + }, + "/api/customers": { + "get": { + "description": "Cost: 10 credits / result for users on an annual subscription or Enterprise plan.\nGet a list of probable corporate customers of a target company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of customers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/watsons", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of customers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/watsonsproperty", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results of customer companies returned per API call.\n\n The default value of this parameter is 10.\n\n Accepted values for this parameter is an integer ranging from 0 to 1000.\n ", + "example": "10", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerList" + }, + "example": { + "companies": [ + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", + "twitter_profile_url": "https://twitter.com/spirellp", + "email": "info@spiresolicitors.co.uk" + }, + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/mall-wood-insurance-services-ltd", + "twitter_profile_url": "https://twitter.com/draytonins", + "email": null + } + ], + "next_page": null + } + } + }, + "description": "A list of probable customers of the target company." + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Customer API `EXPERIMENTAL`"], + "operationId": "Customer Listing Endpoint `EXPERIMENTAL`" + }, + "summary": "Customer Listing Endpoint `EXPERIMENTAL`" + }, + "/api/customers/count/": { + "get": { + "description": "Cost: 1 credit / result for users on an annual subscription or Enterprise plan.\nGet the total count of probable corporate customers of a target company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of customers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/watsons", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of customers of.\n\n URL should be in the format of https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/watsonsproperty", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerCount" + }, + "example": { + "company_count": 125 + } + } + }, + "description": "Number of probable customers of the target company." + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Customer API `EXPERIMENTAL`"], + "operationId": "Customer Listing Count Endpoint `EXPERIMENTAL`" + }, + "summary": "Customer Listing Count Endpoint `EXPERIMENTAL`" + }, + "/api/linkedin/company/employees/": { + "get": { + "description": "Cost: 3 credits / employee returned.\nGet a list of employees of a Company.\n\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our comprehensive dataset of people and company profiles.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US. Or you can set the parameter to `country=us,sg` if you want employees from both the US and Singapore.\n\n This parameter accepts a comma-separated case-insensitive values of [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the full profile of employees instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists employee's profile url\n * `enrich`: lists full profile of employees\n\n Calling this API endpoint with this parameter would add `1` credit per employee returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "role_search", + "required": false, + "description": "\n Filter employees by their title by matching the employee's title against a *regular expression*.\n\n The default value of this parameter is `null`.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n\n (The base cost of calling this API endpoint with this parameter would be `10` credits.\n Each employee matched and returned would cost 3 extra credits.)\n ", + "example": "(co)?-?founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results returned per API call.\n\n The default value of this parameter is `10`.\n\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employment_status", + "required": false, + "description": "\n Parameter to tell the API to return past or current employees.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : lists current employees\n * `past` : lists past employees\n * `all` : lists current & past employees\n ", + "example": "current", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "required": false, + "description": "\n Sort employees by recency.\n\n Valid values are:\n * `recently-joined` - Sort employees by their join date. The most recent employee is on the top of the list.\n * `recently-left` - Sort employees by their departure date. The most recent employee who had just left is on the top of this list.\n * `oldest` - Returns the oldest employees first. The oldest employee who had joined this company historically is on the top of this list.\n * `none` - The default value. Do not sort.\n\n If this parameter is supplied with a value other than `none`, will add `50` credits to the base cost of the API endpoint regardless number of results returned. It will also add an additional cost of `10` credits per employee returned.\n ", + "example": "recently-joined", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for Company Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "false", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Company Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", + "example": "https://www.linkedin.com/company/microsoft", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeList" + }, + "example": { + "employees": [ + { + "profile_url": "https://www.linkedin.com/in/williamhgates", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw" + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ" + } + ], + "languages": [], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [], + "connections": null, + "people_also_viewed": [], + "recommendations": [], + "activities": [], + "similarly_named_profiles": [], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + } + }, + "description": "List of employees" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Company API"], + "operationId": "Employee Listing Endpoint" + }, + "summary": "Employee Listing Endpoint" + }, + "/api/linkedin/company/employees/count": { + "get": { + "description": "Cost: 1 credit / successful request.\nGet a number of total employees of a Company.\n\nGet an employee count of this company from various sources.", + "parameters": [ + { + "in": "query", + "name": "use_cache", + "required": false, + "description": "\n `if-present`: The default behavior. Fetches data from LinkDB cache regardless of age of profile.\n\n `if-recent`: API will make a best effort to return a fresh data no older than 29 days. Costs an extra 1 credit on top of the cost of the base endpoint.\n ", + "example": "if-present", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_employee_count", + "required": false, + "description": "\n Option to include a scraped employee count value from the target company's LinkedIn profile.\n\n Valid values are `include` and `exclude`:\n\n * `exclude` (default) : To exclude the scraped employee count.\n * `include` : To include the scraped employee count.\n\n Costs an extra `1` credit on top of the base cost of the endpoint.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employment_status", + "required": false, + "description": "\n Parameter to tell the API to filter past or current employees.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : count current employees\n * `past` : count past employees\n * `all` : count current & past employees\n ", + "example": "current", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Company Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", + "example": "https://www.linkedin.com/company/apple/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeCount" + }, + "example": { + "linkedin_employee_count": 529274, + "linkdb_employee_count": 3 + } + } + }, + "description": "Number of employees in a company" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Company API"], + "operationId": "Employee Count Endpoint" + }, + "summary": "Employee Count Endpoint" + }, + "/api/linkedin/person/profile-picture": { + "get": { + "description": "Cost: 0 credit / successful request.\nGet the profile picture of a person.\n\nProfile pictures are served from cached people profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb).\nIf the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), then the API will return a `404` status code.", + "parameters": [ + { + "in": "query", + "name": "linkedin_person_profile_url", + "required": true, + "description": "\n LinkedIn Profile URL of the person that you are trying to get the profile picture of.\n ", + "example": "https://www.linkedin.com/in/williamhgates/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProfilePicture" + }, + "example": { + "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" + } + } + }, + "description": "Profile picture of a person" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["People API"], + "operationId": "Person Profile Picture Endpoint" + }, + "summary": "Person Profile Picture Endpoint" + }, + "/api/linkedin/company/profile-picture": { + "get": { + "description": "Cost: 0 credit / successful request.\nGet the profile picture of a company.\n\nProfile pictures are served from cached company profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb).\nIf the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), then the API will return a `404` status code.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": true, + "description": "\n LinkedIn Profile URL of the company that you are trying to get the profile picture of.\n ", + "example": "https://www.linkedin.com/company/apple/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProfilePicture" + }, + "example": { + "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" + } + } + }, + "description": "Profile picture of a company" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Company API"], + "operationId": "Company Profile Picture Endpoint" + }, + "summary": "Company Profile Picture Endpoint" + }, + "/api/linkedin/profile/resolve": { + "get": { + "description": "Cost: 2 credits / successful request.\nLook up a person with a name and company information.", + "parameters": [ + { + "in": "query", + "name": "similarity_checks", + "required": false, + "description": "\n Controls whether the API endpoint performs\n similarity comparisons between the input parameters\n and the results or simply returns the closest match.\n For instance, if you are searching for a person named\n \"Ben Chad\", and the closest result we have is \"Chavvy\n Plum\", our similarity checks will discard the obviously\n incorrect result and return `null` instead of a false\n positive.\n\n Include similarity checks to eliminate false positives.\n However, be aware that this might yield fewer results\n as false positives are discarded. Credits will still be\n deducted even if we return `null`.\n\n You can choose to skip similarity checks, in which\n case no credits will be charged if we return `null`.\n\n This parameter accepts the following values:\n * `include` (default) - Perform similarity checks and\n discard false positives. Credits will be deducted even\n if we return null .\n * `skip` - Bypass similarity checks. No credits will be\n deducted if no results are returned.\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [People Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_domain", + "required": true, + "description": "Company name or domain", + "example": "gatesfoundation.org", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "location", + "required": false, + "description": "\n The location of this user.\n\n Name of country, city or state.\n ", + "example": "Seattle", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "title", + "required": false, + "description": "Title that user is holding at his/her current job", + "example": "Co-chair", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "last_name", + "required": false, + "description": "Last name of the user", + "example": "Gates", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "first_name", + "required": true, + "description": "First name of the user", + "example": "Bill", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonLookupUrlEnrichResult" + }, + "example": { + "url": "https://www.linkedin.com/in/senatormarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + } + }, + "description": "LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["People API"], + "operationId": "Person Lookup Endpoint" + }, + "summary": "Person Lookup Endpoint" + }, + "/api/v2/linkedin/company/job": { + "get": { + "description": "Cost: 2 credits / successful request.\nList jobs posted by a company on LinkedIn", + "parameters": [ + { + "in": "query", + "name": "job_type", + "required": false, + "description": "\n The nature of the job.\n It accepts the following 7 case-insensitive values only:\n - `full-time`\n - `part-time`\n - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n - `anything` (default)\n ", + "example": "anything", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "experience_level", + "required": false, + "description": "\n The experience level needed for the job.\n It accepts the following 6 case-insensitive values only:\n - `internship`\n - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n - `anything` (default)\n ", + "example": "entry_level", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "when", + "required": false, + "description": "\n The time when the job is posted,\n It accepts the following case-insensitive values only:\n - `yesterday`\n - `past-week`\n - `past-month`\n - `anytime` (default)\n ", + "example": "past-month", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "flexibility", + "required": false, + "description": "\n The flexibility of the job.\n It accepts the following 3 case insensitive values only:\n - `remote`\n - `on-site`\n - `hybrid`\n - `anything` (default)\n ", + "example": "remote", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "geo_id", + "required": false, + "description": "\n The `geo_id` of the location to search for.\n For example, `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article) as to how you may be able to match regions to `geo_id` input values.\n ", + "example": "92000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "keyword", + "required": false, + "description": "\n The keyword to search for.\n ", + "example": "software engineer", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search_id", + "required": false, + "description": "\n The `search_id` of the company on LinkedIn.\n You can get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n ", + "example": "1035", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobListPage" + }, + "example": { + "job": [ + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Product Management: Intern Opportunities for University Students", + "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", + "list_date": "2022-10-09", + "location": "New York, NY" + }, + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Content Strategist", + "job_url": "https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764", + "list_date": "2022-10-21", + "location": "United States" + } + ], + "next_page_no": 1, + "next_page_api_url": "http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035", + "previous_page_no": null, + "previous_page_api_url": null + } + } + }, + "description": "List of open job position" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Jobs API"], + "operationId": "Job Search Endpoint" + }, + "summary": "Job Search Endpoint" + }, + "/api/v2/linkedin/company/job/count": { + "get": { + "description": "Cost: 2 credits / successful request.\nCount number of jobs posted by a company on LinkedIn", + "parameters": [ + { + "in": "query", + "name": "job_type", + "required": false, + "description": "\n The nature of the job.\n It accepts the following 7 case-insensitive values only:\n - `full-time`\n - `part-time`\n - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n - `anything` (default)\n ", + "example": "entry_level", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "experience_level", + "required": false, + "description": "\n The experience level needed for the job.\n It accepts the following 6 case-insensitive values only:\n - `internship`\n - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n - `anything` (default)\n ", + "example": "entry_level", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "when", + "required": false, + "description": "\n The time when the job is posted,\n It accepts the following case-insensitive values only:\n - `yesterday`\n - `past-week`\n - `past-month`\n - `anytime` (default)\n ", + "example": "past-month", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "flexibility", + "required": false, + "description": "\n The flexibility of the job.\n It accepts the following 3 case insensitive values only:\n - `remote`\n - `on-site`\n - `hybrid`\n - `anything` (default)\n ", + "example": "remote", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "geo_id", + "required": false, + "description": "\n The `geo_id` of the location to search for.\n For example, `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article) as to how you may be able to match regions to `geo_id` input values.\n ", + "example": "92000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "keyword", + "required": false, + "description": "\n The keyword to search for.\n ", + "example": "software engineer", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search_id", + "required": false, + "description": "\n The `search_id` of the company on LinkedIn.\n You can get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n ", + "example": "1035", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobListCount" + }, + "example": { + "count": 887622 + } + } + }, + "description": "Count number of jobs posted" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Jobs API"], + "operationId": "Jobs Listing Count Endpoint" + }, + "summary": "Jobs Listing Count Endpoint" + }, + "/api/find/company/role/": { + "get": { + "description": "Cost: 3 credits / successful request.\nReturns the profile of a person who most closely matches a specified role\nin a company. For instance, it can be used to identify the \"CTO\" of\n\"Apple\". The endpoint yields a single result that represents the closest\nmatch. For a detailed comparison between this API endpoint and the\n[Employee Search Endpoint](#company-api-employee-search-endpoint)\nor the [Person Search Endpoint](#search-api-person-search-endpoint),\nrefer to [this article](\n https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).", + "parameters": [ + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [Person Profile Endpoint](#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "role", + "required": true, + "description": "Role of the profile that you are lookin up", + "example": "ceo", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_name", + "required": true, + "description": "Name of the company that you are searching for", + "example": "nubela", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleSearchEnrichedResult" + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + } + }, + "description": "LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["People API"], + "operationId": "Role Lookup Endpoint" + }, + "summary": "Role Lookup Endpoint" + }, + "/api/linkedin/company/resolve": { + "get": { + "description": "Cost: 2 credits / successful request.\nResolve Company LinkedIn Profile from company name,\n domain name and location.", + "parameters": [ + { + "in": "query", + "name": "company_location", + "required": false, + "description": "\n The location / region of company.\n ISO 3166-1 alpha-2 codes\n ", + "example": "sg", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_domain", + "required": false, + "description": "Company website or Company domain\nRequires either `company_domain` or `company_name`", + "example": "accenture.com", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "company_name", + "required": false, + "description": "Company Name\nRequires either `company_domain` or `company_name`", + "example": "Accenture", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [Company Profile Endpoint](https://nubela.co/proxycurl/docs#company-api-company-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanyUrlEnrichResult" + }, + "example": { + "url": "https://www.linkedin.com/company/accenture", + "profile": { + "linkedin_internal_id": "1033", + "description": "Accenture is a global professional services company with leading capabilities in digital, cloud, and security. Combining unmatched experience and specialized skills across more than 40 industries, we offer Strategy and Consulting, Technology and Operations Services, and Accenture Song—all powered by the world’s largest network of Advanced Technology and Intelligent Operations centers. \n\nOur people deliver on the promise of technology and human ingenuity every day, serving clients in more than 120 countries. We embrace the power of change to create value and shared success for our clients, people, shareholders, partners, and communities. \n\nVisit us at accenture.com.", + "website": "http://www.accenture.com", + "industry": "Business Consulting and Services", + "company_size": [10001, null], + "company_size_on_linkedin": 541251, + "hq": { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "Management Consulting", + "Systems Integration and Technology" + ], + "locations": [ + { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + { + "country": "US", + "city": "San Francisco", + "postal_code": "94105", + "line_1": "415 Mission Street Floor 31-34", + "is_hq": false, + "state": "California" + } + ], + "name": "Accenture", + "tagline": null, + "universal_name_id": "accenture", + "profile_pic_url": "https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY", + "background_cover_image_url": "https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0", + "search_id": "1033", + "similar_companies": [ + { + "name": "Deloitte", + "link": "https://www.linkedin.com/company/deloitte", + "industry": "Business Consulting and Services", + "location": null + }, + { + "name": "Tata Consultancy Services", + "link": "https://in.linkedin.com/company/tata-consultancy-services", + "industry": "IT Services and IT Consulting", + "location": "Mumbai, Maharashtra" + } + ], + "affiliated_companies": [ + { + "name": "Accenture in India", + "link": "https://in.linkedin.com/company/accentureindia", + "industry": "IT Services and IT Consulting", + "location": "Bengaluru, Karnatka" + }, + { + "name": "Accenture Brasil", + "link": "https://br.linkedin.com/company/accenturebrasil", + "industry": "IT Services and IT Consulting", + "location": "São Paulo, São Paulo" + } + ], + "updates": [ + { + "article_link": null, + "image": null, + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4", + "total_likes": 325 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA", + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "The ability to learn new things, without forgetting those that came before, is a huge differentiator between the #AI we're familiar with, and the #GenerativeAI powered by foundation models that we're seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n \n#TechVision2023", + "total_likes": 541 + } + ], + "follower_count": 11125167, + "acquisitions": null, + "exit_data": null, + "extra": null, + "funding_data": null, + "categories": null + }, + "last_updated": "2023-10-26T11:33:24Z" + } + } + }, + "description": "LinkedIn (Company) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Company API"], + "operationId": "Company Lookup Endpoint" + }, + "summary": "Company Lookup Endpoint" + }, + "/api/linkedin/company/employee/search/": { + "get": { + "description": "Cost: 10 credits / successful request.\nSearch employees of a target by their job title. This API endpoint is syntactic\nsugar for the role_search parameter under the [Employee Listing Endpoint](#company-api-employee-listing-endpoint).\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our comprehensive dataset of people\nand company profiles. For a detailed comparison between this API endpoint\nand the [Role Lookup Endpoint](#people-api-role-lookup-endpoint) or the [Person Search Endpoint](#search-api-person-search-endpoint), refer to [this article](https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).", + "parameters": [ + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Tune the maximum results returned per API call.\n The default value of this parameter is `200000`.\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `100`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": true, + "description": "\n LinkedIn Profile URL of the target company.\n ", + "example": "https://www.linkedin.com/company/microsoft/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "keyword_regex", + "required": true, + "description": "\n Job title keyword to search for in regular expression format.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n ", + "example": "ceo|cto", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the full profile of employees instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists employee's profile url\n * `enrich`: lists full profile of employees\n\n Calling this API endpoint with this parameter would add `1` credit per employee returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for Company Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "false", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EmployeeList" + }, + "example": { + "employees": [ + { + "profile_url": "https://www.linkedin.com/in/satyanadella", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw" + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ" + } + ], + "languages": [], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [], + "connections": null, + "people_also_viewed": [], + "recommendations": [], + "activities": [], + "similarly_named_profiles": [], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + } + }, + "description": "List of employees" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Company API"], + "operationId": "Employee Search Endpoint" + }, + "summary": "Employee Search Endpoint" + }, + "/api/linkedin/school/students/": { + "get": { + "description": "Cost: 3 credits / student returned.\nGet a list of students of a school or university.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the full profile of students instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists student's profile url\n * `enrich`: lists full profile of students\n\n *Calling this API endpoint with this parameter would add `1` credit per student returned.*\n ", + "example": "enrich", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "search_keyword", + "required": false, + "description": "\n Filter students by their major by matching the student's major against a *regular expression*.\n\n The default value of this parameter is `null`.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n\n (The base cost of calling this API endpoint with this parameter would be `10` credits.\n Each student matched and returned would cost `6` credits per student returned.)\n ", + "example": "computer*|cs", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results returned per API call.\n\n The default value of this parameter is `10`.\n\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "student_status", + "required": false, + "description": "\n Parameter to tell the API to return past or current students.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : lists current students\n * `past` : lists past students\n * `all` : lists current & past students\n ", + "example": "current", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "sort_by", + "required": false, + "description": "\n Sort students by matriculation or graduation dates.\n\n Valid values are:\n * `recently-matriculated` - Sort students by their matriculation date. Students who had had most recently started school is on the top of the list.\n * `recently-graduated` - Sort students by their graduation date. The most recently graduated student is on the top of this list.\n * `none` - The default value. Do not sort.\n\n If this parameter is supplied with a value other than `none`, will add `50` credits to the base cost of the API endpoint regardless number of results returned. It will also add an additional cost of `10` credits per student returned.\n ", + "example": "recently-matriculated", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "resolve_numeric_id", + "required": false, + "description": "\n Enable support for School Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/school/1234567890` to `https://www.linkedin.com/school/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for School Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", + "example": "false", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_school_url", + "required": true, + "description": "\n URL of the LinkedIn School Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/school/`\n ", + "example": "https://www.linkedin.com/school/stanford-university", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StudentList" + }, + "example": { + "students": [ + { + "profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + } + }, + "description": "List of students" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["School API"], + "operationId": "Student Listing Endpoint" + }, + "summary": "Student Listing Endpoint" + }, + "/api/linkedin/profile/resolve/email": { + "get": { + "description": "Cost: 3 credits / successful request.\nResolve social media profiles correlated from an email address.\nThis API endpoint works with both personal and work emails.", + "parameters": [ + { + "in": "query", + "name": "email", + "required": false, + "description": "Email address of the user you want to look up.\nyes", + "example": "danial@nubela.co", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "lookup_depth", + "required": false, + "description": "\n This parameter describes the depth options for our API lookup function. This endpoint can execute either a superficial or a deep lookup.\n\n A **superficial lookup** involves comparing the provided email with entries in our database. This approach tends to yield fewer results and is typically less effective for work-related email addresses. However, it does not consume any credits if no results are returned.\n\n On the other hand, a **deep lookup** extends beyond our database to utilize advanced heuristics and identify the individual associated with a given email. This method is particularly recommended for work emails.\n\n Please note the following valid values for the depth of the lookup:\n\n * `superficial`: No credits are consumed if no results are found.\n * `deep` (default): Credits are used regardless of whether any results are returned.\n \nyes", + "example": "deep", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profile", + "required": false, + "description": "\n Enrich the result with a cached LinkedIn profile of the LinkedIn Profile URL result (if any).\n\n Valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data.\n * `enrich`: enriches the result with cached profile data. \n\n Calling this API endpoint with this parameter would add `1` additional credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/), please chain this API call with the `linkedin_profile_url` result with the [Person Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n \nno", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReverseEmailUrlEnrichResult" + }, + "example": { + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + } + }, + "description": "Twitter, Facebook, and LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Contact API"], + "operationId": "Reverse Email Lookup Endpoint" + }, + "summary": "Reverse Email Lookup Endpoint" + }, + "/api/resolve/phone": { + "get": { + "description": "Cost: 3 credits / successful request.\nFind social media profiles from a contact phone number.", + "parameters": [ + { + "in": "query", + "name": "phone_number", + "required": true, + "description": "[E.164 formatted](https://www.twilio.com/docs/glossary/what-e164) phone number of the person you want to identify social media profiles of.", + "example": "+14155552671", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReverseContactNumberResult" + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "twitter_profile_url": "https://www.twitter.com/proxycurl", + "facebook_profile_url": "https://www.facebook.com/zuck" + } + } + }, + "description": "Twitter, Facebook, and LinkedIn Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Contact API"], + "operationId": "Reverse Contact Number Lookup Endpoint" + }, + "summary": "Reverse Contact Number Lookup Endpoint" + }, + "/api/linkedin/profile/email": { + "get": { + "description": "Cost: 3 credits / request.\nLookup work email address of a LinkedIn Person Profile.\n\nEmail addresses returned are verified to not be role-based or catch-all emails. Email addresses\nreturned by our API endpoint come with a 95+% deliverability guarantee\n\n**Endpoint behavior**\n\n*This endpoint* **_may not_** *return results immediately.*\n\nIf you provided a webhook in your request parameter, our application will call your webhook with\nthe result once. See `Webhook request` below.", + "parameters": [ + { + "in": "query", + "name": "linkedin_profile_url", + "required": true, + "description": "\n Linkedin Profile URL of the person you want to\n extract work email address from.\n ", + "example": "https://sg.linkedin.com/in/williamhgates", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "callback_url", + "required": false, + "description": "\n Webhook to notify your application when\n the request has finished processing.\n ", + "example": "https://webhook.site/29e12f17-d5a2-400a-9d08-42ee9d83600a", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExtractionEmailResult" + }, + "example": { + "email_queue_count": 0 + } + } + }, + "description": "Work Email Address" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Contact API"], + "operationId": "Work Email Lookup Endpoint" + }, + "summary": "Work Email Lookup Endpoint" + }, + "/api/linkedin/job": { + "get": { + "description": "Cost: 2 credits / successful request.\nGet structured data of a LinkedIn Job Profile", + "parameters": [ + { + "in": "query", + "name": "url", + "required": true, + "description": "\n URL of the LinkedIn Job Profile to target.\n\n URL should be in the format of\n `https://www.linkedin.com/jobs/view/`.\n [Jobs Listing Endpoint](#jobs-api-jobs-listing-endpoint)\n can be used to retrieve a job URL.\n ", + "example": "https://www.linkedin.com/jobs/view/3667167926/", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobProfile" + }, + "example": { + "linkedin_internal_id": "content-strategist-at-microsoft-3257696537", + "job_description": "The Global Demand Center (GDC) within the Cloud Marketing group is leading the marketing transformation of Microsoft’s largest and fastest growing commercial businesses. Our always-on integrated marketing programs work to nurture and acquire new customers across segments, targeting business and technical audiences across our commercial cloud portfolio, with programs available in 42 markets and 30 languages. The GDC team is modernizing and integrating these channels through advanced analytics, marketing automation, and digital marketing. We are on a mission to drive market share, consumption, and consistent double-digit+ revenue growth. Content is the fuel that drives the digitally connected customer journeys at the core of the GDC engine, and we’re looking for a skilled, self-motivated, data-driven content strategist to build the content that motivates customers to take action. The Content Strategist will develop and execute content strategies for the ever-critical security space. You will be accountable for understanding the business priorities, getting close to our target audiences, defining the content journeys that attract, nurture, inspire, and retain customers, and manage quality execution and delivery of the content. You will work closely with your counterparts, the integrated marketing strategists, to drive business outcomes. Your network will include product marketers, integrated marketers, relationship marketers, sales, engineering, and agency partners to develop and execute on your plan. Our team: The Lifecycle Programs team is a fast-paced digital marketing organization. We put a focus on getting things done, simplifying anything and everything, and having fun while doing it. We all believe in connecting with customers at scale, supporting them at each stage of the customer journey, from early awareness and consideration, through onboarding and post purchase engagement. You will be in the middle of it all helping to identify the right content that delivers what customers want—where they want it, when they want it, and how they want it. \n \n**_Responsibilities \n_**\n * Define content journeys for Security and IT professionals across industries.\n * Build the resulting content strategies designed to accelerate the customer through the lifecycle.\n * Create a content plan to address the insights in the customer journey and strategy, ensuring the content is aligned to what the customer needs at each stage.\n * Deliver the content through our internal Studio or with select agency partners.\n * Be a customer advocate. Relentlessly champion the customer and the experiences they have with the content you create—how they find it, how they consume it, how they use it to make decisions.\n * Leverage data and market insights for decision making including content optimization and new concept development. \n\n\n**_Qualifications \n \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 1+ year(s) integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 3+ years integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience.\n * Strong customer centric mindset and demonstrated ability to put the customer first.\n * Clear and persuasive communication skills, both written and verbal.\n * Experience with program performance tracking and communications.\n * Recognized as a self-starter with a bias for action.\n * Creative problem-solving skills, and a growth mindset approach\n * Experience managing across highly matrixed organizations, often with competing priorities.\n * A demonstrated track record of business impact through content\n * Well-versed in digital marketing best practices, including journey mapping.\n * Understanding of content disciplines, including SEO, content strategy, and execution.\n * Preferred, but not required: experience with commercial technology sales process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The typical base pay range for this role across the U.S. is USD $80,900 - $162,200 per year. There is a different range applicable to specific work locations, within the San Francisco Bay area and New York City metropolitan area, and the base pay range for this role in those locations is USD $105,300 - $176,900 per year. \n \nMicrosoft has different base pay ranges for different work locations within the United States, which allows us to pay employees competitively and consistently in different geographic markets (see below). The range above reflects the potential base pay across the U.S. for this role (except as noted below); the applicable base pay range will depend on what ultimately is determined to be the candidate’s primary work location. Individual base pay depends on various factors, in addition to primary work location, such as complexity and responsibility of role, job duties/requirements, and relevant experience and skills. Base pay ranges are reviewed and typically updated each year. Offers are made within the base pay range applicable at the time. \n \nAt Microsoft certain roles are eligible for additional rewards, including merit increases, annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed here may vary depending on the nature of employment with Microsoft and the country work location. U.S.-based employees have access to healthcare benefits, a 401(k) plan and company match, short-term and long-term disability coverage, basic life insurance, wellbeing benefits, paid vacation time, paid sick and mental health time, and several paid holidays, among others. \n \nOur commitment to pay equity \n \nWe are committed to the principle of pay equity – paying employees equitably for substantially similar work. To learn more about pay equity and our other commitments to increase representation and strengthen our culture of inclusion, check out our annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page displays the role for which the base pay ranges apply – Integrated Marketing IC3. The way we define roles includes two things: discipline (the type of work) and career stage (scope and complexity). The career stage has two parts – the first identifies whether the role is a manager (M), an individual contributor (IC), an admin-technician-retail (ATR) job, or an intern. The second part identifies the relative seniority of the role – a higher number (or later letter alphabetically in the case of ATR) indicates greater scope and complexity. \n \nMicrosoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. If you need assistance and/or a reasonable accommodation due to a disability during the application or the recruiting process, please send a request via the Accommodation request form. \n \nThe salary for this role in the state of Colorado is between $108,200 and $162,200. \n \nAt Microsoft, certain roles are eligible for additional rewards, including annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work. \n", + "apply_url": "https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite", + "title": "Content Strategist", + "location": { + "country": "United States", + "region": "Hawaii", + "city": null, + "postal_code": null, + "latitude": null, + "longitude": null, + "street": null + }, + "company": { + "name": "Microsoft", + "url": "https://www.linkedin.com/company/microsoft", + "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" + }, + "seniority_level": "Mid-Senior level", + "industry": [ + "IT Services and IT Consulting, Computer Hardware Manufacturing, and Software Development" + ], + "employment_type": "Full-time", + "job_functions": ["Marketing"], + "total_applicants": 200 + } + } + }, + "description": "Detailed job data" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Jobs API"], + "operationId": "Job Profile Endpoint" + }, + "summary": "Job Profile Endpoint" + }, + "/api/followers": { + "get": { + "description": "Cost: 10 credits / result for users on an annual subscription or Enterprise plan.\nGet a list of individual followers of a company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of followers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/henry-schein", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of followers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/henryschein", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Limit the maximum results of followers returned per API call.\n\n The default value of this parameter is 10.\n\n Accepted values for this parameter is an integer ranging from 0 to 1000.\n ", + "example": "10", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FollowerList" + }, + "example": { + "followers": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", + "twitter_profile_url": "https://www.x.com/agilio_software", + "email": null + }, + { + "linkedin_profile_url": "https://www.linkedin.com/in/air-techniques", + "twitter_profile_url": "https://www.x.com/airtechniques", + "email": null + } + ], + "next_page": null + } + } + }, + "description": "A list of individual followers of the company" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Customer API `EXPERIMENTAL`"], + "operationId": "Follower Listing Endpoint `EXPERIMENTAL`" + }, + "summary": "Follower Listing Endpoint `EXPERIMENTAL`" + }, + "/api/followers/count": { + "get": { + "description": "Cost: 1 credit / result for users on an annual subscription or Enterprise plan.\nGet the count of followers of a company.", + "parameters": [ + { + "in": "query", + "name": "linkedin_company_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of followers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://www.linkedin.com/company/henry-schein", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of followers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", + "example": "https://x.com/henryschein", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FollowerListCount" + }, + "example": { + "follower_count": 74 + } + } + }, + "description": "Count individuals of that company's followers" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Customer API `EXPERIMENTAL`"], + "operationId": "Follower Listing Count Endpoint `EXPERIMENTAL`" + }, + "summary": "Follower Listing Count Endpoint `EXPERIMENTAL`" + }, + "/api/v2/search/company": { + "get": { + "description": "Cost: 3 credits / result returned.\nSearch for companies that meet a set of criteria within\n our exhaustive dataset of company profiles.\n\n This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our exhaustive dataset of company profiles.\n\n This API endpoint can return at most of 10,000 results per search.\n\n Each search expression for a parameter is limited to a maximum of 255 characters.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": false, + "description": "\n Filter companies with an office based in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "US", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "region", + "required": false, + "description": "\n Filter companies with an office based in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "United States", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "required": false, + "description": "\n Filter companies based in cities matching the provided search expression.\n ", + "example": "new AND york", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "type", + "required": false, + "description": "\n Filter companies of the provided LinkedIn type.\n\n Possible values:\n\n * `EDUCATIONAL`: Educational Institution\n * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT` : Nonprofit\n * `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY` : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED` : Sole Proprietorship\n ", + "example": "PRIVATELY_HELD", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "follower_count_min", + "required": false, + "description": "\n Filter companies with a LinkedIn follower count **more than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "follower_count_max", + "required": false, + "description": "\n Filter companies with a LinkedIn follower count **less than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name", + "required": false, + "description": "\n Filter companies with a name matching the provided search expression.\n ", + "example": "google OR apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "industry", + "required": false, + "description": "\n Filter companies belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n ", + "example": "technology", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employee_count_max", + "required": false, + "description": "\n Filter companies with **at most** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "employee_count_min", + "required": false, + "description": "\n Filter companies with **at least** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "description", + "required": false, + "description": "\n Filter companies with a description matching the provided search expression.\n ", + "example": "medical device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "founded_after_year", + "required": false, + "description": "\n Filter companies founded **after** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "founded_before_year", + "required": false, + "description": "\n Filter companies founded **before** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_amount_max", + "required": false, + "description": "\n Filter companies that have raised **at most** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_amount_min", + "required": false, + "description": "\n Filter companies that have raised **at least** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_raised_after", + "required": false, + "description": "\n Filter companies that have raised funding **after** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "funding_raised_before", + "required": false, + "description": "\n Filter companies that have raised funding **before** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the company’s profile URL).\n The target company’s identifier must be a member of this list.\n ", + "example": "stripe,amazon", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_not_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the company’s profile URL).\n The target company’s identifier must **not** be a member of this list.\n ", + "example": "stripe,amazon", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Tune the maximum results returned per API call.\n\n The default value of this parameter is 100.\n\n Accepted values for this parameter is an integer ranging from 1 to 100.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the company's complete profile data rather than just the URLs to their LinkedIn profiles.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n\n - skip (default): lists company's profile url\n - enrich: include company's profile data in the list\n\n Calling this API endpoint with this parameter would add 1 credit per result returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CompanySearchResult" + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple/", + "profile": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [10001, null], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": ["search", "ads"], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": false, + "state": "NY" + } + ], + "name": "Google", + "tagline": null, + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792 + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + } + }, + "description": "List of companies" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Search API"], + "operationId": "Company Search Endpoint" + }, + "summary": "Company Search Endpoint" + }, + "/api/v2/search/person/": { + "get": { + "description": "Cost: 3 credits / result returned.\nSearch for people who meet a set of criteria within our exhaustive dataset of people profiles.\n\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our exhaustive dataset of people and company profiles.\n\nThis API endpoint can return at most 10,000 results per search.\n\nEach search expression for a parameter is limited to a maximum of 255 characters.", + "parameters": [ + { + "in": "query", + "name": "country", + "required": true, + "description": "\n Filter people located in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "US", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "first_name", + "required": false, + "description": "\n Filter people whose first names match the provided search expression.\n ", + "example": "Sarah", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "last_name", + "required": false, + "description": "\n Filter people whose last names match the provided search expression.\n ", + "example": "Jackson OR Johnson", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_field_of_study", + "required": false, + "description": "\n Filter people with a field of study matching the provided search expression, based on education history.\n ", + "example": "computer science", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_degree_name", + "required": false, + "description": "\n Filter people who earned a degree matching the provided search expression, based on education history.\n ", + "example": "MBA", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_school_name", + "required": false, + "description": "\n Filter people who have attended a school whose name matches the provided search expression, based on education history.\n ", + "example": "Caltech OR Massachusetts Institute of Technology", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "education_school_linkedin_profile_url", + "required": false, + "description": "\n Filter people who have attended a school with a specific LinkedIn profile URL, based on education history.\n ", + "example": "https://www.linkedin.com/school/national-university-of-singapore/", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_role_title", + "required": false, + "description": "\n Filter people who are **currently** working as a role whose title matches the provided search expression. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_role_title", + "required": false, + "description": "\n Filter people who have **in the past** worked as a role whose title matches the provided search expression.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_role_before", + "required": false, + "description": "\n Filter people who started their current role **before** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n\n This parameter takes a ISO8601 date. Default value of this parameter is `null`.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_role_after", + "required": false, + "description": "\n Filter people who started their current role **after** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n\n This parameter takes a ISO8601 date. Default value of this parameter is `null`.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_linkedin_profile_url", + "required": false, + "description": "\n Filter people who are **currently** working at a company represented by this LinkedIn Company Profile URL.\n\n Default value of this parameter is `null`.\n ", + "example": "https://www.linkedin.com/company/apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_company_linkedin_profile_url", + "required": false, + "description": "\n Filter people who have **in the past** worked at the company represented by this LinkedIn Company Profile URL.\n\n This parameter takes a LinkedIn Company Profile URL. Default value of this parameter is `null`.\n ", + "example": "https://www.linkedin.com/company/apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_job_description", + "required": false, + "description": "\n Filter people with **current** job descriptions matching the provided search expression.\n ", + "example": "education", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_job_description", + "required": false, + "description": "\n Filter people with **past** job descriptions matching the provided search expression.\n ", + "example": "education", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_name", + "required": false, + "description": "\n Filter people who are **currently** working at a company whose name matches the provided search expression.\n ", + "example": "Stripe OR Apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "past_company_name", + "required": false, + "description": "\n Filter people who **have previously** worked at a company whose name matches the provided search expression.\n ", + "example": "Stripe OR Apple", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_groups", + "required": false, + "description": "\n Filter people who are members of LinkedIn groups whose names match the provided search expression.\n ", + "example": "haskell", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "languages", + "required": false, + "description": "\n Filter people who list a language matching the provided search expression.\n ", + "example": "Mandarin OR Chinese", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "region", + "required": false, + "description": "\n Filter people located in a region matching the provided search expression.\n A “region” in this context means “state,” “province,” or similar political division, depending on what country you’re querying.\n ", + "example": "California", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "city", + "required": false, + "description": "\n Filter people located in a city matching the provided search expression.\n ", + "example": "Seattle OR Los Angeles", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "headline", + "required": false, + "description": "\n Filter people whose LinkedIn headline fields match the provided search expression.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "summary", + "required": false, + "description": "\n Filter people whose LinkedIn summary fields match the provided search expression.\n ", + "example": "founder", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "industries", + "required": false, + "description": "\n Person's inferred industry. May sometimes exist when `current_company_industry` does not, but `current_company_industry` should be preferred when it exists.\n ", + "example": "automotive", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "interests", + "required": false, + "description": "\n Filter people whose Linkedin interest fields match the provided search expression.\n ", + "example": "technology", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "skills", + "required": false, + "description": "\n Filter people whose Linkedin skill fields match the provided search expression.\n ", + "example": "accounting", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_country", + "required": false, + "description": "\n Filter people who are currently working at a company with an office based in this country.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", + "example": "us", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_region", + "required": false, + "description": "\n Filter people who are currently working at a company based in a region matching the provided search expression.\n ", + "example": "United States", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_city", + "required": false, + "description": "\n Filter people who are currently working at a company based in a city matching the provided search expression.\n ", + "example": "Seattle OR Los Angeles", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_type", + "required": false, + "description": "\n Filter people who are currently working at a company of the provided LinkedIn type.\n\n Possible values:\n\n * `EDUCATIONAL`: Educational Institution\n * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT` : Nonprofit\n * `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY` : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED` : Sole Proprietorship\n ", + "example": "NON_PROFIT", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_follower_count_min", + "required": false, + "description": "\n Filter people who are currently working at a company with a LinkedIn follower count **more than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_follower_count_max", + "required": false, + "description": "\n Filter people who are currently working at a company with a LinkedIn follower count **less than** this value.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_industry", + "required": false, + "description": "\n Filter people who are currently working at a company belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n ", + "example": "higher AND education", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_employee_count_min", + "required": false, + "description": "\n Filter people who are currently working at a company with **at least** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_employee_count_max", + "required": false, + "description": "\n Filter people who are currently working at a company with **at most** this many employees.\n ", + "example": "1000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_description", + "required": false, + "description": "\n Filter people who are currently working at a company with a description matching the provided search expression.\n ", + "example": "medical device", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_founded_after_year", + "required": false, + "description": "\n Filter people who are currently working at a company that was founded **after** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_founded_before_year", + "required": false, + "description": "\n Filter people who are currently working at a company that was founded **before** this year.\n ", + "example": "1999", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_amount_min", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised **at least** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_amount_max", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised **at most** this much (USD) funding amount.\n ", + "example": "1000000", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_raised_after", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised funding **after** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "current_company_funding_raised_before", + "required": false, + "description": "\n Filter people who are currently working at a company that has raised funding **before** this date.\n ", + "example": "2019-12-30", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the person’s profile URL).\n The target person’s identifier must be a member of this list.\n ", + "example": "williamhgates,johnrmarty", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "public_identifier_not_in_list", + "required": false, + "description": "\n A list of public identifiers (the identifying portion of the person’s profile URL).\n The target person’s identifier must **not** be a member of this list.\n ", + "example": "williamhgates,johnrmarty", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n Tune the maximum results returned per API call.\n\n The default value of this parameter is `100`.\n\n Accepted values for this parameter is an integer ranging from `1` to `100`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10`.\n ", + "example": "10", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "enrich_profiles", + "required": false, + "description": "\n Get the person's complete profile data rather than just the URLs to their LinkedIn profiles.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n\n * `skip` (default): lists person's profile url only\n * `enrich`: include person's profile data in the list\n\n Calling this API endpoint with this parameter would add `1` credit per result returned.\n ", + "example": "enrich", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonSearchResult" + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [], + "accomplishment_publications": [], + "accomplishment_honors_awards": [], + "accomplishment_patents": [], + "accomplishment_courses": [], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [], + "volunteer_work": [], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [], + "groups": [] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + } + }, + "description": "LinkedIn (Person) Profile URL" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Search API"], + "operationId": "Person Search Endpoint" + }, + "summary": "Person Search Endpoint" + }, + "/api/credit-balance": { + "get": { + "description": "Cost: 0 credit / successful request.\nGet your current credit(s) balance", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreditBalance" + }, + "example": { + "credit_balance": 100000 + } + } + }, + "description": "Balance of credits" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Meta API"], + "operationId": "View Credit Balance Endpoint" + }, + "summary": "View Credit Balance Endpoint" + }, + "/api/disposable-email": { + "get": { + "description": "Cost: 0 credit / successful request.\nGiven an email address, checks if the email address belongs to a disposable email service.", + "parameters": [ + { + "in": "query", + "name": "email", + "required": true, + "description": "Email address to check", + "example": "steven@nubela.co", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DisposableEmail" + }, + "example": { + "is_disposable_email": false, + "is_free_email": false + } + } + }, + "description": "Disposable Email Check" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Contact API"], + "operationId": "Disposable Email Address Check Endpoint" + }, + "summary": "Disposable Email Address Check Endpoint" + }, + "/api/contact-api/personal-contact": { + "get": { + "description": "Cost: 1 credit / contact number returned.\nFind personal phone numbers associated with a given social media profile.", + "parameters": [ + { + "in": "query", + "name": "page_size", + "required": false, + "description": "\n This controls the maximum number of numbers returned per API call.\n It's useful for limiting credit consumption as the number of numbers\n per identity can vary. The default value is 0, meaning there's no limit\n to the number of returned results.\n ", + "example": "0", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "\n The Twitter/X Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", + "example": "https://x.com/proxycurl", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_url", + "required": false, + "description": "\n The Facebook Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", + "example": "https://www.facebook.com/zuck", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_profile_url", + "required": false, + "description": "\n The LinkedIn Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", + "example": "https://linkedin.com/in/steven-goh-6738131b", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PersonalContactNumbers" + }, + "example": { + "numbers": ["+1123123123"] + } + } + }, + "description": "List of Personal Contact Numbers" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Contact API"], + "operationId": "Personal Contact Number Lookup Endpoint" + }, + "summary": "Personal Contact Number Lookup Endpoint" + }, + "/api/contact-api/personal-email": { + "get": { + "description": "Cost: 1 credit / email returned.\nFind personal email addresses associated with a given social media profile.", + "parameters": [ + { + "in": "query", + "name": "email_validation", + "required": false, + "description": "\n How to validate each email.\n \n Takes the following values:\n * `none` (default) - Do not perform email validation.\n * `fast` - Perform fast email validation (does not cost extra credit).\n * `precise` - Perform deliverability validation (costs 1 extra credit per email found).\n\n For backward-compatibility these are also accepted:\n * `include` - Equivalent to `precise`\n * `exclude` - Equivalent to `none`\n ", + "example": "include", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page_size", + "required": false, + "description": "This controls the maximum number of emails returned per API call. It's useful for limiting credit consumption as the number of emails per identity can vary. The default value is `0`, meaning there's no limit to the number of returned results.", + "example": 0, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "twitter_profile_url", + "required": false, + "description": "The Twitter/X Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://x.com/proxycurl", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "facebook_profile_url", + "required": false, + "description": "The Facebook Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://www.facebook.com/zuck", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "linkedin_profile_url", + "required": false, + "description": "The LinkedIn Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", + "example": "https://linkedin.com/in/steven-goh-6738131b", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PDLEmailResult" + }, + "example": { + "emails": ["random@gmail.com", "random2@yahoo.com"], + "invalid_emails": ["random3@gmail.com"] + } + } + }, + "description": "List of Personal Emails" + }, + "400": { + "description": "Invalid parameters provided. Refer to the documentation and message body for more info" + }, + "401": { + "description": "Invalid API key" + }, + "403": { + "description": "You have run out of credits" + }, + "404": { + "description": "The requested resource (e.g: user profile, company) could not be found" + }, + "429": { + "description": "Rate limited. Please retry" + }, + "500": { + "description": "Internal Server Error" + }, + "503": { + "description": "Enrichment failed, please retry." + } + }, + "tags": ["Contact API"], + "operationId": "Personal Email Lookup Endpoint" + }, + "summary": "Personal Email Lookup Endpoint" + } + }, + "info": { + "title": "Proxycurl API", + "version": "1.0.0" + }, + "openapi": "3.0.0", + "components": { + "schemas": { + "CompanyLocation": { + "type": "object", + "properties": { + "country": { + "type": "string", + "nullable": true + }, + "city": { + "type": "string", + "nullable": true + }, + "postal_code": { + "type": "string", + "nullable": true + }, + "line_1": { + "type": "string", + "nullable": true + }, + "is_hq": { + "type": "boolean" + }, + "state": { + "type": "string", + "nullable": true + } + }, + "example": { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + } + }, + "CompanyType": { + "type": "string", + "enum": [ + "EDUCATIONAL", + "GOVERNMENT_AGENCY", + "NON_PROFIT", + "PARTNERSHIP", + "PRIVATELY_HELD", + "PUBLIC_COMPANY", + "SELF_EMPLOYED", + "SELF_OWNED" + ] + }, + "SimilarCompany": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "industry": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "name": "NUS Business School", + "link": "https://www.linkedin.com/school/nus-business-school/", + "industry": "Higher Education", + "location": null + } + }, + "AffiliatedCompany": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "industry": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "name": "LinkedIn", + "link": "https://www.linkedin.com/company/linkedin", + "industry": "Internet", + "location": "Sunnyvale, California" + } + }, + "Date": { + "type": "object", + "properties": { + "day": { + "type": "integer", + "nullable": true + }, + "month": { + "type": "integer", + "nullable": true + }, + "year": { + "type": "integer" + } + }, + "example": { + "day": 30, + "month": 9, + "year": 2021 + } + }, + "CompanyUpdate": { + "type": "object", + "properties": { + "article_link": { + "type": "string", + "nullable": true, + "description": "The URL for which the post links out to" + }, + "image": { + "type": "string", + "nullable": true, + "description": "The URL to the image to the post (if it exists)" + }, + "posted_on": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "text": { + "type": "string", + "nullable": true, + "description": "The body of the update" + }, + "total_likes": { + "type": "integer", + "nullable": true, + "description": "The total likes a post has received" + } + }, + "example": { + "article_link": "https://lnkd.in/gr7cb5by", + "image": "https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c", + "posted_on": { + "day": 30, + "month": 9, + "year": 2021 + }, + "text": "Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by", + "total_likes": 3 + } + }, + "LinkedinSchool": { + "type": "object", + "properties": { + "linkedin_internal_id": { + "type": "string", + "description": "\n LinkedIn's Internal and immutable ID of this Company profile.\n " + }, + "description": { + "type": "string", + "nullable": true, + "description": "A textual description of the company." + }, + "website": { + "type": "string", + "nullable": true, + "description": "The URL of the company's website." + }, + "industry": { + "type": "string", + "nullable": true, + "description": "The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link)." + }, + "company_size": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "integer", + "nullable": true + } + ] + }, + "minItems": 2, + "maxItems": 2, + "description": "Sequenceed range of company head count" + }, + "company_size_on_linkedin": { + "type": "integer", + "nullable": true, + "description": "The size of the company as indicated on LinkedIn." + }, + "hq": { + "$ref": "#/components/schemas/CompanyLocation", + "nullable": true + }, + "company_type": { + "$ref": "#/components/schemas/CompanyType", + "nullable": true, + "description": "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT` : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`: Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" + }, + "founded_year": { + "type": "integer", + "nullable": true, + "description": "The year the company was founded." + }, + "specialities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of specialities.\n " + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyLocation" + } + }, + "name": { + "type": "string", + "nullable": true, + "description": "The name of the company." + }, + "tagline": { + "type": "string", + "nullable": true, + "description": "A short, catchy phrase that represents the company's mission or brand." + }, + "universal_name_id": { + "type": "string", + "nullable": true, + "description": "A unique numerical identifier for the company used in the LinkedIn platform." + }, + "profile_pic_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's profile picture." + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's background cover image." + }, + "search_id": { + "type": "string", + "description": "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n " + }, + "similar_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarCompany" + } + }, + "affiliated_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AffiliatedCompany" + } + }, + "updates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyUpdate" + }, + "description": "A list of post updates made by the company. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "follower_count": { + "type": "integer", + "nullable": true, + "description": "The number of followers the company has on LinkedIn." + } + }, + "example": { + "linkedin_internal_id": "5524", + "description": "At NUS, we are shaping the future through our people and our pursuit of new frontiers in knowledge. In a single century, we have become a university of global influence and an Asian thought leader. Our location at the crossroads of Asia informs our mission and gives us a tremendous vantage point to help create opportunities and address the pressing issues facing Singapore, Asia and the world.\r\rAt NUS, we believe in education, research and service that change lives.", + "website": "http://nus.edu.sg", + "industry": "Higher Education", + "company_size": [5001, 10000], + "company_size_on_linkedin": 16084, + "hq": { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + }, + "company_type": "EDUCATIONAL_INSTITUTION", + "founded_year": 1905, + "specialities": ["education", "research"], + "locations": [ + { + "country": "SG", + "city": "Singapore", + "postal_code": "119077", + "line_1": "21 Lower Kent Ridge Road, Singapore", + "is_hq": true, + "state": null + } + ], + "name": "National University of Singapore", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "national-university-of-singapore", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140", + "search_id": "5524", + "similar_companies": [ + { + "name": "NUS Business School", + "link": "https://www.linkedin.com/school/nus-business-school/", + "industry": "Higher Education", + "location": null + }, + { + "name": "NUS Faculty of Arts and Social Sciences", + "link": "https://www.linkedin.com/school/nusfass/", + "industry": "Higher Education", + "location": null + } + ], + "affiliated_companies": [ + { + "name": "LinkedIn", + "link": "https://www.linkedin.com/company/linkedin", + "industry": "Internet", + "location": "Sunnyvale, California" + } + ], + "updates": [ + { + "article_link": "https://lnkd.in/gr7cb5by", + "image": "https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c", + "posted_on": { + "day": 30, + "month": 9, + "year": 2021 + }, + "text": "Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by", + "total_likes": 3 + } + ], + "follower_count": 539321 + } + }, + "AcquiredCompany": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n LinkedIn Company Profile URL of company that was involved\n " + }, + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of company that was involved" + }, + "announced_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date by which this event was announced" + }, + "price": { + "type": "integer", + "nullable": true, + "description": "Price of acquisition" + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + }, + "Acquisitor": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n LinkedIn Company Profile URL of company that was involved\n " + }, + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of company that was involved" + }, + "announced_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date by which this event was announced" + }, + "price": { + "type": "integer", + "nullable": true, + "description": "Price of acquisition" + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "Acquisition": { + "type": "object", + "properties": { + "acquired": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AcquiredCompany" + } + }, + "acquired_by": { + "$ref": "#/components/schemas/Acquisitor", + "nullable": true + } + }, + "example": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + } + }, + "Exit": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "LinkedIn Profile URL of the company that has exited" + }, + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of the company that has exited" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of the company" + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + }, + "CompanyDetails": { + "type": "object", + "properties": { + "crunchbase_profile_url": { + "type": "string", + "nullable": true, + "description": "Crunchbase Profile URL of the company" + }, + "ipo_status": { + "type": "string", + "nullable": true, + "description": "IPO status of the company" + }, + "crunchbase_rank": { + "type": "integer", + "nullable": true, + "description": "A measure of prominence of this company by Crunchbase" + }, + "founding_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of founding" + }, + "operating_status": { + "type": "string", + "nullable": true, + "description": "Status of the company's operational status" + }, + "company_type": { + "type": "string", + "nullable": true, + "description": "Type of company" + }, + "contact_email": { + "type": "string", + "nullable": true, + "description": "General contact email of the company" + }, + "phone_number": { + "type": "string", + "nullable": true, + "description": "General contact number of the company" + }, + "facebook_id": { + "type": "string", + "nullable": true, + "description": "ID of the company's official Facebook account" + }, + "twitter_id": { + "type": "string", + "nullable": true, + "description": "ID of the company's official Twitter account" + }, + "number_of_funding_rounds": { + "type": "integer", + "nullable": true, + "description": "Total rounds of funding that this company has raised" + }, + "total_funding_amount": { + "type": "integer", + "nullable": true, + "description": "Total venture capital raised by this company" + }, + "stock_symbol": { + "type": "string", + "nullable": true, + "description": "Stock symbol of this public company" + }, + "ipo_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "The date by which this public company went public" + }, + "number_of_lead_investors": { + "type": "integer", + "nullable": true, + "description": "Total lead investors" + }, + "number_of_investors": { + "type": "integer", + "nullable": true, + "description": "Total investors" + }, + "total_fund_raised": { + "type": "integer", + "nullable": true, + "description": "\n The total amount of funds raised (by this VC firm) to be deployed as\n subsidiary investments (applicable only for VC firms)\n " + }, + "number_of_investments": { + "type": "integer", + "nullable": true, + "description": "\n Total investments made by this VC firm (applicable only for VC firms)\n " + }, + "number_of_lead_investments": { + "type": "integer", + "nullable": true, + "description": "\n Total investments that was led by this VC firm\n (applicable only for VC firms)\n " + }, + "number_of_exits": { + "type": "integer", + "nullable": true, + "description": "Total exits by this VC (applicable only for VC firms)" + }, + "number_of_acquisitions": { + "type": "integer", + "nullable": true, + "description": "Total companies acquired by this company" + } + }, + "example": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + } + }, + "Investor": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "LinkedIn Profile URL of investor" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of investor" + }, + "type": { + "type": "string", + "nullable": true, + "description": "Type of investor" + } + }, + "example": { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + }, + "Funding": { + "type": "object", + "properties": { + "funding_type": { + "type": "string", + "nullable": true, + "description": "Type of funding" + }, + "money_raised": { + "type": "integer", + "nullable": true, + "description": "Amount of money raised" + }, + "announced_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of announcement" + }, + "number_of_investor": { + "type": "integer", + "nullable": true, + "description": "Number of investors in this round" + }, + "investor_list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Investor" + }, + "nullable": true + } + }, + "example": { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + }, + "LinkedinCompany": { + "type": "object", + "properties": { + "linkedin_internal_id": { + "type": "string", + "description": "\n LinkedIn's Internal and immutable ID of this Company profile.\n " + }, + "description": { + "type": "string", + "nullable": true, + "description": "A textual description of the company." + }, + "website": { + "type": "string", + "nullable": true, + "description": "The URL of the company's website." + }, + "industry": { + "type": "string", + "nullable": true, + "description": "The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link)." + }, + "company_size": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "integer", + "nullable": true + } + ] + }, + "minItems": 2, + "maxItems": 2, + "description": "Sequenceed range of company head count" + }, + "company_size_on_linkedin": { + "type": "integer", + "nullable": true, + "description": "The size of the company as indicated on LinkedIn." + }, + "hq": { + "$ref": "#/components/schemas/CompanyLocation", + "nullable": true + }, + "company_type": { + "$ref": "#/components/schemas/CompanyType", + "nullable": true, + "description": "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT` : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`: Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" + }, + "founded_year": { + "type": "integer", + "nullable": true, + "description": "The year the company was founded." + }, + "specialities": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of specialities.\n " + }, + "locations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyLocation" + } + }, + "name": { + "type": "string", + "nullable": true, + "description": "The name of the company." + }, + "tagline": { + "type": "string", + "nullable": true, + "description": "A short, catchy phrase that represents the company's mission or brand." + }, + "universal_name_id": { + "type": "string", + "nullable": true, + "description": "A unique numerical identifier for the company used in the LinkedIn platform." + }, + "profile_pic_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's profile picture." + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "The URL of the company's background cover image." + }, + "search_id": { + "type": "string", + "description": "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n " + }, + "similar_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarCompany" + } + }, + "affiliated_companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AffiliatedCompany" + } + }, + "updates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyUpdate" + }, + "description": "A list of post updates made by the company. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "follower_count": { + "type": "integer", + "nullable": true, + "description": "The number of followers the company has on LinkedIn." + }, + "acquisitions": { + "$ref": "#/components/schemas/Acquisition", + "nullable": true + }, + "exit_data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Exit" + }, + "nullable": true + }, + "extra": { + "$ref": "#/components/schemas/CompanyDetails", + "nullable": true, + "description": "Company extra when `extra=include`" + }, + "funding_data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Funding" + }, + "description": "Company Funding data when `funding_data=include`" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "description": "The `categories` attribute is fetched from the company's Crunchbase profile. Values for this attribute are free-form text, and there is no exhaustive list of categories. Consider the categories attribute as \"hints\" regarding the products or services offered by the company." + }, + "customer_list": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + } + }, + "example": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [10001, null], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": ["search", "ads"], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": null, + "state": "NY" + } + ], + "name": "Google", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": ["artificial-intelligence", "virtual-reality"] + } + }, + "Experience": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "company": { + "type": "string", + "nullable": true, + "description": "The company's display name." + }, + "company_linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The company's profile URL on Linkedin.\n If present, could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint) for more info.\n " + }, + "company_facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The company's profile URL on Facebook.\n " + }, + "title": { + "type": "string", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + }, + "logo_url": { + "type": "string", + "nullable": true, + "description": "URL of the logo of the organisation." + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + } + }, + "Education": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "field_of_study": { + "type": "string", + "nullable": true + }, + "degree_name": { + "type": "string", + "nullable": true + }, + "school": { + "type": "string", + "nullable": true + }, + "school_linkedin_profile_url": { + "type": "string", + "nullable": true + }, + "school_facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The school's profile URL on Facebook.\n " + }, + "description": { + "type": "string", + "nullable": true + }, + "logo_url": { + "type": "string", + "nullable": true + }, + "grade": { + "type": "string" + }, + "activities_and_societies": { + "type": "string" + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + } + }, + "AccomplishmentOrg": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "org_name": { + "type": "string", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true + }, + "description": { + "type": "string", + "nullable": true + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + }, + "Publication": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "Name of the publication." + }, + "publisher": { + "type": "string", + "nullable": true, + "description": "The publishing organisation body." + }, + "published_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of publication." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the publication." + }, + "url": { + "type": "string", + "nullable": true, + "description": "URL of the publication." + } + }, + "example": { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + }, + "HonourAward": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true, + "description": "Title of the honour/award." + }, + "issuer": { + "type": "string", + "nullable": true, + "description": "The organisation body issuing this honour/award." + }, + "issued_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date that this honour/awared was issued." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the honour/award." + } + }, + "example": { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + }, + "Patent": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true, + "description": "Title of the patent." + }, + "issuer": { + "type": "string", + "nullable": true, + "description": "The organisation body that issued the patent." + }, + "issued_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of patent issuance." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the patent." + }, + "application_number": { + "type": "string", + "nullable": true, + "description": "Numerical representation that identifies the patent." + }, + "patent_number": { + "type": "string", + "nullable": true, + "description": "Application number of the patent." + }, + "url": { + "type": "string", + "nullable": true + } + }, + "example": { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + }, + "Course": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "Name of the course" + }, + "number": { + "type": "string", + "nullable": true, + "description": "The numerical representation of the course" + } + }, + "example": { + "name": "The course about ABCs", + "number": "123" + } + }, + "Project": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true, + "description": "\n Name of the project that has been or is currently being worked on.\n " + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the project." + }, + "url": { + "type": "string", + "nullable": true, + "description": "A web location related to the project." + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + } + }, + "TestScore": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "\n Title of the course for which test score was derived from.\n " + }, + "score": { + "type": "string", + "nullable": true, + "description": "Test score" + }, + "date_on": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Date of test was assesed." + }, + "description": { + "type": "string", + "nullable": true, + "description": "Description of the test score." + } + }, + "example": { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + }, + "VolunteeringExperience": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "title": { + "type": "string", + "nullable": true, + "description": "Name of volunteer activity." + }, + "cause": { + "type": "string", + "nullable": true + }, + "company": { + "type": "string", + "nullable": true, + "description": "The company's display name." + }, + "company_linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "\n The company's profile URL.\n If present, could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint) for more info.\n " + }, + "description": { + "type": "string", + "nullable": true + }, + "logo_url": { + "type": "string", + "nullable": true, + "description": "URL of the logo of the organisation." + } + }, + "example": { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + }, + "Certification": { + "type": "object", + "properties": { + "starts_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "ends_at": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of the course or program." + }, + "license_number": { + "type": "string", + "nullable": true + }, + "display_source": { + "type": "string", + "nullable": true + }, + "authority": { + "type": "string", + "nullable": true, + "description": "The organisation body issuing this certificate." + }, + "url": { + "type": "string", + "nullable": true + } + }, + "example": { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + } + }, + "PeopleAlsoViewed": { + "type": "object", + "properties": { + "link": { + "type": "string", + "nullable": true, + "description": "\n URL of the profile.\n Useable with [Person profile endpoint](#people-api-person-profile-endpoint)\n " + }, + "name": { + "type": "string", + "nullable": true + }, + "summary": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + }, + "Activity": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "activity_status": { + "type": "string", + "nullable": true + } + }, + "example": { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + }, + "SimilarProfile": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "summary": { + "type": "string", + "nullable": true + }, + "location": { + "type": "string", + "nullable": true + } + }, + "example": { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + } + }, + "Article": { + "type": "object", + "properties": { + "title": { + "type": "string", + "nullable": true + }, + "link": { + "type": "string", + "nullable": true + }, + "published_date": { + "$ref": "#/components/schemas/Date", + "nullable": true + }, + "author": { + "type": "string", + "nullable": true + }, + "image_url": { + "type": "string", + "nullable": true + } + }, + "example": { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + }, + "PersonGroup": { + "type": "object", + "properties": { + "profile_pic_url": { + "type": "string", + "nullable": true, + "description": "The URL to the profile picture of this LinkedIn Group" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Name of LinkedIn group for which this user is in" + }, + "url": { + "type": "string", + "nullable": true, + "description": "URL to the LinkedIn Group" + } + }, + "example": { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + }, + "InferredSalary": { + "type": "object", + "properties": { + "min": { + "type": "number", + "nullable": true + }, + "max": { + "type": "number", + "nullable": true + } + }, + "example": { + "min": 35000, + "max": 45000 + } + }, + "PersonExtra": { + "type": "object", + "properties": { + "github_profile_id": { + "type": "string", + "nullable": true, + "description": "This profile's Github account." + }, + "facebook_profile_id": { + "type": "string", + "nullable": true, + "description": "This profile's Facebook account." + }, + "twitter_profile_id": { + "type": "string", + "nullable": true, + "description": "This profile's twitter account." + }, + "website": { + "type": "string", + "nullable": true, + "description": "This account's website listed on his profile." + } + }, + "example": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + } + }, + "PersonEndpointResponse": { + "type": "object", + "properties": { + "public_identifier": { + "type": "string", + "nullable": true, + "description": "\n The vanity identifier of the public LinkedIn profile.\n The vanity identifier comes after the `/in/` part of the LinkedIn Profile URL\n in the following format: `https://www.linkedin.com/in/`\n " + }, + "profile_pic_url": { + "type": "string", + "description": "\n A temporary link to the user's profile picture that is valid for 30 minutes. \n The temporal nature of the link is by design to prevent having Proxycurl be the mirror for the images.\n The developer is expected to handle these images by downloading the image and re-hosting the image.\n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n Some profile pictures might be of the standard LinkedIn's profile picture placeholder. It is so because. See [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/) for context.\n " + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "\n A temporary link to the user's background cover picture\n that is valid for 30 minutes.\n The temporal nature of the link is by design to prevent\n having Proxycurl be the mirror for the images.\n The developer is expected to handle these images \n by downloading the image and re-hosting the image. \n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n " + }, + "first_name": { + "type": "string", + "nullable": true, + "description": "First name of the user." + }, + "last_name": { + "type": "string", + "nullable": true, + "description": "Last name of the user." + }, + "full_name": { + "type": "string", + "nullable": true, + "description": "\n Full name of the user (`first_name` + `last_name`)\n " + }, + "follower_count": { + "type": "integer", + "description": "Follower count for this profile" + }, + "occupation": { + "type": "string", + "nullable": true, + "description": "\n The title and company name of the user's current employment.\n " + }, + "headline": { + "type": "string", + "nullable": true, + "description": "\n The tagline written by the user for his profile.\n " + }, + "summary": { + "type": "string", + "nullable": true, + "description": "\n A blurb (longer than the tagline) written by the user for his profile.\n " + }, + "country": { + "type": "string", + "nullable": true, + "description": "\n The user's country of residence depicted by\n a 2-letter country code (ISO 3166-1 alpha-2).\n " + }, + "country_full_name": { + "type": "string", + "nullable": true, + "description": "The user's country of residence, in English words." + }, + "city": { + "type": "string", + "nullable": true, + "description": "The city that the user is living at." + }, + "state": { + "type": "string", + "nullable": true, + "description": "The state that the user is living at." + }, + "experiences": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Experience" + }, + "description": "The user's list of historic work experiences." + }, + "education": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Education" + }, + "description": "The user's list of education background." + }, + "languages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of languages that the user claims to be familiar with,\n and has added to his/her profile.\n Do note that we do not have the proficiency level as\n that data point is not available on a public LinkedIn profile.\n " + }, + "accomplishment_organisations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccomplishmentOrg" + }, + "description": "\n List of noteworthy organizations that this user is part of.\n " + }, + "accomplishment_publications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Publication" + }, + "description": "\n List of noteworthy publications that this user has partook in.\n " + }, + "accomplishment_honors_awards": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HonourAward" + }, + "description": "\n List of noteworthy honours and awards that this user has won.\n " + }, + "accomplishment_patents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Patent" + }, + "description": "List of noteworthy patents won by this user." + }, + "accomplishment_courses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Course" + }, + "description": "List of noteworthy courses partook by this user." + }, + "accomplishment_projects": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + }, + "description": "\n List of noteworthy projects undertaken by this user.\n " + }, + "accomplishment_test_scores": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestScore" + }, + "description": "\n List of noteworthy test scores accomplished by this user.\n " + }, + "volunteer_work": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VolunteeringExperience" + }, + "description": "List of historic volunteer work experiences." + }, + "certifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Certification" + }, + "description": "\n List of noteworthy certifications accomplished by this user.\n " + }, + "connections": { + "type": "integer", + "nullable": true, + "description": "Total *count* of LinkedIn connections." + }, + "people_also_viewed": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PeopleAlsoViewed" + }, + "description": "\n A list of other LinkedIn profiles closely related to this user.\n " + }, + "recommendations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n List of recommendations made by other users about this profile.\n " + }, + "activities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Activity" + }, + "description": "A list of LinkedIn status activities. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "similarly_named_profiles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarProfile" + }, + "description": "\n A list of other LinkedIn profiles with similar names.\n " + }, + "articles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Article" + }, + "description": "\n A list of content-based articles posted by this user. This field is not guaranteed to be returned. Do not rely on this attribute in production.\n " + }, + "groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonGroup" + }, + "description": "\n A list of LinkedIn groups that this user is a part of.\",\n " + }, + "skills": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of keyword-based skills that this user boasts of on his LinkedIn profile." + }, + "inferred_salary": { + "$ref": "#/components/schemas/InferredSalary", + "nullable": true, + "description": "A salary range inferred from the user's current job title and company." + }, + "gender": { + "type": "string", + "nullable": true, + "description": "Gender of the user." + }, + "birth_date": { + "$ref": "#/components/schemas/Date", + "nullable": true, + "description": "Birth date of the user." + }, + "industry": { + "type": "string", + "nullable": true, + "description": "Industry that the user works in." + }, + "extra": { + "$ref": "#/components/schemas/PersonExtra", + "nullable": true, + "description": "A bundle of extra data on this user." + }, + "interests": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of interests that the user has." + }, + "personal_emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of personal emails associated with this user." + }, + "personal_numbers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of personal mobile phone numbers associated with this user." + } + }, + "example": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": ["education", "health", "human rights"], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] + } + }, + "CompanyCustomer": { + "type": "object", + "properties": { + "linkedin_company_profile_url": { + "type": "string", + "description": "LinkedIn Company Profile URL of a probable customer" + }, + "twitter_profile_url": { + "type": "string", + "nullable": true, + "description": "Twitter Profile URL of a probable customer" + }, + "email": { + "type": "string", + "nullable": true, + "description": "General Email address of company (if any)" + } + }, + "example": { + "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", + "twitter_profile_url": "https://twitter.com/spirellp", + "email": "info@spiresolicitors.co.uk" + } + }, + "CustomerList": { + "type": "object", + "properties": { + "companies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CompanyCustomer" + }, + "description": "A list of companies that are probable customers." + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "companies": [ + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", + "twitter_profile_url": "https://twitter.com/spirellp", + "email": "info@spiresolicitors.co.uk" + }, + { + "linkedin_company_profile_url": "https://www.linkedin.com/company/mall-wood-insurance-services-ltd", + "twitter_profile_url": "https://twitter.com/draytonins", + "email": "hello@example.com" + } + ], + "next_page": null + } + }, + "CustomerCount": { + "type": "object", + "properties": { + "company_count": { + "type": "integer", + "nullable": true, + "description": "A count of of companies that are probable customers." + } + }, + "example": { + "company_count": 125 + } + }, + "PublicPerson": { + "type": "object", + "properties": { + "public_identifier": { + "type": "string", + "nullable": true, + "description": "\n The vanity identifier of the public LinkedIn profile.\n The vanity identifier comes after the `/in/` part of the LinkedIn Profile URL\n in the following format: `https://www.linkedin.com/in/`\n " + }, + "profile_pic_url": { + "type": "string", + "description": "\n A temporary link to the user's profile picture that is valid for 30 minutes. \n The temporal nature of the link is by design to prevent having Proxycurl be the mirror for the images.\n The developer is expected to handle these images by downloading the image and re-hosting the image.\n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n Some profile pictures might be of the standard LinkedIn's profile picture placeholder. It is so because. See [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/) for context.\n " + }, + "background_cover_image_url": { + "type": "string", + "nullable": true, + "description": "\n A temporary link to the user's background cover picture\n that is valid for 30 minutes.\n The temporal nature of the link is by design to prevent\n having Proxycurl be the mirror for the images.\n The developer is expected to handle these images \n by downloading the image and re-hosting the image. \n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n " + }, + "first_name": { + "type": "string", + "nullable": true, + "description": "First name of the user." + }, + "last_name": { + "type": "string", + "nullable": true, + "description": "Last name of the user." + }, + "full_name": { + "type": "string", + "nullable": true, + "description": "\n Full name of the user (`first_name` + `last_name`)\n " + }, + "follower_count": { + "type": "integer", + "description": "Follower count for this profile" + }, + "occupation": { + "type": "string", + "nullable": true, + "description": "\n The title and company name of the user's current employment.\n " + }, + "headline": { + "type": "string", + "nullable": true, + "description": "\n The tagline written by the user for his profile.\n " + }, + "summary": { + "type": "string", + "nullable": true, + "description": "\n A blurb (longer than the tagline) written by the user for his profile.\n " + }, + "country": { + "type": "string", + "nullable": true, + "description": "\n The user's country of residence depicted by\n a 2-letter country code (ISO 3166-1 alpha-2).\n " + }, + "country_full_name": { + "type": "string", + "nullable": true, + "description": "The user's country of residence, in English words." + }, + "city": { + "type": "string", + "nullable": true, + "description": "The city that the user is living at." + }, + "state": { + "type": "string", + "nullable": true, + "description": "The state that the user is living at." + }, + "experiences": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Experience" + }, + "description": "The user's list of historic work experiences." + }, + "education": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Education" + }, + "description": "The user's list of education background." + }, + "languages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of languages that the user claims to be familiar with,\n and has added to his/her profile.\n Do note that we do not have the proficiency level as\n that data point is not available on a public LinkedIn profile.\n " + }, + "accomplishment_organisations": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccomplishmentOrg" + }, + "description": "\n List of noteworthy organizations that this user is part of.\n " + }, + "accomplishment_publications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Publication" + }, + "description": "\n List of noteworthy publications that this user has partook in.\n " + }, + "accomplishment_honors_awards": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HonourAward" + }, + "description": "\n List of noteworthy honours and awards that this user has won.\n " + }, + "accomplishment_patents": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Patent" + }, + "description": "List of noteworthy patents won by this user." + }, + "accomplishment_courses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Course" + }, + "description": "List of noteworthy courses partook by this user." + }, + "accomplishment_projects": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Project" + }, + "description": "\n List of noteworthy projects undertaken by this user.\n " + }, + "accomplishment_test_scores": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TestScore" + }, + "description": "\n List of noteworthy test scores accomplished by this user.\n " + }, + "volunteer_work": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VolunteeringExperience" + }, + "description": "List of historic volunteer work experiences." + }, + "certifications": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Certification" + }, + "description": "\n List of noteworthy certifications accomplished by this user.\n " + }, + "connections": { + "type": "integer", + "nullable": true, + "description": "Total *count* of LinkedIn connections." + }, + "people_also_viewed": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PeopleAlsoViewed" + }, + "description": "\n A list of other LinkedIn profiles closely related to this user.\n " + }, + "recommendations": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n List of recommendations made by other users about this profile.\n " + }, + "activities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Activity" + }, + "description": "A list of LinkedIn status activities. This field is not guaranteed to be returned. Do not rely on this attribute in production." + }, + "similarly_named_profiles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SimilarProfile" + }, + "description": "\n A list of other LinkedIn profiles with similar names.\n " + }, + "articles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Article" + }, + "description": "\n A list of content-based articles posted by this user. This field is not guaranteed to be returned. Do not rely on this attribute in production.\n " + }, + "groups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PersonGroup" + }, + "description": "\n A list of LinkedIn groups that this user is a part of.\",\n " + }, + "skills": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of keyword-based skills that this user boasts of on his LinkedIn profile." + } + }, + "example": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "follower_count": null, + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "company_facebook_profile_url": null, + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "company_facebook_profile_url": null, + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Chinese", "Japanese"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [], + "connections": null, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Professional and dedicated approach towards clients and collegues." + ], + "activities": [ + { + "title": "I am hiring!", + "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", + "activity_status": "posted" + } + ], + "similarly_named_profiles": null, + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + } + }, + "Employee": { + "type": "object", + "properties": { + "profile_url": { + "type": "string", + "description": "\n LinkedIn Profile URL of the employee.\n " + }, + "profile": { + "$ref": "#/components/schemas/PublicPerson", + "nullable": true, + "description": "\n Enriched profile data of the employee.\n " + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "profile_url": "https://www.linkedin.com/in/williamhgates", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "follower_count": null, + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "company_facebook_profile_url": null, + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "company_facebook_profile_url": null, + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Chinese", "Japanese"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [], + "connections": null, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Professional and dedicated approach towards clients and collegues." + ], + "activities": [ + { + "title": "I am hiring!", + "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", + "activity_status": "posted" + } + ], + "similarly_named_profiles": null, + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "EmployeeList": { + "type": "object", + "properties": { + "employees": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Employee" + }, + "description": "\n A list of employee profiles (if enriched) and their associated profile URL.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "employees": [ + { + "profile_url": "https://www.linkedin.com/in/williamhgates", + "profile": { + "public_identifier": "williamhgates", + "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "background_cover_image_url": null, + "first_name": "Bill", + "last_name": "Gates", + "full_name": "Bill Gates", + "follower_count": null, + "occupation": "Co-chair at Bill & Melinda Gates Foundation", + "headline": "Co-chair, Bill & Melinda Gates Foundation", + "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "company": "Breakthrough Energy ", + "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", + "company_facebook_profile_url": null, + "title": "Founder", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2000 + }, + "ends_at": null, + "company": "Bill & Melinda Gates Foundation", + "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", + "company_facebook_profile_url": null, + "title": "Co-chair", + "description": null, + "location": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 1973 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 1975 + }, + "field_of_study": null, + "degree_name": null, + "school": "Harvard University", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": null, + "ends_at": null, + "field_of_study": null, + "degree_name": null, + "school": "Lakeside School", + "school_linkedin_profile_url": null, + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Chinese", "Japanese"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [], + "connections": null, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Professional and dedicated approach towards clients and collegues." + ], + "activities": [ + { + "title": "I am hiring!", + "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", + "activity_status": "posted" + } + ], + "similarly_named_profiles": null, + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + }, + "EmployeeCount": { + "type": "object", + "properties": { + "total_employee": { + "type": "integer" + }, + "linkedin_employee_count": { + "type": "integer", + "nullable": true, + "description": "The scraped value of employee count of this company from it's LinkedIn profile. This value does not respect `employement_status` parameter. It will always return the curent employee count of this company from LinkedIn." + }, + "linkdb_employee_count": { + "type": "integer", + "description": "The total number of employees found in LinkDB for this company. This value is limited by pre-crawled LinkedIn profiles stored in [LinkDB](https://nubela.co/proxycurl/linkdb)" + }, + "regression_notice": { + "type": "string" + } + }, + "example": { + "linkedin_employee_count": 529274, + "linkdb_employee_count": 3 + } + }, + "ProfilePicture": { + "type": "object", + "properties": { + "tmp_profile_pic_url": { + "type": "string", + "description": "\n Temporary URL to the profile picture (valid for just 30 minutes).\n See this [blog post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for more information." + } + }, + "example": { + "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" + } + }, + "PersonLookupUrlEnrichResult": { + "type": "object", + "properties": { + "url": { + "type": "string", + "nullable": true, + "description": "The LinkedIn profile URL" + }, + "name_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input name is to the name in the returned profile. Values can range from `0` to `1` , with `0` indicating no similarity and `1` implying high similarity. In cases where a current profile for comparison is not available in our dataset, the result may be `null`." + }, + "company_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input company name/domain is to the name/domain of past or present companies in the returned profile. The score ranges from `0` to `1` , with `0` signifying no similarity and `1` denoting high similarity. If a relevant profile is unavailable in our dataset for comparison, a `null` score may be returned." + }, + "title_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input title is to the returned profile's past or present titles. Scores vary from `0` to `1` , where `0` means no similarity and `1` indicates high similarity. If a relevant profile for comparison isn't available in our dataset, a `null` result may occur." + }, + "location_similarity_score": { + "type": "number", + "nullable": true, + "description": "A measure of how similar the input location is to the returned profile's current location. The range is from `0` to `1` , with `0` representing no similarity and `1` signifying high similarity. If there isn't a relevant profile in our dataset for comparison, the score might be `null`. " + }, + "profile": { + "$ref": "#/components/schemas/PersonEndpointResponse" + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "url": "https://www.linkedin.com/in/senatormarty", + "name_similarity_score": 0.5, + "company_similarity_score": 0.5, + "title_similarity_score": 0.5, + "location_similarity_score": 0.5, + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": ["education", "health", "human rights"], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "JobListEntry": { + "type": "object", + "properties": { + "company": { + "type": "string", + "nullable": true, + "description": "\n The name of the company that posted this job.\n " + }, + "company_url": { + "type": "string", + "nullable": true, + "description": "\n The LinkedIn Company Profile URL that posted this job.\n " + }, + "job_title": { + "type": "string", + "nullable": true, + "description": "\n Job title of the posted job.\n " + }, + "job_url": { + "type": "string", + "nullable": true, + "description": "\n Job Profile URL. You can fetch details about this job using this URL via the [Job Profile API Endpoint](https://nubela.co/proxycurl/docs#jobs-api-job-profile-endpoint).\n " + }, + "list_date": { + "type": "string", + "nullable": true, + "description": "\n The date that this job was listed.\n " + }, + "location": { + "type": "string", + "nullable": true, + "description": "\n The job location.\n " + } + }, + "example": { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Product Management: Intern Opportunities for University Students", + "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", + "list_date": "2022-10-09", + "location": "New York, NY" + } + }, + "JobListPage": { + "type": "object", + "properties": { + "job": { + "type": "array", + "items": { + "$ref": "#/components/schemas/JobListEntry" + } + }, + "next_page_no": { + "type": "integer", + "nullable": true + }, + "next_page_api_url": { + "type": "string", + "nullable": true, + "description": "\n The URL to the next page of results. This will be null for the final page.\n " + }, + "previous_page_no": { + "type": "integer", + "nullable": true + }, + "previous_page_api_url": { + "type": "string", + "nullable": true, + "description": "\n The URL to the previous page of results. This will be null for the first page.\n " + } + }, + "example": { + "job": [ + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Product Management: Intern Opportunities for University Students", + "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", + "list_date": "2022-10-09", + "location": "New York, NY" + }, + { + "company": "Microsoft", + "company_url": "https://www.linkedin.com/company/microsoft", + "job_title": "Content Strategist", + "job_url": "https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764", + "list_date": "2022-10-21", + "location": "United States" + } + ], + "next_page_no": 1, + "next_page_api_url": "http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035", + "previous_page_no": null, + "previous_page_api_url": "https://nubela.co/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035" + } + }, + "JobListCount": { + "type": "object", + "properties": { + "count": { + "type": "integer" + } + }, + "example": { + "count": 887622 + } + }, + "RoleSearchEnrichedResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "LinkedIn Profile URL of the person that most closely matches the role" + }, + "profile": { + "$ref": "#/components/schemas/PersonEndpointResponse" + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": ["education", "health", "human rights"], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "CompanyUrlEnrichResult": { + "type": "object", + "properties": { + "url": { + "type": "string", + "nullable": true, + "description": "The LinkedIn profile URL" + }, + "profile": { + "$ref": "#/components/schemas/LinkedinCompany" + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "url": "https://www.linkedin.com/company/accenture", + "profile": { + "linkedin_internal_id": "1033", + "description": "Accenture is a global professional services company with leading capabilities in digital, cloud, and security. Combining unmatched experience and specialized skills across more than 40 industries, we offer Strategy and Consulting, Technology and Operations Services, and Accenture Song—all powered by the world’s largest network of Advanced Technology and Intelligent Operations centers. \n\nOur people deliver on the promise of technology and human ingenuity every day, serving clients in more than 120 countries. We embrace the power of change to create value and shared success for our clients, people, shareholders, partners, and communities. \n\nVisit us at accenture.com.", + "website": "http://www.accenture.com", + "industry": "Business Consulting and Services", + "company_size": [10001, null], + "company_size_on_linkedin": 541251, + "hq": { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": [ + "Management Consulting", + "Systems Integration and Technology" + ], + "locations": [ + { + "country": "IE", + "city": "Dublin 2", + "postal_code": null, + "line_1": "Grand Canal Harbour", + "is_hq": true, + "state": null + }, + { + "country": "US", + "city": "San Francisco", + "postal_code": "94105", + "line_1": "415 Mission Street Floor 31-34", + "is_hq": null, + "state": "California" + } + ], + "name": "Accenture", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "accenture", + "profile_pic_url": "https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY", + "background_cover_image_url": "https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0", + "search_id": "1033", + "similar_companies": [ + { + "name": "Deloitte", + "link": "https://www.linkedin.com/company/deloitte", + "industry": "Business Consulting and Services", + "location": null + }, + { + "name": "Tata Consultancy Services", + "link": "https://in.linkedin.com/company/tata-consultancy-services", + "industry": "IT Services and IT Consulting", + "location": "Mumbai, Maharashtra" + } + ], + "affiliated_companies": [ + { + "name": "Accenture in India", + "link": "https://in.linkedin.com/company/accentureindia", + "industry": "IT Services and IT Consulting", + "location": "Bengaluru, Karnatka" + }, + { + "name": "Accenture Brasil", + "link": "https://br.linkedin.com/company/accenturebrasil", + "industry": "IT Services and IT Consulting", + "location": "São Paulo, São Paulo" + } + ], + "updates": [ + { + "article_link": null, + "image": null, + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4", + "total_likes": 325 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA", + "posted_on": { + "day": 25, + "month": 10, + "year": 2023 + }, + "text": "The ability to learn new things, without forgetting those that came before, is a huge differentiator between the #AI we're familiar with, and the #GenerativeAI powered by foundation models that we're seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n \n#TechVision2023", + "total_likes": 541 + } + ], + "follower_count": 11125167, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": ["artificial-intelligence", "virtual-reality"] + }, + "last_updated": "2023-10-26T11:33:24Z" + } + }, + "Student": { + "type": "object", + "properties": { + "profile_url": { + "type": "string" + }, + "profile": { + "$ref": "#/components/schemas/PublicPerson", + "nullable": true + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "StudentList": { + "type": "object", + "properties": { + "students": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Student" + }, + "description": "\n A list of student profiles (if enriched) and their associated profile URL.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "students": [ + { + "profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null + } + }, + "ReverseEmailUrlEnrichResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the closest match of the LinkedIn profile that belongs to this email address." + }, + "twitter_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Twitter Profile URL that belongs to this email address." + }, + "facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Facebook Profile URL that belongs to this email address." + }, + "url": { + "type": "string", + "nullable": true + }, + "similarity_score": { + "type": "number", + "nullable": true, + "description": "This metric quantifies the degree of resemblance between the queried profile and the retrieved one. Scores range from `0` (no similarity) to `1` (high similarity). In the event that our dataset lacks a pertinent profile for comparison, the assigned score might be `null`." + }, + "backwards_compatibility_notes": { + "type": "string", + "nullable": true + }, + "profile": { + "$ref": "#/components/schemas/PersonEndpointResponse", + "nullable": true + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "ISO 8601 timestamp since the enriched profile was last scraped." + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "twitter_profile_url": "https://www.twitter.com/proxycurl", + "facebook_profile_url": "https://www.facebook.com/zuck", + "similarity_score": 0.82, + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ], + "inferred_salary": { + "min": 35000, + "max": 45000 + }, + "gender": "male", + "birth_date": { + "day": 1, + "month": 1, + "year": 1990 + }, + "industry": "government administration", + "extra": { + "github_profile_id": "github-username", + "facebook_profile_id": "facebook-username", + "twitter_profile_id": "twitter-username", + "website": "https://proxycurl.com" + }, + "interests": ["education", "health", "human rights"], + "personal_emails": [ + "abc@gmail.com", + "bcd@gmail.com", + "cde@@outlook.com" + ], + "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "ReverseContactNumberResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the closest match of the LinkedIn profile that belongs to this phone number." + }, + "twitter_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Twitter Profile URL that belongs to this phone number." + }, + "facebook_profile_url": { + "type": "string", + "nullable": true, + "description": "Returns the Facebook Profile URL that belongs to this phone number." + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", + "twitter_profile_url": "https://www.twitter.com/proxycurl", + "facebook_profile_url": "https://www.facebook.com/zuck" + } + }, + "ExtractionEmailResult": { + "type": "object", + "properties": { + "email_queue_count": { + "type": "integer", + "description": "Total queue in the email extraction process" + } + }, + "example": { + "email_queue_count": null + } + }, + "JobLocation": { + "type": "object", + "properties": { + "country": { + "type": "string", + "nullable": true, + "description": "\n Full country name.\n " + }, + "region": { + "type": "string", + "nullable": true, + "description": "\n Region.\n " + }, + "city": { + "type": "string", + "nullable": true, + "description": "\n The city for the job.\n " + }, + "postal_code": { + "type": "string", + "nullable": true, + "description": "\n Postal code of the business location for the job.\n " + }, + "latitude": { + "type": "number", + "nullable": true, + "description": "\n Latitude coordinates of the business location for the job.\n " + }, + "longitude": { + "type": "number", + "nullable": true, + "description": "\n Longitude coordinates of the business location for the job.\n " + }, + "street": { + "type": "string", + "nullable": true, + "description": "\n Street address of the business location for the job.\n " + } + }, + "example": { + "country": "United States", + "region": "Hawaii", + "city": null, + "postal_code": null, + "latitude": null, + "longitude": null, + "street": null + } + }, + "JobCompany": { + "type": "object", + "properties": { + "name": { + "type": "string", + "nullable": true, + "description": "\n The name of the company.\n " + }, + "url": { + "type": "string", + "nullable": true, + "description": "\n The LinkedIn Company Profile URL of the job posting company.\n " + }, + "logo": { + "type": "string", + "nullable": true, + "description": "\n The URL to the logo of this company.\n " + } + }, + "example": { + "name": "Microsoft", + "url": "https://www.linkedin.com/company/microsoft", + "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" + } + }, + "JobProfile": { + "type": "object", + "properties": { + "linkedin_internal_id": { + "type": "string", + "nullable": true, + "description": "\n The internal ID representation of this job that LinkedIn has for this job.\n " + }, + "job_description": { + "type": "string", + "nullable": true, + "description": "\n Description of the posted job.\n " + }, + "apply_url": { + "type": "string", + "nullable": true, + "description": "\n The URL to apply for this job.\n " + }, + "title": { + "type": "string", + "nullable": true, + "description": "\n Title of the posted job.\n " + }, + "location": { + "$ref": "#/components/schemas/JobLocation" + }, + "company": { + "$ref": "#/components/schemas/JobCompany" + }, + "seniority_level": { + "type": "string", + "nullable": true, + "description": "\n The seniority level for this role.\n " + }, + "industry": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of industries that the company which posted this job lies in.\n " + }, + "employment_type": { + "type": "string", + "nullable": true, + "description": "\n Type of employment.\n " + }, + "job_functions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "\n A list of job functions that this role is expected to cover.\n " + }, + "total_applicants": { + "type": "integer", + "nullable": true, + "description": "\n Total applicants for this job so far.\n " + } + }, + "example": { + "linkedin_internal_id": "content-strategist-at-microsoft-3257696537", + "job_description": "The Global Demand Center (GDC) within the Cloud Marketing group is leading the marketing transformation of Microsoft’s largest and fastest growing commercial businesses. Our always-on integrated marketing programs work to nurture and acquire new customers across segments, targeting business and technical audiences across our commercial cloud portfolio, with programs available in 42 markets and 30 languages. The GDC team is modernizing and integrating these channels through advanced analytics, marketing automation, and digital marketing. We are on a mission to drive market share, consumption, and consistent double-digit+ revenue growth. Content is the fuel that drives the digitally connected customer journeys at the core of the GDC engine, and we’re looking for a skilled, self-motivated, data-driven content strategist to build the content that motivates customers to take action. The Content Strategist will develop and execute content strategies for the ever-critical security space. You will be accountable for understanding the business priorities, getting close to our target audiences, defining the content journeys that attract, nurture, inspire, and retain customers, and manage quality execution and delivery of the content. You will work closely with your counterparts, the integrated marketing strategists, to drive business outcomes. Your network will include product marketers, integrated marketers, relationship marketers, sales, engineering, and agency partners to develop and execute on your plan. Our team: The Lifecycle Programs team is a fast-paced digital marketing organization. We put a focus on getting things done, simplifying anything and everything, and having fun while doing it. We all believe in connecting with customers at scale, supporting them at each stage of the customer journey, from early awareness and consideration, through onboarding and post purchase engagement. You will be in the middle of it all helping to identify the right content that delivers what customers want—where they want it, when they want it, and how they want it. \n \n**_Responsibilities \n_**\n * Define content journeys for Security and IT professionals across industries.\n * Build the resulting content strategies designed to accelerate the customer through the lifecycle.\n * Create a content plan to address the insights in the customer journey and strategy, ensuring the content is aligned to what the customer needs at each stage.\n * Deliver the content through our internal Studio or with select agency partners.\n * Be a customer advocate. Relentlessly champion the customer and the experiences they have with the content you create—how they find it, how they consume it, how they use it to make decisions.\n * Leverage data and market insights for decision making including content optimization and new concept development. \n\n\n**_Qualifications \n \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 1+ year(s) integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 3+ years integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience.\n * Strong customer centric mindset and demonstrated ability to put the customer first.\n * Clear and persuasive communication skills, both written and verbal.\n * Experience with program performance tracking and communications.\n * Recognized as a self-starter with a bias for action.\n * Creative problem-solving skills, and a growth mindset approach\n * Experience managing across highly matrixed organizations, often with competing priorities.\n * A demonstrated track record of business impact through content\n * Well-versed in digital marketing best practices, including journey mapping.\n * Understanding of content disciplines, including SEO, content strategy, and execution.\n * Preferred, but not required: experience with commercial technology sales process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The typical base pay range for this role across the U.S. is USD $80,900 - $162,200 per year. There is a different range applicable to specific work locations, within the San Francisco Bay area and New York City metropolitan area, and the base pay range for this role in those locations is USD $105,300 - $176,900 per year. \n \nMicrosoft has different base pay ranges for different work locations within the United States, which allows us to pay employees competitively and consistently in different geographic markets (see below). The range above reflects the potential base pay across the U.S. for this role (except as noted below); the applicable base pay range will depend on what ultimately is determined to be the candidate’s primary work location. Individual base pay depends on various factors, in addition to primary work location, such as complexity and responsibility of role, job duties/requirements, and relevant experience and skills. Base pay ranges are reviewed and typically updated each year. Offers are made within the base pay range applicable at the time. \n \nAt Microsoft certain roles are eligible for additional rewards, including merit increases, annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed here may vary depending on the nature of employment with Microsoft and the country work location. U.S.-based employees have access to healthcare benefits, a 401(k) plan and company match, short-term and long-term disability coverage, basic life insurance, wellbeing benefits, paid vacation time, paid sick and mental health time, and several paid holidays, among others. \n \nOur commitment to pay equity \n \nWe are committed to the principle of pay equity – paying employees equitably for substantially similar work. To learn more about pay equity and our other commitments to increase representation and strengthen our culture of inclusion, check out our annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page displays the role for which the base pay ranges apply – Integrated Marketing IC3. The way we define roles includes two things: discipline (the type of work) and career stage (scope and complexity). The career stage has two parts – the first identifies whether the role is a manager (M), an individual contributor (IC), an admin-technician-retail (ATR) job, or an intern. The second part identifies the relative seniority of the role – a higher number (or later letter alphabetically in the case of ATR) indicates greater scope and complexity. \n \nMicrosoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. If you need assistance and/or a reasonable accommodation due to a disability during the application or the recruiting process, please send a request via the Accommodation request form. \n \nThe salary for this role in the state of Colorado is between $108,200 and $162,200. \n \nAt Microsoft, certain roles are eligible for additional rewards, including annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work. \n", + "apply_url": "https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite", + "title": "Content Strategist", + "location": { + "country": "United States", + "region": "Hawaii", + "city": null, + "postal_code": null, + "latitude": null, + "longitude": null, + "street": null + }, + "company": { + "name": "Microsoft", + "url": "https://www.linkedin.com/company/microsoft", + "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" + }, + "seniority_level": "Mid-Senior level", + "industry": [ + "IT Services and IT Consulting, Computer Hardware Manufacturing, and Software Development" + ], + "employment_type": "Full-time", + "job_functions": ["Marketing"], + "total_applicants": 200 + } + }, + "Follower": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "nullable": true + }, + "twitter_profile_url": { + "type": "string" + }, + "email": { + "type": "string", + "nullable": true + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", + "twitter_profile_url": "https://www.x.com/agilio_software", + "email": null + } + }, + "FollowerList": { + "type": "object", + "properties": { + "followers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Follower" + }, + "description": "\n A list of individual followers of a company.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " + } + }, + "example": { + "followers": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", + "twitter_profile_url": "https://www.x.com/agilio_software", + "email": null + }, + { + "linkedin_profile_url": "https://www.linkedin.com/in/air-techniques", + "twitter_profile_url": "https://www.x.com/airtechniques", + "email": null + } + ], + "next_page": null + } + }, + "FollowerListCount": { + "type": "object", + "properties": { + "follower_count": { + "type": "integer", + "description": "A count of all individuals that are probable customers or followers." + } + }, + "example": { + "follower_count": 74 + } + }, + "CSearchResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "description": "\n The LinkedIn Profile URL of the company\n " + }, + "profile": { + "$ref": "#/components/schemas/LinkedinCompany", + "nullable": true, + "description": "\n If `enrich_profiles=enrich` is specified, the company's entire profile\n is returned. Otherwise this field will return `null`.\n " + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/company/apple/", + "profile": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [10001, null], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": ["search", "ads"], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": null, + "state": "NY" + } + ], + "name": "Google", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": ["artificial-intelligence", "virtual-reality"] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "CompanySearchResult": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CSearchResult" + }, + "description": "\n A list of SearchResult objects.\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The URL to the next page of search results. This will be null for the final page.\n " + }, + "total_result_count": { + "type": "integer", + "description": "Total results found." + } + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple/", + "profile": { + "linkedin_internal_id": "1441", + "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", + "website": "https://goo.gle/3m1IN7m", + "industry": "Software Development", + "company_size": [10001, null], + "company_size_on_linkedin": 319856, + "hq": { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + "company_type": "PUBLIC_COMPANY", + "founded_year": null, + "specialities": ["search", "ads"], + "locations": [ + { + "country": "US", + "city": "Mountain View", + "postal_code": "94043", + "line_1": "1600 Amphitheatre Parkway", + "is_hq": true, + "state": "CA" + }, + { + "country": "US", + "city": "New York", + "postal_code": "10011", + "line_1": "111 8th Ave", + "is_hq": null, + "state": "NY" + } + ], + "name": "Google", + "tagline": "Think Different - But Not Too Different", + "universal_name_id": "google", + "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", + "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", + "search_id": "1441", + "similar_companies": [ + { + "name": "Amazon", + "link": "https://www.linkedin.com/company/amazon", + "industry": "Software Development", + "location": "Seattle, WA" + }, + { + "name": "Microsoft", + "link": "https://www.linkedin.com/company/microsoft", + "industry": "Software Development", + "location": "Redmond, Washington" + } + ], + "affiliated_companies": [ + { + "name": "YouTube", + "link": "https://www.linkedin.com/company/youtube", + "industry": "Software Development", + "location": "San Bruno, CA" + }, + { + "name": "Google Cloud", + "link": "https://www.linkedin.com/showcase/google-cloud", + "industry": "Software Development", + "location": "Mountain View, California" + } + ], + "updates": [ + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", + "posted_on": { + "day": 13, + "month": 9, + "year": 2022 + }, + "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", + "total_likes": 4267 + }, + { + "article_link": null, + "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", + "posted_on": null, + "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", + "total_likes": 397 + } + ], + "follower_count": 27472792, + "acquisitions": { + "acquired": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/apple", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", + "announced_date": { + "day": 1, + "month": 4, + "year": 1976 + }, + "price": 300000000 + } + ], + "acquired_by": { + "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "announced_date": { + "day": 6, + "month": 3, + "year": 2020 + }, + "price": 10000 + } + }, + "exit_data": [ + { + "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", + "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", + "name": "MotionDSP" + } + ], + "extra": { + "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", + "ipo_status": "Public", + "crunchbase_rank": 13, + "founding_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "operating_status": "Active", + "company_type": "For Profit", + "contact_email": "info@nvidia.com", + "phone_number": "(140) 848-6200", + "facebook_id": "NVIDIA.IN", + "twitter_id": "nvidia", + "number_of_funding_rounds": 3, + "total_funding_amount": 4000000, + "stock_symbol": "NASDAQ:NVDA", + "ipo_date": { + "day": 1, + "month": 1, + "year": 2000 + }, + "number_of_lead_investors": 3, + "number_of_investors": 4, + "total_fund_raised": 1000, + "number_of_investments": 50, + "number_of_lead_investments": 3, + "number_of_exits": 7, + "number_of_acquisitions": 2 + }, + "funding_data": [ + { + "funding_type": "Grant", + "money_raised": 25000000, + "announced_date": { + "day": 1, + "month": 1, + "year": 2001 + }, + "number_of_investor": 1, + "investor_list": [ + { + "linkedin_profile_url": "https://linkedin.com/company/darpa", + "name": "DARPA", + "type": "organization" + } + ] + } + ], + "categories": ["artificial-intelligence", "virtual-reality"] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + }, + "SearchResult": { + "type": "object", + "properties": { + "linkedin_profile_url": { + "type": "string", + "description": "\n The LinkedIn Profile URL of the person\n " + }, + "profile": { + "$ref": "#/components/schemas/PublicPerson", + "nullable": true, + "description": "\n If `enrich_profiles=enrich` is specified, the person's entire profile\n is returned. Otherwise this field will return `null`.\n " + }, + "last_updated": { + "type": "string", + "nullable": true, + "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " + } + }, + "example": { + "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + }, + "PersonSearchResult": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchResult" + }, + "description": "\n A list of SearchResult objects\n " + }, + "next_page": { + "type": "string", + "nullable": true, + "description": "\n The URL to the next page of search results. This will be null for the final page.\n " + }, + "total_result_count": { + "type": "integer", + "description": "Total results found." + } + }, + "example": { + "results": [ + { + "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", + "profile": { + "public_identifier": "johnrmarty", + "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", + "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", + "first_name": "John", + "last_name": "Marty", + "full_name": "John Marty", + "follower_count": null, + "occupation": "Co-Founder at Freedom Fund Real Estate", + "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", + "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", + "country": "US", + "country_full_name": "United States of America", + "city": "Seattle", + "state": "Washington", + "experiences": [ + { + "starts_at": { + "day": 1, + "month": 8, + "year": 2021 + }, + "ends_at": null, + "company": "Freedom Fund Real Estate", + "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", + "company_facebook_profile_url": null, + "title": "Co-Founder", + "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", + "location": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2021 + }, + "ends_at": null, + "company": "Mindset Reset Podcast", + "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", + "company_facebook_profile_url": null, + "title": "Founder", + "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", + "location": "Denver, Colorado, United States", + "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" + } + ], + "education": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2013 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "Finance + Economics", + "degree_name": "Master of Business Administration (MBA)", + "school": "University of Colorado Denver", + "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", + "school_facebook_profile_url": null, + "description": null, + "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", + "grade": null, + "activities_and_societies": null + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": { + "day": 31, + "month": 12, + "year": 2015 + }, + "field_of_study": "School of Software Development", + "degree_name": null, + "school": "Galvanize Inc", + "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", + "school_facebook_profile_url": null, + "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", + "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", + "grade": null, + "activities_and_societies": null + } + ], + "languages": ["English", "Spanish"], + "accomplishment_organisations": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "org_name": "Microsoft", + "title": "Software Developer", + "description": null + } + ], + "accomplishment_publications": [ + { + "name": "Nobel Peace Prize", + "publisher": "Acme Corp", + "published_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "url": "https://example.com" + } + ], + "accomplishment_honors_awards": [ + { + "title": "Nobel Peace Prize", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " + } + ], + "accomplishment_patents": [ + { + "title": "The art of war", + "issuer": "Acme Corp", + "issued_on": { + "day": 1, + "month": 1, + "year": 1970 + }, + "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", + "application_number": "123", + "patent_number": "123", + "url": null + } + ], + "accomplishment_courses": [ + { + "name": "The course about ABCs", + "number": "123" + } + ], + "accomplishment_projects": [ + { + "starts_at": { + "day": 1, + "month": 3, + "year": 2015 + }, + "ends_at": null, + "title": "gMessenger", + "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", + "url": "http://gmessenger.herokuapp.com/" + }, + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2015 + }, + "ends_at": null, + "title": "Taskly", + "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", + "url": "https://hidden-coast-7204.herokuapp.com/" + } + ], + "accomplishment_test_scores": [ + { + "name": "CS1101S", + "score": "A", + "date_on": { + "day": 1, + "month": 1, + "year": 2010 + }, + "description": "Nailed it without studying." + } + ], + "volunteer_work": [ + { + "starts_at": { + "day": 1, + "month": 1, + "year": 2012 + }, + "ends_at": { + "day": 1, + "month": 8, + "year": 2016 + }, + "title": "Surveyor", + "cause": "To help the world", + "company": "Microsoft", + "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", + "description": null, + "logo_url": null + } + ], + "certifications": [ + { + "starts_at": null, + "ends_at": null, + "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", + "license_number": null, + "display_source": null, + "authority": "Scaled Agile, Inc.", + "url": null + }, + { + "starts_at": null, + "ends_at": null, + "name": "SCRUM Alliance Certified Product Owner", + "license_number": null, + "display_source": null, + "authority": "Scrum Alliance", + "url": null + } + ], + "connections": 500, + "people_also_viewed": [ + { + "link": "https://www.linkedin.com/in/johndoe", + "name": "John Doe", + "summary": "Software Engineer at Google", + "location": "Singapore" + } + ], + "recommendations": [ + "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", + "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" + ], + "activities": [ + { + "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", + "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", + "activity_status": "Shared by John Marty" + } + ], + "similarly_named_profiles": [ + { + "name": "John Martinez", + "link": "https://www.linkedin.com/in/john-martinez-90384a229", + "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", + "location": "San Antonio, TX" + }, + { + "name": "John Marty", + "link": "https://www.linkedin.com/in/senatormarty", + "summary": null, + "location": "St Paul, MN" + } + ], + "articles": [ + { + "title": "Manufacturing opportunity", + "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", + "published_date": { + "day": 27, + "month": 11, + "year": 2019 + }, + "author": "Bill Gates", + "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" + } + ], + "groups": [ + { + "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", + "name": "Hadoop Users", + "url": "https://www.linkedin.com/groups/988957" + } + ] + }, + "last_updated": "2023-10-26T11:34:30Z" + } + ], + "next_page": null, + "total_result_count": 1 + } + }, + "CreditBalance": { + "type": "object", + "properties": { + "credit_balance": { + "type": "integer", + "description": "Your current credit(s)" + } + }, + "example": { + "credit_balance": 100000 + } + }, + "DisposableEmail": { + "type": "object", + "properties": { + "is_disposable_email": { + "type": "boolean", + "description": "Returns a boolean value of the disposable nature of the given email address" + }, + "is_free_email": { + "type": "boolean", + "description": "Returns a boolean value of the free status of the given email address" + } + }, + "example": { + "is_disposable_email": null, + "is_free_email": null + } + }, + "PersonalContactNumbers": { + "type": "object", + "properties": { + "numbers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of contact numbers" + } + }, + "example": { + "numbers": ["+1123123123"] + } + }, + "PDLEmailResult": { + "type": "object", + "properties": { + "emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of personal emails" + }, + "invalid_emails": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of invalid personal emails" + } + }, + "example": { + "emails": ["random@gmail.com", "random2@yahoo.com"], + "invalid_emails": ["random3@gmail.com"] + } + } + }, + "securitySchemes": { + "BearerAuth": { + "type": "http", + "scheme": "bearer" + } + } + } +} diff --git a/proxycurl-openapi.yaml b/proxycurl-openapi.yaml new file mode 100644 index 000000000..21472f377 --- /dev/null +++ b/proxycurl-openapi.yaml @@ -0,0 +1,9978 @@ +servers: + - url: https://nubela.co/proxycurl + description: With SSL Proxycurl Server + - url: http://nubela.co/proxycurl + description: Without SSL Proxycurl Server +security: + - BearerAuth: + - client +paths: + /api/linkedin/school: + get: + description: 'Cost: 1 credit / successful request. + + Get structured data of a LinkedIn School Profile' + parameters: + - in: query + name: url + required: true + description: + "\n URL of the LinkedIn School Profile to crawl.\n\n URL\ + \ should be in the format of `https://www.linkedin.com/school/`\n\ + \ " + example: https://www.linkedin.com/school/national-university-of-singapore + schema: + type: string + - in: query + name: use_cache + required: false + description: + '`if-present` The default behavior. Fetches profile from cache + regardless of age of profile. If profile is not available in cache, API + will attempt to source profile externally. + + + `if-recent` API will make a best effort to return a fresh profile no older + than 29 days.Costs an extra `1` credit on top of the cost of the base endpoint.' + example: if-present + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LinkedinSchool' + example: + linkedin_internal_id: '5524' + description: + "At NUS, we are shaping the future through our people\ + \ and our pursuit of new frontiers in knowledge. In a single century,\ + \ we have become a university of global influence and an Asian thought\ + \ leader. Our location at the crossroads of Asia informs our mission\ + \ and gives us a tremendous vantage point to help create opportunities\ + \ and address the pressing issues facing Singapore, Asia and the\ + \ world.\r\rAt NUS, we believe in education, research and service\ + \ that change lives." + website: http://nus.edu.sg + industry: Higher Education + company_size: + - 5001 + - 10000 + company_size_on_linkedin: 16084 + hq: + country: SG + city: Singapore + postal_code: '119077' + line_1: 21 Lower Kent Ridge Road, Singapore + is_hq: true + state: null + company_type: EDUCATIONAL_INSTITUTION + founded_year: 1905 + specialities: + - education + - research + locations: + - country: SG + city: Singapore + postal_code: '119077' + line_1: 21 Lower Kent Ridge Road, Singapore + is_hq: true + state: null + name: National University of Singapore + tagline: null + universal_name_id: national-university-of-singapore + profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24 + background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140 + search_id: '5524' + similar_companies: + - name: NUS Business School + link: https://www.linkedin.com/school/nus-business-school/ + industry: Higher Education + location: null + - name: NUS Faculty of Arts and Social Sciences + link: https://www.linkedin.com/school/nusfass/ + industry: Higher Education + location: null + affiliated_companies: [] + updates: [] + follower_count: 539321 + description: Profile data with profile picture, school location, etc + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - School API + operationId: School Profile Endpoint + summary: School Profile Endpoint + /api/linkedin/company: + get: + description: 'Cost: 1 credit / successful request. + + Get structured data of a Company Profile' + parameters: + - in: query + name: url + required: true + description: + "\n URL of the LinkedIn Company Profile to\ + \ crawl.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n\ + \ " + example: https://www.linkedin.com/company/google/ + schema: + type: string + - in: query + name: resolve_numeric_id + required: false + description: + "\n Enable support for Company Profile URLs\ + \ with numerical IDs that you most frequently fetch from Sales Navigator.\n\ + \ We achieve this by resolving numerical IDs into vanity\ + \ IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb).\n\ + \ For example, we will turn `https://www.linkedin.com/company/1234567890`\ + \ to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint\ + \ only supports the latter.\n\n This parameter accepts\ + \ the following values:\n - `false` - Will not resolve\ + \ numerical IDs.\n - `true` (default value) - Enable\ + \ support for Company Profile URLs with numerical IDs.\n \ + \ Costs an extra `2` credit on top of the base cost of the endpoint.\n\ + \ " + example: 'true' + schema: + type: string + - in: query + name: categories + required: false + description: + "\n Appends categories data of this company.\n\ + \n Default value is `\"exclude\"`.\n \ + \ The other acceptable value is `\"include\"`, which will include these\ + \ categories (if available) for `1` extra credit.\n " + example: include + schema: + type: string + - in: query + name: funding_data + required: false + description: + "\n Returns a list of funding rounds that\ + \ this company has received.\n\n Default value is `\"\ + exclude\"`.\n The other acceptable value is `\"include\"\ + `, which will include these categories (if available) for `1` extra credit.\n\ + \ " + example: include + schema: + type: string + - in: query + name: exit_data + required: false + description: + "\n Returns a list of investment portfolio\ + \ exits.\n\n Default value is `\"exclude\"`.\n \ + \ The other acceptable value is `\"include\"`, which will include\ + \ these categories (if available) for `1` extra credit.\n \ + \ " + example: include + schema: + type: string + - in: query + name: acquisitions + required: false + description: + "\n Provides further enriched data on acquisitions\ + \ made by this company from external sources.\n\n Default\ + \ value is `\"exclude\"`.\n The other acceptable value\ + \ is `\"include\"`, which will include these acquisition data (if available)\ + \ for `1` extra credit.\n " + example: include + schema: + type: string + - in: query + name: extra + required: false + description: + "\n Enriches the Company Profile with extra\ + \ details from external sources.\n Details include Crunchbase\ + \ ranking, contact email, phone number, Facebook account, Twitter account,\ + \ funding rounds and amount, IPO status, investor information, etc.\n\n\ + \ Default value is `\"exclude\"`.\n \ + \ The other acceptable value is `\"include\"`, which will include these\ + \ extra details (if available) for `1` extra credit.\n \ + \ " + example: include + schema: + type: string + - in: query + name: use_cache + required: false + description: + "\n `if-present` The default behavior.\n \ + \ Fetches profile from cache regardless of age of profile.\n\ + \ If profile is not available in cache, API will attempt\ + \ to source profile externally.\n\n `if-recent` API will\ + \ make a best effort to return a fresh profile no older than 29 days.\"\n\ + \ Costs an extra `1` credit on top of the cost of the\ + \ base endpoint.\n " + example: if-present + schema: + type: string + - in: query + name: fallback_to_cache + required: false + description: + "\n Tweaks the fallback behavior if an error\ + \ arises from fetching a fresh profile.\n\n This parameter\ + \ accepts the following values:\n * `on-error` (default\ + \ value) - Fallback to reading the profile from cache if an error arises.\n\ + \ * `never` - Do not ever read profile from cache.\n\ + \ " + example: on-error + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/LinkedinCompany' + example: + linkedin_internal_id: '1441' + description: "A problem isn't truly solved until it's solved for + all. Googlers build products that help create opportunities for + everyone, whether down the street or across the globe. Bring your + insight, imagination and a healthy disregard for the impossible. + Bring everything that makes you unique. Together, we can build for + everyone. + + + Check out our career opportunities at careers.google.com." + website: https://goo.gle/3m1IN7m + industry: Software Development + company_size: + - 10001 + - null + company_size_on_linkedin: 319856 + hq: + country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + company_type: PUBLIC_COMPANY + founded_year: null + specialities: + - search + - ads + locations: + - country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + - country: US + city: New York + postal_code: '10011' + line_1: 111 8th Ave + is_hq: false + state: NY + name: Google + tagline: null + universal_name_id: google + profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca + background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 + search_id: '1441' + similar_companies: + - name: Amazon + link: https://www.linkedin.com/company/amazon + industry: Software Development + location: Seattle, WA + - name: Microsoft + link: https://www.linkedin.com/company/microsoft + industry: Software Development + location: Redmond, Washington + affiliated_companies: + - name: YouTube + link: https://www.linkedin.com/company/youtube + industry: Software Development + location: San Bruno, CA + - name: Google Cloud + link: https://www.linkedin.com/showcase/google-cloud + industry: Software Development + location: Mountain View, California + updates: + - article_link: null + image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE + posted_on: + day: 13 + month: 9 + year: 2022 + text: + "Want to kick start your #LifeAtGoogle but not sure where\ + \ to begin? Explore our Build Your Future site, where you can\ + \ learn about developmental programs, learn tips for future interviews,\ + \ sign up for informational events, and even hear real stories\ + \ from Googlers who\u2019ve been where you are now. Get started\ + \ \u2192 https://bit.ly/3SKPzQB" + total_likes: 4267 + - article_link: null + image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg + posted_on: null + text: + "Ariana, welcome to Google. Here\u2019s to a year full of\ + \ growth, learning, and experiences at #LifeAtGoogle! \U0001F389" + total_likes: 397 + follower_count: 27472792 + description: Profile data with profile picture, office locations, etc + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Company API + operationId: Company Profile Endpoint + summary: Company Profile Endpoint + /api/v2/linkedin: + get: + description: 'Cost: 1 credit / successful request. + + Get structured data of a Personal Profile' + parameters: + - in: query + name: extra + required: false + description: + "\n Enriches the Person Profile with extra\ + \ details from external sources.\n Extra details include\ + \ gender, birth date, industry and interests.\n\n This\ + \ parameter accepts the following values:\n - `exclude`\ + \ (default value) - Does not provide extra data field.\n \ + \ - `include` - Append extra data to the person profile object.\n \ + \ Costs an extra `1` credit on top of the cost of the base\ + \ endpoint (if data is available).\n " + example: include + schema: + type: string + - in: query + name: github_profile_id + required: false + description: + "\n Enriches the Person Profile with Github\ + \ Id from external sources.\n\n This parameter accepts\ + \ the following values:\n - `exclude` (default value)\ + \ - Does not provide Github Id data field.\n - `include`\ + \ - Append Github Id data to the person profile object.\n \ + \ Costs an extra `1` credit on top of the cost of the base endpoint\ + \ (if data is available).\n " + example: include + schema: + type: string + - in: query + name: facebook_profile_id + required: false + description: + "\n Enriches the Person Profile with Facebook\ + \ Id from external sources.\n\n This parameter accepts\ + \ the following values:\n - `exclude` (default value)\ + \ - Does not provide Facebook Id data field.\n - `include`\ + \ - Append Facebook Id data to the person profile object.\n \ + \ Costs an extra `1` credit on top of the cost of the base endpoint\ + \ (if data is available).\n " + example: include + schema: + type: string + - in: query + name: twitter_profile_id + required: false + description: + "\n Enriches the Person Profile with Twitter\ + \ Id from external sources.\n\n This parameter accepts\ + \ the following values:\n - `exclude` (default value)\ + \ - Does not provide Twitter Id data field.\n - `include`\ + \ - Append Twitter Id data to the person profile object.\n \ + \ Costs an extra `1` credit on top of the cost of the base endpoint\ + \ (if data is available).\n " + example: include + schema: + type: string + - in: query + name: personal_contact_number + required: false + description: + "\n Enriches the Person Profile with personal\ + \ numbers from external sources.\n\n This parameter accepts\ + \ the following values:\n - `exclude` (default value)\ + \ - Does not provide personal numbers data field.\n -\ + \ `include` - Append personal numbers data to the person profile object.\n\ + \ Costs an extra `1` credit per email returned on top\ + \ of the cost of the base endpoint (if data is available).\n \ + \ " + example: include + schema: + type: string + - in: query + name: personal_email + required: false + description: + "\n Enriches the Person Profile with personal\ + \ emails from external sources.\n\n This parameter accepts\ + \ the following values:\n - `exclude` (default value)\ + \ - Does not provide personal emails data field.\n -\ + \ `include` - Append personal emails data to the person profile object.\n\ + \ Costs an extra `1` credit per email returned on top\ + \ of the cost of the base endpoint (if data is available).\n \ + \ " + example: include + schema: + type: string + - in: query + name: inferred_salary + required: false + description: + "\n Include inferred salary range from external\ + \ sources.\n\n This parameter accepts the following values:\n\ + \ - `exclude` (default value) - Does not provide inferred\ + \ salary data field.\n - `include` - Append inferred\ + \ salary range data to the person profile object.\n Costs\ + \ an extra `1` credit on top of the cost of the base endpoint (if data is\ + \ available).\n " + example: include + schema: + type: string + - in: query + name: skills + required: false + description: + "\n Include skills data from external sources.\n\ + \n This parameter accepts the following values:\n \ + \ - `exclude` (default value) - Does not provide skills\ + \ data field.\n - `include` - Append skills data to the\ + \ person profile object.\n Costs an extra `1` credit\ + \ on top of the cost of the base endpoint (if data is available).\n \ + \ " + example: include + schema: + type: string + - in: query + name: use_cache + required: false + description: + "\n `if-present` The default behavior.\n \ + \ Fetches profile from cache regardless of age of profile.\n\ + \ If profile is not available in cache, API will attempt\ + \ to source profile externally.\n\n `if-recent` API will\ + \ make a best effort to return a fresh profile no older than 29 days.\"\n\ + \ Costs an extra `1` credit on top of the cost of the\ + \ base endpoint.\n " + example: if-present + schema: + type: string + - in: query + name: fallback_to_cache + required: false + description: + "\n Tweaks the fallback behavior if an error\ + \ arises from fetching a fresh profile.\n\n This parameter\ + \ accepts the following values:\n * `on-error` (default\ + \ value) - Fallback to reading the profile from cache if an error arises.\n\ + \ * `never` - Do not ever read profile from cache.\n\ + \ " + example: on-error + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + "\n The Twitter/X Profile URL from which you\ + \ wish to extract person profile\n\n URL should be in\ + \ the format of `https://x.com/`\n \ + \ \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`,\ + \ or `facebook_profile_url`)" + example: https://x.com/johnrmarty/ + schema: + type: string + - in: query + name: facebook_profile_url + required: false + description: + "\n The Facebook Profile URL from which you\ + \ wish to extract person profile\n\n URL should be in\ + \ the format of `https://facebook.com/`\n \ + \ \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`,\ + \ or `facebook_profile_url`)" + example: https://facebook.com/johnrmarty/ + schema: + type: string + - in: query + name: linkedin_profile_url + required: false + description: + "\n The LinkedIn Profile URL from which you\ + \ wish to extract person profile\n\n URL should be in\ + \ the format of `https://linkedin.com/in/`\n \ + \ \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`,\ + \ or `facebook_profile_url`)" + example: https://linkedin.com/in/johnrmarty/ + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PersonEndpointResponse' + example: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy\ + \ at work and in their lives - I'm on a mission to solve that.\n\ + \nI spent 10 years as the founder of Axxis Audio, an electronics\ + \ company that grew to multi-million dollar sales, which I sold\ + \ in 2012. At that time, I funneled my earnings into the creation\ + \ of an Internet of Things company, but numerous factors lead to\ + \ its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job\ + \ at Best Buy for $12 an hour while reinventing myself through the\ + \ completion of an MBA at the University of Colorado, and a 6-month\ + \ software development boot camp. \n\nAfter graduation, I landed\ + \ at American Express as a Senior Product Manager and then got poached\ + \ by Amazon in 2017 (because of my LinkedIn profile). My journey\ + \ has led to a deep sense of perspective, humility, and purpose\ + \ that I draw on to help others find clarity, meaning, and happiness\ + \ in their careers and lives. \n\nCheck out my website for details\ + \ on my Mindset Reset Podcast, Public Speaking, Consulting, or my\ + \ free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ + \ podcast?\nA: I'd love to! I've shared my message on the future\ + \ of employment, breaking into big tech, and my personal story of\ + \ reinventing myself and discovering my sense of purpose (and how\ + \ you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John Marty)\ + \ : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\uFE0F YouTube\ + \ Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ + \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ + \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ + \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"R\"\ + ....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking + financial freedom long before the age of 65 with the ability to + invest in high yield, short-term real estate investments that + were only accessible in the past for a select few wealthy individuals. + Each of our single family rehab projects require a minimum investment + contribution of only $10K, we have simple terms, no multi-year + hold periods, and no fees. With our unique model investors can + log into our easy to use website, select the projects that they + want to invest in, and get realtime updates on the status of their + investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost\ + \ thought leaders and turn them into actionable insights so that\ + \ others can discover greater happiness, success, and fulfillment.\n\ + \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, + api integration, Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap + HTML, CSS, and JavaScript framework. It uses a Websocket-Rails + integration to post a user's message content to the page in real + time, with no page refresh required. gMessenger also includes + custom authentication with three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: [] + volunteer_work: [] + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean + Practices in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: [] + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n\ + \ \n John Marty is a genius at his craft. He is skilled\ + \ in the art of making people feel empowered to seek out roles that\ + \ they are qualified for, ask for salaries that they deserve, and\ + \ creates a kind of pay it forward lifestyle. John helps you to\ + \ get to places that you only thought were possible for other people.\ + \ Anyone that is fortunate enough to learn from John should consider\ + \ themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n\ + \ John is so focused on helping guide you through an interview\ + \ process not just for Amazon but on interviewing in general. I've\ + \ generally done well at interviewing, my skills are top notch now.\ + \ John is so focused on on his clients and really goes above and\ + \ beyond. John is genuine, knowledgeable, well spoken and non-judgemental.\ + \ He is so encouraging, so positive and really easy to talk to.\ + \ Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that has\ + \ a large 13K sq ft lot with two homes on it. After 5 minutes\ + \ of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner\ + \ Marty\u2019s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: [] + groups: [] + description: Profile data with profile picture, job history, etc. + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - People API + operationId: Person Profile Endpoint + summary: Person Profile Endpoint + /api/customers: + get: + description: + 'Cost: 10 credits / result for users on an annual subscription + or Enterprise plan. + + Get a list of probable corporate customers of a target company.' + parameters: + - in: query + name: linkedin_company_profile_url + required: false + description: + "\n The LinkedIn Profile URL of the company from\ + \ which you want to get a list of customers of.\n\n URL should\ + \ be in the format of `https://www.linkedin.com/company/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://www.linkedin.com/company/watsons + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + "\n The Twitter/X Profile URL belonging to the\ + \ company that you want to get a list of customers of.\n\n \ + \ URL should be in the format of `https://x.com/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://x.com/watsonsproperty + schema: + type: string + - in: query + name: page_size + required: false + description: + "\n Limit the maximum results of customer companies\ + \ returned per API call.\n\n The default value of this parameter\ + \ is 10.\n\n Accepted values for this parameter is an integer\ + \ ranging from 0 to 1000.\n " + example: '10' + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomerList' + example: + companies: + - linkedin_company_profile_url: https://www.linkedin.com/company/spire-solicitors-llp + twitter_profile_url: https://twitter.com/spirellp + email: info@spiresolicitors.co.uk + - linkedin_company_profile_url: https://www.linkedin.com/company/mall-wood-insurance-services-ltd + twitter_profile_url: https://twitter.com/draytonins + email: null + next_page: null + description: A list of probable customers of the target company. + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Customer API `EXPERIMENTAL` + operationId: Customer Listing Endpoint `EXPERIMENTAL` + summary: Customer Listing Endpoint `EXPERIMENTAL` + /api/customers/count/: + get: + description: + 'Cost: 1 credit / result for users on an annual subscription or + Enterprise plan. + + Get the total count of probable corporate customers of a target company.' + parameters: + - in: query + name: linkedin_company_profile_url + required: false + description: + "\n The LinkedIn Profile URL of the company from\ + \ which you want to get a list of customers of.\n\n URL should\ + \ be in the format of `https://www.linkedin.com/company/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://www.linkedin.com/company/watsons + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + "\n The Twitter/X Profile URL belonging to the\ + \ company that you want to get a list of customers of.\n\n \ + \ URL should be in the format of https://x.com/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://x.com/watsonsproperty + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomerCount' + example: + company_count: 125 + description: Number of probable customers of the target company. + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Customer API `EXPERIMENTAL` + operationId: Customer Listing Count Endpoint `EXPERIMENTAL` + summary: Customer Listing Count Endpoint `EXPERIMENTAL` + /api/linkedin/company/employees/: + get: + description: 'Cost: 3 credits / employee returned. + + Get a list of employees of a Company. + + + This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), + our comprehensive dataset of people and company profiles.' + parameters: + - in: query + name: country + required: false + description: + "\n Limit the result set to the country locality of the profile.\ + \ For example, set the parameter of `country=us` if you only want profiles\ + \ from the US. Or you can set the parameter to `country=us,sg` if you want\ + \ employees from both the US and Singapore.\n\n This parameter accepts\ + \ a comma-separated case-insensitive values of [Alpha-2 ISO3166 country\ + \ code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs\ + \ an extra `3` credit per result returned.\n " + example: us + schema: + type: string + - in: query + name: enrich_profiles + required: false + description: + "\n Get the full profile of employees instead of only their\ + \ profile urls.\n\n Each request respond with a streaming response of\ + \ profiles.\n\n The valid values are:\n \n * `skip` (default):\ + \ lists employee's profile url\n * `enrich`: lists full profile of employees\n\ + \n Calling this API endpoint with this parameter would add `1` credit\ + \ per employee returned.\n " + example: enrich + schema: + type: string + - in: query + name: role_search + required: false + description: + "\n Filter employees by their title by matching the employee's\ + \ title against a *regular expression*.\n\n The default value of this\ + \ parameter is `null`.\n\n The accepted value for this parameter is a\ + \ **case-insensitive** regular expression.\n\n (The base cost of calling\ + \ this API endpoint with this parameter would be `10` credits.\n Each\ + \ employee matched and returned would cost 3 extra credits.)\n " + example: (co)?-?founder + schema: + type: string + - in: query + name: page_size + required: false + description: + "\n Limit the maximum results returned per API call.\n\n \ + \ The default value of this parameter is `10`.\n\n Accepted values\ + \ for this parameter is an integer ranging from `1` to `200000`.\n\n \ + \ When `enrich_profiles=enrich`, this parameter accepts value ranging from\ + \ `1` to `10` and the default value is `10`.\n " + example: '10' + schema: + type: string + - in: query + name: employment_status + required: false + description: + "\n Parameter to tell the API to return past or current employees.\n\ + \n Valid values are `current`, `past`, and `all`:\n\n * `current`\ + \ (default) : lists current employees\n * `past` : lists past employees\n\ + \ * `all` : lists current & past employees\n " + example: current + schema: + type: string + - in: query + name: sort_by + required: false + description: + "\n Sort employees by recency.\n\n Valid values are:\n\ + \ * `recently-joined` - Sort employees by their join date. The most recent\ + \ employee is on the top of the list.\n * `recently-left` - Sort employees\ + \ by their departure date. The most recent employee who had just left is\ + \ on the top of this list.\n * `oldest` - Returns the oldest employees\ + \ first. The oldest employee who had joined this company historically is\ + \ on the top of this list.\n * `none` - The default value. Do not sort.\n\ + \n If this parameter is supplied with a value other than `none`, will\ + \ add `50` credits to the base cost of the API endpoint regardless number\ + \ of results returned. It will also add an additional cost of `10` credits\ + \ per employee returned.\n " + example: recently-joined + schema: + type: string + - in: query + name: resolve_numeric_id + required: false + description: + "\n Enable support for Company Profile URLs with numerical\ + \ IDs that you most frequently fetch from Sales Navigator. \n We achieve\ + \ this by resolving numerical IDs into vanity IDs with cached company profiles\ + \ from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example,\ + \ we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp`\ + \ -- for which the API endpoint only supports the latter.\n \n This\ + \ parameter accepts the following values:\n - `false` (default value)\ + \ - Will not resolve numerical IDs.\n - `true` - Enable support for Company\ + \ Profile URLs with numerical IDs. \n Costs an extra `2` credit on top\ + \ of the base cost of the endpoint.\n " + example: 'false' + schema: + type: string + - in: query + name: url + required: true + description: + "\n URL of the LinkedIn Company Profile to target.\n\n \ + \ URL should be in the format of `https://www.linkedin.com/company/`\n\ + \ " + example: https://www.linkedin.com/company/microsoft + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EmployeeList' + example: + employees: + - profile_url: https://www.linkedin.com/in/williamhgates + profile: + public_identifier: williamhgates + profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + background_cover_image_url: null + first_name: Bill + last_name: Gates + full_name: Bill Gates + occupation: Co-chair at Bill & Melinda Gates Foundation + headline: Co-chair, Bill & Melinda Gates Foundation + summary: + Co-chair of the Bill & Melinda Gates Foundation. Founder + of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. + Avid traveler. Active blogger. + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + company: 'Breakthrough Energy ' + company_linkedin_profile_url: https://www.linkedin.com/company/breakthrough-energy/ + title: Founder + description: null + location: null + logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y + - starts_at: + day: 1 + month: 1 + year: 2000 + ends_at: null + company: Bill & Melinda Gates Foundation + company_linkedin_profile_url: https://www.linkedin.com/company/bill-&-melinda-gates-foundation/ + title: Co-chair + description: null + location: null + logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs + education: + - starts_at: + day: 1 + month: 1 + year: 1973 + ends_at: + day: 31 + month: 12 + year: 1975 + field_of_study: null + degree_name: null + school: Harvard University + school_linkedin_profile_url: null + description: null + logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw + - starts_at: null + ends_at: null + field_of_study: null + degree_name: null + school: Lakeside School + school_linkedin_profile_url: null + description: null + logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ + languages: [] + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: [] + accomplishment_test_scores: [] + volunteer_work: [] + certifications: [] + connections: null + people_also_viewed: [] + recommendations: [] + activities: [] + similarly_named_profiles: [] + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + next_page: null + description: List of employees + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Company API + operationId: Employee Listing Endpoint + summary: Employee Listing Endpoint + /api/linkedin/company/employees/count: + get: + description: 'Cost: 1 credit / successful request. + + Get a number of total employees of a Company. + + + Get an employee count of this company from various sources.' + parameters: + - in: query + name: use_cache + required: false + description: + "\n `if-present`: The default behavior. Fetches data from\ + \ LinkDB cache regardless of age of profile.\n\n `if-recent`: API will\ + \ make a best effort to return a fresh data no older than 29 days. Costs\ + \ an extra 1 credit on top of the cost of the base endpoint.\n " + example: if-present + schema: + type: string + - in: query + name: linkedin_employee_count + required: false + description: + "\n Option to include a scraped employee count value from\ + \ the target company's LinkedIn profile.\n\n Valid values are `include`\ + \ and `exclude`:\n\n * `exclude` (default) : To exclude the scraped employee\ + \ count.\n * `include` : To include the scraped employee count.\n\n \ + \ Costs an extra `1` credit on top of the base cost of the endpoint.\n\ + \ " + example: include + schema: + type: string + - in: query + name: employment_status + required: false + description: + "\n Parameter to tell the API to filter past or current employees.\n\ + \n Valid values are `current`, `past`, and `all`:\n\n * `current`\ + \ (default) : count current employees\n * `past` : count past employees\n\ + \ * `all` : count current & past employees\n " + example: current + schema: + type: string + - in: query + name: url + required: true + description: + "\n URL of the LinkedIn Company Profile to target.\n\n \ + \ URL should be in the format of `https://www.linkedin.com/company/`\n\ + \ " + example: https://www.linkedin.com/company/apple/ + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EmployeeCount' + example: + linkedin_employee_count: 529274 + linkdb_employee_count: 3 + description: Number of employees in a company + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Company API + operationId: Employee Count Endpoint + summary: Employee Count Endpoint + /api/linkedin/person/profile-picture: + get: + description: 'Cost: 0 credit / successful request. + + Get the profile picture of a person. + + + Profile pictures are served from cached people profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb). + + If the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), + then the API will return a `404` status code.' + parameters: + - in: query + name: linkedin_person_profile_url + required: true + description: + "\n LinkedIn Profile URL of the person that you are trying\ + \ to get the profile picture of.\n " + example: https://www.linkedin.com/in/williamhgates/ + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ProfilePicture' + example: + tmp_profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + description: Profile picture of a person + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - People API + operationId: Person Profile Picture Endpoint + summary: Person Profile Picture Endpoint + /api/linkedin/company/profile-picture: + get: + description: 'Cost: 0 credit / successful request. + + Get the profile picture of a company. + + + Profile pictures are served from cached company profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb). + + If the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), + then the API will return a `404` status code.' + parameters: + - in: query + name: linkedin_company_profile_url + required: true + description: + "\n LinkedIn Profile URL of the company that you are trying\ + \ to get the profile picture of.\n " + example: https://www.linkedin.com/company/apple/ + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ProfilePicture' + example: + tmp_profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + description: Profile picture of a company + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Company API + operationId: Company Profile Picture Endpoint + summary: Company Profile Picture Endpoint + /api/linkedin/profile/resolve: + get: + description: 'Cost: 2 credits / successful request. + + Look up a person with a name and company information.' + parameters: + - in: query + name: similarity_checks + required: false + description: + "\n Controls whether the API endpoint performs\n similarity\ + \ comparisons between the input parameters\n and the results or simply\ + \ returns the closest match.\n For instance, if you are searching for\ + \ a person named\n \"Ben Chad\", and the closest result we have is \"\ + Chavvy\n Plum\", our similarity checks will discard the obviously\n \ + \ incorrect result and return `null` instead of a false\n positive.\n\ + \n Include similarity checks to eliminate false positives.\n However,\ + \ be aware that this might yield fewer results\n as false positives are\ + \ discarded. Credits will still be\n deducted even if we return `null`.\n\ + \n You can choose to skip similarity checks, in which\n case no credits\ + \ will be charged if we return `null`.\n\n This parameter accepts the\ + \ following values:\n * `include` (default) - Perform similarity checks\ + \ and\n discard false positives. Credits will be deducted even\n if\ + \ we return null .\n * `skip` - Bypass similarity checks. No credits\ + \ will be\n deducted if no results are returned.\n " + example: include + schema: + type: string + - in: query + name: enrich_profile + required: false + description: + "\n Enrich the result with a cached profile of the lookup\ + \ result.\n\n The valid values are:\n\n * `skip` (default): do not\ + \ enrich the results with cached profile data\n * `enrich`: enriches\ + \ the result with cached profile data\n\n Calling this API endpoint with\ + \ this parameter would add 1 credit.\n\n If you require [fresh profile\ + \ data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n\ + \ please chain this API call with the [People Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint)\ + \ with the `use_cache=if-recent` parameter.\n " + example: enrich + schema: + type: string + - in: query + name: company_domain + required: true + description: Company name or domain + example: gatesfoundation.org + schema: + type: string + - in: query + name: location + required: false + description: + "\n The location of this user.\n\n Name of country, city\ + \ or state.\n " + example: Seattle + schema: + type: string + - in: query + name: title + required: false + description: Title that user is holding at his/her current job + example: Co-chair + schema: + type: string + - in: query + name: last_name + required: false + description: Last name of the user + example: Gates + schema: + type: string + - in: query + name: first_name + required: true + description: First name of the user + example: Bill + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PersonLookupUrlEnrichResult' + example: + url: https://www.linkedin.com/in/senatormarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy\ + \ at work and in their lives - I'm on a mission to solve that.\n\ + \nI spent 10 years as the founder of Axxis Audio, an electronics\ + \ company that grew to multi-million dollar sales, which I sold\ + \ in 2012. At that time, I funneled my earnings into the creation\ + \ of an Internet of Things company, but numerous factors lead\ + \ to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job\ + \ at Best Buy for $12 an hour while reinventing myself through\ + \ the completion of an MBA at the University of Colorado, and\ + \ a 6-month software development boot camp. \n\nAfter graduation,\ + \ I landed at American Express as a Senior Product Manager and\ + \ then got poached by Amazon in 2017 (because of my LinkedIn profile).\ + \ My journey has led to a deep sense of perspective, humility,\ + \ and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website\ + \ for details on my Mindset Reset Podcast, Public Speaking, Consulting,\ + \ or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ + \ podcast?\nA: I'd love to! I've shared my message on the future\ + \ of employment, breaking into big tech, and my personal story\ + \ of reinventing myself and discovering my sense of purpose (and\ + \ how you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John\ + \ Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\ + \uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ + \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ + \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ + \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"\ + R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking + financial freedom long before the age of 65 with the ability + to invest in high yield, short-term real estate investments + that were only accessible in the past for a select few wealthy + individuals. Each of our single family rehab projects require + a minimum investment contribution of only $10K, we have simple + terms, no multi-year hold periods, and no fees. With our unique + model investors can log into our easy to use website, select + the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost\ + \ thought leaders and turn them into actionable insights so\ + \ that others can discover greater happiness, success, and fulfillment.\n\ + \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, + api integration, Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the + Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails + integration to post a user's message content to the page in + real time, with no page refresh required. gMessenger also includes + custom authentication with three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app + utilizing Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: [] + volunteer_work: [] + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean + Practices in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: [] + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\ + \n \n John Marty is a genius at his craft. He is\ + \ skilled in the art of making people feel empowered to seek out\ + \ roles that they are qualified for, ask for salaries that they\ + \ deserve, and creates a kind of pay it forward lifestyle. John\ + \ helps you to get to places that you only thought were possible\ + \ for other people. Anyone that is fortunate enough to learn from\ + \ John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \ + \ \n John is so focused on helping guide you through\ + \ an interview process not just for Amazon but on interviewing\ + \ in general. I've generally done well at interviewing, my skills\ + \ are top notch now. John is so focused on on his clients and\ + \ really goes above and beyond. John is genuine, knowledgeable,\ + \ well spoken and non-judgemental. He is so encouraging, so positive\ + \ and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that\ + \ has a large 13K sq ft lot with two homes on it. After 5 minutes\ + \ of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC ,\ + \ Owner Marty\u2019s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + description: LinkedIn (Person) Profile URL + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - People API + operationId: Person Lookup Endpoint + summary: Person Lookup Endpoint + /api/v2/linkedin/company/job: + get: + description: 'Cost: 2 credits / successful request. + + List jobs posted by a company on LinkedIn' + parameters: + - in: query + name: job_type + required: false + description: + "\n The nature of the job.\n It accepts the following 7\ + \ case-insensitive values only:\n - `full-time`\n - `part-time`\n\ + \ - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n\ + \ - `anything` (default)\n " + example: anything + schema: + type: string + - in: query + name: experience_level + required: false + description: + "\n The experience level needed for the job.\n It accepts\ + \ the following 6 case-insensitive values only:\n - `internship`\n \ + \ - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n\ + \ - `anything` (default)\n " + example: entry_level + schema: + type: string + - in: query + name: when + required: false + description: + "\n The time when the job is posted,\n It accepts the following\ + \ case-insensitive values only:\n - `yesterday`\n - `past-week`\n\ + \ - `past-month`\n - `anytime` (default)\n " + example: past-month + schema: + type: string + - in: query + name: flexibility + required: false + description: + "\n The flexibility of the job.\n It accepts the following\ + \ 3 case insensitive values only:\n - `remote`\n - `on-site`\n \ + \ - `hybrid`\n - `anything` (default)\n " + example: remote + schema: + type: string + - in: query + name: geo_id + required: false + description: + "\n The `geo_id` of the location to search for.\n For example,\ + \ `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article)\ + \ as to how you may be able to match regions to `geo_id` input values.\n\ + \ " + example: '92000000' + schema: + type: string + - in: query + name: keyword + required: false + description: "\n The keyword to search for.\n " + example: software engineer + schema: + type: string + - in: query + name: search_id + required: false + description: + "\n The `search_id` of the company on LinkedIn.\n You can\ + \ get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n\ + \ " + example: '1035' + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/JobListPage' + example: + job: + - company: Microsoft + company_url: https://www.linkedin.com/company/microsoft + job_title: + 'Product Management: Intern Opportunities for University + Students' + job_url: https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682 + list_date: '2022-10-09' + location: New York, NY + - company: Microsoft + company_url: https://www.linkedin.com/company/microsoft + job_title: Content Strategist + job_url: https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764 + list_date: '2022-10-21' + location: United States + next_page_no: 1 + next_page_api_url: http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035 + previous_page_no: null + previous_page_api_url: null + description: List of open job position + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Jobs API + operationId: Job Search Endpoint + summary: Job Search Endpoint + /api/v2/linkedin/company/job/count: + get: + description: 'Cost: 2 credits / successful request. + + Count number of jobs posted by a company on LinkedIn' + parameters: + - in: query + name: job_type + required: false + description: + "\n The nature of the job.\n It accepts the following 7\ + \ case-insensitive values only:\n - `full-time`\n - `part-time`\n\ + \ - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n\ + \ - `anything` (default)\n " + example: entry_level + schema: + type: string + - in: query + name: experience_level + required: false + description: + "\n The experience level needed for the job.\n It accepts\ + \ the following 6 case-insensitive values only:\n - `internship`\n \ + \ - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n\ + \ - `anything` (default)\n " + example: entry_level + schema: + type: string + - in: query + name: when + required: false + description: + "\n The time when the job is posted,\n It accepts the following\ + \ case-insensitive values only:\n - `yesterday`\n - `past-week`\n\ + \ - `past-month`\n - `anytime` (default)\n " + example: past-month + schema: + type: string + - in: query + name: flexibility + required: false + description: + "\n The flexibility of the job.\n It accepts the following\ + \ 3 case insensitive values only:\n - `remote`\n - `on-site`\n \ + \ - `hybrid`\n - `anything` (default)\n " + example: remote + schema: + type: string + - in: query + name: geo_id + required: false + description: + "\n The `geo_id` of the location to search for.\n For example,\ + \ `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article)\ + \ as to how you may be able to match regions to `geo_id` input values.\n\ + \ " + example: '92000000' + schema: + type: string + - in: query + name: keyword + required: false + description: "\n The keyword to search for.\n " + example: software engineer + schema: + type: string + - in: query + name: search_id + required: false + description: + "\n The `search_id` of the company on LinkedIn.\n You can\ + \ get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n\ + \ " + example: '1035' + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/JobListCount' + example: + count: 887622 + description: Count number of jobs posted + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Jobs API + operationId: Jobs Listing Count Endpoint + summary: Jobs Listing Count Endpoint + /api/find/company/role/: + get: + description: + "Cost: 3 credits / successful request.\nReturns the profile of\ + \ a person who most closely matches a specified role\nin a company. For instance,\ + \ it can be used to identify the \"CTO\" of\n\"Apple\". The endpoint yields\ + \ a single result that represents the closest\nmatch. For a detailed comparison\ + \ between this API endpoint and the\n[Employee Search Endpoint](#company-api-employee-search-endpoint)\n\ + or the [Person Search Endpoint](#search-api-person-search-endpoint),\nrefer\ + \ to [this article](\n https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint)." + parameters: + - in: query + name: enrich_profile + required: false + description: + "\n Enrich the result with a cached profile of the lookup\ + \ result.\n\n The valid values are:\n\n * `skip` (default): do not\ + \ enrich the results with cached profile data\n * `enrich`: enriches\ + \ the result with cached profile data\n\n Calling this API endpoint with\ + \ this parameter would add 1 credit.\n\n If you require [fresh profile\ + \ data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n\ + \ please chain this API call with the [Person Profile Endpoint](#people-api-person-profile-endpoint)\ + \ with the `use_cache=if-recent` parameter.\n " + example: enrich + schema: + type: string + - in: query + name: role + required: true + description: Role of the profile that you are lookin up + example: ceo + schema: + type: string + - in: query + name: company_name + required: true + description: Name of the company that you are searching for + example: nubela + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RoleSearchEnrichedResult' + example: + linkedin_profile_url: https://www.linkedin.com/in/senatormarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy\ + \ at work and in their lives - I'm on a mission to solve that.\n\ + \nI spent 10 years as the founder of Axxis Audio, an electronics\ + \ company that grew to multi-million dollar sales, which I sold\ + \ in 2012. At that time, I funneled my earnings into the creation\ + \ of an Internet of Things company, but numerous factors lead\ + \ to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job\ + \ at Best Buy for $12 an hour while reinventing myself through\ + \ the completion of an MBA at the University of Colorado, and\ + \ a 6-month software development boot camp. \n\nAfter graduation,\ + \ I landed at American Express as a Senior Product Manager and\ + \ then got poached by Amazon in 2017 (because of my LinkedIn profile).\ + \ My journey has led to a deep sense of perspective, humility,\ + \ and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website\ + \ for details on my Mindset Reset Podcast, Public Speaking, Consulting,\ + \ or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ + \ podcast?\nA: I'd love to! I've shared my message on the future\ + \ of employment, breaking into big tech, and my personal story\ + \ of reinventing myself and discovering my sense of purpose (and\ + \ how you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John\ + \ Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\ + \uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ + \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ + \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ + \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"\ + R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking + financial freedom long before the age of 65 with the ability + to invest in high yield, short-term real estate investments + that were only accessible in the past for a select few wealthy + individuals. Each of our single family rehab projects require + a minimum investment contribution of only $10K, we have simple + terms, no multi-year hold periods, and no fees. With our unique + model investors can log into our easy to use website, select + the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost\ + \ thought leaders and turn them into actionable insights so\ + \ that others can discover greater happiness, success, and fulfillment.\n\ + \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, + api integration, Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the + Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails + integration to post a user's message content to the page in + real time, with no page refresh required. gMessenger also includes + custom authentication with three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app + utilizing Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: [] + volunteer_work: [] + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean + Practices in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: [] + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\ + \n \n John Marty is a genius at his craft. He is\ + \ skilled in the art of making people feel empowered to seek out\ + \ roles that they are qualified for, ask for salaries that they\ + \ deserve, and creates a kind of pay it forward lifestyle. John\ + \ helps you to get to places that you only thought were possible\ + \ for other people. Anyone that is fortunate enough to learn from\ + \ John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \ + \ \n John is so focused on helping guide you through\ + \ an interview process not just for Amazon but on interviewing\ + \ in general. I've generally done well at interviewing, my skills\ + \ are top notch now. John is so focused on on his clients and\ + \ really goes above and beyond. John is genuine, knowledgeable,\ + \ well spoken and non-judgemental. He is so encouraging, so positive\ + \ and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that\ + \ has a large 13K sq ft lot with two homes on it. After 5 minutes\ + \ of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC ,\ + \ Owner Marty\u2019s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + description: LinkedIn (Person) Profile URL + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - People API + operationId: Role Lookup Endpoint + summary: Role Lookup Endpoint + /api/linkedin/company/resolve: + get: + description: + "Cost: 2 credits / successful request.\nResolve Company LinkedIn\ + \ Profile from company name,\n domain name and location." + parameters: + - in: query + name: company_location + required: false + description: + "\n The location / region of company.\n ISO 3166-1 alpha-2\ + \ codes\n " + example: sg + schema: + type: string + - in: query + name: company_domain + required: false + description: 'Company website or Company domain + + Requires either `company_domain` or `company_name`' + example: accenture.com + schema: + type: string + - in: query + name: company_name + required: false + description: 'Company Name + + Requires either `company_domain` or `company_name`' + example: Accenture + schema: + type: string + - in: query + name: enrich_profile + required: false + description: + "\n Enrich the result with a cached profile of the lookup\ + \ result.\n\n The valid values are:\n\n * `skip` (default): do not\ + \ enrich the results with cached profile data\n * `enrich`: enriches\ + \ the result with cached profile data\n\n Calling this API endpoint with\ + \ this parameter would add 1 credit.\n\n If you require [fresh profile\ + \ data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n\ + \ please chain this API call with the [Company Profile Endpoint](https://nubela.co/proxycurl/docs#company-api-company-profile-endpoint)\ + \ with the `use_cache=if-recent` parameter.\n " + example: enrich + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompanyUrlEnrichResult' + example: + url: https://www.linkedin.com/company/accenture + profile: + linkedin_internal_id: '1033' + description: + "Accenture is a global professional services company\ + \ with leading capabilities in digital, cloud, and security. Combining\ + \ unmatched experience and specialized skills across more than\ + \ 40 industries, we offer Strategy and Consulting, Technology\ + \ and Operations Services, and Accenture Song\u2014all powered\ + \ by the world\u2019s largest network of Advanced Technology and\ + \ Intelligent Operations centers. \n\nOur people deliver on the\ + \ promise of technology and human ingenuity every day, serving\ + \ clients in more than 120 countries. We embrace the power of\ + \ change to create value and shared success for our clients, people,\ + \ shareholders, partners, and communities. \n\nVisit us at accenture.com." + website: http://www.accenture.com + industry: Business Consulting and Services + company_size: + - 10001 + - null + company_size_on_linkedin: 541251 + hq: + country: IE + city: Dublin 2 + postal_code: null + line_1: Grand Canal Harbour + is_hq: true + state: null + company_type: PUBLIC_COMPANY + founded_year: null + specialities: + - Management Consulting + - Systems Integration and Technology + locations: + - country: IE + city: Dublin 2 + postal_code: null + line_1: Grand Canal Harbour + is_hq: true + state: null + - country: US + city: San Francisco + postal_code: '94105' + line_1: 415 Mission Street Floor 31-34 + is_hq: false + state: California + name: Accenture + tagline: null + universal_name_id: accenture + profile_pic_url: https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY + background_cover_image_url: https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0 + search_id: '1033' + similar_companies: + - name: Deloitte + link: https://www.linkedin.com/company/deloitte + industry: Business Consulting and Services + location: null + - name: Tata Consultancy Services + link: https://in.linkedin.com/company/tata-consultancy-services + industry: IT Services and IT Consulting + location: Mumbai, Maharashtra + affiliated_companies: + - name: Accenture in India + link: https://in.linkedin.com/company/accentureindia + industry: IT Services and IT Consulting + location: Bengaluru, Karnatka + - name: Accenture Brasil + link: https://br.linkedin.com/company/accenturebrasil + industry: IT Services and IT Consulting + location: "S\xE3o Paulo, S\xE3o Paulo" + updates: + - article_link: null + image: null + posted_on: + day: 25 + month: 10 + year: 2023 + text: 'Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4' + total_likes: 325 + - article_link: null + image: https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA + posted_on: + day: 25 + month: 10 + year: 2023 + text: + "The ability to learn new things, without forgetting those\ + \ that came before, is a huge differentiator between the #AI\ + \ we're familiar with, and the #GenerativeAI powered by foundation\ + \ models that we're seeing now.\n \nDiscover the trends shaping\ + \ the next decade: https://accntu.re/474YxOH\n \n#TechVision2023" + total_likes: 541 + follower_count: 11125167 + acquisitions: null + exit_data: null + extra: null + funding_data: null + categories: null + last_updated: '2023-10-26T11:33:24Z' + description: LinkedIn (Company) Profile URL + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Company API + operationId: Company Lookup Endpoint + summary: Company Lookup Endpoint + /api/linkedin/company/employee/search/: + get: + description: 'Cost: 10 credits / successful request. + + Search employees of a target by their job title. This API endpoint is syntactic + + sugar for the role_search parameter under the [Employee Listing Endpoint](#company-api-employee-listing-endpoint). + + This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), + our comprehensive dataset of people + + and company profiles. For a detailed comparison between this API endpoint + + and the [Role Lookup Endpoint](#people-api-role-lookup-endpoint) or the [Person + Search Endpoint](#search-api-person-search-endpoint), refer to [this article](https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).' + parameters: + - in: query + name: page_size + required: false + description: + "\n Tune the maximum results returned per API call.\n The\ + \ default value of this parameter is `200000`.\n Accepted values for\ + \ this parameter is an integer ranging from `1` to `200000`.\n When `enrich_profiles=enrich`,\ + \ this parameter accepts value ranging from `1` to `10` and the default\ + \ value is `100`.\n " + example: '10' + schema: + type: string + - in: query + name: linkedin_company_profile_url + required: true + description: "\n LinkedIn Profile URL of the target company.\n " + example: https://www.linkedin.com/company/microsoft/ + schema: + type: string + - in: query + name: keyword_regex + required: true + description: + "\n Job title keyword to search for in regular expression\ + \ format.\n\n The accepted value for this parameter is a **case-insensitive**\ + \ regular expression.\n " + example: ceo|cto + schema: + type: string + - in: query + name: country + required: false + description: + "\n Limit the result set to the country locality of the profile.\ + \ For example, set the parameter of `country=us` if you only want profiles\ + \ from the US.\n\n This parameter accepts a case-insensitive [Alpha-2\ + \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ + \n Costs an extra `3` credit per result returned.\n " + example: us + schema: + type: string + - in: query + name: enrich_profiles + required: false + description: + "\n Get the full profile of employees instead of only their\ + \ profile urls.\n\n Each request respond with a streaming response of\ + \ profiles.\n\n The valid values are:\n \n * `skip` (default):\ + \ lists employee's profile url\n * `enrich`: lists full profile of employees\n\ + \n Calling this API endpoint with this parameter would add `1` credit\ + \ per employee returned.\n " + example: enrich + schema: + type: string + - in: query + name: resolve_numeric_id + required: false + description: + "\n Enable support for Company Profile URLs with numerical\ + \ IDs that you most frequently fetch from Sales Navigator. \n We achieve\ + \ this by resolving numerical IDs into vanity IDs with cached company profiles\ + \ from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example,\ + \ we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp`\ + \ -- for which the API endpoint only supports the latter.\n \n This\ + \ parameter accepts the following values:\n - `false` (default value)\ + \ - Will not resolve numerical IDs.\n - `true` - Enable support for Company\ + \ Profile URLs with numerical IDs. \n Costs an extra `2` credit on top\ + \ of the base cost of the endpoint.\n " + example: 'false' + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/EmployeeList' + example: + employees: + - profile_url: https://www.linkedin.com/in/satyanadella + profile: + public_identifier: williamhgates + profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + background_cover_image_url: null + first_name: Bill + last_name: Gates + full_name: Bill Gates + occupation: Co-chair at Bill & Melinda Gates Foundation + headline: Co-chair, Bill & Melinda Gates Foundation + summary: + Co-chair of the Bill & Melinda Gates Foundation. Founder + of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. + Avid traveler. Active blogger. + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + company: 'Breakthrough Energy ' + company_linkedin_profile_url: https://www.linkedin.com/company/breakthrough-energy/ + title: Founder + description: null + location: null + logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y + - starts_at: + day: 1 + month: 1 + year: 2000 + ends_at: null + company: Bill & Melinda Gates Foundation + company_linkedin_profile_url: https://www.linkedin.com/company/bill-&-melinda-gates-foundation/ + title: Co-chair + description: null + location: null + logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs + education: + - starts_at: + day: 1 + month: 1 + year: 1973 + ends_at: + day: 31 + month: 12 + year: 1975 + field_of_study: null + degree_name: null + school: Harvard University + school_linkedin_profile_url: null + description: null + logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw + - starts_at: null + ends_at: null + field_of_study: null + degree_name: null + school: Lakeside School + school_linkedin_profile_url: null + description: null + logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ + languages: [] + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: [] + accomplishment_test_scores: [] + volunteer_work: [] + certifications: [] + connections: null + people_also_viewed: [] + recommendations: [] + activities: [] + similarly_named_profiles: [] + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + next_page: null + description: List of employees + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Company API + operationId: Employee Search Endpoint + summary: Employee Search Endpoint + /api/linkedin/school/students/: + get: + description: 'Cost: 3 credits / student returned. + + Get a list of students of a school or university.' + parameters: + - in: query + name: country + required: false + description: + "\n Limit the result set to the country locality of the profile.\ + \ For example, set the parameter of `country=us` if you only want profiles\ + \ from the US.\n\n This parameter accepts a case-insensitive [Alpha-2\ + \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ + \n Costs an extra `3` credit per result returned.\n " + example: us + schema: + type: string + - in: query + name: enrich_profiles + required: false + description: + "\n Get the full profile of students instead of only their\ + \ profile urls.\n\n Each request respond with a streaming response of\ + \ profiles.\n\n The valid values are:\n \n * `skip` (default):\ + \ lists student's profile url\n * `enrich`: lists full profile of students\n\ + \n *Calling this API endpoint with this parameter would add `1` credit\ + \ per student returned.*\n " + example: enrich + schema: + type: string + - in: query + name: search_keyword + required: false + description: + "\n Filter students by their major by matching the student's\ + \ major against a *regular expression*.\n\n The default value of this\ + \ parameter is `null`.\n\n The accepted value for this parameter is a\ + \ **case-insensitive** regular expression.\n\n (The base cost of calling\ + \ this API endpoint with this parameter would be `10` credits.\n Each\ + \ student matched and returned would cost `6` credits per student returned.)\n\ + \ " + example: computer*|cs + schema: + type: string + - in: query + name: page_size + required: false + description: + "\n Limit the maximum results returned per API call.\n\n \ + \ The default value of this parameter is `10`.\n\n Accepted values\ + \ for this parameter is an integer ranging from `1` to `200000`.\n\n \ + \ When `enrich_profiles=enrich`, this parameter accepts value ranging from\ + \ `1` to `10` and the default value is `10`.\n " + example: '10' + schema: + type: string + - in: query + name: student_status + required: false + description: + "\n Parameter to tell the API to return past or current students.\n\ + \n Valid values are `current`, `past`, and `all`:\n\n * `current`\ + \ (default) : lists current students\n * `past` : lists past students\n\ + \ * `all` : lists current & past students\n " + example: current + schema: + type: string + - in: query + name: sort_by + required: false + description: + "\n Sort students by matriculation or graduation dates.\n\n\ + \ Valid values are:\n * `recently-matriculated` - Sort students by\ + \ their matriculation date. Students who had had most recently started school\ + \ is on the top of the list.\n * `recently-graduated` - Sort students\ + \ by their graduation date. The most recently graduated student is on the\ + \ top of this list.\n * `none` - The default value. Do not sort.\n\n\ + \ If this parameter is supplied with a value other than `none`, will\ + \ add `50` credits to the base cost of the API endpoint regardless number\ + \ of results returned. It will also add an additional cost of `10` credits\ + \ per student returned.\n " + example: recently-matriculated + schema: + type: string + - in: query + name: resolve_numeric_id + required: false + description: + "\n Enable support for School Profile URLs with numerical\ + \ IDs that you most frequently fetch from Sales Navigator. \n We achieve\ + \ this by resolving numerical IDs into vanity IDs with cached company profiles\ + \ from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example,\ + \ we will turn `https://www.linkedin.com/school/1234567890` to `https://www.linkedin.com/school/acme-corp`\ + \ -- for which the API endpoint only supports the latter.\n \n This\ + \ parameter accepts the following values:\n - `false` (default value)\ + \ - Will not resolve numerical IDs.\n - `true` - Enable support for School\ + \ Profile URLs with numerical IDs. \n Costs an extra `2` credit on top\ + \ of the base cost of the endpoint.\n " + example: 'false' + schema: + type: string + - in: query + name: linkedin_school_url + required: true + description: + "\n URL of the LinkedIn School Profile to target.\n\n URL\ + \ should be in the format of `https://www.linkedin.com/school/`\n\ + \ " + example: https://www.linkedin.com/school/stanford-university + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/StudentList' + example: + students: + - profile_url: https://www.linkedin.com/in/johnrmarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: + Financial Freedom through Real Estate - LinkedIn Top + Voice + summary: + "Most people go through life lost, disengaged, and unhappy\ + \ at work and in their lives - I'm on a mission to solve that.\n\ + \nI spent 10 years as the founder of Axxis Audio, an electronics\ + \ company that grew to multi-million dollar sales, which I sold\ + \ in 2012. At that time, I funneled my earnings into the creation\ + \ of an Internet of Things company, but numerous factors lead\ + \ to its demise after 2 hard fought years. \n\nAt 31, I was\ + \ penny-less, had a baby on the way, and had zero job prospects\ + \ (despite applying to 150 companies). My desperate situation\ + \ led me to take a job at Best Buy for $12 an hour while reinventing\ + \ myself through the completion of an MBA at the University\ + \ of Colorado, and a 6-month software development boot camp.\ + \ \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because\ + \ of my LinkedIn profile). My journey has led to a deep sense\ + \ of perspective, humility, and purpose that I draw on to help\ + \ others find clarity, meaning, and happiness in their careers\ + \ and lives. \n\nCheck out my website for details on my Mindset\ + \ Reset Podcast, Public Speaking, Consulting, or my free 40\ + \ page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\n\ + FAQ's\n\nQ: Can you speak at my Company, University, event or\ + \ podcast?\nA: I'd love to! I've shared my message on the future\ + \ of employment, breaking into big tech, and my personal story\ + \ of reinventing myself and discovering my sense of purpose\ + \ (and how you can too!).\n\n\u2611\uFE0F YouTube Channel #1\ + \ (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers:\ + \ https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner,\ + \ and I just started learning to skateboard a half-pipe.\n\u2611\ + \uFE0F Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS\ + \ CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com (don't\ + \ forget that \"R\"....The other guy gets my emails all the\ + \ time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking + financial freedom long before the age of 65 with the ability + to invest in high yield, short-term real estate investments + that were only accessible in the past for a select few wealthy + individuals. Each of our single family rehab projects require + a minimum investment contribution of only $10K, we have simple + terms, no multi-year hold periods, and no fees. With our unique + model investors can log into our easy to use website, select + the projects that they want to invest in, and get realtime + updates on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + title: Founder + description: + "We dive into the mindsets of the world\u2019s\ + \ foremost thought leaders and turn them into actionable insights\ + \ so that others can discover greater happiness, success,\ + \ and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + description: + rails, ruby, rspec, capybara, bootstrap, css, html, + api integration, Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the + Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails + integration to post a user's message content to the page in + real time, with no page refresh required. gMessenger also + includes custom authentication with three different permissions + levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app + utilizing Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: [] + volunteer_work: [] + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean + Practices in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: [] + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n\ + \ \n \n \n \n\ + \ \n\n \n John Marty is a genius at his craft.\ + \ He is skilled in the art of making people feel empowered to\ + \ seek out roles that they are qualified for, ask for salaries\ + \ that they deserve, and creates a kind of pay it forward lifestyle.\ + \ John helps you to get to places that you only thought were\ + \ possible for other people. Anyone that is fortunate enough\ + \ to learn from John should consider themselves extremely lucky.\ + \ I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n\ + \ \n John is so focused on helping guide you through\ + \ an interview process not just for Amazon but on interviewing\ + \ in general. I've generally done well at interviewing, my\ + \ skills are top notch now. John is so focused on on his clients\ + \ and really goes above and beyond. John is genuine, knowledgeable,\ + \ well spoken and non-judgemental. He is so encouraging, so\ + \ positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that\ + \ has a large 13K sq ft lot with two homes on it. After 5\ + \ minutes of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC\ + \ , Owner Marty\u2019s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + next_page: null + description: List of students + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - School API + operationId: Student Listing Endpoint + summary: Student Listing Endpoint + /api/linkedin/profile/resolve/email: + get: + description: 'Cost: 3 credits / successful request. + + Resolve social media profiles correlated from an email address. + + This API endpoint works with both personal and work emails.' + parameters: + - in: query + name: email + required: false + description: 'Email address of the user you want to look up. + + yes' + example: danial@nubela.co + schema: + type: string + - in: query + name: lookup_depth + required: false + description: + "\n This parameter describes the depth options\ + \ for our API lookup function. This endpoint can execute either a superficial\ + \ or a deep lookup.\n\n A **superficial lookup** involves\ + \ comparing the provided email with entries in our database. This approach\ + \ tends to yield fewer results and is typically less effective for work-related\ + \ email addresses. However, it does not consume any credits if no results\ + \ are returned.\n\n On the other hand, a **deep lookup**\ + \ extends beyond our database to utilize advanced heuristics and identify\ + \ the individual associated with a given email. This method is particularly\ + \ recommended for work emails.\n\n Please note the following\ + \ valid values for the depth of the lookup:\n\n * `superficial`:\ + \ No credits are consumed if no results are found.\n * `deep`\ + \ (default): Credits are used regardless of whether any results are returned.\n\ + \ \nyes" + example: deep + schema: + type: string + - in: query + name: enrich_profile + required: false + description: + "\n Enrich the result with a cached LinkedIn profile\ + \ of the LinkedIn Profile URL result (if any).\n\n Valid\ + \ values are:\n\n * `skip` (default): do not enrich the results\ + \ with cached profile data.\n * `enrich`: enriches the result\ + \ with cached profile data. \n\n Calling this API endpoint\ + \ with this parameter would add `1` additional credit.\n\n \ + \ If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\ + \ please chain this API call with the `linkedin_profile_url` result with\ + \ the [Person Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint)\ + \ with the `use_cache=if-recent` parameter.\n \nno" + example: enrich + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ReverseEmailUrlEnrichResult' + example: + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy\ + \ at work and in their lives - I'm on a mission to solve that.\n\ + \nI spent 10 years as the founder of Axxis Audio, an electronics\ + \ company that grew to multi-million dollar sales, which I sold\ + \ in 2012. At that time, I funneled my earnings into the creation\ + \ of an Internet of Things company, but numerous factors lead\ + \ to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job\ + \ at Best Buy for $12 an hour while reinventing myself through\ + \ the completion of an MBA at the University of Colorado, and\ + \ a 6-month software development boot camp. \n\nAfter graduation,\ + \ I landed at American Express as a Senior Product Manager and\ + \ then got poached by Amazon in 2017 (because of my LinkedIn profile).\ + \ My journey has led to a deep sense of perspective, humility,\ + \ and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website\ + \ for details on my Mindset Reset Podcast, Public Speaking, Consulting,\ + \ or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ + \ podcast?\nA: I'd love to! I've shared my message on the future\ + \ of employment, breaking into big tech, and my personal story\ + \ of reinventing myself and discovering my sense of purpose (and\ + \ how you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John\ + \ Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\ + \uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ + \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ + \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ + \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"\ + R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking + financial freedom long before the age of 65 with the ability + to invest in high yield, short-term real estate investments + that were only accessible in the past for a select few wealthy + individuals. Each of our single family rehab projects require + a minimum investment contribution of only $10K, we have simple + terms, no multi-year hold periods, and no fees. With our unique + model investors can log into our easy to use website, select + the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost\ + \ thought leaders and turn them into actionable insights so\ + \ that others can discover greater happiness, success, and fulfillment.\n\ + \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, + api integration, Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the + Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails + integration to post a user's message content to the page in + real time, with no page refresh required. gMessenger also includes + custom authentication with three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app + utilizing Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: [] + volunteer_work: [] + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean + Practices in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: [] + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\ + \n \n John Marty is a genius at his craft. He is\ + \ skilled in the art of making people feel empowered to seek out\ + \ roles that they are qualified for, ask for salaries that they\ + \ deserve, and creates a kind of pay it forward lifestyle. John\ + \ helps you to get to places that you only thought were possible\ + \ for other people. Anyone that is fortunate enough to learn from\ + \ John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \ + \ \n John is so focused on helping guide you through\ + \ an interview process not just for Amazon but on interviewing\ + \ in general. I've generally done well at interviewing, my skills\ + \ are top notch now. John is so focused on on his clients and\ + \ really goes above and beyond. John is genuine, knowledgeable,\ + \ well spoken and non-judgemental. He is so encouraging, so positive\ + \ and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that\ + \ has a large 13K sq ft lot with two homes on it. After 5 minutes\ + \ of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC ,\ + \ Owner Marty\u2019s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + description: Twitter, Facebook, and LinkedIn (Person) Profile URL + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Contact API + operationId: Reverse Email Lookup Endpoint + summary: Reverse Email Lookup Endpoint + /api/resolve/phone: + get: + description: 'Cost: 3 credits / successful request. + + Find social media profiles from a contact phone number.' + parameters: + - in: query + name: phone_number + required: true + description: + '[E.164 formatted](https://www.twilio.com/docs/glossary/what-e164) + phone number of the person you want to identify social media profiles of.' + example: '+14155552671' + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ReverseContactNumberResult' + example: + linkedin_profile_url: https://www.linkedin.com/in/senatormarty + twitter_profile_url: https://www.twitter.com/proxycurl + facebook_profile_url: https://www.facebook.com/zuck + description: Twitter, Facebook, and LinkedIn Profile URL + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Contact API + operationId: Reverse Contact Number Lookup Endpoint + summary: Reverse Contact Number Lookup Endpoint + /api/linkedin/profile/email: + get: + description: 'Cost: 3 credits / request. + + Lookup work email address of a LinkedIn Person Profile. + + + Email addresses returned are verified to not be role-based or catch-all emails. + Email addresses + + returned by our API endpoint come with a 95+% deliverability guarantee + + + **Endpoint behavior** + + + *This endpoint* **_may not_** *return results immediately.* + + + If you provided a webhook in your request parameter, our application will + call your webhook with + + the result once. See `Webhook request` below.' + parameters: + - in: query + name: linkedin_profile_url + required: true + description: + "\n Linkedin Profile URL of the person you want to\n extract\ + \ work email address from.\n " + example: https://sg.linkedin.com/in/williamhgates + schema: + type: string + - in: query + name: callback_url + required: false + description: + "\n Webhook to notify your application when\n the request\ + \ has finished processing.\n " + example: https://webhook.site/29e12f17-d5a2-400a-9d08-42ee9d83600a + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ExtractionEmailResult' + example: + email_queue_count: 0 + description: Work Email Address + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Contact API + operationId: Work Email Lookup Endpoint + summary: Work Email Lookup Endpoint + /api/linkedin/job: + get: + description: 'Cost: 2 credits / successful request. + + Get structured data of a LinkedIn Job Profile' + parameters: + - in: query + name: url + required: true + description: + "\n URL of the LinkedIn Job Profile to target.\n\n URL\ + \ should be in the format of\n `https://www.linkedin.com/jobs/view/`.\n\ + \ [Jobs Listing Endpoint](#jobs-api-jobs-listing-endpoint)\n can be\ + \ used to retrieve a job URL.\n " + example: https://www.linkedin.com/jobs/view/3667167926/ + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/JobProfile' + example: + linkedin_internal_id: content-strategist-at-microsoft-3257696537 + job_description: + "The Global Demand Center (GDC) within the Cloud\ + \ Marketing group is leading the marketing transformation of Microsoft\u2019\ + s largest and fastest growing commercial businesses. Our always-on\ + \ integrated marketing programs work to nurture and acquire new\ + \ customers across segments, targeting business and technical audiences\ + \ across our commercial cloud portfolio, with programs available\ + \ in 42 markets and 30 languages. The GDC team is modernizing and\ + \ integrating these channels through advanced analytics, marketing\ + \ automation, and digital marketing. We are on a mission to drive\ + \ market share, consumption, and consistent double-digit+ revenue\ + \ growth. Content is the fuel that drives the digitally connected\ + \ customer journeys at the core of the GDC engine, and we\u2019\ + re looking for a skilled, self-motivated, data-driven content strategist\ + \ to build the content that motivates customers to take action.\ + \ The Content Strategist will develop and execute content strategies\ + \ for the ever-critical security space. You will be accountable\ + \ for understanding the business priorities, getting close to our\ + \ target audiences, defining the content journeys that attract,\ + \ nurture, inspire, and retain customers, and manage quality execution\ + \ and delivery of the content. You will work closely with your counterparts,\ + \ the integrated marketing strategists, to drive business outcomes.\ + \ Your network will include product marketers, integrated marketers,\ + \ relationship marketers, sales, engineering, and agency partners\ + \ to develop and execute on your plan. Our team: The Lifecycle Programs\ + \ team is a fast-paced digital marketing organization. We put a\ + \ focus on getting things done, simplifying anything and everything,\ + \ and having fun while doing it. We all believe in connecting with\ + \ customers at scale, supporting them at each stage of the customer\ + \ journey, from early awareness and consideration, through onboarding\ + \ and post purchase engagement. You will be in the middle of it\ + \ all helping to identify the right content that delivers what customers\ + \ want\u2014where they want it, when they want it, and how they\ + \ want it. \n \n**_Responsibilities \n_**\n * Define content\ + \ journeys for Security and IT professionals across industries.\n\ + \ * Build the resulting content strategies designed to accelerate\ + \ the customer through the lifecycle.\n * Create a content plan\ + \ to address the insights in the customer journey and strategy,\ + \ ensuring the content is aligned to what the customer needs at\ + \ each stage.\n * Deliver the content through our internal Studio\ + \ or with select agency partners.\n * Be a customer advocate. Relentlessly\ + \ champion the customer and the experiences they have with the content\ + \ you create\u2014how they find it, how they consume it, how they\ + \ use it to make decisions.\n * Leverage data and market insights\ + \ for decision making including content optimization and new concept\ + \ development. \n\n\n**_Qualifications \n \n_** **Required/Minimum\ + \ Qualifications \n**\n * Bachelor's Degree in Business, Marketing,\ + \ Communications, Economics, Public Relations, or related field\ + \ AND 1+ year(s) integrated marketing (e.g., digital, relationship,\ + \ social media, campaign), event management, marketing strategy,\ + \ business planning, marketing operations, or related work experience\n\ + \ * OR equivalent experience. \n\n\n**_Additional Or Preferred\ + \ Qualifications \n_**\n * Bachelor's Degree in Business, Marketing,\ + \ Communications, Economics, Public Relations, or related field\ + \ AND 3+ years integrated marketing (e.g., digital, relationship,\ + \ social media, campaign), event management, marketing strategy,\ + \ business planning, marketing operations, or related work experience\n\ + \ * OR equivalent experience.\n * Strong customer centric mindset\ + \ and demonstrated ability to put the customer first.\n * Clear\ + \ and persuasive communication skills, both written and verbal.\n\ + \ * Experience with program performance tracking and communications.\n\ + \ * Recognized as a self-starter with a bias for action.\n * Creative\ + \ problem-solving skills, and a growth mindset approach\n * Experience\ + \ managing across highly matrixed organizations, often with competing\ + \ priorities.\n * A demonstrated track record of business impact\ + \ through content\n * Well-versed in digital marketing best practices,\ + \ including journey mapping.\n * Understanding of content disciplines,\ + \ including SEO, content strategy, and execution.\n * Preferred,\ + \ but not required: experience with commercial technology sales\ + \ process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The\ + \ typical base pay range for this role across the U.S. is USD $80,900\ + \ - $162,200 per year. There is a different range applicable to\ + \ specific work locations, within the San Francisco Bay area and\ + \ New York City metropolitan area, and the base pay range for this\ + \ role in those locations is USD $105,300 - $176,900 per year. \ + \ \n \nMicrosoft has different base pay ranges for different work\ + \ locations within the United States, which allows us to pay employees\ + \ competitively and consistently in different geographic markets\ + \ (see below). The range above reflects the potential base pay across\ + \ the U.S. for this role (except as noted below); the applicable\ + \ base pay range will depend on what ultimately is determined to\ + \ be the candidate\u2019s primary work location. Individual base\ + \ pay depends on various factors, in addition to primary work location,\ + \ such as complexity and responsibility of role, job duties/requirements,\ + \ and relevant experience and skills. Base pay ranges are reviewed\ + \ and typically updated each year. Offers are made within the base\ + \ pay range applicable at the time. \n \nAt Microsoft certain\ + \ roles are eligible for additional rewards, including merit increases,\ + \ annual bonus and stock. These awards are allocated based on individual\ + \ performance. In addition, certain roles also have the opportunity\ + \ to earn sales incentives based on revenue or utilization, depending\ + \ on the terms of the plan and the employee\u2019s role. Benefits/perks\ + \ listed here may vary depending on the nature of employment with\ + \ Microsoft and the country work location. U.S.-based employees\ + \ have access to healthcare benefits, a 401(k) plan and company\ + \ match, short-term and long-term disability coverage, basic life\ + \ insurance, wellbeing benefits, paid vacation time, paid sick and\ + \ mental health time, and several paid holidays, among others. \ + \ \n \nOur commitment to pay equity \n \nWe are committed to\ + \ the principle of pay equity \u2013 paying employees equitably\ + \ for substantially similar work. To learn more about pay equity\ + \ and our other commitments to increase representation and strengthen\ + \ our culture of inclusion, check out our annual Diversity & Inclusion\ + \ Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report\ + \ ) \n \nUnderstanding roles at Microsoft \n \nThe top of\ + \ this page displays the role for which the base pay ranges apply\ + \ \u2013 Integrated Marketing IC3. The way we define roles includes\ + \ two things: discipline (the type of work) and career stage (scope\ + \ and complexity). The career stage has two parts \u2013 the first\ + \ identifies whether the role is a manager (M), an individual contributor\ + \ (IC), an admin-technician-retail (ATR) job, or an intern. The\ + \ second part identifies the relative seniority of the role \u2013\ + \ a higher number (or later letter alphabetically in the case of\ + \ ATR) indicates greater scope and complexity. \n \nMicrosoft\ + \ is an equal opportunity employer. All qualified applicants will\ + \ receive consideration for employment without regard to age, ancestry,\ + \ color, family or medical care leave, gender identity or expression,\ + \ genetic information, marital status, medical condition, national\ + \ origin, physical or mental disability, political affiliation,\ + \ protected veteran status, race, religion, sex (including pregnancy),\ + \ sexual orientation, or any other characteristic protected by applicable\ + \ laws, regulations and ordinances. We also consider qualified applicants\ + \ regardless of criminal histories, consistent with legal requirements.\ + \ If you need assistance and/or a reasonable accommodation due to\ + \ a disability during the application or the recruiting process,\ + \ please send a request via the Accommodation request form. \n\ + \ \nThe salary for this role in the state of Colorado is between\ + \ $108,200 and $162,200. \n \nAt Microsoft, certain roles are\ + \ eligible for additional rewards, including annual bonus and stock.\ + \ These awards are allocated based on individual performance. In\ + \ addition, certain roles also have the opportunity to earn sales\ + \ incentives based on revenue or utilization, depending on the terms\ + \ of the plan and the employee\u2019s role. Benefits/perks listed\ + \ below may vary depending on the nature of your employment with\ + \ Microsoft and the country where you work. \n" + apply_url: https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite + title: Content Strategist + location: + country: United States + region: Hawaii + city: null + postal_code: null + latitude: null + longitude: null + street: null + company: + name: Microsoft + url: https://www.linkedin.com/company/microsoft + logo: https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI + seniority_level: Mid-Senior level + industry: + - IT Services and IT Consulting, Computer Hardware Manufacturing, + and Software Development + employment_type: Full-time + job_functions: + - Marketing + total_applicants: 200 + description: Detailed job data + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Jobs API + operationId: Job Profile Endpoint + summary: Job Profile Endpoint + /api/followers: + get: + description: + 'Cost: 10 credits / result for users on an annual subscription + or Enterprise plan. + + Get a list of individual followers of a company.' + parameters: + - in: query + name: linkedin_company_profile_url + required: false + description: + "\n The LinkedIn Profile URL of the company from\ + \ which you want to get a list of followers of.\n\n URL should\ + \ be in the format of `https://www.linkedin.com/company/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://www.linkedin.com/company/henry-schein + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + "\n The Twitter/X Profile URL belonging to the\ + \ company that you want to get a list of followers of.\n\n \ + \ URL should be in the format of `https://x.com/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://x.com/henryschein + schema: + type: string + - in: query + name: page_size + required: false + description: + "\n Limit the maximum results of followers returned\ + \ per API call.\n\n The default value of this parameter is\ + \ 10.\n\n Accepted values for this parameter is an integer\ + \ ranging from 0 to 1000.\n " + example: '10' + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/FollowerList' + example: + followers: + - linkedin_profile_url: https://www.linkedin.com/in/agiliosoftware + twitter_profile_url: https://www.x.com/agilio_software + email: null + - linkedin_profile_url: https://www.linkedin.com/in/air-techniques + twitter_profile_url: https://www.x.com/airtechniques + email: null + next_page: null + description: A list of individual followers of the company + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Customer API `EXPERIMENTAL` + operationId: Follower Listing Endpoint `EXPERIMENTAL` + summary: Follower Listing Endpoint `EXPERIMENTAL` + /api/followers/count: + get: + description: + 'Cost: 1 credit / result for users on an annual subscription or + Enterprise plan. + + Get the count of followers of a company.' + parameters: + - in: query + name: linkedin_company_profile_url + required: false + description: + "\n The LinkedIn Profile URL of the company from\ + \ which you want to get a list of followers of.\n\n URL should\ + \ be in the format of `https://www.linkedin.com/company/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://www.linkedin.com/company/henry-schein + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + "\n The Twitter/X Profile URL belonging to the\ + \ company that you want to get a list of followers of.\n\n \ + \ URL should be in the format of `https://x.com/`\n\ + \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ + \ or `twitter_profile_url`)\n " + example: https://x.com/henryschein + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/FollowerListCount' + example: + follower_count: 74 + description: Count individuals of that company's followers + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Customer API `EXPERIMENTAL` + operationId: Follower Listing Count Endpoint `EXPERIMENTAL` + summary: Follower Listing Count Endpoint `EXPERIMENTAL` + /api/v2/search/company: + get: + description: + "Cost: 3 credits / result returned.\nSearch for companies that\ + \ meet a set of criteria within\n our exhaustive dataset of company profiles.\n\ + \n This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb),\ + \ our exhaustive dataset of company profiles.\n\n This API endpoint can\ + \ return at most of 10,000 results per search.\n\n Each search expression\ + \ for a parameter is limited to a maximum of 255 characters." + parameters: + - in: query + name: country + required: false + description: + "\n Filter companies with an office based in this\ + \ country.\n This parameter accepts a case-insensitive [Alpha-2\ + \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ + \ " + example: US + schema: + type: string + - in: query + name: region + required: false + description: + "\n Filter companies with an office based in this\ + \ country.\n This parameter accepts a case-insensitive [Alpha-2\ + \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ + \ " + example: United States + schema: + type: string + - in: query + name: city + required: false + description: + "\n Filter companies based in cities matching\ + \ the provided search expression.\n " + example: new AND york + schema: + type: string + - in: query + name: type + required: false + description: + "\n Filter companies of the provided LinkedIn\ + \ type.\n\n Possible values:\n\n * `EDUCATIONAL`:\ + \ Educational Institution\n * `GOVERNMENT_AGENCY`: Government\ + \ Agency\n * `NON_PROFIT` : Nonprofit\n *\ + \ `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately\ + \ Held\n * `PUBLIC_COMPANY` : Public Company\n \ + \ * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED`\ + \ : Sole Proprietorship\n " + example: PRIVATELY_HELD + schema: + type: string + - in: query + name: follower_count_min + required: false + description: + "\n Filter companies with a LinkedIn follower\ + \ count **more than** this value.\n " + example: '1000' + schema: + type: string + - in: query + name: follower_count_max + required: false + description: + "\n Filter companies with a LinkedIn follower\ + \ count **less than** this value.\n " + example: '1000' + schema: + type: string + - in: query + name: name + required: false + description: + "\n Filter companies with a name matching the\ + \ provided search expression.\n " + example: google OR apple + schema: + type: string + - in: query + name: industry + required: false + description: + "\n Filter companies belonging to an `industry`\ + \ that matches the provided search expression. The `industry` attribute,\ + \ found in a LinkedIn Company profile, describes the industry in which the\ + \ company operates. The value of this attribute is an enumerator. [This\ + \ CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n\ + \ " + example: technology + schema: + type: string + - in: query + name: employee_count_max + required: false + description: + "\n Filter companies with **at most** this many\ + \ employees.\n " + example: '1000' + schema: + type: string + - in: query + name: employee_count_min + required: false + description: + "\n Filter companies with **at least** this many\ + \ employees.\n " + example: '1000' + schema: + type: string + - in: query + name: description + required: false + description: + "\n Filter companies with a description matching\ + \ the provided search expression.\n " + example: medical device + schema: + type: string + - in: query + name: founded_after_year + required: false + description: + "\n Filter companies founded **after** this year.\n\ + \ " + example: '1999' + schema: + type: string + - in: query + name: founded_before_year + required: false + description: + "\n Filter companies founded **before** this year.\n\ + \ " + example: '1999' + schema: + type: string + - in: query + name: funding_amount_max + required: false + description: + "\n Filter companies that have raised **at most**\ + \ this much (USD) funding amount.\n " + example: '1000000' + schema: + type: string + - in: query + name: funding_amount_min + required: false + description: + "\n Filter companies that have raised **at least**\ + \ this much (USD) funding amount.\n " + example: '1000000' + schema: + type: string + - in: query + name: funding_raised_after + required: false + description: + "\n Filter companies that have raised funding\ + \ **after** this date.\n " + example: '2019-12-30' + schema: + type: string + - in: query + name: funding_raised_before + required: false + description: + "\n Filter companies that have raised funding\ + \ **before** this date.\n " + example: '2019-12-30' + schema: + type: string + - in: query + name: public_identifier_in_list + required: false + description: + "\n A list of public identifiers (the identifying\ + \ portion of the company\u2019s profile URL).\n The target\ + \ company\u2019s identifier must be a member of this list.\n \ + \ " + example: stripe,amazon + schema: + type: string + - in: query + name: public_identifier_not_in_list + required: false + description: + "\n A list of public identifiers (the identifying\ + \ portion of the company\u2019s profile URL).\n The target\ + \ company\u2019s identifier must **not** be a member of this list.\n \ + \ " + example: stripe,amazon + schema: + type: string + - in: query + name: page_size + required: false + description: + "\n Tune the maximum results returned per API\ + \ call.\n\n The default value of this parameter is 100.\n\ + \n Accepted values for this parameter is an integer ranging\ + \ from 1 to 100.\n\n When `enrich_profiles=enrich`, this\ + \ parameter accepts value ranging from `1` to `10`.\n " + example: '10' + schema: + type: string + - in: query + name: enrich_profiles + required: false + description: + "\n Get the company's complete profile data rather\ + \ than just the URLs to their LinkedIn profiles.\n\n Each\ + \ request respond with a streaming response of profiles.\n\n \ + \ The valid values are:\n\n - skip (default): lists company's\ + \ profile url\n - enrich: include company's profile data\ + \ in the list\n\n Calling this API endpoint with this parameter\ + \ would add 1 credit per result returned.\n " + example: enrich + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompanySearchResult' + example: + results: + - linkedin_profile_url: https://www.linkedin.com/company/apple/ + profile: + linkedin_internal_id: '1441' + description: + "A problem isn't truly solved until it's solved + for all. Googlers build products that help create opportunities + for everyone, whether down the street or across the globe. Bring + your insight, imagination and a healthy disregard for the impossible. + Bring everything that makes you unique. Together, we can build + for everyone. + + + Check out our career opportunities at careers.google.com." + website: https://goo.gle/3m1IN7m + industry: Software Development + company_size: + - 10001 + - null + company_size_on_linkedin: 319856 + hq: + country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + company_type: PUBLIC_COMPANY + founded_year: null + specialities: + - search + - ads + locations: + - country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + - country: US + city: New York + postal_code: '10011' + line_1: 111 8th Ave + is_hq: false + state: NY + name: Google + tagline: null + universal_name_id: google + profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca + background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 + search_id: '1441' + similar_companies: + - name: Amazon + link: https://www.linkedin.com/company/amazon + industry: Software Development + location: Seattle, WA + - name: Microsoft + link: https://www.linkedin.com/company/microsoft + industry: Software Development + location: Redmond, Washington + affiliated_companies: + - name: YouTube + link: https://www.linkedin.com/company/youtube + industry: Software Development + location: San Bruno, CA + - name: Google Cloud + link: https://www.linkedin.com/showcase/google-cloud + industry: Software Development + location: Mountain View, California + updates: + - article_link: null + image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE + posted_on: + day: 13 + month: 9 + year: 2022 + text: + "Want to kick start your #LifeAtGoogle but not sure where\ + \ to begin? Explore our Build Your Future site, where you\ + \ can learn about developmental programs, learn tips for future\ + \ interviews, sign up for informational events, and even hear\ + \ real stories from Googlers who\u2019ve been where you are\ + \ now. Get started \u2192 https://bit.ly/3SKPzQB" + total_likes: 4267 + - article_link: null + image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg + posted_on: null + text: + "Ariana, welcome to Google. Here\u2019s to a year full\ + \ of growth, learning, and experiences at #LifeAtGoogle! \U0001F389" + total_likes: 397 + follower_count: 27472792 + last_updated: '2023-10-26T11:34:30Z' + next_page: null + total_result_count: 1 + description: List of companies + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Search API + operationId: Company Search Endpoint + summary: Company Search Endpoint + /api/v2/search/person/: + get: + description: 'Cost: 3 credits / result returned. + + Search for people who meet a set of criteria within our exhaustive dataset + of people profiles. + + + This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), + our exhaustive dataset of people and company profiles. + + + This API endpoint can return at most 10,000 results per search. + + + Each search expression for a parameter is limited to a maximum of 255 characters.' + parameters: + - in: query + name: country + required: true + description: + "\n Filter people located in this country.\n \ + \ This parameter accepts a case-insensitive [Alpha-2 ISO3166\ + \ country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n \ + \ " + example: US + schema: + type: string + - in: query + name: first_name + required: false + description: + "\n Filter people whose first names match the\ + \ provided search expression.\n " + example: Sarah + schema: + type: string + - in: query + name: last_name + required: false + description: + "\n Filter people whose last names match the provided\ + \ search expression.\n " + example: Jackson OR Johnson + schema: + type: string + - in: query + name: education_field_of_study + required: false + description: + "\n Filter people with a field of study matching\ + \ the provided search expression, based on education history.\n \ + \ " + example: computer science + schema: + type: string + - in: query + name: education_degree_name + required: false + description: + "\n Filter people who earned a degree matching\ + \ the provided search expression, based on education history.\n \ + \ " + example: MBA + schema: + type: string + - in: query + name: education_school_name + required: false + description: + "\n Filter people who have attended a school whose\ + \ name matches the provided search expression, based on education history.\n\ + \ " + example: Caltech OR Massachusetts Institute of Technology + schema: + type: string + - in: query + name: education_school_linkedin_profile_url + required: false + description: + "\n Filter people who have attended a school with\ + \ a specific LinkedIn profile URL, based on education history.\n \ + \ " + example: https://www.linkedin.com/school/national-university-of-singapore/ + schema: + type: string + - in: query + name: current_role_title + required: false + description: + "\n Filter people who are **currently** working\ + \ as a role whose title matches the provided search expression. You'll be\ + \ looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that\ + \ show a person's current job. However, keep in mind that some of these\ + \ profiles may not be up-to-date, which means you might sometimes see a\ + \ person's old job instead of their current job on LinkedIn.\n \ + \ " + example: founder + schema: + type: string + - in: query + name: past_role_title + required: false + description: + "\n Filter people who have **in the past** worked\ + \ as a role whose title matches the provided search expression.\n \ + \ " + example: founder + schema: + type: string + - in: query + name: current_role_before + required: false + description: + "\n Filter people who started their current role\ + \ **before** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb)\ + \ that show a person's current job. However, keep in mind that some of these\ + \ profiles may not be up-to-date, which means you might sometimes see a\ + \ person's old job instead of their current job on LinkedIn.\n\n \ + \ This parameter takes a ISO8601 date. Default value of this parameter\ + \ is `null`.\n " + example: '2019-12-30' + schema: + type: string + - in: query + name: current_role_after + required: false + description: + "\n Filter people who started their current role\ + \ **after** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb)\ + \ that show a person's current job. However, keep in mind that some of these\ + \ profiles may not be up-to-date, which means you might sometimes see a\ + \ person's old job instead of their current job on LinkedIn.\n\n \ + \ This parameter takes a ISO8601 date. Default value of this parameter\ + \ is `null`.\n " + example: '2019-12-30' + schema: + type: string + - in: query + name: current_company_linkedin_profile_url + required: false + description: + "\n Filter people who are **currently** working\ + \ at a company represented by this LinkedIn Company Profile URL.\n\n \ + \ Default value of this parameter is `null`.\n \ + \ " + example: https://www.linkedin.com/company/apple + schema: + type: string + - in: query + name: past_company_linkedin_profile_url + required: false + description: + "\n Filter people who have **in the past** worked\ + \ at the company represented by this LinkedIn Company Profile URL.\n\n \ + \ This parameter takes a LinkedIn Company Profile URL. Default\ + \ value of this parameter is `null`.\n " + example: https://www.linkedin.com/company/apple + schema: + type: string + - in: query + name: current_job_description + required: false + description: + "\n Filter people with **current** job descriptions\ + \ matching the provided search expression.\n " + example: education + schema: + type: string + - in: query + name: past_job_description + required: false + description: + "\n Filter people with **past** job descriptions\ + \ matching the provided search expression.\n " + example: education + schema: + type: string + - in: query + name: current_company_name + required: false + description: + "\n Filter people who are **currently** working\ + \ at a company whose name matches the provided search expression.\n \ + \ " + example: Stripe OR Apple + schema: + type: string + - in: query + name: past_company_name + required: false + description: + "\n Filter people who **have previously** worked\ + \ at a company whose name matches the provided search expression.\n \ + \ " + example: Stripe OR Apple + schema: + type: string + - in: query + name: linkedin_groups + required: false + description: + "\n Filter people who are members of LinkedIn\ + \ groups whose names match the provided search expression.\n \ + \ " + example: haskell + schema: + type: string + - in: query + name: languages + required: false + description: + "\n Filter people who list a language matching\ + \ the provided search expression.\n " + example: Mandarin OR Chinese + schema: + type: string + - in: query + name: region + required: false + description: + "\n Filter people located in a region matching\ + \ the provided search expression.\n A \u201Cregion\u201D\ + \ in this context means \u201Cstate,\u201D \u201Cprovince,\u201D or similar\ + \ political division, depending on what country you\u2019re querying.\n\ + \ " + example: California + schema: + type: string + - in: query + name: city + required: false + description: + "\n Filter people located in a city matching the\ + \ provided search expression.\n " + example: Seattle OR Los Angeles + schema: + type: string + - in: query + name: headline + required: false + description: + "\n Filter people whose LinkedIn headline fields\ + \ match the provided search expression.\n " + example: founder + schema: + type: string + - in: query + name: summary + required: false + description: + "\n Filter people whose LinkedIn summary fields\ + \ match the provided search expression.\n " + example: founder + schema: + type: string + - in: query + name: industries + required: false + description: + "\n Person's inferred industry. May sometimes\ + \ exist when `current_company_industry` does not, but `current_company_industry`\ + \ should be preferred when it exists.\n " + example: automotive + schema: + type: string + - in: query + name: interests + required: false + description: + "\n Filter people whose Linkedin interest fields\ + \ match the provided search expression.\n " + example: technology + schema: + type: string + - in: query + name: skills + required: false + description: + "\n Filter people whose Linkedin skill fields\ + \ match the provided search expression.\n " + example: accounting + schema: + type: string + - in: query + name: current_company_country + required: false + description: + "\n Filter people who are currently working at\ + \ a company with an office based in this country.\n\n This\ + \ parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ + \ " + example: us + schema: + type: string + - in: query + name: current_company_region + required: false + description: + "\n Filter people who are currently working at\ + \ a company based in a region matching the provided search expression.\n\ + \ " + example: United States + schema: + type: string + - in: query + name: current_company_city + required: false + description: + "\n Filter people who are currently working at\ + \ a company based in a city matching the provided search expression.\n \ + \ " + example: Seattle OR Los Angeles + schema: + type: string + - in: query + name: current_company_type + required: false + description: + "\n Filter people who are currently working at\ + \ a company of the provided LinkedIn type.\n\n Possible values:\n\ + \n * `EDUCATIONAL`: Educational Institution\n \ + \ * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT`\ + \ : Nonprofit\n * `PARTNERSHIP` : Partnership\n \ + \ * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY`\ + \ : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n\ + \ * `SELF_OWNED` : Sole Proprietorship\n " + example: NON_PROFIT + schema: + type: string + - in: query + name: current_company_follower_count_min + required: false + description: + "\n Filter people who are currently working at\ + \ a company with a LinkedIn follower count **more than** this value.\n \ + \ " + example: '1000' + schema: + type: string + - in: query + name: current_company_follower_count_max + required: false + description: + "\n Filter people who are currently working at\ + \ a company with a LinkedIn follower count **less than** this value.\n \ + \ " + example: '1000' + schema: + type: string + - in: query + name: current_company_industry + required: false + description: + "\n Filter people who are currently working at\ + \ a company belonging to an `industry` that matches the provided search\ + \ expression. The `industry` attribute, found in a LinkedIn Company profile,\ + \ describes the industry in which the company operates. The value of this\ + \ attribute is an enumerator. [This CSV file provides an exhaustive list\ + \ of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n\ + \ " + example: higher AND education + schema: + type: string + - in: query + name: current_company_employee_count_min + required: false + description: + "\n Filter people who are currently working at\ + \ a company with **at least** this many employees.\n " + example: '1000' + schema: + type: string + - in: query + name: current_company_employee_count_max + required: false + description: + "\n Filter people who are currently working at\ + \ a company with **at most** this many employees.\n " + example: '1000' + schema: + type: string + - in: query + name: current_company_description + required: false + description: + "\n Filter people who are currently working at\ + \ a company with a description matching the provided search expression.\n\ + \ " + example: medical device + schema: + type: string + - in: query + name: current_company_founded_after_year + required: false + description: + "\n Filter people who are currently working at\ + \ a company that was founded **after** this year.\n " + example: '1999' + schema: + type: string + - in: query + name: current_company_founded_before_year + required: false + description: + "\n Filter people who are currently working at\ + \ a company that was founded **before** this year.\n " + example: '1999' + schema: + type: string + - in: query + name: current_company_funding_amount_min + required: false + description: + "\n Filter people who are currently working at\ + \ a company that has raised **at least** this much (USD) funding amount.\n\ + \ " + example: '1000000' + schema: + type: string + - in: query + name: current_company_funding_amount_max + required: false + description: + "\n Filter people who are currently working at\ + \ a company that has raised **at most** this much (USD) funding amount.\n\ + \ " + example: '1000000' + schema: + type: string + - in: query + name: current_company_funding_raised_after + required: false + description: + "\n Filter people who are currently working at\ + \ a company that has raised funding **after** this date.\n \ + \ " + example: '2019-12-30' + schema: + type: string + - in: query + name: current_company_funding_raised_before + required: false + description: + "\n Filter people who are currently working at\ + \ a company that has raised funding **before** this date.\n \ + \ " + example: '2019-12-30' + schema: + type: string + - in: query + name: public_identifier_in_list + required: false + description: + "\n A list of public identifiers (the identifying\ + \ portion of the person\u2019s profile URL).\n The target\ + \ person\u2019s identifier must be a member of this list.\n \ + \ " + example: williamhgates,johnrmarty + schema: + type: string + - in: query + name: public_identifier_not_in_list + required: false + description: + "\n A list of public identifiers (the identifying\ + \ portion of the person\u2019s profile URL).\n The target\ + \ person\u2019s identifier must **not** be a member of this list.\n \ + \ " + example: williamhgates,johnrmarty + schema: + type: string + - in: query + name: page_size + required: false + description: + "\n Tune the maximum results returned per API\ + \ call.\n\n The default value of this parameter is `100`.\n\ + \n Accepted values for this parameter is an integer ranging\ + \ from `1` to `100`.\n\n When `enrich_profiles=enrich`, this\ + \ parameter accepts value ranging from `1` to `10`.\n " + example: '10' + schema: + type: string + - in: query + name: enrich_profiles + required: false + description: + "\n Get the person's complete profile data rather\ + \ than just the URLs to their LinkedIn profiles.\n\n Each\ + \ request respond with a streaming response of profiles.\n\n \ + \ The valid values are:\n\n * `skip` (default): lists\ + \ person's profile url only\n * `enrich`: include person's\ + \ profile data in the list\n\n Calling this API endpoint\ + \ with this parameter would add `1` credit per result returned.\n \ + \ " + example: enrich + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PersonSearchResult' + example: + results: + - linkedin_profile_url: https://www.linkedin.com/in/johnrmarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: + Financial Freedom through Real Estate - LinkedIn Top + Voice + summary: + "Most people go through life lost, disengaged, and unhappy\ + \ at work and in their lives - I'm on a mission to solve that.\n\ + \nI spent 10 years as the founder of Axxis Audio, an electronics\ + \ company that grew to multi-million dollar sales, which I sold\ + \ in 2012. At that time, I funneled my earnings into the creation\ + \ of an Internet of Things company, but numerous factors lead\ + \ to its demise after 2 hard fought years. \n\nAt 31, I was\ + \ penny-less, had a baby on the way, and had zero job prospects\ + \ (despite applying to 150 companies). My desperate situation\ + \ led me to take a job at Best Buy for $12 an hour while reinventing\ + \ myself through the completion of an MBA at the University\ + \ of Colorado, and a 6-month software development boot camp.\ + \ \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because\ + \ of my LinkedIn profile). My journey has led to a deep sense\ + \ of perspective, humility, and purpose that I draw on to help\ + \ others find clarity, meaning, and happiness in their careers\ + \ and lives. \n\nCheck out my website for details on my Mindset\ + \ Reset Podcast, Public Speaking, Consulting, or my free 40\ + \ page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\n\ + FAQ's\n\nQ: Can you speak at my Company, University, event or\ + \ podcast?\nA: I'd love to! I've shared my message on the future\ + \ of employment, breaking into big tech, and my personal story\ + \ of reinventing myself and discovering my sense of purpose\ + \ (and how you can too!).\n\n\u2611\uFE0F YouTube Channel #1\ + \ (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers:\ + \ https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner,\ + \ and I just started learning to skateboard a half-pipe.\n\u2611\ + \uFE0F Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS\ + \ CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com (don't\ + \ forget that \"R\"....The other guy gets my emails all the\ + \ time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking + financial freedom long before the age of 65 with the ability + to invest in high yield, short-term real estate investments + that were only accessible in the past for a select few wealthy + individuals. Each of our single family rehab projects require + a minimum investment contribution of only $10K, we have simple + terms, no multi-year hold periods, and no fees. With our unique + model investors can log into our easy to use website, select + the projects that they want to invest in, and get realtime + updates on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s\ + \ foremost thought leaders and turn them into actionable insights\ + \ so that others can discover greater happiness, success,\ + \ and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, + api integration, Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: [] + accomplishment_publications: [] + accomplishment_honors_awards: [] + accomplishment_patents: [] + accomplishment_courses: [] + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the + Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails + integration to post a user's message content to the page in + real time, with no page refresh required. gMessenger also + includes custom authentication with three different permissions + levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app + utilizing Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: [] + volunteer_work: [] + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean + Practices in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: [] + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n\ + \ \n \n \n \n\ + \ \n\n \n John Marty is a genius at his craft.\ + \ He is skilled in the art of making people feel empowered to\ + \ seek out roles that they are qualified for, ask for salaries\ + \ that they deserve, and creates a kind of pay it forward lifestyle.\ + \ John helps you to get to places that you only thought were\ + \ possible for other people. Anyone that is fortunate enough\ + \ to learn from John should consider themselves extremely lucky.\ + \ I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n\ + \ \n John is so focused on helping guide you through\ + \ an interview process not just for Amazon but on interviewing\ + \ in general. I've generally done well at interviewing, my\ + \ skills are top notch now. John is so focused on on his clients\ + \ and really goes above and beyond. John is genuine, knowledgeable,\ + \ well spoken and non-judgemental. He is so encouraging, so\ + \ positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that\ + \ has a large 13K sq ft lot with two homes on it. After 5\ + \ minutes of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC\ + \ , Owner Marty\u2019s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: [] + groups: [] + last_updated: '2023-10-26T11:34:30Z' + next_page: null + total_result_count: 1 + description: LinkedIn (Person) Profile URL + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Search API + operationId: Person Search Endpoint + summary: Person Search Endpoint + /api/credit-balance: + get: + description: 'Cost: 0 credit / successful request. + + Get your current credit(s) balance' + parameters: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CreditBalance' + example: + credit_balance: 100000 + description: Balance of credits + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Meta API + operationId: View Credit Balance Endpoint + summary: View Credit Balance Endpoint + /api/disposable-email: + get: + description: 'Cost: 0 credit / successful request. + + Given an email address, checks if the email address belongs to a disposable + email service.' + parameters: + - in: query + name: email + required: true + description: Email address to check + example: steven@nubela.co + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/DisposableEmail' + example: + is_disposable_email: false + is_free_email: false + description: Disposable Email Check + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Contact API + operationId: Disposable Email Address Check Endpoint + summary: Disposable Email Address Check Endpoint + /api/contact-api/personal-contact: + get: + description: 'Cost: 1 credit / contact number returned. + + Find personal phone numbers associated with a given social media profile.' + parameters: + - in: query + name: page_size + required: false + description: + "\n This controls the maximum number of numbers returned per\ + \ API call.\n It's useful for limiting credit consumption as the number\ + \ of numbers\n per identity can vary. The default value is 0, meaning\ + \ there's no limit\n to the number of returned results.\n " + example: '0' + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + "\n The Twitter/X Profile URL from which you wish to extract\ + \ personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n\ + \ `twitter_profile_url`, or `facebook_profile_url`)\n " + example: https://x.com/proxycurl + schema: + type: string + - in: query + name: facebook_profile_url + required: false + description: + "\n The Facebook Profile URL from which you wish to extract\ + \ personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n\ + \ `twitter_profile_url`, or `facebook_profile_url`)\n " + example: https://www.facebook.com/zuck + schema: + type: string + - in: query + name: linkedin_profile_url + required: false + description: + "\n The LinkedIn Profile URL from which you wish to extract\ + \ personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n\ + \ `twitter_profile_url`, or `facebook_profile_url`)\n " + example: https://linkedin.com/in/steven-goh-6738131b + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PersonalContactNumbers' + example: + numbers: + - '+1123123123' + description: List of Personal Contact Numbers + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Contact API + operationId: Personal Contact Number Lookup Endpoint + summary: Personal Contact Number Lookup Endpoint + /api/contact-api/personal-email: + get: + description: 'Cost: 1 credit / email returned. + + Find personal email addresses associated with a given social media profile.' + parameters: + - in: query + name: email_validation + required: false + description: + "\n How to validate each email.\n \n Takes the following\ + \ values:\n * `none` (default) - Do not perform email validation.\n\ + \ * `fast` - Perform fast email validation (does not cost extra credit).\n\ + \ * `precise` - Perform deliverability validation (costs 1 extra credit\ + \ per email found).\n\n For backward-compatibility these are also accepted:\n\ + \ * `include` - Equivalent to `precise`\n * `exclude` - Equivalent\ + \ to `none`\n " + example: include + schema: + type: string + - in: query + name: page_size + required: false + description: + This controls the maximum number of emails returned per API call. + It's useful for limiting credit consumption as the number of emails per + identity can vary. The default value is `0`, meaning there's no limit to + the number of returned results. + example: 0 + schema: + type: string + - in: query + name: twitter_profile_url + required: false + description: + 'The Twitter/X Profile URL from which you wish to extract personal + email addresses. + + yes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, + or `facebook_profile_url`)' + example: https://x.com/proxycurl + schema: + type: string + - in: query + name: facebook_profile_url + required: false + description: + 'The Facebook Profile URL from which you wish to extract personal + email addresses. + + yes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, + or `facebook_profile_url`)' + example: https://www.facebook.com/zuck + schema: + type: string + - in: query + name: linkedin_profile_url + required: false + description: + 'The LinkedIn Profile URL from which you wish to extract personal + email addresses. + + yes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, + or `facebook_profile_url`)' + example: https://linkedin.com/in/steven-goh-6738131b + schema: + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/PDLEmailResult' + example: + emails: + - random@gmail.com + - random2@yahoo.com + invalid_emails: + - random3@gmail.com + description: List of Personal Emails + '400': + description: + Invalid parameters provided. Refer to the documentation and + message body for more info + '401': + description: Invalid API key + '403': + description: You have run out of credits + '404': + description: + 'The requested resource (e.g: user profile, company) could + not be found' + '429': + description: Rate limited. Please retry + '500': + description: Internal Server Error + '503': + description: Enrichment failed, please retry. + tags: + - Contact API + operationId: Personal Email Lookup Endpoint + summary: Personal Email Lookup Endpoint +info: + title: Proxycurl API + version: 1.0.0 +openapi: 3.0.0 +components: + schemas: + CompanyLocation: + type: object + properties: + country: + type: string + nullable: true + city: + type: string + nullable: true + postal_code: + type: string + nullable: true + line_1: + type: string + nullable: true + is_hq: + type: boolean + state: + type: string + nullable: true + example: &id002 + country: SG + city: Singapore + postal_code: '119077' + line_1: 21 Lower Kent Ridge Road, Singapore + is_hq: true + state: null + CompanyType: + type: string + enum: + - EDUCATIONAL + - GOVERNMENT_AGENCY + - NON_PROFIT + - PARTNERSHIP + - PRIVATELY_HELD + - PUBLIC_COMPANY + - SELF_EMPLOYED + - SELF_OWNED + SimilarCompany: + type: object + properties: + name: + type: string + nullable: true + link: + type: string + nullable: true + industry: + type: string + nullable: true + location: + type: string + nullable: true + example: &id003 + name: NUS Business School + link: https://www.linkedin.com/school/nus-business-school/ + industry: Higher Education + location: null + AffiliatedCompany: + type: object + properties: + name: + type: string + nullable: true + link: + type: string + nullable: true + industry: + type: string + nullable: true + location: + type: string + nullable: true + example: &id004 + name: LinkedIn + link: https://www.linkedin.com/company/linkedin + industry: Internet + location: Sunnyvale, California + Date: + type: object + properties: + day: + type: integer + nullable: true + month: + type: integer + nullable: true + year: + type: integer + example: &id001 + day: 30 + month: 9 + year: 2021 + CompanyUpdate: + type: object + properties: + article_link: + type: string + nullable: true + description: The URL for which the post links out to + image: + type: string + nullable: true + description: The URL to the image to the post (if it exists) + posted_on: + $ref: '#/components/schemas/Date' + nullable: true + text: + type: string + nullable: true + description: The body of the update + total_likes: + type: integer + nullable: true + description: The total likes a post has received + example: &id005 + article_link: https://lnkd.in/gr7cb5by + image: https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c + posted_on: *id001 + text: Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by + total_likes: 3 + LinkedinSchool: + type: object + properties: + linkedin_internal_id: + type: string + description: + "\n LinkedIn's Internal and immutable ID of this Company\ + \ profile.\n " + description: + type: string + nullable: true + description: A textual description of the company. + website: + type: string + nullable: true + description: The URL of the company's website. + industry: + type: string + nullable: true + description: + The `industry` attribute, found in a LinkedIn Company profile, + describes the industry in which the company operates. The value + of this attribute is an enumerator. [This CSV file provides + an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link). + company_size: + type: array + items: + oneOf: + - type: integer + nullable: true + - type: integer + nullable: true + minItems: 2 + maxItems: 2 + description: Sequenceed range of company head count + company_size_on_linkedin: + type: integer + nullable: true + description: The size of the company as indicated on LinkedIn. + hq: + $ref: '#/components/schemas/CompanyLocation' + nullable: true + company_type: + $ref: '#/components/schemas/CompanyType' + nullable: true + description: + "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\ + \n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT`\ + \ : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`:\ + \ Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n \ + \ `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" + founded_year: + type: integer + nullable: true + description: The year the company was founded. + specialities: + type: array + items: + type: string + description: "\n A list of specialities.\n " + locations: + type: array + items: + $ref: '#/components/schemas/CompanyLocation' + name: + type: string + nullable: true + description: The name of the company. + tagline: + type: string + nullable: true + description: + A short, catchy phrase that represents the company's + mission or brand. + universal_name_id: + type: string + nullable: true + description: + A unique numerical identifier for the company + used in the LinkedIn platform. + profile_pic_url: + type: string + nullable: true + description: The URL of the company's profile picture. + background_cover_image_url: + type: string + nullable: true + description: The URL of the company's background cover image. + search_id: + type: string + description: + "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n\ + \ " + similar_companies: + type: array + items: + $ref: '#/components/schemas/SimilarCompany' + affiliated_companies: + type: array + items: + $ref: '#/components/schemas/AffiliatedCompany' + updates: + type: array + items: + $ref: '#/components/schemas/CompanyUpdate' + description: + A list of post updates made by the company. This field is not + guaranteed to be returned. Do not rely on this attribute in production. + follower_count: + type: integer + nullable: true + description: The number of followers the company has on LinkedIn. + example: + linkedin_internal_id: '5524' + description: + "At NUS, we are shaping the future through our people and our\ + \ pursuit of new frontiers in knowledge. In a single century, we have become\ + \ a university of global influence and an Asian thought leader. Our location\ + \ at the crossroads of Asia informs our mission and gives us a tremendous\ + \ vantage point to help create opportunities and address the pressing issues\ + \ facing Singapore, Asia and the world.\r\rAt NUS, we believe in education,\ + \ research and service that change lives." + website: http://nus.edu.sg + industry: Higher Education + company_size: + - 5001 + - 10000 + company_size_on_linkedin: 16084 + hq: *id002 + company_type: EDUCATIONAL_INSTITUTION + founded_year: 1905 + specialities: + - education + - research + locations: + - country: SG + city: Singapore + postal_code: '119077' + line_1: 21 Lower Kent Ridge Road, Singapore + is_hq: true + state: null + name: National University of Singapore + tagline: Think Different - But Not Too Different + universal_name_id: national-university-of-singapore + profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24 + background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140 + search_id: '5524' + similar_companies: + - *id003 + - name: NUS Faculty of Arts and Social Sciences + link: https://www.linkedin.com/school/nusfass/ + industry: Higher Education + location: null + affiliated_companies: + - *id004 + updates: + - *id005 + follower_count: 539321 + AcquiredCompany: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: + "\n LinkedIn Company Profile URL of company that was\ + \ involved\n " + crunchbase_profile_url: + type: string + nullable: true + description: Crunchbase Profile URL of company that was involved + announced_date: + $ref: '#/components/schemas/Date' + nullable: true + description: Date by which this event was announced + price: + type: integer + nullable: true + description: Price of acquisition + example: &id006 + linkedin_profile_url: https://www.linkedin.com/company/apple + crunchbase_profile_url: https://www.crunchbase.com/organization/apple + announced_date: + day: 1 + month: 4 + year: 1976 + price: 300000000 + Acquisitor: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: + "\n LinkedIn Company Profile URL of company that was\ + \ involved\n " + crunchbase_profile_url: + type: string + nullable: true + description: Crunchbase Profile URL of company that was involved + announced_date: + $ref: '#/components/schemas/Date' + nullable: true + description: Date by which this event was announced + price: + type: integer + nullable: true + description: Price of acquisition + example: &id007 + linkedin_profile_url: https://www.linkedin.com/company/nvidia + crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia + announced_date: + day: 6 + month: 3 + year: 2020 + price: 10000 + Acquisition: + type: object + properties: + acquired: + type: array + items: + $ref: '#/components/schemas/AcquiredCompany' + acquired_by: + $ref: '#/components/schemas/Acquisitor' + nullable: true + example: &id009 + acquired: + - *id006 + acquired_by: *id007 + Exit: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: LinkedIn Profile URL of the company that has exited + crunchbase_profile_url: + type: string + nullable: true + description: Crunchbase Profile URL of the company that has exited + name: + type: string + nullable: true + description: Name of the company + example: &id010 + linkedin_profile_url: https://www.linkedin.com/company/motiondsp + crunchbase_profile_url: https://www.crunchbase.com/organization/motiondsp + name: MotionDSP + CompanyDetails: + type: object + properties: + crunchbase_profile_url: + type: string + nullable: true + description: Crunchbase Profile URL of the company + ipo_status: + type: string + nullable: true + description: IPO status of the company + crunchbase_rank: + type: integer + nullable: true + description: A measure of prominence of this company by Crunchbase + founding_date: + $ref: '#/components/schemas/Date' + nullable: true + description: Date of founding + operating_status: + type: string + nullable: true + description: Status of the company's operational status + company_type: + type: string + nullable: true + description: Type of company + contact_email: + type: string + nullable: true + description: General contact email of the company + phone_number: + type: string + nullable: true + description: General contact number of the company + facebook_id: + type: string + nullable: true + description: ID of the company's official Facebook account + twitter_id: + type: string + nullable: true + description: ID of the company's official Twitter account + number_of_funding_rounds: + type: integer + nullable: true + description: Total rounds of funding that this company has raised + total_funding_amount: + type: integer + nullable: true + description: Total venture capital raised by this company + stock_symbol: + type: string + nullable: true + description: Stock symbol of this public company + ipo_date: + $ref: '#/components/schemas/Date' + nullable: true + description: The date by which this public company went public + number_of_lead_investors: + type: integer + nullable: true + description: Total lead investors + number_of_investors: + type: integer + nullable: true + description: Total investors + total_fund_raised: + type: integer + nullable: true + description: + "\n The total amount of funds raised (by this VC firm)\ + \ to be deployed as\n subsidiary investments (applicable only for\ + \ VC firms)\n " + number_of_investments: + type: integer + nullable: true + description: + "\n Total investments made by this VC firm (applicable\ + \ only for VC firms)\n " + number_of_lead_investments: + type: integer + nullable: true + description: + "\n Total investments that was led by this VC firm\n\ + \ (applicable only for VC firms)\n " + number_of_exits: + type: integer + nullable: true + description: Total exits by this VC (applicable only for VC firms) + number_of_acquisitions: + type: integer + nullable: true + description: Total companies acquired by this company + example: &id011 + crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia + ipo_status: Public + crunchbase_rank: 13 + founding_date: + day: 1 + month: 1 + year: 2000 + operating_status: Active + company_type: For Profit + contact_email: info@nvidia.com + phone_number: (140) 848-6200 + facebook_id: NVIDIA.IN + twitter_id: nvidia + number_of_funding_rounds: 3 + total_funding_amount: 4000000 + stock_symbol: NASDAQ:NVDA + ipo_date: + day: 1 + month: 1 + year: 2000 + number_of_lead_investors: 3 + number_of_investors: 4 + total_fund_raised: 1000 + number_of_investments: 50 + number_of_lead_investments: 3 + number_of_exits: 7 + number_of_acquisitions: 2 + Investor: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: LinkedIn Profile URL of investor + name: + type: string + nullable: true + description: Name of investor + type: + type: string + nullable: true + description: Type of investor + example: &id008 + linkedin_profile_url: https://linkedin.com/company/darpa + name: DARPA + type: organization + Funding: + type: object + properties: + funding_type: + type: string + nullable: true + description: Type of funding + money_raised: + type: integer + nullable: true + description: Amount of money raised + announced_date: + $ref: '#/components/schemas/Date' + nullable: true + description: Date of announcement + number_of_investor: + type: integer + nullable: true + description: Number of investors in this round + investor_list: + type: array + items: + $ref: '#/components/schemas/Investor' + nullable: true + example: &id012 + funding_type: Grant + money_raised: 25000000 + announced_date: + day: 1 + month: 1 + year: 2001 + number_of_investor: 1 + investor_list: + - *id008 + LinkedinCompany: + type: object + properties: + linkedin_internal_id: + type: string + description: + "\n LinkedIn's Internal and immutable ID of this Company\ + \ profile.\n " + description: + type: string + nullable: true + description: A textual description of the company. + website: + type: string + nullable: true + description: The URL of the company's website. + industry: + type: string + nullable: true + description: + The `industry` attribute, found in a LinkedIn Company profile, + describes the industry in which the company operates. The value + of this attribute is an enumerator. [This CSV file provides + an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link). + company_size: + type: array + items: + oneOf: + - type: integer + nullable: true + - type: integer + nullable: true + minItems: 2 + maxItems: 2 + description: Sequenceed range of company head count + company_size_on_linkedin: + type: integer + nullable: true + description: The size of the company as indicated on LinkedIn. + hq: + $ref: '#/components/schemas/CompanyLocation' + nullable: true + company_type: + $ref: '#/components/schemas/CompanyType' + nullable: true + description: + "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\ + \n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT`\ + \ : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`:\ + \ Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n \ + \ `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" + founded_year: + type: integer + nullable: true + description: The year the company was founded. + specialities: + type: array + items: + type: string + description: "\n A list of specialities.\n " + locations: + type: array + items: + $ref: '#/components/schemas/CompanyLocation' + name: + type: string + nullable: true + description: The name of the company. + tagline: + type: string + nullable: true + description: + A short, catchy phrase that represents the company's + mission or brand. + universal_name_id: + type: string + nullable: true + description: + A unique numerical identifier for the company + used in the LinkedIn platform. + profile_pic_url: + type: string + nullable: true + description: The URL of the company's profile picture. + background_cover_image_url: + type: string + nullable: true + description: The URL of the company's background cover image. + search_id: + type: string + description: + "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n\ + \ " + similar_companies: + type: array + items: + $ref: '#/components/schemas/SimilarCompany' + affiliated_companies: + type: array + items: + $ref: '#/components/schemas/AffiliatedCompany' + updates: + type: array + items: + $ref: '#/components/schemas/CompanyUpdate' + description: + A list of post updates made by the company. This field is not + guaranteed to be returned. Do not rely on this attribute in production. + follower_count: + type: integer + nullable: true + description: The number of followers the company has on LinkedIn. + acquisitions: + $ref: '#/components/schemas/Acquisition' + nullable: true + exit_data: + type: array + items: + $ref: '#/components/schemas/Exit' + nullable: true + extra: + $ref: '#/components/schemas/CompanyDetails' + nullable: true + description: Company extra when `extra=include` + funding_data: + type: array + items: + $ref: '#/components/schemas/Funding' + description: Company Funding data when `funding_data=include` + categories: + type: array + items: + type: string + nullable: true + description: + The `categories` attribute is fetched from the company's + Crunchbase profile. Values for this attribute are free-form + text, and there is no exhaustive list of categories. Consider + the categories attribute as "hints" regarding the products + or services offered by the company. + customer_list: + type: array + items: + type: string + nullable: true + example: + linkedin_internal_id: '1441' + description: + "A problem isn't truly solved until it's solved for all. Googlers + build products that help create opportunities for everyone, whether down + the street or across the globe. Bring your insight, imagination and a healthy + disregard for the impossible. Bring everything that makes you unique. Together, + we can build for everyone. + + + Check out our career opportunities at careers.google.com." + website: https://goo.gle/3m1IN7m + industry: Software Development + company_size: + - 10001 + - null + company_size_on_linkedin: 319856 + hq: + country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + company_type: PUBLIC_COMPANY + founded_year: null + specialities: + - search + - ads + locations: + - country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + - country: US + city: New York + postal_code: '10011' + line_1: 111 8th Ave + is_hq: null + state: NY + name: Google + tagline: Think Different - But Not Too Different + universal_name_id: google + profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca + background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 + search_id: '1441' + similar_companies: + - name: Amazon + link: https://www.linkedin.com/company/amazon + industry: Software Development + location: Seattle, WA + - name: Microsoft + link: https://www.linkedin.com/company/microsoft + industry: Software Development + location: Redmond, Washington + affiliated_companies: + - name: YouTube + link: https://www.linkedin.com/company/youtube + industry: Software Development + location: San Bruno, CA + - name: Google Cloud + link: https://www.linkedin.com/showcase/google-cloud + industry: Software Development + location: Mountain View, California + updates: + - article_link: null + image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE + posted_on: + day: 13 + month: 9 + year: 2022 + text: + "Want to kick start your #LifeAtGoogle but not sure where to begin?\ + \ Explore our Build Your Future site, where you can learn about developmental\ + \ programs, learn tips for future interviews, sign up for informational\ + \ events, and even hear real stories from Googlers who\u2019ve been where\ + \ you are now. Get started \u2192 https://bit.ly/3SKPzQB" + total_likes: 4267 + - article_link: null + image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg + posted_on: null + text: + "Ariana, welcome to Google. Here\u2019s to a year full of growth,\ + \ learning, and experiences at #LifeAtGoogle! \U0001F389" + total_likes: 397 + follower_count: 27472792 + acquisitions: *id009 + exit_data: + - *id010 + extra: *id011 + funding_data: + - *id012 + categories: + - artificial-intelligence + - virtual-reality + Experience: + type: object + properties: + starts_at: + $ref: '#/components/schemas/Date' + nullable: true + ends_at: + $ref: '#/components/schemas/Date' + nullable: true + company: + type: string + nullable: true + description: The company's display name. + company_linkedin_profile_url: + type: string + nullable: true + description: + "\n The company's profile URL on Linkedin.\n \ + \ If present, could be used with \n [Company Profile\ + \ Endpoint](#company-api-company-profile-endpoint) for more info.\n \ + \ " + company_facebook_profile_url: + type: string + nullable: true + description: + "\n The company's profile URL on Facebook.\n \ + \ " + title: + type: string + nullable: true + description: + type: string + nullable: true + location: + type: string + nullable: true + logo_url: + type: string + nullable: true + description: URL of the logo of the organisation. + example: &id013 + starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking financial + freedom long before the age of 65 with the ability to invest in high yield, + short-term real estate investments that were only accessible in the past + for a select few wealthy individuals. Each of our single family rehab projects + require a minimum investment contribution of only $10K, we have simple terms, + no multi-year hold periods, and no fees. With our unique model investors + can log into our easy to use website, select the projects that they want + to invest in, and get realtime updates on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + Education: + type: object + properties: + starts_at: + $ref: '#/components/schemas/Date' + nullable: true + ends_at: + $ref: '#/components/schemas/Date' + nullable: true + field_of_study: + type: string + nullable: true + degree_name: + type: string + nullable: true + school: + type: string + nullable: true + school_linkedin_profile_url: + type: string + nullable: true + school_facebook_profile_url: + type: string + nullable: true + description: + "\n The school's profile URL on Facebook.\n \ + \ " + description: + type: string + nullable: true + logo_url: + type: string + nullable: true + grade: + type: string + activities_and_societies: + type: string + example: &id014 + starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + AccomplishmentOrg: + type: object + properties: + starts_at: + $ref: '#/components/schemas/Date' + nullable: true + ends_at: + $ref: '#/components/schemas/Date' + nullable: true + org_name: + type: string + nullable: true + title: + type: string + nullable: true + description: + type: string + nullable: true + example: &id015 + starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + Publication: + type: object + properties: + name: + type: string + nullable: true + description: Name of the publication. + publisher: + type: string + nullable: true + description: The publishing organisation body. + published_on: + $ref: '#/components/schemas/Date' + nullable: true + description: Date of publication. + description: + type: string + nullable: true + description: Description of the publication. + url: + type: string + nullable: true + description: URL of the publication. + example: &id016 + name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + HonourAward: + type: object + properties: + title: + type: string + nullable: true + description: Title of the honour/award. + issuer: + type: string + nullable: true + description: The organisation body issuing this honour/award. + issued_on: + $ref: '#/components/schemas/Date' + nullable: true + description: Date that this honour/awared was issued. + description: + type: string + nullable: true + description: Description of the honour/award. + example: &id017 + title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + Patent: + type: object + properties: + title: + type: string + nullable: true + description: Title of the patent. + issuer: + type: string + nullable: true + description: The organisation body that issued the patent. + issued_on: + $ref: '#/components/schemas/Date' + nullable: true + description: Date of patent issuance. + description: + type: string + nullable: true + description: Description of the patent. + application_number: + type: string + nullable: true + description: Numerical representation that identifies the patent. + patent_number: + type: string + nullable: true + description: Application number of the patent. + url: + type: string + nullable: true + example: &id018 + title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + Course: + type: object + properties: + name: + type: string + nullable: true + description: Name of the course + number: + type: string + nullable: true + description: The numerical representation of the course + example: &id019 + name: The course about ABCs + number: '123' + Project: + type: object + properties: + starts_at: + $ref: '#/components/schemas/Date' + nullable: true + ends_at: + $ref: '#/components/schemas/Date' + nullable: true + title: + type: string + nullable: true + description: + "\n Name of the project that has been or is\ + \ currently being worked on.\n " + description: + type: string + nullable: true + description: Description of the project. + url: + type: string + nullable: true + description: A web location related to the project. + example: &id020 + starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap HTML, + CSS, and JavaScript framework. It uses a Websocket-Rails integration to + post a user's message content to the page in real time, with no page refresh + required. gMessenger also includes custom authentication with three different + permissions levels. + url: http://gmessenger.herokuapp.com/ + TestScore: + type: object + properties: + name: + type: string + nullable: true + description: + "\n Title of the course for which test score\ + \ was derived from.\n " + score: + type: string + nullable: true + description: Test score + date_on: + $ref: '#/components/schemas/Date' + nullable: true + description: Date of test was assesed. + description: + type: string + nullable: true + description: Description of the test score. + example: &id021 + name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + VolunteeringExperience: + type: object + properties: + starts_at: + $ref: '#/components/schemas/Date' + nullable: true + ends_at: + $ref: '#/components/schemas/Date' + nullable: true + title: + type: string + nullable: true + description: Name of volunteer activity. + cause: + type: string + nullable: true + company: + type: string + nullable: true + description: The company's display name. + company_linkedin_profile_url: + type: string + nullable: true + description: + "\n The company's profile URL.\n If present,\ + \ could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint)\ + \ for more info.\n " + description: + type: string + nullable: true + logo_url: + type: string + nullable: true + description: URL of the logo of the organisation. + example: &id022 + starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + Certification: + type: object + properties: + starts_at: + $ref: '#/components/schemas/Date' + nullable: true + ends_at: + $ref: '#/components/schemas/Date' + nullable: true + name: + type: string + nullable: true + description: Name of the course or program. + license_number: + type: string + nullable: true + display_source: + type: string + nullable: true + authority: + type: string + nullable: true + description: The organisation body issuing this certificate. + url: + type: string + nullable: true + example: &id023 + starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices + in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + PeopleAlsoViewed: + type: object + properties: + link: + type: string + nullable: true + description: + "\n URL of the profile.\n Useable with\ + \ [Person profile endpoint](#people-api-person-profile-endpoint)\n \ + \ " + name: + type: string + nullable: true + summary: + type: string + nullable: true + location: + type: string + nullable: true + example: &id024 + link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + Activity: + type: object + properties: + title: + type: string + nullable: true + link: + type: string + nullable: true + activity_status: + type: string + nullable: true + example: &id025 + title: + "Yesterday I toured a $1.2M property in California that has a large\ + \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + SimilarProfile: + type: object + properties: + name: + type: string + nullable: true + link: + type: string + nullable: true + summary: + type: string + nullable: true + location: + type: string + nullable: true + example: &id026 + name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ + s Hardwood Works" + location: San Antonio, TX + Article: + type: object + properties: + title: + type: string + nullable: true + link: + type: string + nullable: true + published_date: + $ref: '#/components/schemas/Date' + nullable: true + author: + type: string + nullable: true + image_url: + type: string + nullable: true + example: &id027 + title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + PersonGroup: + type: object + properties: + profile_pic_url: + type: string + nullable: true + description: The URL to the profile picture of this LinkedIn Group + name: + type: string + nullable: true + description: Name of LinkedIn group for which this user is in + url: + type: string + nullable: true + description: URL to the LinkedIn Group + example: &id028 + profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + InferredSalary: + type: object + properties: + min: + type: number + nullable: true + max: + type: number + nullable: true + example: &id029 + min: 35000 + max: 45000 + PersonExtra: + type: object + properties: + github_profile_id: + type: string + nullable: true + description: This profile's Github account. + facebook_profile_id: + type: string + nullable: true + description: This profile's Facebook account. + twitter_profile_id: + type: string + nullable: true + description: This profile's twitter account. + website: + type: string + nullable: true + description: This account's website listed on his profile. + example: &id030 + github_profile_id: github-username + facebook_profile_id: facebook-username + twitter_profile_id: twitter-username + website: https://proxycurl.com + PersonEndpointResponse: + type: object + properties: + public_identifier: + type: string + nullable: true + description: + "\n The vanity identifier of the public LinkedIn\ + \ profile.\n The vanity identifier comes after the `/in/`\ + \ part of the LinkedIn Profile URL\n in the following format:\ + \ `https://www.linkedin.com/in/`\n " + profile_pic_url: + type: string + description: + "\n A temporary link to the user's profile picture\ + \ that is valid for 30 minutes. \n The temporal nature\ + \ of the link is by design to prevent having Proxycurl be the mirror for\ + \ the images.\n The developer is expected to handle these\ + \ images by downloading the image and re-hosting the image.\n \ + \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ + \ for context.\n Some profile pictures might be of the\ + \ standard LinkedIn's profile picture placeholder. It is so because. See\ + \ [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/)\ + \ for context.\n " + background_cover_image_url: + type: string + nullable: true + description: + "\n A temporary link to the user's background\ + \ cover picture\n that is valid for 30 minutes.\n \ + \ The temporal nature of the link is by design to prevent\n\ + \ having Proxycurl be the mirror for the images.\n \ + \ The developer is expected to handle these images \n \ + \ by downloading the image and re-hosting the image. \n \ + \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ + \ for context.\n " + first_name: + type: string + nullable: true + description: First name of the user. + last_name: + type: string + nullable: true + description: Last name of the user. + full_name: + type: string + nullable: true + description: + "\n Full name of the user (`first_name` + `last_name`)\n\ + \ " + follower_count: + type: integer + description: Follower count for this profile + occupation: + type: string + nullable: true + description: + "\n The title and company name of the user's\ + \ current employment.\n " + headline: + type: string + nullable: true + description: + "\n The tagline written by the user for his\ + \ profile.\n " + summary: + type: string + nullable: true + description: + "\n A blurb (longer than the tagline) written\ + \ by the user for his profile.\n " + country: + type: string + nullable: true + description: + "\n The user's country of residence depicted\ + \ by\n a 2-letter country code (ISO 3166-1 alpha-2).\n\ + \ " + country_full_name: + type: string + nullable: true + description: The user's country of residence, in English words. + city: + type: string + nullable: true + description: The city that the user is living at. + state: + type: string + nullable: true + description: The state that the user is living at. + experiences: + type: array + items: + $ref: '#/components/schemas/Experience' + description: The user's list of historic work experiences. + education: + type: array + items: + $ref: '#/components/schemas/Education' + description: The user's list of education background. + languages: + type: array + items: + type: string + description: + "\n A list of languages that the user claims\ + \ to be familiar with,\n and has added to his/her profile.\n\ + \ Do note that we do not have the proficiency level as\n\ + \ that data point is not available on a public LinkedIn\ + \ profile.\n " + accomplishment_organisations: + type: array + items: + $ref: '#/components/schemas/AccomplishmentOrg' + description: + "\n List of noteworthy organizations that this\ + \ user is part of.\n " + accomplishment_publications: + type: array + items: + $ref: '#/components/schemas/Publication' + description: + "\n List of noteworthy publications that this\ + \ user has partook in.\n " + accomplishment_honors_awards: + type: array + items: + $ref: '#/components/schemas/HonourAward' + description: + "\n List of noteworthy honours and awards that\ + \ this user has won.\n " + accomplishment_patents: + type: array + items: + $ref: '#/components/schemas/Patent' + description: List of noteworthy patents won by this user. + accomplishment_courses: + type: array + items: + $ref: '#/components/schemas/Course' + description: List of noteworthy courses partook by this user. + accomplishment_projects: + type: array + items: + $ref: '#/components/schemas/Project' + description: + "\n List of noteworthy projects undertaken by\ + \ this user.\n " + accomplishment_test_scores: + type: array + items: + $ref: '#/components/schemas/TestScore' + description: + "\n List of noteworthy test scores accomplished\ + \ by this user.\n " + volunteer_work: + type: array + items: + $ref: '#/components/schemas/VolunteeringExperience' + description: List of historic volunteer work experiences. + certifications: + type: array + items: + $ref: '#/components/schemas/Certification' + description: + "\n List of noteworthy certifications accomplished\ + \ by this user.\n " + connections: + type: integer + nullable: true + description: Total *count* of LinkedIn connections. + people_also_viewed: + type: array + items: + $ref: '#/components/schemas/PeopleAlsoViewed' + description: + "\n A list of other LinkedIn profiles closely\ + \ related to this user.\n " + recommendations: + type: array + items: + type: string + description: + "\n List of recommendations made by other users\ + \ about this profile.\n " + activities: + type: array + items: + $ref: '#/components/schemas/Activity' + description: + A list of LinkedIn status activities. This field is not guaranteed + to be returned. Do not rely on this attribute in production. + similarly_named_profiles: + type: array + items: + $ref: '#/components/schemas/SimilarProfile' + description: + "\n A list of other LinkedIn profiles with similar\ + \ names.\n " + articles: + type: array + items: + $ref: '#/components/schemas/Article' + description: + "\n A list of content-based articles posted\ + \ by this user. This field is not guaranteed to be returned. Do not rely\ + \ on this attribute in production.\n " + groups: + type: array + items: + $ref: '#/components/schemas/PersonGroup' + description: + "\n A list of LinkedIn groups that this user\ + \ is a part of.\",\n " + skills: + type: array + items: + type: string + description: + A list of keyword-based skills that this user boasts of on + his LinkedIn profile. + inferred_salary: + $ref: '#/components/schemas/InferredSalary' + nullable: true + description: + A salary range inferred from the user's current job title and + company. + gender: + type: string + nullable: true + description: Gender of the user. + birth_date: + $ref: '#/components/schemas/Date' + nullable: true + description: Birth date of the user. + industry: + type: string + nullable: true + description: Industry that the user works in. + extra: + $ref: '#/components/schemas/PersonExtra' + nullable: true + description: A bundle of extra data on this user. + interests: + type: array + items: + type: string + description: A list of interests that the user has. + personal_emails: + type: array + items: + type: string + description: A list of personal emails associated with this user. + personal_numbers: + type: array + items: + type: string + description: + A list of personal mobile phone numbers associated with this + user. + example: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy at work\ + \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ + \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ + \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ + \ into the creation of an Internet of Things company, but numerous factors\ + \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying to\ + \ 150 companies). My desperate situation led me to take a job at Best Buy\ + \ for $12 an hour while reinventing myself through the completion of an\ + \ MBA at the University of Colorado, and a 6-month software development\ + \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because of my\ + \ LinkedIn profile). My journey has led to a deep sense of perspective,\ + \ humility, and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website for\ + \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or my\ + \ free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\ + \nQ: Can you speak at my Company, University, event or podcast?\nA: I'd\ + \ love to! I've shared my message on the future of employment, breaking\ + \ into big tech, and my personal story of reinventing myself and discovering\ + \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube Channel\ + \ #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\uFE0F\ + \ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just started\ + \ learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ + \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ + \ (don't forget that \"R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - *id013 + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost thought\ + \ leaders and turn them into actionable insights so that others can discover\ + \ greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - *id014 + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, api integration, + Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: + - *id015 + accomplishment_publications: + - *id016 + accomplishment_honors_awards: + - *id017 + accomplishment_patents: + - *id018 + accomplishment_courses: + - *id019 + accomplishment_projects: + - *id020 + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: + - *id021 + volunteer_work: + - *id022 + certifications: + - *id023 + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: + - *id024 + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n \ + \ John Marty is a genius at his craft. He is skilled in the art of making\ + \ people feel empowered to seek out roles that they are qualified for, ask\ + \ for salaries that they deserve, and creates a kind of pay it forward lifestyle.\ + \ John helps you to get to places that you only thought were possible for\ + \ other people. Anyone that is fortunate enough to learn from John should\ + \ consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \ + \ \n \n \n \n\n \n John\ + \ is so focused on helping guide you through an interview process not just\ + \ for Amazon but on interviewing in general. I've generally done well at\ + \ interviewing, my skills are top notch now. John is so focused on on his\ + \ clients and really goes above and beyond. John is genuine, knowledgeable,\ + \ well spoken and non-judgemental. He is so encouraging, so positive and\ + \ really easy to talk to. Thank you John!" + activities: + - *id025 + similarly_named_profiles: + - *id026 + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: + - *id027 + groups: + - *id028 + inferred_salary: *id029 + gender: male + birth_date: + day: 1 + month: 1 + year: 1990 + industry: government administration + extra: *id030 + interests: + - education + - health + - human rights + personal_emails: + - abc@gmail.com + - bcd@gmail.com + - cde@@outlook.com + personal_numbers: + - '+6512345678' + - '+6285123450953' + - '+6502300340' + CompanyCustomer: + type: object + properties: + linkedin_company_profile_url: + type: string + description: LinkedIn Company Profile URL of a probable customer + twitter_profile_url: + type: string + nullable: true + description: Twitter Profile URL of a probable customer + email: + type: string + nullable: true + description: General Email address of company (if any) + example: &id031 + linkedin_company_profile_url: https://www.linkedin.com/company/spire-solicitors-llp + twitter_profile_url: https://twitter.com/spirellp + email: info@spiresolicitors.co.uk + CustomerList: + type: object + properties: + companies: + type: array + items: + $ref: '#/components/schemas/CompanyCustomer' + description: A list of companies that are probable customers. + next_page: + type: string + nullable: true + description: + "\n The API URI that will lead to the next page of results.\ + \ This will be null for the final page.\n " + example: + companies: + - *id031 + - linkedin_company_profile_url: https://www.linkedin.com/company/mall-wood-insurance-services-ltd + twitter_profile_url: https://twitter.com/draytonins + email: hello@example.com + next_page: null + CustomerCount: + type: object + properties: + company_count: + type: integer + nullable: true + description: A count of of companies that are probable customers. + example: + company_count: 125 + PublicPerson: + type: object + properties: + public_identifier: + type: string + nullable: true + description: + "\n The vanity identifier of the public LinkedIn\ + \ profile.\n The vanity identifier comes after the `/in/`\ + \ part of the LinkedIn Profile URL\n in the following format:\ + \ `https://www.linkedin.com/in/`\n " + profile_pic_url: + type: string + description: + "\n A temporary link to the user's profile picture\ + \ that is valid for 30 minutes. \n The temporal nature\ + \ of the link is by design to prevent having Proxycurl be the mirror for\ + \ the images.\n The developer is expected to handle these\ + \ images by downloading the image and re-hosting the image.\n \ + \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ + \ for context.\n Some profile pictures might be of the\ + \ standard LinkedIn's profile picture placeholder. It is so because. See\ + \ [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/)\ + \ for context.\n " + background_cover_image_url: + type: string + nullable: true + description: + "\n A temporary link to the user's background\ + \ cover picture\n that is valid for 30 minutes.\n \ + \ The temporal nature of the link is by design to prevent\n\ + \ having Proxycurl be the mirror for the images.\n \ + \ The developer is expected to handle these images \n \ + \ by downloading the image and re-hosting the image. \n \ + \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ + \ for context.\n " + first_name: + type: string + nullable: true + description: First name of the user. + last_name: + type: string + nullable: true + description: Last name of the user. + full_name: + type: string + nullable: true + description: + "\n Full name of the user (`first_name` + `last_name`)\n\ + \ " + follower_count: + type: integer + description: Follower count for this profile + occupation: + type: string + nullable: true + description: + "\n The title and company name of the user's\ + \ current employment.\n " + headline: + type: string + nullable: true + description: + "\n The tagline written by the user for his\ + \ profile.\n " + summary: + type: string + nullable: true + description: + "\n A blurb (longer than the tagline) written\ + \ by the user for his profile.\n " + country: + type: string + nullable: true + description: + "\n The user's country of residence depicted\ + \ by\n a 2-letter country code (ISO 3166-1 alpha-2).\n\ + \ " + country_full_name: + type: string + nullable: true + description: The user's country of residence, in English words. + city: + type: string + nullable: true + description: The city that the user is living at. + state: + type: string + nullable: true + description: The state that the user is living at. + experiences: + type: array + items: + $ref: '#/components/schemas/Experience' + description: The user's list of historic work experiences. + education: + type: array + items: + $ref: '#/components/schemas/Education' + description: The user's list of education background. + languages: + type: array + items: + type: string + description: + "\n A list of languages that the user claims\ + \ to be familiar with,\n and has added to his/her profile.\n\ + \ Do note that we do not have the proficiency level as\n\ + \ that data point is not available on a public LinkedIn\ + \ profile.\n " + accomplishment_organisations: + type: array + items: + $ref: '#/components/schemas/AccomplishmentOrg' + description: + "\n List of noteworthy organizations that this\ + \ user is part of.\n " + accomplishment_publications: + type: array + items: + $ref: '#/components/schemas/Publication' + description: + "\n List of noteworthy publications that this\ + \ user has partook in.\n " + accomplishment_honors_awards: + type: array + items: + $ref: '#/components/schemas/HonourAward' + description: + "\n List of noteworthy honours and awards that\ + \ this user has won.\n " + accomplishment_patents: + type: array + items: + $ref: '#/components/schemas/Patent' + description: List of noteworthy patents won by this user. + accomplishment_courses: + type: array + items: + $ref: '#/components/schemas/Course' + description: List of noteworthy courses partook by this user. + accomplishment_projects: + type: array + items: + $ref: '#/components/schemas/Project' + description: + "\n List of noteworthy projects undertaken by\ + \ this user.\n " + accomplishment_test_scores: + type: array + items: + $ref: '#/components/schemas/TestScore' + description: + "\n List of noteworthy test scores accomplished\ + \ by this user.\n " + volunteer_work: + type: array + items: + $ref: '#/components/schemas/VolunteeringExperience' + description: List of historic volunteer work experiences. + certifications: + type: array + items: + $ref: '#/components/schemas/Certification' + description: + "\n List of noteworthy certifications accomplished\ + \ by this user.\n " + connections: + type: integer + nullable: true + description: Total *count* of LinkedIn connections. + people_also_viewed: + type: array + items: + $ref: '#/components/schemas/PeopleAlsoViewed' + description: + "\n A list of other LinkedIn profiles closely\ + \ related to this user.\n " + recommendations: + type: array + items: + type: string + description: + "\n List of recommendations made by other users\ + \ about this profile.\n " + activities: + type: array + items: + $ref: '#/components/schemas/Activity' + description: + A list of LinkedIn status activities. This field is not guaranteed + to be returned. Do not rely on this attribute in production. + similarly_named_profiles: + type: array + items: + $ref: '#/components/schemas/SimilarProfile' + description: + "\n A list of other LinkedIn profiles with similar\ + \ names.\n " + articles: + type: array + items: + $ref: '#/components/schemas/Article' + description: + "\n A list of content-based articles posted\ + \ by this user. This field is not guaranteed to be returned. Do not rely\ + \ on this attribute in production.\n " + groups: + type: array + items: + $ref: '#/components/schemas/PersonGroup' + description: + "\n A list of LinkedIn groups that this user\ + \ is a part of.\",\n " + skills: + type: array + items: + type: string + description: + A list of keyword-based skills that this user boasts of on + his LinkedIn profile. + example: &id032 + public_identifier: williamhgates + profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + background_cover_image_url: null + first_name: Bill + last_name: Gates + full_name: Bill Gates + follower_count: null + occupation: Co-chair at Bill & Melinda Gates Foundation + headline: Co-chair, Bill & Melinda Gates Foundation + summary: + Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough + Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active + blogger. + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + company: 'Breakthrough Energy ' + company_linkedin_profile_url: https://www.linkedin.com/company/breakthrough-energy/ + company_facebook_profile_url: null + title: Founder + description: null + location: null + logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y + - starts_at: + day: 1 + month: 1 + year: 2000 + ends_at: null + company: Bill & Melinda Gates Foundation + company_linkedin_profile_url: https://www.linkedin.com/company/bill-&-melinda-gates-foundation/ + company_facebook_profile_url: null + title: Co-chair + description: null + location: null + logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs + education: + - starts_at: + day: 1 + month: 1 + year: 1973 + ends_at: + day: 31 + month: 12 + year: 1975 + field_of_study: null + degree_name: null + school: Harvard University + school_linkedin_profile_url: null + school_facebook_profile_url: null + description: null + logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw + grade: null + activities_and_societies: null + - starts_at: null + ends_at: null + field_of_study: null + degree_name: null + school: Lakeside School + school_linkedin_profile_url: null + school_facebook_profile_url: null + description: null + logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ + grade: null + activities_and_societies: null + languages: + - English + - Chinese + - Japanese + accomplishment_organisations: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + accomplishment_publications: + - name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + accomplishment_honors_awards: + - title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + accomplishment_patents: + - title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + accomplishment_courses: + - name: The course about ABCs + number: '123' + accomplishment_projects: [] + accomplishment_test_scores: + - name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + volunteer_work: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + certifications: [] + connections: null + people_also_viewed: + - link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + recommendations: + - Professional and dedicated approach towards clients and collegues. + activities: + - title: I am hiring! + link: https://www.linkedin.com/feed/update/urn:li:activity:666 + activity_status: posted + similarly_named_profiles: null + articles: + - title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + groups: + - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + Employee: + type: object + properties: + profile_url: + type: string + description: "\n LinkedIn Profile URL of the employee.\n " + profile: + $ref: '#/components/schemas/PublicPerson' + nullable: true + description: + "\n Enriched profile data of the employee.\n \ + \ " + last_updated: + type: string + nullable: true + description: + "\n ISO 8601 timestamp since the enriched profile\ + \ was last scraped.\n " + example: &id033 + profile_url: https://www.linkedin.com/in/williamhgates + profile: *id032 + last_updated: '2023-10-26T11:34:30Z' + EmployeeList: + type: object + properties: + employees: + type: array + items: + $ref: '#/components/schemas/Employee' + description: + "\n A list of employee profiles (if enriched) and their\ + \ associated profile URL.\n " + next_page: + type: string + nullable: true + description: + "\n The API URI that will lead to the next page of results.\ + \ This will be null for the final page.\n " + example: + employees: + - *id033 + next_page: null + EmployeeCount: + type: object + properties: + total_employee: + type: integer + linkedin_employee_count: + type: integer + nullable: true + description: + The scraped value of employee count of this company from it's + LinkedIn profile. This value does not respect `employement_status` parameter. + It will always return the curent employee count of this company from LinkedIn. + linkdb_employee_count: + type: integer + description: + The total number of employees found in LinkDB for this company. + This value is limited by pre-crawled LinkedIn profiles stored in [LinkDB](https://nubela.co/proxycurl/linkdb) + regression_notice: + type: string + example: + linkedin_employee_count: 529274 + linkdb_employee_count: 3 + ProfilePicture: + type: object + properties: + tmp_profile_pic_url: + type: string + description: + "\n Temporary URL to the profile picture (valid\ + \ for just 30 minutes).\n See this [blog post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ + \ for more information." + example: + tmp_profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + PersonLookupUrlEnrichResult: + type: object + properties: + url: + type: string + nullable: true + description: The LinkedIn profile URL + name_similarity_score: + type: number + nullable: true + description: + A measure of how similar the input name is to the name in the + returned profile. Values can range from `0` to `1` , with `0` indicating + no similarity and `1` implying high similarity. In cases where a current + profile for comparison is not available in our dataset, the result may + be `null`. + company_similarity_score: + type: number + nullable: true + description: + A measure of how similar the input company name/domain is to + the name/domain of past or present companies in the returned profile. + The score ranges from `0` to `1` , with `0` signifying no similarity and + `1` denoting high similarity. If a relevant profile is unavailable in + our dataset for comparison, a `null` score may be returned. + title_similarity_score: + type: number + nullable: true + description: + A measure of how similar the input title is to the returned + profile's past or present titles. Scores vary from `0` to `1` , where + `0` means no similarity and `1` indicates high similarity. If a relevant + profile for comparison isn't available in our dataset, a `null` result + may occur. + location_similarity_score: + type: number + nullable: true + description: + "A measure of how similar the input location is to the returned + profile's current location. The range is from `0` to `1` , with `0` representing + no similarity and `1` signifying high similarity. If there isn't a relevant + profile in our dataset for comparison, the score might be `null`. " + profile: + $ref: '#/components/schemas/PersonEndpointResponse' + last_updated: + type: string + nullable: true + description: ISO 8601 timestamp since the enriched profile was last scraped. + example: + url: https://www.linkedin.com/in/senatormarty + name_similarity_score: 0.5 + company_similarity_score: 0.5 + title_similarity_score: 0.5 + location_similarity_score: 0.5 + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy at work\ + \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ + \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ + \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ + \ into the creation of an Internet of Things company, but numerous factors\ + \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job at Best\ + \ Buy for $12 an hour while reinventing myself through the completion\ + \ of an MBA at the University of Colorado, and a 6-month software development\ + \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because of my\ + \ LinkedIn profile). My journey has led to a deep sense of perspective,\ + \ humility, and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website for\ + \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ + \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ + A: I'd love to! I've shared my message on the future of employment, breaking\ + \ into big tech, and my personal story of reinventing myself and discovering\ + \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ + \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ + \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ + \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ + \ (don't forget that \"R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking financial + freedom long before the age of 65 with the ability to invest in high + yield, short-term real estate investments that were only accessible + in the past for a select few wealthy individuals. Each of our single + family rehab projects require a minimum investment contribution of only + $10K, we have simple terms, no multi-year hold periods, and no fees. + With our unique model investors can log into our easy to use website, + select the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost thought\ + \ leaders and turn them into actionable insights so that others can\ + \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, api integration, + Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + accomplishment_publications: + - name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + accomplishment_honors_awards: + - title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + accomplishment_patents: + - title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + accomplishment_courses: + - name: The course about ABCs + number: '123' + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap + HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration + to post a user's message content to the page in real time, with no page + refresh required. gMessenger also includes custom authentication with + three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: + - name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + volunteer_work: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices + in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: + - link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n \ + \ John Marty is a genius at his craft. He is skilled in the art of\ + \ making people feel empowered to seek out roles that they are qualified\ + \ for, ask for salaries that they deserve, and creates a kind of pay it\ + \ forward lifestyle. John helps you to get to places that you only thought\ + \ were possible for other people. Anyone that is fortunate enough to learn\ + \ from John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ + \ \n \n \n \n\n \n John\ + \ is so focused on helping guide you through an interview process not\ + \ just for Amazon but on interviewing in general. I've generally done\ + \ well at interviewing, my skills are top notch now. John is so focused\ + \ on on his clients and really goes above and beyond. John is genuine,\ + \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ + \ so positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that has a large\ + \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ + \ I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ + s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: + - title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + groups: + - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + inferred_salary: + min: 35000 + max: 45000 + gender: male + birth_date: + day: 1 + month: 1 + year: 1990 + industry: government administration + extra: + github_profile_id: github-username + facebook_profile_id: facebook-username + twitter_profile_id: twitter-username + website: https://proxycurl.com + interests: + - education + - health + - human rights + personal_emails: + - abc@gmail.com + - bcd@gmail.com + - cde@@outlook.com + personal_numbers: + - '+6512345678' + - '+6285123450953' + - '+6502300340' + last_updated: '2023-10-26T11:34:30Z' + JobListEntry: + type: object + properties: + company: + type: string + nullable: true + description: + "\n The name of the company that posted this job.\n\ + \ " + company_url: + type: string + nullable: true + description: + "\n The LinkedIn Company Profile URL that posted this\ + \ job.\n " + job_title: + type: string + nullable: true + description: "\n Job title of the posted job.\n " + job_url: + type: string + nullable: true + description: + "\n Job Profile URL. You can fetch details about this\ + \ job using this URL via the [Job Profile API Endpoint](https://nubela.co/proxycurl/docs#jobs-api-job-profile-endpoint).\n\ + \ " + list_date: + type: string + nullable: true + description: "\n The date that this job was listed.\n " + location: + type: string + nullable: true + description: "\n The job location.\n " + example: &id034 + company: Microsoft + company_url: https://www.linkedin.com/company/microsoft + job_title: 'Product Management: Intern Opportunities for University Students' + job_url: https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682 + list_date: '2022-10-09' + location: New York, NY + JobListPage: + type: object + properties: + job: + type: array + items: + $ref: '#/components/schemas/JobListEntry' + next_page_no: + type: integer + nullable: true + next_page_api_url: + type: string + nullable: true + description: + "\n The URL to the next page of results. This will\ + \ be null for the final page.\n " + previous_page_no: + type: integer + nullable: true + previous_page_api_url: + type: string + nullable: true + description: + "\n The URL to the previous page of results. This\ + \ will be null for the first page.\n " + example: + job: + - *id034 + - company: Microsoft + company_url: https://www.linkedin.com/company/microsoft + job_title: Content Strategist + job_url: https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764 + list_date: '2022-10-21' + location: United States + next_page_no: 1 + next_page_api_url: http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035 + previous_page_no: null + previous_page_api_url: https://nubela.co/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035 + JobListCount: + type: object + properties: + count: + type: integer + example: + count: 887622 + RoleSearchEnrichedResult: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: + LinkedIn Profile URL of the person that most closely matches + the role + profile: + $ref: '#/components/schemas/PersonEndpointResponse' + last_updated: + type: string + nullable: true + description: ISO 8601 timestamp since the enriched profile was last scraped. + example: + linkedin_profile_url: https://www.linkedin.com/in/senatormarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy at work\ + \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ + \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ + \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ + \ into the creation of an Internet of Things company, but numerous factors\ + \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job at Best\ + \ Buy for $12 an hour while reinventing myself through the completion\ + \ of an MBA at the University of Colorado, and a 6-month software development\ + \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because of my\ + \ LinkedIn profile). My journey has led to a deep sense of perspective,\ + \ humility, and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website for\ + \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ + \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ + A: I'd love to! I've shared my message on the future of employment, breaking\ + \ into big tech, and my personal story of reinventing myself and discovering\ + \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ + \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ + \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ + \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ + \ (don't forget that \"R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking financial + freedom long before the age of 65 with the ability to invest in high + yield, short-term real estate investments that were only accessible + in the past for a select few wealthy individuals. Each of our single + family rehab projects require a minimum investment contribution of only + $10K, we have simple terms, no multi-year hold periods, and no fees. + With our unique model investors can log into our easy to use website, + select the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost thought\ + \ leaders and turn them into actionable insights so that others can\ + \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, api integration, + Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + accomplishment_publications: + - name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + accomplishment_honors_awards: + - title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + accomplishment_patents: + - title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + accomplishment_courses: + - name: The course about ABCs + number: '123' + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap + HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration + to post a user's message content to the page in real time, with no page + refresh required. gMessenger also includes custom authentication with + three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: + - name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + volunteer_work: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices + in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: + - link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n \ + \ John Marty is a genius at his craft. He is skilled in the art of\ + \ making people feel empowered to seek out roles that they are qualified\ + \ for, ask for salaries that they deserve, and creates a kind of pay it\ + \ forward lifestyle. John helps you to get to places that you only thought\ + \ were possible for other people. Anyone that is fortunate enough to learn\ + \ from John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ + \ \n \n \n \n\n \n John\ + \ is so focused on helping guide you through an interview process not\ + \ just for Amazon but on interviewing in general. I've generally done\ + \ well at interviewing, my skills are top notch now. John is so focused\ + \ on on his clients and really goes above and beyond. John is genuine,\ + \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ + \ so positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that has a large\ + \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ + \ I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ + s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: + - title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + groups: + - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + inferred_salary: + min: 35000 + max: 45000 + gender: male + birth_date: + day: 1 + month: 1 + year: 1990 + industry: government administration + extra: + github_profile_id: github-username + facebook_profile_id: facebook-username + twitter_profile_id: twitter-username + website: https://proxycurl.com + interests: + - education + - health + - human rights + personal_emails: + - abc@gmail.com + - bcd@gmail.com + - cde@@outlook.com + personal_numbers: + - '+6512345678' + - '+6285123450953' + - '+6502300340' + last_updated: '2023-10-26T11:34:30Z' + CompanyUrlEnrichResult: + type: object + properties: + url: + type: string + nullable: true + description: The LinkedIn profile URL + profile: + $ref: '#/components/schemas/LinkedinCompany' + last_updated: + type: string + nullable: true + description: ISO 8601 timestamp since the enriched profile was last scraped. + example: + url: https://www.linkedin.com/company/accenture + profile: + linkedin_internal_id: '1033' + description: + "Accenture is a global professional services company with leading\ + \ capabilities in digital, cloud, and security. Combining unmatched experience\ + \ and specialized skills across more than 40 industries, we offer Strategy\ + \ and Consulting, Technology and Operations Services, and Accenture Song\u2014\ + all powered by the world\u2019s largest network of Advanced Technology\ + \ and Intelligent Operations centers. \n\nOur people deliver on the promise\ + \ of technology and human ingenuity every day, serving clients in more\ + \ than 120 countries. We embrace the power of change to create value and\ + \ shared success for our clients, people, shareholders, partners, and\ + \ communities. \n\nVisit us at accenture.com." + website: http://www.accenture.com + industry: Business Consulting and Services + company_size: + - 10001 + - null + company_size_on_linkedin: 541251 + hq: + country: IE + city: Dublin 2 + postal_code: null + line_1: Grand Canal Harbour + is_hq: true + state: null + company_type: PUBLIC_COMPANY + founded_year: null + specialities: + - Management Consulting + - Systems Integration and Technology + locations: + - country: IE + city: Dublin 2 + postal_code: null + line_1: Grand Canal Harbour + is_hq: true + state: null + - country: US + city: San Francisco + postal_code: '94105' + line_1: 415 Mission Street Floor 31-34 + is_hq: null + state: California + name: Accenture + tagline: Think Different - But Not Too Different + universal_name_id: accenture + profile_pic_url: https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY + background_cover_image_url: https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0 + search_id: '1033' + similar_companies: + - name: Deloitte + link: https://www.linkedin.com/company/deloitte + industry: Business Consulting and Services + location: null + - name: Tata Consultancy Services + link: https://in.linkedin.com/company/tata-consultancy-services + industry: IT Services and IT Consulting + location: Mumbai, Maharashtra + affiliated_companies: + - name: Accenture in India + link: https://in.linkedin.com/company/accentureindia + industry: IT Services and IT Consulting + location: Bengaluru, Karnatka + - name: Accenture Brasil + link: https://br.linkedin.com/company/accenturebrasil + industry: IT Services and IT Consulting + location: "S\xE3o Paulo, S\xE3o Paulo" + updates: + - article_link: null + image: null + posted_on: + day: 25 + month: 10 + year: 2023 + text: 'Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4' + total_likes: 325 + - article_link: null + image: https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA + posted_on: + day: 25 + month: 10 + year: 2023 + text: + "The ability to learn new things, without forgetting those that\ + \ came before, is a huge differentiator between the #AI we're familiar\ + \ with, and the #GenerativeAI powered by foundation models that we're\ + \ seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n\ + \ \n#TechVision2023" + total_likes: 541 + follower_count: 11125167 + acquisitions: + acquired: + - linkedin_profile_url: https://www.linkedin.com/company/apple + crunchbase_profile_url: https://www.crunchbase.com/organization/apple + announced_date: + day: 1 + month: 4 + year: 1976 + price: 300000000 + acquired_by: + linkedin_profile_url: https://www.linkedin.com/company/nvidia + crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia + announced_date: + day: 6 + month: 3 + year: 2020 + price: 10000 + exit_data: + - linkedin_profile_url: https://www.linkedin.com/company/motiondsp + crunchbase_profile_url: https://www.crunchbase.com/organization/motiondsp + name: MotionDSP + extra: + crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia + ipo_status: Public + crunchbase_rank: 13 + founding_date: + day: 1 + month: 1 + year: 2000 + operating_status: Active + company_type: For Profit + contact_email: info@nvidia.com + phone_number: (140) 848-6200 + facebook_id: NVIDIA.IN + twitter_id: nvidia + number_of_funding_rounds: 3 + total_funding_amount: 4000000 + stock_symbol: NASDAQ:NVDA + ipo_date: + day: 1 + month: 1 + year: 2000 + number_of_lead_investors: 3 + number_of_investors: 4 + total_fund_raised: 1000 + number_of_investments: 50 + number_of_lead_investments: 3 + number_of_exits: 7 + number_of_acquisitions: 2 + funding_data: + - funding_type: Grant + money_raised: 25000000 + announced_date: + day: 1 + month: 1 + year: 2001 + number_of_investor: 1 + investor_list: + - linkedin_profile_url: https://linkedin.com/company/darpa + name: DARPA + type: organization + categories: + - artificial-intelligence + - virtual-reality + last_updated: '2023-10-26T11:33:24Z' + Student: + type: object + properties: + profile_url: + type: string + profile: + $ref: '#/components/schemas/PublicPerson' + nullable: true + last_updated: + type: string + nullable: true + description: + "\n ISO 8601 timestamp since the enriched profile\ + \ was last scraped.\n " + example: &id035 + profile_url: https://www.linkedin.com/in/johnrmarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy at work\ + \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ + \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ + \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ + \ into the creation of an Internet of Things company, but numerous factors\ + \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job at Best\ + \ Buy for $12 an hour while reinventing myself through the completion\ + \ of an MBA at the University of Colorado, and a 6-month software development\ + \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because of my\ + \ LinkedIn profile). My journey has led to a deep sense of perspective,\ + \ humility, and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website for\ + \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ + \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ + A: I'd love to! I've shared my message on the future of employment, breaking\ + \ into big tech, and my personal story of reinventing myself and discovering\ + \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ + \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ + \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ + \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ + \ (don't forget that \"R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking financial + freedom long before the age of 65 with the ability to invest in high + yield, short-term real estate investments that were only accessible + in the past for a select few wealthy individuals. Each of our single + family rehab projects require a minimum investment contribution of only + $10K, we have simple terms, no multi-year hold periods, and no fees. + With our unique model investors can log into our easy to use website, + select the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost thought\ + \ leaders and turn them into actionable insights so that others can\ + \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, api integration, + Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + accomplishment_publications: + - name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + accomplishment_honors_awards: + - title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + accomplishment_patents: + - title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + accomplishment_courses: + - name: The course about ABCs + number: '123' + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap + HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration + to post a user's message content to the page in real time, with no page + refresh required. gMessenger also includes custom authentication with + three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: + - name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + volunteer_work: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices + in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: + - link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n \ + \ John Marty is a genius at his craft. He is skilled in the art of\ + \ making people feel empowered to seek out roles that they are qualified\ + \ for, ask for salaries that they deserve, and creates a kind of pay it\ + \ forward lifestyle. John helps you to get to places that you only thought\ + \ were possible for other people. Anyone that is fortunate enough to learn\ + \ from John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ + \ \n \n \n \n\n \n John\ + \ is so focused on helping guide you through an interview process not\ + \ just for Amazon but on interviewing in general. I've generally done\ + \ well at interviewing, my skills are top notch now. John is so focused\ + \ on on his clients and really goes above and beyond. John is genuine,\ + \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ + \ so positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that has a large\ + \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ + \ I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ + s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: + - title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + groups: + - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + last_updated: '2023-10-26T11:34:30Z' + StudentList: + type: object + properties: + students: + type: array + items: + $ref: '#/components/schemas/Student' + description: + "\n A list of student profiles (if enriched) and their\ + \ associated profile URL.\n " + next_page: + type: string + nullable: true + description: + "\n The API URI that will lead to the next page of results.\ + \ This will be null for the final page.\n " + example: + students: + - *id035 + next_page: null + ReverseEmailUrlEnrichResult: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: + Returns the closest match of the LinkedIn profile that belongs + to this email address. + twitter_profile_url: + type: string + nullable: true + description: + Returns the Twitter Profile URL that belongs to this email + address. + facebook_profile_url: + type: string + nullable: true + description: + Returns the Facebook Profile URL that belongs to this email + address. + url: + type: string + nullable: true + similarity_score: + type: number + nullable: true + description: + This metric quantifies the degree of resemblance between the + queried profile and the retrieved one. Scores range from `0` (no similarity) + to `1` (high similarity). In the event that our dataset lacks a pertinent + profile for comparison, the assigned score might be `null`. + backwards_compatibility_notes: + type: string + nullable: true + profile: + $ref: '#/components/schemas/PersonEndpointResponse' + nullable: true + last_updated: + type: string + nullable: true + description: ISO 8601 timestamp since the enriched profile was last scraped. + example: + linkedin_profile_url: https://www.linkedin.com/in/senatormarty + twitter_profile_url: https://www.twitter.com/proxycurl + facebook_profile_url: https://www.facebook.com/zuck + similarity_score: 0.82 + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy at work\ + \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ + \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ + \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ + \ into the creation of an Internet of Things company, but numerous factors\ + \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job at Best\ + \ Buy for $12 an hour while reinventing myself through the completion\ + \ of an MBA at the University of Colorado, and a 6-month software development\ + \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because of my\ + \ LinkedIn profile). My journey has led to a deep sense of perspective,\ + \ humility, and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website for\ + \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ + \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ + A: I'd love to! I've shared my message on the future of employment, breaking\ + \ into big tech, and my personal story of reinventing myself and discovering\ + \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ + \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ + \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ + \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ + \ (don't forget that \"R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking financial + freedom long before the age of 65 with the ability to invest in high + yield, short-term real estate investments that were only accessible + in the past for a select few wealthy individuals. Each of our single + family rehab projects require a minimum investment contribution of only + $10K, we have simple terms, no multi-year hold periods, and no fees. + With our unique model investors can log into our easy to use website, + select the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost thought\ + \ leaders and turn them into actionable insights so that others can\ + \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, api integration, + Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + accomplishment_publications: + - name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + accomplishment_honors_awards: + - title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + accomplishment_patents: + - title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + accomplishment_courses: + - name: The course about ABCs + number: '123' + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap + HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration + to post a user's message content to the page in real time, with no page + refresh required. gMessenger also includes custom authentication with + three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: + - name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + volunteer_work: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices + in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: + - link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n \ + \ John Marty is a genius at his craft. He is skilled in the art of\ + \ making people feel empowered to seek out roles that they are qualified\ + \ for, ask for salaries that they deserve, and creates a kind of pay it\ + \ forward lifestyle. John helps you to get to places that you only thought\ + \ were possible for other people. Anyone that is fortunate enough to learn\ + \ from John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ + \ \n \n \n \n\n \n John\ + \ is so focused on helping guide you through an interview process not\ + \ just for Amazon but on interviewing in general. I've generally done\ + \ well at interviewing, my skills are top notch now. John is so focused\ + \ on on his clients and really goes above and beyond. John is genuine,\ + \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ + \ so positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that has a large\ + \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ + \ I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ + s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: + - title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + groups: + - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + inferred_salary: + min: 35000 + max: 45000 + gender: male + birth_date: + day: 1 + month: 1 + year: 1990 + industry: government administration + extra: + github_profile_id: github-username + facebook_profile_id: facebook-username + twitter_profile_id: twitter-username + website: https://proxycurl.com + interests: + - education + - health + - human rights + personal_emails: + - abc@gmail.com + - bcd@gmail.com + - cde@@outlook.com + personal_numbers: + - '+6512345678' + - '+6285123450953' + - '+6502300340' + last_updated: '2023-10-26T11:34:30Z' + ReverseContactNumberResult: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + description: + Returns the closest match of the LinkedIn profile that belongs + to this phone number. + twitter_profile_url: + type: string + nullable: true + description: + Returns the Twitter Profile URL that belongs to this phone + number. + facebook_profile_url: + type: string + nullable: true + description: + Returns the Facebook Profile URL that belongs to this phone + number. + example: + linkedin_profile_url: https://www.linkedin.com/in/senatormarty + twitter_profile_url: https://www.twitter.com/proxycurl + facebook_profile_url: https://www.facebook.com/zuck + ExtractionEmailResult: + type: object + properties: + email_queue_count: + type: integer + description: Total queue in the email extraction process + example: + email_queue_count: null + JobLocation: + type: object + properties: + country: + type: string + nullable: true + description: "\n Full country name.\n " + region: + type: string + nullable: true + description: "\n Region.\n " + city: + type: string + nullable: true + description: "\n The city for the job.\n " + postal_code: + type: string + nullable: true + description: + "\n Postal code of the business location for the job.\n\ + \ " + latitude: + type: number + nullable: true + description: + "\n Latitude coordinates of the business location for\ + \ the job.\n " + longitude: + type: number + nullable: true + description: + "\n Longitude coordinates of the business location for\ + \ the job.\n " + street: + type: string + nullable: true + description: + "\n Street address of the business location for the\ + \ job.\n " + example: &id036 + country: United States + region: Hawaii + city: null + postal_code: null + latitude: null + longitude: null + street: null + JobCompany: + type: object + properties: + name: + type: string + nullable: true + description: "\n The name of the company.\n " + url: + type: string + nullable: true + description: + "\n The LinkedIn Company Profile URL of the job posting\ + \ company.\n " + logo: + type: string + nullable: true + description: "\n The URL to the logo of this company.\n " + example: &id037 + name: Microsoft + url: https://www.linkedin.com/company/microsoft + logo: https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI + JobProfile: + type: object + properties: + linkedin_internal_id: + type: string + nullable: true + description: + "\n The internal ID representation of this job that\ + \ LinkedIn has for this job.\n " + job_description: + type: string + nullable: true + description: "\n Description of the posted job.\n " + apply_url: + type: string + nullable: true + description: "\n The URL to apply for this job.\n " + title: + type: string + nullable: true + description: "\n Title of the posted job.\n " + location: + $ref: '#/components/schemas/JobLocation' + company: + $ref: '#/components/schemas/JobCompany' + seniority_level: + type: string + nullable: true + description: "\n The seniority level for this role.\n " + industry: + type: array + items: + type: string + description: + "\n A list of industries that the company which posted\ + \ this job lies in.\n " + employment_type: + type: string + nullable: true + description: "\n Type of employment.\n " + job_functions: + type: array + items: + type: string + description: + "\n A list of job functions that this role is expected\ + \ to cover.\n " + total_applicants: + type: integer + nullable: true + description: "\n Total applicants for this job so far.\n " + example: + linkedin_internal_id: content-strategist-at-microsoft-3257696537 + job_description: + "The Global Demand Center (GDC) within the Cloud Marketing\ + \ group is leading the marketing transformation of Microsoft\u2019s largest\ + \ and fastest growing commercial businesses. Our always-on integrated marketing\ + \ programs work to nurture and acquire new customers across segments, targeting\ + \ business and technical audiences across our commercial cloud portfolio,\ + \ with programs available in 42 markets and 30 languages. The GDC team is\ + \ modernizing and integrating these channels through advanced analytics,\ + \ marketing automation, and digital marketing. We are on a mission to drive\ + \ market share, consumption, and consistent double-digit+ revenue growth.\ + \ Content is the fuel that drives the digitally connected customer journeys\ + \ at the core of the GDC engine, and we\u2019re looking for a skilled, self-motivated,\ + \ data-driven content strategist to build the content that motivates customers\ + \ to take action. The Content Strategist will develop and execute content\ + \ strategies for the ever-critical security space. You will be accountable\ + \ for understanding the business priorities, getting close to our target\ + \ audiences, defining the content journeys that attract, nurture, inspire,\ + \ and retain customers, and manage quality execution and delivery of the\ + \ content. You will work closely with your counterparts, the integrated\ + \ marketing strategists, to drive business outcomes. Your network will include\ + \ product marketers, integrated marketers, relationship marketers, sales,\ + \ engineering, and agency partners to develop and execute on your plan.\ + \ Our team: The Lifecycle Programs team is a fast-paced digital marketing\ + \ organization. We put a focus on getting things done, simplifying anything\ + \ and everything, and having fun while doing it. We all believe in connecting\ + \ with customers at scale, supporting them at each stage of the customer\ + \ journey, from early awareness and consideration, through onboarding and\ + \ post purchase engagement. You will be in the middle of it all helping\ + \ to identify the right content that delivers what customers want\u2014\ + where they want it, when they want it, and how they want it. \n \n**_Responsibilities\ + \ \n_**\n * Define content journeys for Security and IT professionals\ + \ across industries.\n * Build the resulting content strategies designed\ + \ to accelerate the customer through the lifecycle.\n * Create a content\ + \ plan to address the insights in the customer journey and strategy, ensuring\ + \ the content is aligned to what the customer needs at each stage.\n *\ + \ Deliver the content through our internal Studio or with select agency\ + \ partners.\n * Be a customer advocate. Relentlessly champion the customer\ + \ and the experiences they have with the content you create\u2014how they\ + \ find it, how they consume it, how they use it to make decisions.\n *\ + \ Leverage data and market insights for decision making including content\ + \ optimization and new concept development. \n\n\n**_Qualifications \n\ + \ \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree\ + \ in Business, Marketing, Communications, Economics, Public Relations, or\ + \ related field AND 1+ year(s) integrated marketing (e.g., digital, relationship,\ + \ social media, campaign), event management, marketing strategy, business\ + \ planning, marketing operations, or related work experience\n * OR equivalent\ + \ experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n\ + \ * Bachelor's Degree in Business, Marketing, Communications, Economics,\ + \ Public Relations, or related field AND 3+ years integrated marketing (e.g.,\ + \ digital, relationship, social media, campaign), event management, marketing\ + \ strategy, business planning, marketing operations, or related work experience\n\ + \ * OR equivalent experience.\n * Strong customer centric mindset and\ + \ demonstrated ability to put the customer first.\n * Clear and persuasive\ + \ communication skills, both written and verbal.\n * Experience with program\ + \ performance tracking and communications.\n * Recognized as a self-starter\ + \ with a bias for action.\n * Creative problem-solving skills, and a growth\ + \ mindset approach\n * Experience managing across highly matrixed organizations,\ + \ often with competing priorities.\n * A demonstrated track record of business\ + \ impact through content\n * Well-versed in digital marketing best practices,\ + \ including journey mapping.\n * Understanding of content disciplines,\ + \ including SEO, content strategy, and execution.\n * Preferred, but not\ + \ required: experience with commercial technology sales process \n\n\n\ + Narrative \n \nIntegrated Marketing IC3 - The typical base pay range\ + \ for this role across the U.S. is USD $80,900 - $162,200 per year. There\ + \ is a different range applicable to specific work locations, within the\ + \ San Francisco Bay area and New York City metropolitan area, and the base\ + \ pay range for this role in those locations is USD $105,300 - $176,900\ + \ per year. \n \nMicrosoft has different base pay ranges for different\ + \ work locations within the United States, which allows us to pay employees\ + \ competitively and consistently in different geographic markets (see below).\ + \ The range above reflects the potential base pay across the U.S. for this\ + \ role (except as noted below); the applicable base pay range will depend\ + \ on what ultimately is determined to be the candidate\u2019s primary work\ + \ location. Individual base pay depends on various factors, in addition\ + \ to primary work location, such as complexity and responsibility of role,\ + \ job duties/requirements, and relevant experience and skills. Base pay\ + \ ranges are reviewed and typically updated each year. Offers are made within\ + \ the base pay range applicable at the time. \n \nAt Microsoft certain\ + \ roles are eligible for additional rewards, including merit increases,\ + \ annual bonus and stock. These awards are allocated based on individual\ + \ performance. In addition, certain roles also have the opportunity to earn\ + \ sales incentives based on revenue or utilization, depending on the terms\ + \ of the plan and the employee\u2019s role. Benefits/perks listed here may\ + \ vary depending on the nature of employment with Microsoft and the country\ + \ work location. U.S.-based employees have access to healthcare benefits,\ + \ a 401(k) plan and company match, short-term and long-term disability coverage,\ + \ basic life insurance, wellbeing benefits, paid vacation time, paid sick\ + \ and mental health time, and several paid holidays, among others. \n\ + \ \nOur commitment to pay equity \n \nWe are committed to the principle\ + \ of pay equity \u2013 paying employees equitably for substantially similar\ + \ work. To learn more about pay equity and our other commitments to increase\ + \ representation and strengthen our culture of inclusion, check out our\ + \ annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report\ + \ ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page\ + \ displays the role for which the base pay ranges apply \u2013 Integrated\ + \ Marketing IC3. The way we define roles includes two things: discipline\ + \ (the type of work) and career stage (scope and complexity). The career\ + \ stage has two parts \u2013 the first identifies whether the role is a\ + \ manager (M), an individual contributor (IC), an admin-technician-retail\ + \ (ATR) job, or an intern. The second part identifies the relative seniority\ + \ of the role \u2013 a higher number (or later letter alphabetically in\ + \ the case of ATR) indicates greater scope and complexity. \n \nMicrosoft\ + \ is an equal opportunity employer. All qualified applicants will receive\ + \ consideration for employment without regard to age, ancestry, color, family\ + \ or medical care leave, gender identity or expression, genetic information,\ + \ marital status, medical condition, national origin, physical or mental\ + \ disability, political affiliation, protected veteran status, race, religion,\ + \ sex (including pregnancy), sexual orientation, or any other characteristic\ + \ protected by applicable laws, regulations and ordinances. We also consider\ + \ qualified applicants regardless of criminal histories, consistent with\ + \ legal requirements. If you need assistance and/or a reasonable accommodation\ + \ due to a disability during the application or the recruiting process,\ + \ please send a request via the Accommodation request form. \n \nThe\ + \ salary for this role in the state of Colorado is between $108,200 and\ + \ $162,200. \n \nAt Microsoft, certain roles are eligible for additional\ + \ rewards, including annual bonus and stock. These awards are allocated\ + \ based on individual performance. In addition, certain roles also have\ + \ the opportunity to earn sales incentives based on revenue or utilization,\ + \ depending on the terms of the plan and the employee\u2019s role. Benefits/perks\ + \ listed below may vary depending on the nature of your employment with\ + \ Microsoft and the country where you work. \n" + apply_url: https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite + title: Content Strategist + location: *id036 + company: *id037 + seniority_level: Mid-Senior level + industry: + - IT Services and IT Consulting, Computer Hardware Manufacturing, and Software + Development + employment_type: Full-time + job_functions: + - Marketing + total_applicants: 200 + Follower: + type: object + properties: + linkedin_profile_url: + type: string + nullable: true + twitter_profile_url: + type: string + email: + type: string + nullable: true + example: &id038 + linkedin_profile_url: https://www.linkedin.com/in/agiliosoftware + twitter_profile_url: https://www.x.com/agilio_software + email: null + FollowerList: + type: object + properties: + followers: + type: array + items: + $ref: '#/components/schemas/Follower' + description: + "\n A list of individual followers of a company.\n \ + \ " + next_page: + type: string + nullable: true + description: + "\n The API URI that will lead to the next page of results.\ + \ This will be null for the final page.\n " + example: + followers: + - *id038 + - linkedin_profile_url: https://www.linkedin.com/in/air-techniques + twitter_profile_url: https://www.x.com/airtechniques + email: null + next_page: null + FollowerListCount: + type: object + properties: + follower_count: + type: integer + description: A count of all individuals that are probable customers or followers. + example: + follower_count: 74 + CSearchResult: + type: object + properties: + linkedin_profile_url: + type: string + description: + "\n The LinkedIn Profile URL of the company\n \ + \ " + profile: + $ref: '#/components/schemas/LinkedinCompany' + nullable: true + description: + "\n If `enrich_profiles=enrich` is specified, the company's\ + \ entire profile\n is returned. Otherwise this field will return\ + \ `null`.\n " + last_updated: + type: string + nullable: true + description: + "\n ISO 8601 timestamp since the enriched profile was\ + \ last scraped.\n " + example: &id039 + linkedin_profile_url: https://www.linkedin.com/company/apple/ + profile: + linkedin_internal_id: '1441' + description: "A problem isn't truly solved until it's solved for all. + Googlers build products that help create opportunities for everyone, whether + down the street or across the globe. Bring your insight, imagination and + a healthy disregard for the impossible. Bring everything that makes you + unique. Together, we can build for everyone. + + + Check out our career opportunities at careers.google.com." + website: https://goo.gle/3m1IN7m + industry: Software Development + company_size: + - 10001 + - null + company_size_on_linkedin: 319856 + hq: + country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + company_type: PUBLIC_COMPANY + founded_year: null + specialities: + - search + - ads + locations: + - country: US + city: Mountain View + postal_code: '94043' + line_1: 1600 Amphitheatre Parkway + is_hq: true + state: CA + - country: US + city: New York + postal_code: '10011' + line_1: 111 8th Ave + is_hq: null + state: NY + name: Google + tagline: Think Different - But Not Too Different + universal_name_id: google + profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca + background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 + search_id: '1441' + similar_companies: + - name: Amazon + link: https://www.linkedin.com/company/amazon + industry: Software Development + location: Seattle, WA + - name: Microsoft + link: https://www.linkedin.com/company/microsoft + industry: Software Development + location: Redmond, Washington + affiliated_companies: + - name: YouTube + link: https://www.linkedin.com/company/youtube + industry: Software Development + location: San Bruno, CA + - name: Google Cloud + link: https://www.linkedin.com/showcase/google-cloud + industry: Software Development + location: Mountain View, California + updates: + - article_link: null + image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE + posted_on: + day: 13 + month: 9 + year: 2022 + text: + "Want to kick start your #LifeAtGoogle but not sure where to begin?\ + \ Explore our Build Your Future site, where you can learn about developmental\ + \ programs, learn tips for future interviews, sign up for informational\ + \ events, and even hear real stories from Googlers who\u2019ve been\ + \ where you are now. Get started \u2192 https://bit.ly/3SKPzQB" + total_likes: 4267 + - article_link: null + image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg + posted_on: null + text: + "Ariana, welcome to Google. Here\u2019s to a year full of growth,\ + \ learning, and experiences at #LifeAtGoogle! \U0001F389" + total_likes: 397 + follower_count: 27472792 + acquisitions: + acquired: + - linkedin_profile_url: https://www.linkedin.com/company/apple + crunchbase_profile_url: https://www.crunchbase.com/organization/apple + announced_date: + day: 1 + month: 4 + year: 1976 + price: 300000000 + acquired_by: + linkedin_profile_url: https://www.linkedin.com/company/nvidia + crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia + announced_date: + day: 6 + month: 3 + year: 2020 + price: 10000 + exit_data: + - linkedin_profile_url: https://www.linkedin.com/company/motiondsp + crunchbase_profile_url: https://www.crunchbase.com/organization/motiondsp + name: MotionDSP + extra: + crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia + ipo_status: Public + crunchbase_rank: 13 + founding_date: + day: 1 + month: 1 + year: 2000 + operating_status: Active + company_type: For Profit + contact_email: info@nvidia.com + phone_number: (140) 848-6200 + facebook_id: NVIDIA.IN + twitter_id: nvidia + number_of_funding_rounds: 3 + total_funding_amount: 4000000 + stock_symbol: NASDAQ:NVDA + ipo_date: + day: 1 + month: 1 + year: 2000 + number_of_lead_investors: 3 + number_of_investors: 4 + total_fund_raised: 1000 + number_of_investments: 50 + number_of_lead_investments: 3 + number_of_exits: 7 + number_of_acquisitions: 2 + funding_data: + - funding_type: Grant + money_raised: 25000000 + announced_date: + day: 1 + month: 1 + year: 2001 + number_of_investor: 1 + investor_list: + - linkedin_profile_url: https://linkedin.com/company/darpa + name: DARPA + type: organization + categories: + - artificial-intelligence + - virtual-reality + last_updated: '2023-10-26T11:34:30Z' + CompanySearchResult: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/CSearchResult' + description: "\n A list of SearchResult objects.\n " + next_page: + type: string + nullable: true + description: + "\n The URL to the next page of search results. This\ + \ will be null for the final page.\n " + total_result_count: + type: integer + description: Total results found. + example: + results: + - *id039 + next_page: null + total_result_count: 1 + SearchResult: + type: object + properties: + linkedin_profile_url: + type: string + description: "\n The LinkedIn Profile URL of the person\n " + profile: + $ref: '#/components/schemas/PublicPerson' + nullable: true + description: + "\n If `enrich_profiles=enrich` is specified, the person's\ + \ entire profile\n is returned. Otherwise this field will return\ + \ `null`.\n " + last_updated: + type: string + nullable: true + description: + "\n ISO 8601 timestamp since the enriched profile was\ + \ last scraped.\n " + example: &id040 + linkedin_profile_url: https://www.linkedin.com/in/johnrmarty + profile: + public_identifier: johnrmarty + profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI + background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU + first_name: John + last_name: Marty + full_name: John Marty + follower_count: null + occupation: Co-Founder at Freedom Fund Real Estate + headline: Financial Freedom through Real Estate - LinkedIn Top Voice + summary: + "Most people go through life lost, disengaged, and unhappy at work\ + \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ + \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ + \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ + \ into the creation of an Internet of Things company, but numerous factors\ + \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ + \ had a baby on the way, and had zero job prospects (despite applying\ + \ to 150 companies). My desperate situation led me to take a job at Best\ + \ Buy for $12 an hour while reinventing myself through the completion\ + \ of an MBA at the University of Colorado, and a 6-month software development\ + \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ + \ Product Manager and then got poached by Amazon in 2017 (because of my\ + \ LinkedIn profile). My journey has led to a deep sense of perspective,\ + \ humility, and purpose that I draw on to help others find clarity, meaning,\ + \ and happiness in their careers and lives. \n\nCheck out my website for\ + \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ + \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ + \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ + A: I'd love to! I've shared my message on the future of employment, breaking\ + \ into big tech, and my personal story of reinventing myself and discovering\ + \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ + \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ + \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ + \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ + \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ + \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ + \ (don't forget that \"R\"....The other guy gets my emails all the time)" + country: US + country_full_name: United States of America + city: Seattle + state: Washington + experiences: + - starts_at: + day: 1 + month: 8 + year: 2021 + ends_at: null + company: Freedom Fund Real Estate + company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund + company_facebook_profile_url: null + title: Co-Founder + description: + 'Our mission is to provide everyday people seeking financial + freedom long before the age of 65 with the ability to invest in high + yield, short-term real estate investments that were only accessible + in the past for a select few wealthy individuals. Each of our single + family rehab projects require a minimum investment contribution of only + $10K, we have simple terms, no multi-year hold periods, and no fees. + With our unique model investors can log into our easy to use website, + select the projects that they want to invest in, and get realtime updates + on the status of their investments. + + + Website: https://www.freedomfundinvestments.com/home' + location: null + logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s + - starts_at: + day: 1 + month: 1 + year: 2021 + ends_at: null + company: Mindset Reset Podcast + company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast + company_facebook_profile_url: null + title: Founder + description: + "We dive into the mindsets of the world\u2019s foremost thought\ + \ leaders and turn them into actionable insights so that others can\ + \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" + location: Denver, Colorado, United States + logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 + education: + - starts_at: + day: 1 + month: 1 + year: 2013 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: Finance + Economics + degree_name: Master of Business Administration (MBA) + school: University of Colorado Denver + school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ + school_facebook_profile_url: null + description: null + logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE + grade: null + activities_and_societies: null + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: + day: 31 + month: 12 + year: 2015 + field_of_study: School of Software Development + degree_name: null + school: Galvanize Inc + school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ + school_facebook_profile_url: null + description: + rails, ruby, rspec, capybara, bootstrap, css, html, api integration, + Jquery, Javascript + logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE + grade: null + activities_and_societies: null + languages: + - English + - Spanish + accomplishment_organisations: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + org_name: Microsoft + title: Software Developer + description: null + accomplishment_publications: + - name: Nobel Peace Prize + publisher: Acme Corp + published_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + url: https://example.com + accomplishment_honors_awards: + - title: Nobel Peace Prize + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + accomplishment_patents: + - title: The art of war + issuer: Acme Corp + issued_on: + day: 1 + month: 1 + year: 1970 + description: + "\n Lorem ipsum dolor sit amet, consectetur\ + \ adipiscing elit\n " + application_number: '123' + patent_number: '123' + url: null + accomplishment_courses: + - name: The course about ABCs + number: '123' + accomplishment_projects: + - starts_at: + day: 1 + month: 3 + year: 2015 + ends_at: null + title: gMessenger + description: + gMessenger was built using Ruby on Rails, and the Bootstrap + HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration + to post a user's message content to the page in real time, with no page + refresh required. gMessenger also includes custom authentication with + three different permissions levels. + url: http://gmessenger.herokuapp.com/ + - starts_at: + day: 1 + month: 1 + year: 2015 + ends_at: null + title: Taskly + description: + A task and project management responsive web app utilizing + Ruby on Rails - CSS and HTML + url: https://hidden-coast-7204.herokuapp.com/ + accomplishment_test_scores: + - name: CS1101S + score: A + date_on: + day: 1 + month: 1 + year: 2010 + description: Nailed it without studying. + volunteer_work: + - starts_at: + day: 1 + month: 1 + year: 2012 + ends_at: + day: 1 + month: 8 + year: 2016 + title: Surveyor + cause: To help the world + company: Microsoft + company_linkedin_profile_url: https://www.linkedin.com/company/microsoft + description: null + logo_url: null + certifications: + - starts_at: null + ends_at: null + name: + SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices + in the SAFe Enterprise) + license_number: null + display_source: null + authority: Scaled Agile, Inc. + url: null + - starts_at: null + ends_at: null + name: SCRUM Alliance Certified Product Owner + license_number: null + display_source: null + authority: Scrum Alliance + url: null + connections: 500 + people_also_viewed: + - link: https://www.linkedin.com/in/johndoe + name: John Doe + summary: Software Engineer at Google + location: Singapore + recommendations: + - "Rebecca Canfield\n\n \n \n \n\n\n\n \ + \ \n \n \n \n \n\n \n \ + \ John Marty is a genius at his craft. He is skilled in the art of\ + \ making people feel empowered to seek out roles that they are qualified\ + \ for, ask for salaries that they deserve, and creates a kind of pay it\ + \ forward lifestyle. John helps you to get to places that you only thought\ + \ were possible for other people. Anyone that is fortunate enough to learn\ + \ from John should consider themselves extremely lucky. I know I do. " + - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ + \ \n \n \n \n\n \n John\ + \ is so focused on helping guide you through an interview process not\ + \ just for Amazon but on interviewing in general. I've generally done\ + \ well at interviewing, my skills are top notch now. John is so focused\ + \ on on his clients and really goes above and beyond. John is genuine,\ + \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ + \ so positive and really easy to talk to. Thank you John!" + activities: + - title: + "Yesterday I toured a $1.2M property in California that has a large\ + \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ + \ I\u2026" + link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo + activity_status: Shared by John Marty + similarly_named_profiles: + - name: John Martinez + link: https://www.linkedin.com/in/john-martinez-90384a229 + summary: + "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ + s Hardwood Works" + location: San Antonio, TX + - name: John Marty + link: https://www.linkedin.com/in/senatormarty + summary: null + location: St Paul, MN + articles: + - title: Manufacturing opportunity + link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ + published_date: + day: 27 + month: 11 + year: 2019 + author: Bill Gates + image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg + groups: + - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 + name: Hadoop Users + url: https://www.linkedin.com/groups/988957 + last_updated: '2023-10-26T11:34:30Z' + PersonSearchResult: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/SearchResult' + description: "\n A list of SearchResult objects\n " + next_page: + type: string + nullable: true + description: + "\n The URL to the next page of search results. This\ + \ will be null for the final page.\n " + total_result_count: + type: integer + description: Total results found. + example: + results: + - *id040 + next_page: null + total_result_count: 1 + CreditBalance: + type: object + properties: + credit_balance: + type: integer + description: Your current credit(s) + example: + credit_balance: 100000 + DisposableEmail: + type: object + properties: + is_disposable_email: + type: boolean + description: + Returns a boolean value of the disposable nature of the given + email address + is_free_email: + type: boolean + description: + Returns a boolean value of the free status of the given email + address + example: + is_disposable_email: null + is_free_email: null + PersonalContactNumbers: + type: object + properties: + numbers: + type: array + items: + type: string + description: A list of contact numbers + example: + numbers: + - '+1123123123' + PDLEmailResult: + type: object + properties: + emails: + type: array + items: + type: string + description: A list of personal emails + invalid_emails: + type: array + items: + type: string + description: A list of invalid personal emails + example: + emails: + - random@gmail.com + - random2@yahoo.com + invalid_emails: + - random3@gmail.com + securitySchemes: + BearerAuth: + type: http + scheme: bearer diff --git a/src/fns.ts b/src/fns.ts index 8a4feaf84..178d3839a 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -9,13 +9,6 @@ import { zodToJsonSchema } from './zod-to-json-schema.js' export const invocableMetadataKey = Symbol('invocable') -export interface Invocable { - name: string - description?: string - inputSchema?: z.AnyZodObject - callback: (args: Record) => Promise -} - export abstract class AIToolsProvider { private _tools?: ToolSet private _functions?: FunctionSet @@ -34,7 +27,16 @@ export abstract class AIToolsProvider { get functions(): FunctionSet { if (!this._functions) { - const invocables = getInvocables(this) + const metadata = this.constructor[Symbol.metadata] + const invocables = (metadata?.invocables as Invocable[]) ?? [] + const namespace = this.namespace + + const functions = invocables.map((invocable) => ({ + ...invocable, + name: invocable.name ?? `${namespace}_${invocable.propertyKey}`, + callback: (target as any)[invocable.propertyKey].bind(target) + })) + const functions = invocables.map(getFunctionSpec) this._functions = new FunctionSet(functions) } @@ -43,7 +45,14 @@ export abstract class AIToolsProvider { } } -export function getFunctionSpec(invocable: Invocable): types.AIFunctionSpec { +export interface Invocable { + name: string + description?: string + inputSchema?: z.AnyZodObject + callback: (args: Record) => Promise +} + +function getFunctionSpec(invocable: Invocable): types.AIFunctionSpec { const { name, description, inputSchema } = invocable return { @@ -58,14 +67,11 @@ export function getFunctionSpec(invocable: Invocable): types.AIFunctionSpec { } } -/** - * Constraints: - * - params must be an object, so the underlying function should only expect a - * single parameter - * - for the return value type `T | MaybePromise`, `T` must be serializable - * to JSON - */ -export function aiFunction({ +export function aiFunction< + This, + Args extends any[], + Return extends Promise +>({ name, description, inputSchema @@ -77,48 +83,38 @@ export function aiFunction({ // single parameter inputSchema?: z.AnyZodObject }) { - return function ( - target: object, - propertyKey: string, - descriptor: PropertyDescriptor - ) { - const existingInvocables = getPrivateInvocables(target) - - existingInvocables.push({ - propertyKey, + return ( + targetMethod: (this: This, ...args: Args) => Return, + context: ClassMethodDecoratorContext< + This, + (this: This, ...args: Args) => Return + > & { + readonly metadata: { + invocables: Invocable[] + } + } + ) => { + const methodName = String(context.name) + if (!context.metadata.invocables) { + context.metadata.invocables = [] + } + + context.metadata.invocables.push({ + name: name ?? methodName, description, - name, - inputSchema + inputSchema, + callback: targetMethod }) - setPrivateInvocables(target, existingInvocables) - - return descriptor.get ?? descriptor.value - } -} - -export function getInvocables(target: object): Invocable[] { - const invocables = getPrivateInvocables(target) - const namespace = target.constructor.name - - return invocables.map((invocable) => ({ - ...invocable, - name: invocable.name ?? `${namespace}_${invocable.propertyKey}`, - callback: (target as any)[invocable.propertyKey].bind(target) - })) -} - -interface PrivateInvocable { - propertyKey: string - name?: string - description?: string - inputSchema?: z.AnyZodObject -} + return targetMethod -function getPrivateInvocables(target: object): PrivateInvocable[] { - return Reflect.getMetadata(invocableMetadataKey, target) ?? [] -} + // function replacementMethod(this: This, ...args: Args): Return { + // console.log(`LOG: Entering method '${methodName}'.`) + // const result = targetMethod.call(this, ...args) + // console.log(`LOG: Exiting method '${methodName}'.`) + // return result + // } -function setPrivateInvocables(target: object, invocables: PrivateInvocable[]) { - Reflect.defineMetadata(invocableMetadataKey, invocables, target) + // return replacementMethod + } } diff --git a/src/index.ts b/src/index.ts index 6c52ac25b..43c86488d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,3 @@ -export * from './fns.js' export * from './function-set.js' export * from './parse-structured-output.js' export * from './services/index.js' diff --git a/src/services/clearbit.ts b/src/services/clearbit-client.ts similarity index 100% rename from src/services/clearbit.ts rename to src/services/clearbit-client.ts diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index 87b71a114..ad050a953 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -24,7 +24,7 @@ export class DexaClient { this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, timeout: 60_000 }) } - async generateResponse({ messages }: { messages: Prompt.Msg[] }) { + async askDexa({ messages }: { messages: Prompt.Msg[] }) { return this.ky .post('api/ask-dexa', { json: { diff --git a/src/services/diffbot.ts b/src/services/diffbot-client.ts similarity index 100% rename from src/services/diffbot.ts rename to src/services/diffbot-client.ts diff --git a/src/services/index.ts b/src/services/index.ts index e1570d819..8d452d892 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,9 +1,10 @@ -export * from './clearbit.js' +export * from './clearbit-client.js' export * from './dexa-client.js' -export * from './diffbot.js' +export * from './diffbot-client.js' export * from './openai-client.js' +export * from './proxycurl-client.js' export * from './scraper-client.js' -export * from './serpapi.js' -export * from './serper.js' +export * from './serpapi-client.js' +export * from './serper-client.js' export * from './twitter-client.js' -export * from './weather.js' +export * from './weather-client.js' diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts new file mode 100644 index 000000000..6bd79cc5a --- /dev/null +++ b/src/services/proxycurl-client.ts @@ -0,0 +1,2113 @@ +import defaultKy, { type KyInstance } from 'ky' +import * as z from 'zod' + +import { assert, getEnv } from '../utils.js' + +export namespace proxycurl { + export const CompanyTypeSchema = z.enum([ + 'EDUCATIONAL', + 'GOVERNMENT_AGENCY', + 'NON_PROFIT', + 'PARTNERSHIP', + 'PRIVATELY_HELD', + 'PUBLIC_COMPANY', + 'SELF_EMPLOYED', + 'SELF_OWNED' + ]) + export type CompanyType = z.infer + + export const CompanyProfileEndpointParamsQueryClassSchema = z.object({ + acquisitions: z.string().optional(), + categories: z.string().optional(), + exit_data: z.string().optional(), + extra: z.string().optional(), + fallback_to_cache: z.string().optional(), + funding_data: z.string().optional(), + resolve_numeric_id: z.string().optional(), + url: z.string(), + use_cache: z.string().optional() + }) + export type CompanyProfileEndpointParamsQueryClass = z.infer< + typeof CompanyProfileEndpointParamsQueryClassSchema + > + + export const PersonProfileEndpointParamsQueryClassSchema = z.object({ + extra: z.string().optional(), + facebook_profile_id: z.string().optional(), + facebook_profile_url: z.string().optional(), + fallback_to_cache: z.string().optional(), + github_profile_id: z.string().optional(), + inferred_salary: z.string().optional(), + linkedin_profile_url: z.string().optional(), + personal_contact_number: z.string().optional(), + personal_email: z.string().optional(), + skills: z.string().optional(), + twitter_profile_id: z.string().optional(), + twitter_profile_url: z.string().optional(), + use_cache: z.string().optional() + }) + export type PersonProfileEndpointParamsQueryClass = z.infer< + typeof PersonProfileEndpointParamsQueryClassSchema + > + + export const PersonLookupEndpointParamsQueryClassSchema = z.object({ + company_domain: z.string(), + enrich_profile: z.string().optional(), + first_name: z.string(), + last_name: z.string().optional(), + location: z.string().optional(), + similarity_checks: z.string().optional(), + title: z.string().optional() + }) + export type PersonLookupEndpointParamsQueryClass = z.infer< + typeof PersonLookupEndpointParamsQueryClassSchema + > + + export const RoleLookupEndpointParamsQueryClassSchema = z.object({ + company_name: z.string(), + enrich_profile: z.string().optional(), + role: z.string() + }) + export type RoleLookupEndpointParamsQueryClass = z.infer< + typeof RoleLookupEndpointParamsQueryClassSchema + > + + export const CompanyLookupEndpointParamsQueryClassSchema = z.object({ + company_domain: z.string().optional(), + company_location: z.string().optional(), + company_name: z.string().optional(), + enrich_profile: z.string().optional() + }) + export type CompanyLookupEndpointParamsQueryClass = z.infer< + typeof CompanyLookupEndpointParamsQueryClassSchema + > + + export const ReverseEmailLookupEndpointParamsQueryClassSchema = z.object({ + email: z.string().optional(), + enrich_profile: z.string().optional(), + lookup_depth: z.string().optional() + }) + export type ReverseEmailLookupEndpointParamsQueryClass = z.infer< + typeof ReverseEmailLookupEndpointParamsQueryClassSchema + > + + export const CompanySearchEndpointParamsQueryClassSchema = z.object({ + city: z.string().optional(), + country: z.string().optional(), + description: z.string().optional(), + employee_count_max: z.string().optional(), + employee_count_min: z.string().optional(), + enrich_profiles: z.string().optional(), + follower_count_max: z.string().optional(), + follower_count_min: z.string().optional(), + founded_after_year: z.string().optional(), + founded_before_year: z.string().optional(), + funding_amount_max: z.string().optional(), + funding_amount_min: z.string().optional(), + funding_raised_after: z.string().optional(), + funding_raised_before: z.string().optional(), + industry: z.string().optional(), + name: z.string().optional(), + page_size: z.string().optional(), + public_identifier_in_list: z.string().optional(), + public_identifier_not_in_list: z.string().optional(), + region: z.string().optional(), + type: z.string().optional() + }) + export type CompanySearchEndpointParamsQueryClass = z.infer< + typeof CompanySearchEndpointParamsQueryClassSchema + > + + export const PersonSearchEndpointParamsQueryClassSchema = z.object({ + city: z.string().optional(), + country: z.string(), + current_company_city: z.string().optional(), + current_company_country: z.string().optional(), + current_company_description: z.string().optional(), + current_company_employee_count_max: z.string().optional(), + current_company_employee_count_min: z.string().optional(), + current_company_follower_count_max: z.string().optional(), + current_company_follower_count_min: z.string().optional(), + current_company_founded_after_year: z.string().optional(), + current_company_founded_before_year: z.string().optional(), + current_company_funding_amount_max: z.string().optional(), + current_company_funding_amount_min: z.string().optional(), + current_company_funding_raised_after: z.string().optional(), + current_company_funding_raised_before: z.string().optional(), + current_company_industry: z.string().optional(), + current_company_linkedin_profile_url: z.string().optional(), + current_company_name: z.string().optional(), + current_company_region: z.string().optional(), + current_company_type: z.string().optional(), + current_job_description: z.string().optional(), + current_role_after: z.string().optional(), + current_role_before: z.string().optional(), + current_role_title: z.string().optional(), + education_degree_name: z.string().optional(), + education_field_of_study: z.string().optional(), + education_school_linkedin_profile_url: z.string().optional(), + education_school_name: z.string().optional(), + enrich_profiles: z.string().optional(), + first_name: z.string().optional(), + headline: z.string().optional(), + industries: z.string().optional(), + interests: z.string().optional(), + languages: z.string().optional(), + last_name: z.string().optional(), + linkedin_groups: z.string().optional(), + page_size: z.string().optional(), + past_company_linkedin_profile_url: z.string().optional(), + past_company_name: z.string().optional(), + past_job_description: z.string().optional(), + past_role_title: z.string().optional(), + public_identifier_in_list: z.string().optional(), + public_identifier_not_in_list: z.string().optional(), + region: z.string().optional(), + skills: z.string().optional(), + summary: z.string().optional() + }) + export type PersonSearchEndpointParamsQueryClass = z.infer< + typeof PersonSearchEndpointParamsQueryClassSchema + > + + export const PurpleCourseSchema = z.object({ + name: z.string().optional(), + number: z.string().optional() + }) + export type PurpleCourse = z.infer + + export const PurpleDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type PurpleDate = z.infer + + export const FluffyDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type FluffyDate = z.infer + + export const TentacledDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type TentacledDate = z.infer + + export const StickyDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type StickyDate = z.infer + + export const IndigoDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type IndigoDate = z.infer + + export const IndecentDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type IndecentDate = z.infer + + export const HilariousDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type HilariousDate = z.infer + + export const AmbitiousDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type AmbitiousDate = z.infer + + export const PurpleActivitySchema = z.object({ + activity_status: z.string().optional(), + link: z.string().optional(), + title: z.string().optional() + }) + export type PurpleActivity = z.infer + + export const CunningDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type CunningDate = z.infer + + export const MagentaDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type MagentaDate = z.infer + + export const FriskyDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type FriskyDate = z.infer + + export const MischievousDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type MischievousDate = z.infer + + export const BraggadociousDateSchema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type BraggadociousDate = z.infer + + export const Date1Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date1 = z.infer + + export const Date2Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date2 = z.infer + + export const Date3Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date3 = z.infer + + export const PurplePersonExtraSchema = z.object({ + facebook_profile_id: z.string().optional(), + github_profile_id: z.string().optional(), + twitter_profile_id: z.string().optional(), + website: z.string().optional() + }) + export type PurplePersonExtra = z.infer + + export const PurplePersonGroupSchema = z.object({ + name: z.string().optional(), + profile_pic_url: z.string().optional(), + url: z.string().optional() + }) + export type PurplePersonGroup = z.infer + + export const PurpleInferredSalarySchema = z.object({ + max: z.number().optional(), + min: z.number().optional() + }) + export type PurpleInferredSalary = z.infer + + export const PurplePeopleAlsoViewedSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type PurplePeopleAlsoViewed = z.infer< + typeof PurplePeopleAlsoViewedSchema + > + + export const PurpleSimilarProfileSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type PurpleSimilarProfile = z.infer + + export const Date4Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date4 = z.infer + + export const Date5Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date5 = z.infer + + export const FluffyCourseSchema = z.object({ + name: z.string().optional(), + number: z.string().optional() + }) + export type FluffyCourse = z.infer + + export const Date6Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date6 = z.infer + + export const Date7Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date7 = z.infer + + export const Date8Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date8 = z.infer + + export const Date9Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date9 = z.infer + + export const Date10Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date10 = z.infer + + export const Date11Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date11 = z.infer + + export const Date12Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date12 = z.infer + + export const Date13Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date13 = z.infer + + export const FluffyActivitySchema = z.object({ + activity_status: z.string().optional(), + link: z.string().optional(), + title: z.string().optional() + }) + export type FluffyActivity = z.infer + + export const Date14Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date14 = z.infer + + export const Date15Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date15 = z.infer + + export const Date16Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date16 = z.infer + + export const Date17Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date17 = z.infer + + export const Date18Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date18 = z.infer + + export const Date19Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date19 = z.infer + + export const Date20Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date20 = z.infer + + export const Date21Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date21 = z.infer + + export const FluffyPersonExtraSchema = z.object({ + facebook_profile_id: z.string().optional(), + github_profile_id: z.string().optional(), + twitter_profile_id: z.string().optional(), + website: z.string().optional() + }) + export type FluffyPersonExtra = z.infer + + export const FluffyPersonGroupSchema = z.object({ + name: z.string().optional(), + profile_pic_url: z.string().optional(), + url: z.string().optional() + }) + export type FluffyPersonGroup = z.infer + + export const FluffyInferredSalarySchema = z.object({ + max: z.number().optional(), + min: z.number().optional() + }) + export type FluffyInferredSalary = z.infer + + export const FluffyPeopleAlsoViewedSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type FluffyPeopleAlsoViewed = z.infer< + typeof FluffyPeopleAlsoViewedSchema + > + + export const FluffySimilarProfileSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type FluffySimilarProfile = z.infer + + export const Date22Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date22 = z.infer + + export const Date23Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date23 = z.infer + + export const TentacledCourseSchema = z.object({ + name: z.string().optional(), + number: z.string().optional() + }) + export type TentacledCourse = z.infer + + export const Date24Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date24 = z.infer + + export const Date25Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date25 = z.infer + + export const Date26Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date26 = z.infer + + export const Date27Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date27 = z.infer + + export const Date28Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date28 = z.infer + + export const Date29Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date29 = z.infer + + export const Date30Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date30 = z.infer + + export const Date31Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date31 = z.infer + + export const TentacledActivitySchema = z.object({ + activity_status: z.string().optional(), + link: z.string().optional(), + title: z.string().optional() + }) + export type TentacledActivity = z.infer + + export const Date32Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date32 = z.infer + + export const Date33Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date33 = z.infer + + export const Date34Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date34 = z.infer + + export const Date35Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date35 = z.infer + + export const Date36Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date36 = z.infer + + export const Date37Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date37 = z.infer + + export const Date38Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date38 = z.infer + + export const Date39Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date39 = z.infer + + export const TentacledPersonExtraSchema = z.object({ + facebook_profile_id: z.string().optional(), + github_profile_id: z.string().optional(), + twitter_profile_id: z.string().optional(), + website: z.string().optional() + }) + export type TentacledPersonExtra = z.infer + + export const TentacledPersonGroupSchema = z.object({ + name: z.string().optional(), + profile_pic_url: z.string().optional(), + url: z.string().optional() + }) + export type TentacledPersonGroup = z.infer + + export const TentacledInferredSalarySchema = z.object({ + max: z.number().optional(), + min: z.number().optional() + }) + export type TentacledInferredSalary = z.infer< + typeof TentacledInferredSalarySchema + > + + export const TentacledPeopleAlsoViewedSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type TentacledPeopleAlsoViewed = z.infer< + typeof TentacledPeopleAlsoViewedSchema + > + + export const TentacledSimilarProfileSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type TentacledSimilarProfile = z.infer< + typeof TentacledSimilarProfileSchema + > + + export const Date40Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date40 = z.infer + + export const Date41Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date41 = z.infer + + export const StickyCourseSchema = z.object({ + name: z.string().optional(), + number: z.string().optional() + }) + export type StickyCourse = z.infer + + export const Date42Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date42 = z.infer + + export const Date43Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date43 = z.infer + + export const Date44Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date44 = z.infer + + export const Date45Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date45 = z.infer + + export const Date46Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date46 = z.infer + + export const Date47Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date47 = z.infer + + export const Date48Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date48 = z.infer + + export const Date49Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date49 = z.infer + + export const StickyActivitySchema = z.object({ + activity_status: z.string().optional(), + link: z.string().optional(), + title: z.string().optional() + }) + export type StickyActivity = z.infer + + export const Date50Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date50 = z.infer + + export const Date51Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date51 = z.infer + + export const Date52Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date52 = z.infer + + export const Date53Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date53 = z.infer + + export const Date54Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date54 = z.infer + + export const Date55Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date55 = z.infer + + export const Date56Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date56 = z.infer + + export const StickyPersonGroupSchema = z.object({ + name: z.string().optional(), + profile_pic_url: z.string().optional(), + url: z.string().optional() + }) + export type StickyPersonGroup = z.infer + + export const StickyPeopleAlsoViewedSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type StickyPeopleAlsoViewed = z.infer< + typeof StickyPeopleAlsoViewedSchema + > + + export const StickySimilarProfileSchema = z.object({ + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional(), + summary: z.string().optional() + }) + export type StickySimilarProfile = z.infer + + export const Date57Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date57 = z.infer + + export const Date58Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date58 = z.infer + + export const Date59Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date59 = z.infer + + export const Date60Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date60 = z.infer + + export const PurpleAffiliatedCompanySchema = z.object({ + industry: z.string().optional(), + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional() + }) + export type PurpleAffiliatedCompany = z.infer< + typeof PurpleAffiliatedCompanySchema + > + + export const PurpleExitSchema = z.object({ + crunchbase_profile_url: z.string().optional(), + linkedin_profile_url: z.string().optional(), + name: z.string().optional() + }) + export type PurpleExit = z.infer + + export const Date61Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date61 = z.infer + + export const Date62Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date62 = z.infer + + export const Date63Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date63 = z.infer + + export const PurpleInvestorSchema = z.object({ + linkedin_profile_url: z.string().optional(), + name: z.string().optional(), + type: z.string().optional() + }) + export type PurpleInvestor = z.infer + + export const PurpleCompanyLocationSchema = z.object({ + city: z.string().optional(), + country: z.string().optional(), + is_hq: z.boolean().optional(), + line_1: z.string().optional(), + postal_code: z.string().optional(), + state: z.string().optional() + }) + export type PurpleCompanyLocation = z.infer< + typeof PurpleCompanyLocationSchema + > + + export const FluffyCompanyLocationSchema = z.object({ + city: z.string().optional(), + country: z.string().optional(), + is_hq: z.boolean().optional(), + line_1: z.string().optional(), + postal_code: z.string().optional(), + state: z.string().optional() + }) + export type FluffyCompanyLocation = z.infer< + typeof FluffyCompanyLocationSchema + > + + export const PurpleSimilarCompanySchema = z.object({ + industry: z.string().optional(), + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional() + }) + export type PurpleSimilarCompany = z.infer + + export const Date64Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date64 = z.infer + + export const Date65Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date65 = z.infer + + export const Date66Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date66 = z.infer + + export const FluffyAffiliatedCompanySchema = z.object({ + industry: z.string().optional(), + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional() + }) + export type FluffyAffiliatedCompany = z.infer< + typeof FluffyAffiliatedCompanySchema + > + + export const FluffyExitSchema = z.object({ + crunchbase_profile_url: z.string().optional(), + linkedin_profile_url: z.string().optional(), + name: z.string().optional() + }) + export type FluffyExit = z.infer + + export const Date67Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date67 = z.infer + + export const Date68Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date68 = z.infer + + export const Date69Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date69 = z.infer + + export const FluffyInvestorSchema = z.object({ + linkedin_profile_url: z.string().optional(), + name: z.string().optional(), + type: z.string().optional() + }) + export type FluffyInvestor = z.infer + + export const TentacledCompanyLocationSchema = z.object({ + city: z.string().optional(), + country: z.string().optional(), + is_hq: z.boolean().optional(), + line_1: z.string().optional(), + postal_code: z.string().optional(), + state: z.string().optional() + }) + export type TentacledCompanyLocation = z.infer< + typeof TentacledCompanyLocationSchema + > + + export const StickyCompanyLocationSchema = z.object({ + city: z.string().optional(), + country: z.string().optional(), + is_hq: z.boolean().optional(), + line_1: z.string().optional(), + postal_code: z.string().optional(), + state: z.string().optional() + }) + export type StickyCompanyLocation = z.infer< + typeof StickyCompanyLocationSchema + > + + export const FluffySimilarCompanySchema = z.object({ + industry: z.string().optional(), + link: z.string().optional(), + location: z.string().optional(), + name: z.string().optional() + }) + export type FluffySimilarCompany = z.infer + + export const Date70Schema = z.object({ + day: z.number().optional(), + month: z.number().optional(), + year: z.number().optional() + }) + export type Date70 = z.infer + + export const PurpleHonourAwardSchema = z.object({ + description: z.string().optional(), + issued_on: PurpleDateSchema.optional(), + issuer: z.string().optional(), + title: z.string().optional() + }) + export type PurpleHonourAward = z.infer + + export const PurpleAccomplishmentOrgSchema = z.object({ + description: z.string().optional(), + ends_at: FluffyDateSchema.optional(), + org_name: z.string().optional(), + starts_at: TentacledDateSchema.optional(), + title: z.string().optional() + }) + export type PurpleAccomplishmentOrg = z.infer< + typeof PurpleAccomplishmentOrgSchema + > + + export const PurplePatentSchema = z.object({ + application_number: z.string().optional(), + description: z.string().optional(), + issued_on: StickyDateSchema.optional(), + issuer: z.string().optional(), + patent_number: z.string().optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type PurplePatent = z.infer + + export const PurpleProjectSchema = z.object({ + description: z.string().optional(), + ends_at: IndigoDateSchema.optional(), + starts_at: IndecentDateSchema.optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type PurpleProject = z.infer + + export const PurplePublicationSchema = z.object({ + description: z.string().optional(), + name: z.string().optional(), + published_on: HilariousDateSchema.optional(), + publisher: z.string().optional(), + url: z.string().optional() + }) + export type PurplePublication = z.infer + + export const PurpleTestScoreSchema = z.object({ + date_on: AmbitiousDateSchema.optional(), + description: z.string().optional(), + name: z.string().optional(), + score: z.string().optional() + }) + export type PurpleTestScore = z.infer + + export const PurpleArticleSchema = z.object({ + author: z.string().optional(), + image_url: z.string().optional(), + link: z.string().optional(), + published_date: CunningDateSchema.optional(), + title: z.string().optional() + }) + export type PurpleArticle = z.infer + + export const PurpleCertificationSchema = z.object({ + authority: z.string().optional(), + display_source: z.string().optional(), + ends_at: FriskyDateSchema.optional(), + license_number: z.string().optional(), + name: z.string().optional(), + starts_at: MischievousDateSchema.optional(), + url: z.string().optional() + }) + export type PurpleCertification = z.infer + + export const PurpleEducationSchema = z.object({ + activities_and_societies: z.string().optional(), + degree_name: z.string().optional(), + description: z.string().optional(), + ends_at: BraggadociousDateSchema.optional(), + field_of_study: z.string().optional(), + grade: z.string().optional(), + logo_url: z.string().optional(), + school: z.string().optional(), + school_facebook_profile_url: z.string().optional(), + school_linkedin_profile_url: z.string().optional(), + starts_at: Date1Schema.optional() + }) + export type PurpleEducation = z.infer + + export const PurpleExperienceSchema = z.object({ + company: z.string().optional(), + company_facebook_profile_url: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date2Schema.optional(), + location: z.string().optional(), + logo_url: z.string().optional(), + starts_at: Date3Schema.optional(), + title: z.string().optional() + }) + export type PurpleExperience = z.infer + + export const PurpleVolunteeringExperienceSchema = z.object({ + cause: z.string().optional(), + company: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date4Schema.optional(), + logo_url: z.string().optional(), + starts_at: Date5Schema.optional(), + title: z.string().optional() + }) + export type PurpleVolunteeringExperience = z.infer< + typeof PurpleVolunteeringExperienceSchema + > + + export const FluffyHonourAwardSchema = z.object({ + description: z.string().optional(), + issued_on: Date6Schema.optional(), + issuer: z.string().optional(), + title: z.string().optional() + }) + export type FluffyHonourAward = z.infer + + export const FluffyAccomplishmentOrgSchema = z.object({ + description: z.string().optional(), + ends_at: Date7Schema.optional(), + org_name: z.string().optional(), + starts_at: Date8Schema.optional(), + title: z.string().optional() + }) + export type FluffyAccomplishmentOrg = z.infer< + typeof FluffyAccomplishmentOrgSchema + > + + export const FluffyPatentSchema = z.object({ + application_number: z.string().optional(), + description: z.string().optional(), + issued_on: Date9Schema.optional(), + issuer: z.string().optional(), + patent_number: z.string().optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type FluffyPatent = z.infer + + export const FluffyProjectSchema = z.object({ + description: z.string().optional(), + ends_at: Date10Schema.optional(), + starts_at: Date11Schema.optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type FluffyProject = z.infer + + export const FluffyPublicationSchema = z.object({ + description: z.string().optional(), + name: z.string().optional(), + published_on: Date12Schema.optional(), + publisher: z.string().optional(), + url: z.string().optional() + }) + export type FluffyPublication = z.infer + + export const FluffyTestScoreSchema = z.object({ + date_on: Date13Schema.optional(), + description: z.string().optional(), + name: z.string().optional(), + score: z.string().optional() + }) + export type FluffyTestScore = z.infer + + export const FluffyArticleSchema = z.object({ + author: z.string().optional(), + image_url: z.string().optional(), + link: z.string().optional(), + published_date: Date14Schema.optional(), + title: z.string().optional() + }) + export type FluffyArticle = z.infer + + export const FluffyCertificationSchema = z.object({ + authority: z.string().optional(), + display_source: z.string().optional(), + ends_at: Date16Schema.optional(), + license_number: z.string().optional(), + name: z.string().optional(), + starts_at: Date17Schema.optional(), + url: z.string().optional() + }) + export type FluffyCertification = z.infer + + export const FluffyEducationSchema = z.object({ + activities_and_societies: z.string().optional(), + degree_name: z.string().optional(), + description: z.string().optional(), + ends_at: Date18Schema.optional(), + field_of_study: z.string().optional(), + grade: z.string().optional(), + logo_url: z.string().optional(), + school: z.string().optional(), + school_facebook_profile_url: z.string().optional(), + school_linkedin_profile_url: z.string().optional(), + starts_at: Date19Schema.optional() + }) + export type FluffyEducation = z.infer + + export const FluffyExperienceSchema = z.object({ + company: z.string().optional(), + company_facebook_profile_url: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date20Schema.optional(), + location: z.string().optional(), + logo_url: z.string().optional(), + starts_at: Date21Schema.optional(), + title: z.string().optional() + }) + export type FluffyExperience = z.infer + + export const FluffyVolunteeringExperienceSchema = z.object({ + cause: z.string().optional(), + company: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date22Schema.optional(), + logo_url: z.string().optional(), + starts_at: Date23Schema.optional(), + title: z.string().optional() + }) + export type FluffyVolunteeringExperience = z.infer< + typeof FluffyVolunteeringExperienceSchema + > + + export const TentacledHonourAwardSchema = z.object({ + description: z.string().optional(), + issued_on: Date24Schema.optional(), + issuer: z.string().optional(), + title: z.string().optional() + }) + export type TentacledHonourAward = z.infer + + export const TentacledAccomplishmentOrgSchema = z.object({ + description: z.string().optional(), + ends_at: Date25Schema.optional(), + org_name: z.string().optional(), + starts_at: Date26Schema.optional(), + title: z.string().optional() + }) + export type TentacledAccomplishmentOrg = z.infer< + typeof TentacledAccomplishmentOrgSchema + > + + export const TentacledPatentSchema = z.object({ + application_number: z.string().optional(), + description: z.string().optional(), + issued_on: Date27Schema.optional(), + issuer: z.string().optional(), + patent_number: z.string().optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type TentacledPatent = z.infer + + export const TentacledProjectSchema = z.object({ + description: z.string().optional(), + ends_at: Date28Schema.optional(), + starts_at: Date29Schema.optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type TentacledProject = z.infer + + export const TentacledPublicationSchema = z.object({ + description: z.string().optional(), + name: z.string().optional(), + published_on: Date30Schema.optional(), + publisher: z.string().optional(), + url: z.string().optional() + }) + export type TentacledPublication = z.infer + + export const TentacledTestScoreSchema = z.object({ + date_on: Date31Schema.optional(), + description: z.string().optional(), + name: z.string().optional(), + score: z.string().optional() + }) + export type TentacledTestScore = z.infer + + export const TentacledArticleSchema = z.object({ + author: z.string().optional(), + image_url: z.string().optional(), + link: z.string().optional(), + published_date: Date32Schema.optional(), + title: z.string().optional() + }) + export type TentacledArticle = z.infer + + export const TentacledCertificationSchema = z.object({ + authority: z.string().optional(), + display_source: z.string().optional(), + ends_at: Date34Schema.optional(), + license_number: z.string().optional(), + name: z.string().optional(), + starts_at: Date35Schema.optional(), + url: z.string().optional() + }) + export type TentacledCertification = z.infer< + typeof TentacledCertificationSchema + > + + export const TentacledEducationSchema = z.object({ + activities_and_societies: z.string().optional(), + degree_name: z.string().optional(), + description: z.string().optional(), + ends_at: Date36Schema.optional(), + field_of_study: z.string().optional(), + grade: z.string().optional(), + logo_url: z.string().optional(), + school: z.string().optional(), + school_facebook_profile_url: z.string().optional(), + school_linkedin_profile_url: z.string().optional(), + starts_at: Date37Schema.optional() + }) + export type TentacledEducation = z.infer + + export const TentacledExperienceSchema = z.object({ + company: z.string().optional(), + company_facebook_profile_url: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date38Schema.optional(), + location: z.string().optional(), + logo_url: z.string().optional(), + starts_at: Date39Schema.optional(), + title: z.string().optional() + }) + export type TentacledExperience = z.infer + + export const TentacledVolunteeringExperienceSchema = z.object({ + cause: z.string().optional(), + company: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date40Schema.optional(), + logo_url: z.string().optional(), + starts_at: Date41Schema.optional(), + title: z.string().optional() + }) + export type TentacledVolunteeringExperience = z.infer< + typeof TentacledVolunteeringExperienceSchema + > + + export const StickyHonourAwardSchema = z.object({ + description: z.string().optional(), + issued_on: Date42Schema.optional(), + issuer: z.string().optional(), + title: z.string().optional() + }) + export type StickyHonourAward = z.infer + + export const StickyAccomplishmentOrgSchema = z.object({ + description: z.string().optional(), + ends_at: Date43Schema.optional(), + org_name: z.string().optional(), + starts_at: Date44Schema.optional(), + title: z.string().optional() + }) + export type StickyAccomplishmentOrg = z.infer< + typeof StickyAccomplishmentOrgSchema + > + + export const StickyPatentSchema = z.object({ + application_number: z.string().optional(), + description: z.string().optional(), + issued_on: Date45Schema.optional(), + issuer: z.string().optional(), + patent_number: z.string().optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type StickyPatent = z.infer + + export const StickyProjectSchema = z.object({ + description: z.string().optional(), + ends_at: Date46Schema.optional(), + starts_at: Date47Schema.optional(), + title: z.string().optional(), + url: z.string().optional() + }) + export type StickyProject = z.infer + + export const StickyPublicationSchema = z.object({ + description: z.string().optional(), + name: z.string().optional(), + published_on: Date48Schema.optional(), + publisher: z.string().optional(), + url: z.string().optional() + }) + export type StickyPublication = z.infer + + export const StickyTestScoreSchema = z.object({ + date_on: Date49Schema.optional(), + description: z.string().optional(), + name: z.string().optional(), + score: z.string().optional() + }) + export type StickyTestScore = z.infer + + export const StickyArticleSchema = z.object({ + author: z.string().optional(), + image_url: z.string().optional(), + link: z.string().optional(), + published_date: Date50Schema.optional(), + title: z.string().optional() + }) + export type StickyArticle = z.infer + + export const StickyCertificationSchema = z.object({ + authority: z.string().optional(), + display_source: z.string().optional(), + ends_at: Date51Schema.optional(), + license_number: z.string().optional(), + name: z.string().optional(), + starts_at: Date52Schema.optional(), + url: z.string().optional() + }) + export type StickyCertification = z.infer + + export const StickyEducationSchema = z.object({ + activities_and_societies: z.string().optional(), + degree_name: z.string().optional(), + description: z.string().optional(), + ends_at: Date53Schema.optional(), + field_of_study: z.string().optional(), + grade: z.string().optional(), + logo_url: z.string().optional(), + school: z.string().optional(), + school_facebook_profile_url: z.string().optional(), + school_linkedin_profile_url: z.string().optional(), + starts_at: Date54Schema.optional() + }) + export type StickyEducation = z.infer + + export const StickyExperienceSchema = z.object({ + company: z.string().optional(), + company_facebook_profile_url: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date55Schema.optional(), + location: z.string().optional(), + logo_url: z.string().optional(), + starts_at: Date56Schema.optional(), + title: z.string().optional() + }) + export type StickyExperience = z.infer + + export const StickyVolunteeringExperienceSchema = z.object({ + cause: z.string().optional(), + company: z.string().optional(), + company_linkedin_profile_url: z.string().optional(), + description: z.string().optional(), + ends_at: Date57Schema.optional(), + logo_url: z.string().optional(), + starts_at: Date58Schema.optional(), + title: z.string().optional() + }) + export type StickyVolunteeringExperience = z.infer< + typeof StickyVolunteeringExperienceSchema + > + + export const PurpleAcquiredCompanySchema = z.object({ + announced_date: Date59Schema.optional(), + crunchbase_profile_url: z.string().optional(), + linkedin_profile_url: z.string().optional(), + price: z.number().optional() + }) + export type PurpleAcquiredCompany = z.infer< + typeof PurpleAcquiredCompanySchema + > + + export const PurpleAcquisitorSchema = z.object({ + announced_date: Date60Schema.optional(), + crunchbase_profile_url: z.string().optional(), + linkedin_profile_url: z.string().optional(), + price: z.number().optional() + }) + export type PurpleAcquisitor = z.infer + + export const PurpleCompanyDetailsSchema = z.object({ + company_type: z.string().optional(), + contact_email: z.string().optional(), + crunchbase_profile_url: z.string().optional(), + crunchbase_rank: z.number().optional(), + facebook_id: z.string().optional(), + founding_date: Date61Schema.optional(), + ipo_date: Date62Schema.optional(), + ipo_status: z.string().optional(), + number_of_acquisitions: z.number().optional(), + number_of_exits: z.number().optional(), + number_of_funding_rounds: z.number().optional(), + number_of_investments: z.number().optional(), + number_of_investors: z.number().optional(), + number_of_lead_investments: z.number().optional(), + number_of_lead_investors: z.number().optional(), + operating_status: z.string().optional(), + phone_number: z.string().optional(), + stock_symbol: z.string().optional(), + total_fund_raised: z.number().optional(), + total_funding_amount: z.number().optional(), + twitter_id: z.string().optional() + }) + export type PurpleCompanyDetails = z.infer + + export const PurpleFundingSchema = z.object({ + announced_date: Date63Schema.optional(), + funding_type: z.string().optional(), + investor_list: z.array(PurpleInvestorSchema).optional(), + money_raised: z.number().optional(), + number_of_investor: z.number().optional() + }) + export type PurpleFunding = z.infer + + export const PurpleCompanyUpdateSchema = z.object({ + article_link: z.string().optional(), + image: z.string().optional(), + posted_on: Date64Schema.optional(), + text: z.string().optional(), + total_likes: z.number().optional() + }) + export type PurpleCompanyUpdate = z.infer + + export const FluffyAcquiredCompanySchema = z.object({ + announced_date: Date65Schema.optional(), + crunchbase_profile_url: z.string().optional(), + linkedin_profile_url: z.string().optional(), + price: z.number().optional() + }) + export type FluffyAcquiredCompany = z.infer< + typeof FluffyAcquiredCompanySchema + > + + export const FluffyAcquisitorSchema = z.object({ + announced_date: Date66Schema.optional(), + crunchbase_profile_url: z.string().optional(), + linkedin_profile_url: z.string().optional(), + price: z.number().optional() + }) + export type FluffyAcquisitor = z.infer + + export const FluffyCompanyDetailsSchema = z.object({ + company_type: z.string().optional(), + contact_email: z.string().optional(), + crunchbase_profile_url: z.string().optional(), + crunchbase_rank: z.number().optional(), + facebook_id: z.string().optional(), + founding_date: Date67Schema.optional(), + ipo_date: Date68Schema.optional(), + ipo_status: z.string().optional(), + number_of_acquisitions: z.number().optional(), + number_of_exits: z.number().optional(), + number_of_funding_rounds: z.number().optional(), + number_of_investments: z.number().optional(), + number_of_investors: z.number().optional(), + number_of_lead_investments: z.number().optional(), + number_of_lead_investors: z.number().optional(), + operating_status: z.string().optional(), + phone_number: z.string().optional(), + stock_symbol: z.string().optional(), + total_fund_raised: z.number().optional(), + total_funding_amount: z.number().optional(), + twitter_id: z.string().optional() + }) + export type FluffyCompanyDetails = z.infer + + export const FluffyFundingSchema = z.object({ + announced_date: Date69Schema.optional(), + funding_type: z.string().optional(), + investor_list: z.array(FluffyInvestorSchema).optional(), + money_raised: z.number().optional(), + number_of_investor: z.number().optional() + }) + export type FluffyFunding = z.infer + + export const FluffyCompanyUpdateSchema = z.object({ + article_link: z.string().optional(), + image: z.string().optional(), + posted_on: Date70Schema.optional(), + text: z.string().optional(), + total_likes: z.number().optional() + }) + export type FluffyCompanyUpdate = z.infer + + export const PersonLookupUrlEnrichResultProfileSchema = z.object({ + accomplishment_courses: z.array(PurpleCourseSchema).optional(), + accomplishment_honors_awards: z.array(PurpleHonourAwardSchema).optional(), + accomplishment_organisations: z + .array(PurpleAccomplishmentOrgSchema) + .optional(), + accomplishment_patents: z.array(PurplePatentSchema).optional(), + accomplishment_projects: z.array(PurpleProjectSchema).optional(), + accomplishment_publications: z.array(PurplePublicationSchema).optional(), + accomplishment_test_scores: z.array(PurpleTestScoreSchema).optional(), + activities: z.array(PurpleActivitySchema).optional(), + articles: z.array(PurpleArticleSchema).optional(), + background_cover_image_url: z.string().optional(), + birth_date: MagentaDateSchema.optional(), + certifications: z.array(PurpleCertificationSchema).optional(), + city: z.string().optional(), + connections: z.number().optional(), + country: z.string().optional(), + country_full_name: z.string().optional(), + education: z.array(PurpleEducationSchema).optional(), + experiences: z.array(PurpleExperienceSchema).optional(), + extra: PurplePersonExtraSchema.optional(), + first_name: z.string().optional(), + follower_count: z.number().optional(), + full_name: z.string().optional(), + gender: z.string().optional(), + groups: z.array(PurplePersonGroupSchema).optional(), + headline: z.string().optional(), + industry: z.string().optional(), + inferred_salary: PurpleInferredSalarySchema.optional(), + interests: z.array(z.string()).optional(), + languages: z.array(z.string()).optional(), + last_name: z.string().optional(), + occupation: z.string().optional(), + people_also_viewed: z.array(PurplePeopleAlsoViewedSchema).optional(), + personal_emails: z.array(z.string()).optional(), + personal_numbers: z.array(z.string()).optional(), + profile_pic_url: z.string().optional(), + public_identifier: z.string().optional(), + recommendations: z.array(z.string()).optional(), + similarly_named_profiles: z.array(PurpleSimilarProfileSchema).optional(), + skills: z.array(z.string()).optional(), + state: z.string().optional(), + summary: z.string().optional(), + volunteer_work: z.array(PurpleVolunteeringExperienceSchema).optional() + }) + export type PersonLookupUrlEnrichResultProfile = z.infer< + typeof PersonLookupUrlEnrichResultProfileSchema + > + + export const RoleSearchEnrichedResultProfileSchema = z.object({ + accomplishment_courses: z.array(FluffyCourseSchema).optional(), + accomplishment_honors_awards: z.array(FluffyHonourAwardSchema).optional(), + accomplishment_organisations: z + .array(FluffyAccomplishmentOrgSchema) + .optional(), + accomplishment_patents: z.array(FluffyPatentSchema).optional(), + accomplishment_projects: z.array(FluffyProjectSchema).optional(), + accomplishment_publications: z.array(FluffyPublicationSchema).optional(), + accomplishment_test_scores: z.array(FluffyTestScoreSchema).optional(), + activities: z.array(FluffyActivitySchema).optional(), + articles: z.array(FluffyArticleSchema).optional(), + background_cover_image_url: z.string().optional(), + birth_date: Date15Schema.optional(), + certifications: z.array(FluffyCertificationSchema).optional(), + city: z.string().optional(), + connections: z.number().optional(), + country: z.string().optional(), + country_full_name: z.string().optional(), + education: z.array(FluffyEducationSchema).optional(), + experiences: z.array(FluffyExperienceSchema).optional(), + extra: FluffyPersonExtraSchema.optional(), + first_name: z.string().optional(), + follower_count: z.number().optional(), + full_name: z.string().optional(), + gender: z.string().optional(), + groups: z.array(FluffyPersonGroupSchema).optional(), + headline: z.string().optional(), + industry: z.string().optional(), + inferred_salary: FluffyInferredSalarySchema.optional(), + interests: z.array(z.string()).optional(), + languages: z.array(z.string()).optional(), + last_name: z.string().optional(), + occupation: z.string().optional(), + people_also_viewed: z.array(FluffyPeopleAlsoViewedSchema).optional(), + personal_emails: z.array(z.string()).optional(), + personal_numbers: z.array(z.string()).optional(), + profile_pic_url: z.string().optional(), + public_identifier: z.string().optional(), + recommendations: z.array(z.string()).optional(), + similarly_named_profiles: z.array(FluffySimilarProfileSchema).optional(), + skills: z.array(z.string()).optional(), + state: z.string().optional(), + summary: z.string().optional(), + volunteer_work: z.array(FluffyVolunteeringExperienceSchema).optional() + }) + export type RoleSearchEnrichedResultProfile = z.infer< + typeof RoleSearchEnrichedResultProfileSchema + > + + export const ReverseEmailUrlEnrichResultProfileSchema = z.object({ + accomplishment_courses: z.array(TentacledCourseSchema).optional(), + accomplishment_honors_awards: z + .array(TentacledHonourAwardSchema) + .optional(), + accomplishment_organisations: z + .array(TentacledAccomplishmentOrgSchema) + .optional(), + accomplishment_patents: z.array(TentacledPatentSchema).optional(), + accomplishment_projects: z.array(TentacledProjectSchema).optional(), + accomplishment_publications: z.array(TentacledPublicationSchema).optional(), + accomplishment_test_scores: z.array(TentacledTestScoreSchema).optional(), + activities: z.array(TentacledActivitySchema).optional(), + articles: z.array(TentacledArticleSchema).optional(), + background_cover_image_url: z.string().optional(), + birth_date: Date33Schema.optional(), + certifications: z.array(TentacledCertificationSchema).optional(), + city: z.string().optional(), + connections: z.number().optional(), + country: z.string().optional(), + country_full_name: z.string().optional(), + education: z.array(TentacledEducationSchema).optional(), + experiences: z.array(TentacledExperienceSchema).optional(), + extra: TentacledPersonExtraSchema.optional(), + first_name: z.string().optional(), + follower_count: z.number().optional(), + full_name: z.string().optional(), + gender: z.string().optional(), + groups: z.array(TentacledPersonGroupSchema).optional(), + headline: z.string().optional(), + industry: z.string().optional(), + inferred_salary: TentacledInferredSalarySchema.optional(), + interests: z.array(z.string()).optional(), + languages: z.array(z.string()).optional(), + last_name: z.string().optional(), + occupation: z.string().optional(), + people_also_viewed: z.array(TentacledPeopleAlsoViewedSchema).optional(), + personal_emails: z.array(z.string()).optional(), + personal_numbers: z.array(z.string()).optional(), + profile_pic_url: z.string().optional(), + public_identifier: z.string().optional(), + recommendations: z.array(z.string()).optional(), + similarly_named_profiles: z.array(TentacledSimilarProfileSchema).optional(), + skills: z.array(z.string()).optional(), + state: z.string().optional(), + summary: z.string().optional(), + volunteer_work: z.array(TentacledVolunteeringExperienceSchema).optional() + }) + export type ReverseEmailUrlEnrichResultProfile = z.infer< + typeof ReverseEmailUrlEnrichResultProfileSchema + > + + export const PublicPersonSchema = z.object({ + accomplishment_courses: z.array(StickyCourseSchema).optional(), + accomplishment_honors_awards: z.array(StickyHonourAwardSchema).optional(), + accomplishment_organisations: z + .array(StickyAccomplishmentOrgSchema) + .optional(), + accomplishment_patents: z.array(StickyPatentSchema).optional(), + accomplishment_projects: z.array(StickyProjectSchema).optional(), + accomplishment_publications: z.array(StickyPublicationSchema).optional(), + accomplishment_test_scores: z.array(StickyTestScoreSchema).optional(), + activities: z.array(StickyActivitySchema).optional(), + articles: z.array(StickyArticleSchema).optional(), + background_cover_image_url: z.string().optional(), + certifications: z.array(StickyCertificationSchema).optional(), + city: z.string().optional(), + connections: z.number().optional(), + country: z.string().optional(), + country_full_name: z.string().optional(), + education: z.array(StickyEducationSchema).optional(), + experiences: z.array(StickyExperienceSchema).optional(), + first_name: z.string().optional(), + follower_count: z.number().optional(), + full_name: z.string().optional(), + groups: z.array(StickyPersonGroupSchema).optional(), + headline: z.string().optional(), + languages: z.array(z.string()).optional(), + last_name: z.string().optional(), + occupation: z.string().optional(), + people_also_viewed: z.array(StickyPeopleAlsoViewedSchema).optional(), + profile_pic_url: z.string().optional(), + public_identifier: z.string().optional(), + recommendations: z.array(z.string()).optional(), + similarly_named_profiles: z.array(StickySimilarProfileSchema).optional(), + skills: z.array(z.string()).optional(), + state: z.string().optional(), + summary: z.string().optional(), + volunteer_work: z.array(StickyVolunteeringExperienceSchema).optional() + }) + export type PublicPerson = z.infer + + export const PurpleAcquisitionSchema = z.object({ + acquired: z.array(PurpleAcquiredCompanySchema).optional(), + acquired_by: PurpleAcquisitorSchema.optional() + }) + export type PurpleAcquisition = z.infer + + export const FluffyAcquisitionSchema = z.object({ + acquired: z.array(FluffyAcquiredCompanySchema).optional(), + acquired_by: FluffyAcquisitorSchema.optional() + }) + export type FluffyAcquisition = z.infer + + export const PersonLookupUrlEnrichResultSchema = z.object({ + company_similarity_score: z.number().optional(), + last_updated: z.string().optional(), + location_similarity_score: z.number().optional(), + name_similarity_score: z.number().optional(), + profile: PersonLookupUrlEnrichResultProfileSchema.optional(), + title_similarity_score: z.number().optional(), + url: z.string().optional() + }) + export type PersonLookupUrlEnrichResult = z.infer< + typeof PersonLookupUrlEnrichResultSchema + > + + export const RoleSearchEnrichedResultSchema = z.object({ + last_updated: z.string().optional(), + linkedin_profile_url: z.string().optional(), + profile: RoleSearchEnrichedResultProfileSchema.optional() + }) + export type RoleSearchEnrichedResult = z.infer< + typeof RoleSearchEnrichedResultSchema + > + + export const ReverseEmailUrlEnrichResultSchema = z.object({ + backwards_compatibility_notes: z.string().optional(), + facebook_profile_url: z.string().optional(), + last_updated: z.string().optional(), + linkedin_profile_url: z.string().optional(), + profile: ReverseEmailUrlEnrichResultProfileSchema.optional(), + similarity_score: z.number().optional(), + twitter_profile_url: z.string().optional(), + url: z.string().optional() + }) + export type ReverseEmailUrlEnrichResult = z.infer< + typeof ReverseEmailUrlEnrichResultSchema + > + + export const SearchResultSchema = z.object({ + last_updated: z.string().optional(), + linkedin_profile_url: z.string().optional(), + profile: PublicPersonSchema.optional() + }) + export type SearchResult = z.infer + + export const ResultProfileSchema = z.object({ + acquisitions: PurpleAcquisitionSchema.optional(), + affiliated_companies: z.array(PurpleAffiliatedCompanySchema).optional(), + background_cover_image_url: z.string().optional(), + categories: z.array(z.string()).optional(), + company_size: z.array(z.number()).optional(), + company_size_on_linkedin: z.number().optional(), + company_type: CompanyTypeSchema.optional(), + customer_list: z.array(z.string()).optional(), + description: z.string().optional(), + exit_data: z.array(PurpleExitSchema).optional(), + extra: PurpleCompanyDetailsSchema.optional(), + follower_count: z.number().optional(), + founded_year: z.number().optional(), + funding_data: z.array(PurpleFundingSchema).optional(), + hq: PurpleCompanyLocationSchema.optional(), + industry: z.string().optional(), + linkedin_internal_id: z.string().optional(), + locations: z.array(FluffyCompanyLocationSchema).optional(), + name: z.string().optional(), + profile_pic_url: z.string().optional(), + search_id: z.string().optional(), + similar_companies: z.array(PurpleSimilarCompanySchema).optional(), + specialities: z.array(z.string()).optional(), + tagline: z.string().optional(), + universal_name_id: z.string().optional(), + updates: z.array(PurpleCompanyUpdateSchema).optional(), + website: z.string().optional() + }) + export type ResultProfile = z.infer + + export const CompanyUrlEnrichResultProfileSchema = z.object({ + acquisitions: FluffyAcquisitionSchema.optional(), + affiliated_companies: z.array(FluffyAffiliatedCompanySchema).optional(), + background_cover_image_url: z.string().optional(), + categories: z.array(z.string()).optional(), + company_size: z.array(z.number()).optional(), + company_size_on_linkedin: z.number().optional(), + company_type: CompanyTypeSchema.optional(), + customer_list: z.array(z.string()).optional(), + description: z.string().optional(), + exit_data: z.array(FluffyExitSchema).optional(), + extra: FluffyCompanyDetailsSchema.optional(), + follower_count: z.number().optional(), + founded_year: z.number().optional(), + funding_data: z.array(FluffyFundingSchema).optional(), + hq: TentacledCompanyLocationSchema.optional(), + industry: z.string().optional(), + linkedin_internal_id: z.string().optional(), + locations: z.array(StickyCompanyLocationSchema).optional(), + name: z.string().optional(), + profile_pic_url: z.string().optional(), + search_id: z.string().optional(), + similar_companies: z.array(FluffySimilarCompanySchema).optional(), + specialities: z.array(z.string()).optional(), + tagline: z.string().optional(), + universal_name_id: z.string().optional(), + updates: z.array(FluffyCompanyUpdateSchema).optional(), + website: z.string().optional() + }) + export type CompanyUrlEnrichResultProfile = z.infer< + typeof CompanyUrlEnrichResultProfileSchema + > + + export const PersonSearchResultSchema = z.object({ + next_page: z.string().optional(), + results: z.array(SearchResultSchema).optional(), + total_result_count: z.number().optional() + }) + export type PersonSearchResult = z.infer + + export const CSearchResultSchema = z.object({ + last_updated: z.string().optional(), + linkedin_profile_url: z.string().optional(), + profile: ResultProfileSchema.optional() + }) + export type CSearchResult = z.infer + + export const CompanyUrlEnrichResultSchema = z.object({ + last_updated: z.string().optional(), + profile: CompanyUrlEnrichResultProfileSchema.optional(), + url: z.string().optional() + }) + export type CompanyUrlEnrichResult = z.infer< + typeof CompanyUrlEnrichResultSchema + > + + export const CompanySearchResultSchema = z.object({ + next_page: z.string().optional(), + results: z.array(CSearchResultSchema).optional(), + total_result_count: z.number().optional() + }) + export type CompanySearchResult = z.infer +} + +export class ProxycurlClient { + readonly ky: KyInstance + readonly apiKey: string + + constructor({ + apiKey = getEnv('PROXYCURL_API_KEY'), + apiBaseUrl = getEnv('PROXYCURL_API_BASE_URL') ?? + 'https://nubela.co/proxycurl', + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert(apiKey, 'Error ProxycurlClient missing required "apiKey"') + + this.apiKey = apiKey + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + headers: { + Authorization: `Bearer ${apiKey}` + } + }) + } + + async getLinkedInCompany( + opts: proxycurl.CompanyProfileEndpointParamsQueryClass + ) { + return this.ky + .get('api/linkedin/company', { + searchParams: { ...opts } + }) + .json() + } + + async getLinkedInPerson( + opts: proxycurl.PersonProfileEndpointParamsQueryClass + ) { + return this.ky + .get('api/v2/linkedin', { + searchParams: { ...opts } + }) + .json() + } + + async resolveLinkedInPerson( + opts: proxycurl.PersonLookupEndpointParamsQueryClass + ) { + return this.ky + .get('api/linkedin/profile/resolve', { + searchParams: { ...opts } + }) + .json() + } + + async resolvePersonByEmail( + opts: proxycurl.ReverseEmailLookupEndpointParamsQueryClass + ) { + return this.ky + .get('api/linkedin/profile/resolve/email', { + searchParams: { ...opts } + }) + .json() + } + + async resolveLinkedInPersonAtCompanyByRole( + opts: proxycurl.RoleLookupEndpointParamsQueryClass + ) { + return this.ky + .get('/api/find/company/role/', { + searchParams: { ...opts } + }) + .json() + } + + async resolveLinkedInCompany( + opts: proxycurl.CompanyLookupEndpointParamsQueryClass + ) { + return this.ky + .get('/api/linkedin/company/resolve', { + searchParams: { ...opts } + }) + .json() + } + + async resolveLinkedInPersonByEmail( + opts: proxycurl.ReverseEmailLookupEndpointParamsQueryClass + ) { + return this.ky + .get('/api/linkedin/profile/resolve/email', { + searchParams: { ...opts } + }) + .json() + } + + async searchCompanies(opts: proxycurl.CompanySearchEndpointParamsQueryClass) { + return this.ky + .get('/api/v2/search/company', { + searchParams: { ...opts } + }) + .json() + } + + async searchPeople(opts: proxycurl.PersonSearchEndpointParamsQueryClass) { + return this.ky + .get('/api/v2/search/person/', { + searchParams: { ...opts } + }) + .json() + } +} diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts index 27960e4d7..15bfc3fbc 100644 --- a/src/services/scraper-client.ts +++ b/src/services/scraper-client.ts @@ -2,25 +2,27 @@ import defaultKy, { type KyInstance } from 'ky' import { assert, getEnv } from '../utils.js' -export type ScrapeResult = { - author: string - byline: string - /** The HTML for the main content of the page. */ - content: string - description: string - imageUrl: string - lang: string - length: number - logoUrl: string - /** The text for the main content of the page in markdown format. */ - markdownContent: string - publishedTime: string - /** The raw HTML response from the server. */ - rawHtml: string - siteName: string - /** The text for the main content of the page. */ - textContent: string - title: string +export namespace scraper { + export type ScrapeResult = { + author: string + byline: string + /** The HTML for the main content of the page. */ + content: string + description: string + imageUrl: string + lang: string + length: number + logoUrl: string + /** The text for the main content of the page in markdown format. */ + markdownContent: string + publishedTime: string + /** The raw HTML response from the server. */ + rawHtml: string + siteName: string + /** The text for the main content of the page. */ + textContent: string + title: string + } } /** @@ -56,7 +58,7 @@ export class ScraperClient { }: { timeout?: number } = {} - ): Promise { + ): Promise { return this.ky .post('scrape', { json: { url }, diff --git a/src/services/serpapi.ts b/src/services/serpapi-client.ts similarity index 100% rename from src/services/serpapi.ts rename to src/services/serpapi-client.ts diff --git a/src/services/serper.ts b/src/services/serper-client.ts similarity index 100% rename from src/services/serper.ts rename to src/services/serper-client.ts diff --git a/src/services/weather.ts b/src/services/weather-client.ts similarity index 100% rename from src/services/weather.ts rename to src/services/weather-client.ts diff --git a/src/symbol-polyfill.ts b/src/symbol-polyfill.ts new file mode 100644 index 000000000..c9a5b23cd --- /dev/null +++ b/src/symbol-polyfill.ts @@ -0,0 +1,21 @@ +// https://github.com/microsoft/TypeScript/issues/53461 +// symbol-polyfill.ts + +declare global { + interface SymbolConstructor { + readonly metadata: unique symbol + } +} + +;(Symbol as any).metadata ??= Symbol.for('Symbol.metadata') + +const _metadata = Object.create(null) + +if (typeof Symbol === 'function' && Symbol.metadata) { + Object.defineProperty(globalThis, Symbol.metadata, { + enumerable: true, + configurable: true, + writable: true, + value: _metadata + }) +} diff --git a/src/types.ts b/src/types.ts index d30bbdbbb..6597c22fc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -14,3 +14,105 @@ export interface AIToolSpec { type: 'function' function: AIFunctionSpec } + +/** + * Generic/default OpenAI message without any narrowing applied + */ +export interface Msg { + /** The contents of the message. `content` is required for all messages, and may be null for assistant messages with function calls. */ + content: string | null + /** The role of the messages author. One of `system`, `user`, `assistant`, 'tool', or `function`. */ + role: Msg.Role + /** The name and arguments of a function that should be called, as generated by the model. */ + function_call?: Msg.Call.Function + /** The tool calls generated by the model, such as function calls. */ + tool_calls?: Msg.Call.Tool[] + /** + * Tool call that this message is responding to. + */ + tool_call_id?: string + /** + * The name of the author of this message. `name` is required if role is + * `function`, and it should be the name of the function whose response is in the + * `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of + * 64 characters. + */ + name?: string +} + +/** Narrowed ChatModel.Message types. */ +export namespace Msg { + /** The possible roles for a message. */ + export type Role = 'system' | 'user' | 'assistant' | 'function' | 'tool' + + export namespace Call { + /** The name and arguments of a function that should be called, as generated by the model. */ + export type Function = { + /** The arguments to call the function with, as generated by the model in JSON format. */ + arguments: string + /** The name of the function to call. */ + name: string + } + + /** The tool calls generated by the model, such as function calls. */ + export type Tool = { + /** The ID of the tool call. */ + id: string + /** The type of the tool. Currently, only `function` is supported. */ + type: 'function' + /** The function that the model called. */ + function: Call.Function + } + } + + /** Message with text content for the system. */ + export type System = { + role: 'system' + content: string + name?: string + } + + /** Message with text content from the user. */ + export type User = { + role: 'user' + name?: string + content: string + } + + /** Message with text content from the assistant. */ + export type Assistant = { + role: 'assistant' + name?: string + content: string + } + + /** Message with arguments to call a function. */ + export type FuncCall = { + role: 'assistant' + name?: string + content: null + function_call: Call.Function + } + + /** Message with the result of a function call. */ + export type FuncResult = { + role: 'function' + name: string + content: string + } + + /** Message with arguments to call one or more tools. */ + export type ToolCall = { + role: 'assistant' + name?: string + content: null + tool_calls: Call.Tool[] + } + + /** Message with the result of a tool call. */ + export type ToolResult = { + role: 'tool' + tool_call_id: string + content: string + } +} diff --git a/src/zod-to-json-schema.ts b/src/zod-to-json-schema.ts index 8767f36ed..30a13077d 100644 --- a/src/zod-to-json-schema.ts +++ b/src/zod-to-json-schema.ts @@ -11,7 +11,6 @@ export function zodToJsonSchema(schema: z.ZodType): Record { 'default', 'definitions', 'description', - 'markdownDescription', - 'additionalProperties' + 'markdownDescription' ) } From e3f1b5641f2c67f33bfba51365af41b792fdc74f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 22 May 2024 03:15:09 -0500 Subject: [PATCH 05/81] =?UTF-8?q?=F0=9F=8C=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 2 +- src/services/proxycurl-client.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 2419ce60f..119781a78 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -8,7 +8,7 @@ import restoreCursor from 'restore-cursor' import { ProxycurlClient } from '../src/services/proxycurl-client.js' /** - * Scratch for quick testing. + * Scratch pad for testing. */ async function main() { restoreCursor() diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index 6bd79cc5a..9d9e6706d 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -3,6 +3,7 @@ import * as z from 'zod' import { assert, getEnv } from '../utils.js' +// All proxycurl types are auto-generated from their openapi spec export namespace proxycurl { export const CompanyTypeSchema = z.enum([ 'EDUCATIONAL', From 783f375d388e2b0222d3ec71f49be48de7813bdd Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 23 May 2024 18:19:38 -0500 Subject: [PATCH 06/81] =?UTF-8?q?=F0=9F=90=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 - pnpm-lock.yaml | 8059 ++++++++++++++++-------------- readme.md | 28 + src/fns.ts | 12 +- src/services/clearbit-client.ts | 14 +- src/services/dexa-client.ts | 10 +- src/services/diffbot-client.ts | 8 +- src/services/exa-client.ts | 264 + src/services/index.ts | 2 +- src/services/openai-client.ts | 1 - src/services/proxycurl-client.ts | 5 +- src/services/scraper-client.ts | 2 +- src/services/serpapi-client.ts | 2 +- src/services/serper-client.ts | 6 +- src/services/weather-client.ts | 2 +- src/stringify-for-model.ts | 2 - src/types.ts | 8 + tsconfig.json | 4 +- 18 files changed, 4534 insertions(+), 3899 deletions(-) create mode 100644 src/services/exa-client.ts delete mode 100644 src/services/openai-client.ts diff --git a/package.json b/package.json index 4aed72a63..ca641c306 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "test:unit": "vitest run" }, "dependencies": { - "@dexaai/dexter": "^2.0.0", "@nangohq/node": "^0.39.30", "chalk": "^5.3.0", "delay": "^6.0.0", @@ -52,12 +51,9 @@ "exit-hook": "^4.0.0", "jsonrepair": "^3.6.1", "ky": "^1.2.4", - "openai": "^4.47.1", "p-map": "^7.0.2", "p-retry": "^6.2.0", "p-throttle": "^6.1.0", - "proxycurl-js-linkedin-profile-scraper": "^1.0.2", - "reflect-metadata": "^0.2.2", "restore-cursor": "^5.0.0", "tiny-invariant": "^1.3.3", "twitter-api-sdk": "^1.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fdde1678f..a7f8541a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1125 +1,587 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - '@dexaai/dexter': - specifier: ^2.0.0 - version: 2.0.2 - '@nangohq/node': - specifier: ^0.39.30 - version: 0.39.30 - chalk: - specifier: ^5.3.0 - version: 5.3.0 - delay: - specifier: ^6.0.0 - version: 6.0.0 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - exit-hook: - specifier: ^4.0.0 - version: 4.0.0 - jsonrepair: - specifier: ^3.6.1 - version: 3.8.0 - ky: - specifier: ^1.2.4 - version: 1.2.4 - openai: - specifier: ^4.47.1 - version: 4.47.1 - p-map: - specifier: ^7.0.2 - version: 7.0.2 - p-retry: - specifier: ^6.2.0 - version: 6.2.0 - p-throttle: - specifier: ^6.1.0 - version: 6.1.0 - proxycurl-js-linkedin-profile-scraper: - specifier: ^1.0.2 - version: 1.0.2(@babel/core@7.24.5) - reflect-metadata: - specifier: ^0.2.2 - version: 0.2.2 - restore-cursor: - specifier: ^5.0.0 - version: 5.0.0 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - twitter-api-sdk: - specifier: ^1.2.1 - version: 1.2.1 - type-fest: - specifier: ^4.16.0 - version: 4.18.2 - zod: - specifier: ^3.23.3 - version: 3.23.8 - zod-to-json-schema: - specifier: ^3.23.0 - version: 3.23.0(zod@3.23.8) - -devDependencies: - '@fisch0920/eslint-config': - specifier: ^1.3.1 - version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) - '@total-typescript/ts-reset': - specifier: ^0.5.1 - version: 0.5.1 - '@types/node': - specifier: ^20.12.7 - version: 20.12.12 - del-cli: - specifier: ^5.1.0 - version: 5.1.0 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - husky: - specifier: ^9.0.11 - version: 9.0.11 - lint-staged: - specifier: ^15.2.4 - version: 15.2.4 - np: - specifier: ^10.0.5 - version: 10.0.5(typescript@5.4.5) - npm-run-all2: - specifier: ^6.2.0 - version: 6.2.0 - prettier: - specifier: ^3.2.5 - version: 3.2.5 - tsup: - specifier: ^8.0.2 - version: 8.0.2(typescript@5.4.5) - tsx: - specifier: ^4.10.5 - version: 4.10.5 - typescript: - specifier: ^5.4.5 - version: 5.4.5 - vite: - specifier: ^5.2.10 - version: 5.2.11(@types/node@20.12.12) - vitest: - specifier: ^1.5.0 - version: 1.6.0(@types/node@20.12.12) +importers: + + .: + dependencies: + '@nangohq/node': + specifier: ^0.39.30 + version: 0.39.30 + chalk: + specifier: ^5.3.0 + version: 5.3.0 + delay: + specifier: ^6.0.0 + version: 6.0.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + exit-hook: + specifier: ^4.0.0 + version: 4.0.0 + jsonrepair: + specifier: ^3.6.1 + version: 3.8.0 + ky: + specifier: ^1.2.4 + version: 1.2.4 + p-map: + specifier: ^7.0.2 + version: 7.0.2 + p-retry: + specifier: ^6.2.0 + version: 6.2.0 + p-throttle: + specifier: ^6.1.0 + version: 6.1.0 + restore-cursor: + specifier: ^5.0.0 + version: 5.0.0 + tiny-invariant: + specifier: ^1.3.3 + version: 1.3.3 + twitter-api-sdk: + specifier: ^1.2.1 + version: 1.2.1 + type-fest: + specifier: ^4.16.0 + version: 4.18.2 + zod: + specifier: ^3.23.3 + version: 3.23.8 + zod-to-json-schema: + specifier: ^3.23.0 + version: 3.23.0(zod@3.23.8) + devDependencies: + '@fisch0920/eslint-config': + specifier: ^1.3.1 + version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) + '@total-typescript/ts-reset': + specifier: ^0.5.1 + version: 0.5.1 + '@types/node': + specifier: ^20.12.7 + version: 20.12.12 + del-cli: + specifier: ^5.1.0 + version: 5.1.0 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + husky: + specifier: ^9.0.11 + version: 9.0.11 + lint-staged: + specifier: ^15.2.4 + version: 15.2.4 + np: + specifier: ^10.0.5 + version: 10.0.5(typescript@5.4.5) + npm-run-all2: + specifier: ^6.2.0 + version: 6.2.0 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + tsup: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.4.38)(typescript@5.4.5) + tsx: + specifier: ^4.10.5 + version: 4.10.5 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite: + specifier: ^5.2.10 + version: 5.2.11(@types/node@20.12.12) + vitest: + specifier: ^1.5.0 + version: 1.6.0(@types/node@20.12.12) packages: - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: false - - /@babel/cli@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg==} - engines: {node: '>=6.9.0'} - hasBin: true - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@jridgewell/trace-mapping': 0.3.25 - commander: 4.1.1 - convert-source-map: 2.0.0 - fs-readdir-recursive: 1.1.0 - glob: 7.2.3 - make-dir: 2.1.0 - slash: 2.0.0 - optionalDependencies: - '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 - chokidar: 3.6.0 - dev: false - - /@babel/code-frame@7.24.2: + '@babel/code-frame@7.24.2': resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.1 - - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/generator@7.24.5: - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: false - - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - dev: false - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: false - - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: false - - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - dev: false - - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: false - - /@babel/helper-split-export-declaration@7.24.5: - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - dev: false - - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-validator-identifier@7.24.5: + '@babel/helper-validator-identifier@7.24.5': resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/highlight@7.24.5: + '@babel/highlight@7.24.5': resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - - /@babel/parser@7.24.5: - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.5 - dev: false - /@babel/runtime@7.24.5: + '@babel/runtime@7.24.5': resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: true - - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - dev: false - - /@babel/traverse@7.24.5: - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - dev: false - - /@dexaai/dexter@2.0.2: - resolution: {integrity: sha512-21LOWGTM0eXB7d6+ytGv2Bg4sBVBv0uFMFgiUvkLiyDX+fi9A0lDqPXJuEnCrB7AH0WbwodXWtEGK6jCK4d3Dg==} - engines: {node: '>= 18'} - dependencies: - '@fastify/deepmerge': 1.3.0 - dedent: 1.5.3 - hash-object: 5.0.1 - jsonrepair: 3.8.0 - ky: 1.2.4 - openai-fetch: 2.0.2 - p-map: 7.0.2 - p-throttle: 6.1.0 - parse-json: 8.1.0 - pinecone-client: 2.0.0 - tiktoken: 1.0.15 - zod: 3.23.8 - zod-to-json-schema: 3.23.0(zod@3.23.8) - zod-validation-error: 3.3.0(zod@3.23.8) - transitivePeerDependencies: - - babel-plugin-macros - dev: false - /@esbuild/aix-ppc64@0.19.12: + '@esbuild/aix-ppc64@0.19.12': resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/aix-ppc64@0.20.2: + '@esbuild/aix-ppc64@0.20.2': resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.12: + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.20.2: + '@esbuild/android-arm64@0.20.2': resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.12: + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.20.2: + '@esbuild/android-arm@0.20.2': resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.12: + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.20.2: + '@esbuild/android-x64@0.20.2': resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.12: + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.20.2: + '@esbuild/darwin-arm64@0.20.2': resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.12: + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.20.2: + '@esbuild/darwin-x64@0.20.2': resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.20.2: + '@esbuild/freebsd-arm64@0.20.2': resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.12: + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.20.2: + '@esbuild/freebsd-x64@0.20.2': resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.12: + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.20.2: + '@esbuild/linux-arm64@0.20.2': resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.12: + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.20.2: + '@esbuild/linux-arm@0.20.2': resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.12: + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.20.2: + '@esbuild/linux-ia32@0.20.2': resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.12: + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.20.2: + '@esbuild/linux-loong64@0.20.2': resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.12: + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.20.2: + '@esbuild/linux-mips64el@0.20.2': resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.12: + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.20.2: + '@esbuild/linux-ppc64@0.20.2': resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.12: + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.20.2: + '@esbuild/linux-riscv64@0.20.2': resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.12: + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.20.2: + '@esbuild/linux-s390x@0.20.2': resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.12: + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.20.2: + '@esbuild/linux-x64@0.20.2': resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.12: + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.20.2: + '@esbuild/netbsd-x64@0.20.2': resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.12: + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.20.2: + '@esbuild/openbsd-x64@0.20.2': resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.12: + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.20.2: + '@esbuild/sunos-x64@0.20.2': resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.12: + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.20.2: + '@esbuild/win32-arm64@0.20.2': resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.12: + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.20.2: + '@esbuild/win32-ia32@0.20.2': resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.12: + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.20.2: + '@esbuild/win32-x64@0.20.2': resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: + '@eslint-community/regexpp@4.10.0': resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.57.0: + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@fastify/deepmerge@1.3.0: - resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - dev: false - - /@fisch0920/eslint-config@1.3.2(eslint@8.57.0)(typescript@5.4.5): + '@fisch0920/eslint-config@1.3.2': resolution: {integrity: sha512-CUpMxCPWzoxvWFlmvH0OthooRlenqrezrVVleKEZv+NbibwgT4phyZadBLYsF8aB7Et2OoEzk4LKg8Xsdu5spA==} engines: {node: '>=18'} peerDependencies: typescript: ^5.0.0 - dependencies: - '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.9.0)(eslint@8.57.0)(typescript@5.4.5) - eslint-plugin-jest-dom: 5.4.0(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) - eslint-plugin-security: 2.1.1 - eslint-plugin-simple-import-sort: 12.1.0(eslint@8.57.0) - eslint-plugin-unicorn: 52.0.0(eslint@8.57.0) - typescript: 5.4.5 - transitivePeerDependencies: - - '@testing-library/dom' - - eslint - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - jest - - supports-color - dev: true - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.3: + '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: true - /@inquirer/figures@1.0.1: + '@inquirer/figures@1.0.1': resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} engines: {node: '>=18'} - dev: true - /@isaacs/cliui@8.0.2: + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - /@jest/schemas@29.6.3: + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.5: + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.2.1: + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.25: + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - /@ljharb/through@2.3.13: + '@ljharb/through@2.3.13': resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - dev: true - /@nangohq/node@0.39.30: + '@nangohq/node@0.39.30': resolution: {integrity: sha512-ZHi3yZp4/osP8oNmlzXrASmXPHWj+AijD8TWO4uDrQL5lr87GcSRtFYLYVOEQ0hASuXEPD1eXcT3lX3AHnD1+A==} engines: {node: '>=18.0'} - dependencies: - axios: 1.7.2 - transitivePeerDependencies: - - debug - dev: false - /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: - resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} - requiresBuild: true - dev: false - optional: true - - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - /@pkgjs/parseargs@0.11.0: + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@pnpm/config.env-replace@1.1.0: + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} - dev: true - /@pnpm/network.ca-file@1.0.2: + '@pnpm/network.ca-file@1.0.2': resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} - dependencies: - graceful-fs: 4.2.10 - dev: true - /@pnpm/npm-conf@2.2.2: + '@pnpm/npm-conf@2.2.2': resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} - dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 - dev: true - /@rollup/rollup-android-arm-eabi@4.17.2: + '@rollup/rollup-android-arm-eabi@4.17.2': resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.17.2: + '@rollup/rollup-android-arm64@4.17.2': resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.17.2: + '@rollup/rollup-darwin-arm64@4.17.2': resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.17.2: + '@rollup/rollup-darwin-x64@4.17.2': resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.17.2: + '@rollup/rollup-linux-arm-musleabihf@4.17.2': resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.17.2: + '@rollup/rollup-linux-arm64-gnu@4.17.2': resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.17.2: + '@rollup/rollup-linux-arm64-musl@4.17.2': resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.17.2: + '@rollup/rollup-linux-riscv64-gnu@4.17.2': resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.17.2: + '@rollup/rollup-linux-s390x-gnu@4.17.2': resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.17.2: + '@rollup/rollup-linux-x64-gnu@4.17.2': resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.17.2: + '@rollup/rollup-linux-x64-musl@4.17.2': resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.17.2: + '@rollup/rollup-win32-arm64-msvc@4.17.2': resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.17.2: + '@rollup/rollup-win32-ia32-msvc@4.17.2': resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.17.2: + '@rollup/rollup-win32-x64-msvc@4.17.2': resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rushstack/eslint-patch@1.10.3: + '@rushstack/eslint-patch@1.10.3': resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} - dev: true - /@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7): + '@samverschueren/stream-to-observable@0.3.1': resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==} engines: {node: '>=6'} peerDependencies: @@ -1130,85 +592,3296 @@ packages: optional: true zen-observable: optional: true - dependencies: - any-observable: 0.3.0(rxjs@6.6.7) - rxjs: 6.6.7 - transitivePeerDependencies: - - zenObservable - dev: true - /@sinclair/typebox@0.27.8: + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - /@sindresorhus/is@5.6.0: + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - dev: true - /@szmarczak/http-timer@5.0.1: + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - dependencies: - defer-to-connect: 2.0.1 - dev: true - /@total-typescript/ts-reset@0.5.1: + '@total-typescript/ts-reset@0.5.1': resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==} - dev: true - /@types/estree@1.0.5: + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/http-cache-semantics@4.0.4: + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true - /@types/json5@0.0.29: + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - /@types/minimist@1.2.5: + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - dependencies: - '@types/node': 20.12.12 - form-data: 4.0.0 - dev: false + '@types/node@20.12.12': + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - /@types/node@18.19.33: - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} - dependencies: - undici-types: 5.26.5 - dev: false + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@typescript-eslint/eslint-plugin@7.9.0': + resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.9.0': + resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.9.0': + resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.9.0': + resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.9.0': + resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.9.0': + resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.9.0': + resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.9.0': + resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-observable@0.3.0: + resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} + engines: {node: '>=6'} + peerDependencies: + rxjs: '*' + zenObservable: '*' + peerDependenciesMeta: + rxjs: + optional: true + zenObservable: + optional: true + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bundle-require@4.1.0: + resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-lite@1.0.30001620: + resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@0.2.1: + resolution: {integrity: sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==} + engines: {node: '>=0.10.0'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + date-fns@1.30.1: + resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + del-cli@5.1.0: + resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} + engines: {node: '>=14.16'} + hasBin: true + + del@7.1.0: + resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} + engines: {node: '>=14.16'} + + delay@6.0.0: + resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} + engines: {node: '>=16'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.773: + resolution: {integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==} + + elegant-spinner@1.0.1: + resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} + engines: {node: '>=0.10.0'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} + engines: {node: '>=10.13.0'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest-dom@5.4.0: + resolution: {integrity: sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': ^8.0.0 || ^9.0.0 || ^10.0.0 + eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + '@testing-library/dom': + optional: true + + eslint-plugin-jest@28.5.0: + resolution: {integrity: sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-security@2.1.1: + resolution: {integrity: sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==} + + eslint-plugin-simple-import-sort@12.1.0: + resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} + peerDependencies: + eslint: '>=5.0.0' + + eslint-plugin-unicorn@52.0.0: + resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + + figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + + github-url-from-git@1.5.0: + resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.15: + resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@3.2.0: + resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} + engines: {node: '>=4'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + engines: {node: '>=18'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer-autosubmit-prompt@0.2.0: + resolution: {integrity: sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==} + + inquirer@6.5.2: + resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} + engines: {node: '>=6.0.0'} + + inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + + inquirer@9.2.21: + resolution: {integrity: sha512-c/dwDruM1FtzeISV+xMHm+JZTmhpmgWPEZI2bU3+Fwu5MhbAX0zMHHxj5warNfttE5NUID3aijrFUpDc2yBvcA==} + engines: {node: '>=18'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ci@0.1.0: + resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} + engines: {node: '>=18'} + hasBin: true + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-npm@6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-observable@1.1.0: + resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} + engines: {node: '>=4'} + + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-scoped@3.0.0: + resolution: {integrity: sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g==} + engines: {node: '>=12'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-url-superb@6.1.0: + resolution: {integrity: sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==} + engines: {node: '>=12'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + issue-regex@4.1.0: + resolution: {integrity: sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonrepair@3.8.0: + resolution: {integrity: sha512-89lrxpwp+IEcJ6kwglF0HH3Tl17J08JEpYfXnvvjdp4zV4rjSoGu2NdQHxBs7yTOk3ETjTn9du48pBy8iBqj1w==} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + ky@1.2.4: + resolution: {integrity: sha512-CfSrf4a0yj1n6WgPT6kQNQOopIGLkQzqSAXo05oKByaH7G3SiqW4a8jGox0p9whMXqO49H7ljgigivrMyycAVA==} + engines: {node: '>=18'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.4: + resolution: {integrity: sha512-3F9KRQIS2fVDGtCkBp4Bx0jswjX7zUcKx6OF0ZeY1prksUyKPRIIUqZhIUYAstJfvj6i48VFs4dwVIbCYwvTYQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr-input@0.2.1: + resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==} + engines: {node: '>=6'} + + listr-silent-renderer@1.1.1: + resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==} + engines: {node: '>=4'} + + listr-update-renderer@0.5.0: + resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} + engines: {node: '>=6'} + peerDependencies: + listr: ^0.14.2 + + listr-verbose-renderer@0.5.0: + resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} + engines: {node: '>=4'} + + listr2@8.2.1: + resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} + engines: {node: '>=18.0.0'} + + listr@0.14.3: + resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} + engines: {node: '>=6'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@1.0.2: + resolution: {integrity: sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==} + engines: {node: '>=0.10.0'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + log-update@2.3.0: + resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} + engines: {node: '>=4'} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@10.1.5: + resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.6: + resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.1: + resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + new-github-release-url@2.0.0: + resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-package-data@6.0.1: + resolution: {integrity: sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + np@10.0.5: + resolution: {integrity: sha512-Tu270vVvsh92uh6XDXrGS6D94PhzxQYqM8uUxftYVp0B8qXl78dJRYwQ9wfYMOBB9ynlF79eWlUtPUxPzKGddQ==} + engines: {git: '>=2.11.0', node: '>=18', npm: '>=9', pnpm: '>=8', yarn: '>=1.7.0'} + hasBin: true + + npm-name@8.0.0: + resolution: {integrity: sha512-DIuCGcKYYhASAZW6Xh/tiaGMko8IHOHe0n3zOA7SzTi0Yvy00x8L7sa5yNiZ75Ny58O/KeRtNouy8Ut6gPbKiw==} + engines: {node: '>=18'} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-all2@6.2.0: + resolution: {integrity: sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + org-regex@1.0.0: + resolution: {integrity: sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==} + engines: {node: '>=8'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-map@7.0.2: + resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} + engines: {node: '>=18'} + + p-memoize@7.1.1: + resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} + engines: {node: '>=14.16'} + + p-retry@6.2.0: + resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + engines: {node: '>=16.17'} + + p-throttle@6.1.0: + resolution: {integrity: sha512-eQMdGTxk2+047La67wefUtt0tEHh7D+C8Jl7QXoFCuIiNYeQ9zWs2AZiJdIAs72rSXZ06t11me2bgalRNdy3SQ==} + engines: {node: '>=18'} + + p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + engines: {node: '>=18'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@8.0.0: + resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} + engines: {node: '>=18'} + + pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg-up@8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-pkg@6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + restore-cursor@5.0.0: + resolution: {integrity: sha512-Hp93f349DvdEqJFHiPyzNzVjT7lDDFtQJWRotQVQNl3CHr4j7oMHStQB9UH/CJSHTrevAZXFvomgzy8lXjrK0w==} + engines: {node: '>=18'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scoped-regex@3.0.0: + resolution: {integrity: sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==} + engines: {node: '>=12'} + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slice-ansi@0.0.4: + resolution: {integrity: sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==} + engines: {node: '>=0.10.0'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@1.2.0: + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terminal-link@3.0.0: + resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} + engines: {node: '>=12'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsup@8.0.2: + resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@4.10.5: + resolution: {integrity: sha512-twDSbf7Gtea4I2copqovUiNTEDrT8XNFXsuHpfGbdpW/z9ZW4fTghzzhAG0WfrCuJmJiOEY1nLIjq4u3oujRWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + twitter-api-sdk@1.2.1: + resolution: {integrity: sha512-tNQ6DGYucFk94JlnUMsHCkHg5o1wnCdHh71Y2ukygNVssOdD1gNVjOpaojJrdwbEAhoZvcWdGHerCa55F8HKxQ==} + engines: {node: '>=14'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.18.2: + resolution: {integrity: sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@7.0.0: + resolution: {integrity: sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==} + engines: {node: '>=18'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@3.0.1: + resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} + engines: {node: '>=4'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.23.0: + resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + peerDependencies: + zod: ^3.23.3 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.5 + picocolors: 1.0.1 + + '@babel/helper-validator-identifier@7.24.5': {} + + '@babel/highlight@7.24.5': + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/runtime@7.24.5': + dependencies: + regenerator-runtime: 0.14.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true - /@types/node@20.12.12: - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fisch0920/eslint-config@1.3.2(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@rushstack/eslint-patch': 1.10.3 + '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + eslint-config-prettier: 9.1.0(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-jest-dom: 5.4.0(eslint@8.57.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) + eslint-plugin-react: 7.34.1(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + eslint-plugin-security: 2.1.1 + eslint-plugin-simple-import-sort: 12.1.0(eslint@8.57.0) + eslint-plugin-unicorn: 52.0.0(eslint@8.57.0) + typescript: 5.4.5 + transitivePeerDependencies: + - '@testing-library/dom' + - eslint + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - jest + - supports-color + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@inquirer/figures@1.0.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@ljharb/through@2.3.13': + dependencies: + call-bind: 1.0.7 + + '@nangohq/node@0.39.30': + dependencies: + axios: 1.7.2 + transitivePeerDependencies: + - debug + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.2.2': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@rollup/rollup-android-arm-eabi@4.17.2': + optional: true + + '@rollup/rollup-android-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-x64@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': + optional: true + + '@rushstack/eslint-patch@1.10.3': {} + + '@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7)': + dependencies: + any-observable: 0.3.0(rxjs@6.6.7) + optionalDependencies: + rxjs: 6.6.7 + transitivePeerDependencies: + - zenObservable + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@5.6.0': {} + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@total-typescript/ts-reset@0.5.1': {} + + '@types/estree@1.0.5': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json5@0.0.29': {} + + '@types/minimist@1.2.5': {} + + '@types/node@20.12.12': dependencies: undici-types: 5.26.5 - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/retry@0.12.2: - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - dev: false + '@types/retry@0.12.2': {} - /@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) @@ -1221,20 +3894,12 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/scope-manager': 7.9.0 '@typescript-eslint/types': 7.9.0 @@ -1242,52 +3907,31 @@ packages: '@typescript-eslint/visitor-keys': 7.9.0 debug: 4.3.4 eslint: 8.57.0 + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@7.9.0: - resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@7.9.0': dependencies: '@typescript-eslint/types': 7.9.0 '@typescript-eslint/visitor-keys': 7.9.0 - dev: true - /@typescript-eslint/type-utils@7.9.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@7.9.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@7.9.0: - resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true + '@typescript-eslint/types@7.9.0': {} - /@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5): - resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5)': dependencies: '@typescript-eslint/types': 7.9.0 '@typescript-eslint/visitor-keys': 7.9.0 @@ -1297,16 +3941,12 @@ packages: minimatch: 9.0.4 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@7.9.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + '@typescript-eslint/utils@7.9.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.9.0 @@ -1316,239 +3956,130 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@7.9.0: - resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@7.9.0': dependencies: '@typescript-eslint/types': 7.9.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@vitest/expect@1.6.0: - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@1.6.0': dependencies: '@vitest/spy': 1.6.0 '@vitest/utils': 1.6.0 chai: 4.4.1 - dev: true - /@vitest/runner@1.6.0: - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 - dev: true - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@1.6.0': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - dev: true - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@1.6.0': dependencies: tinyspy: 2.2.1 - dev: true - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@1.6.0': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 loupe: 2.3.7 pretty-format: 29.7.0 - dev: true - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + abort-controller@3.0.0: dependencies: - acorn: 8.11.3 - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + event-target-shim: 5.0.1 - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: - humanize-ms: 1.2.1 - dev: false + acorn: 8.11.3 - /aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + aggregate-error@4.0.1: dependencies: clean-stack: 4.2.0 indent-string: 5.0.0 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: true - /ansi-escapes@3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - dev: true + ansi-escapes@3.2.0: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + ansi-escapes@5.0.0: dependencies: type-fest: 1.4.0 - dev: true - /ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} - dev: true + ansi-escapes@6.2.1: {} - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true + ansi-regex@2.1.1: {} - /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true + ansi-regex@3.0.1: {} - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - dev: true + ansi-regex@4.1.1: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true + ansi-styles@2.2.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true + ansi-styles@6.2.1: {} - /any-observable@0.3.0(rxjs@6.6.7): - resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} - engines: {node: '>=6'} - peerDependencies: - rxjs: '*' - zenObservable: '*' - peerDependenciesMeta: - rxjs: - optional: true - zenObservable: - optional: true - dependencies: + any-observable@0.3.0(rxjs@6.6.7): + optionalDependencies: rxjs: 6.6.7 - dev: true - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -1556,16 +4087,10 @@ packages: es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -1573,11 +4098,8 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -1585,50 +4107,37 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -1638,75 +4147,46 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - dev: true + ast-types-flow@0.0.8: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false + asynckit@0.4.0: {} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} - dev: true + axe-core@4.7.0: {} - /axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + axios@1.7.2: dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@3.2.1: dependencies: dequal: 2.0.3 - dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + base64-js@1.5.1: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + binary-extensions@2.3.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -1716,85 +4196,52 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.1.1 - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - dev: true - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001620 electron-to-chromium: 1.4.773 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true + builtin-modules@3.3.0: {} - /bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 - dev: true - /bundle-require@4.1.0(esbuild@0.19.12): - resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' + bundle-require@4.1.0(esbuild@0.19.12): dependencies: esbuild: 0.19.12 load-tsconfig: 0.2.5 - dev: true - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + cac@6.7.14: {} - /cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - dev: true + cacheable-lookup@7.0.0: {} - /cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} + cacheable-request@10.2.14: dependencies: '@types/http-cache-semantics': 4.0.4 get-stream: 6.0.1 @@ -1803,11 +4250,8 @@ packages: mimic-response: 4.0.0 normalize-url: 8.0.1 responselike: 3.0.0 - dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -1815,37 +4259,22 @@ packages: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /camelcase-keys@7.0.2: - resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} - engines: {node: '>=12'} + camelcase-keys@7.0.2: dependencies: camelcase: 6.3.0 map-obj: 4.3.0 quick-lru: 5.1.1 type-fest: 1.4.0 - dev: true - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true + camelcase@7.0.1: {} - /caniuse-lite@1.0.30001620: - resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + caniuse-lite@1.0.30001620: {} - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -1854,59 +4283,39 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chalk-template@1.1.0: - resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} - engines: {node: '>=14.16'} + chalk-template@1.1.0: dependencies: chalk: 5.3.0 - dev: true - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.3.0: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -1918,380 +4327,198 @@ packages: optionalDependencies: fsevents: 2.3.3 - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: true + ci-info@4.0.0: {} - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} + clean-stack@4.2.0: dependencies: escape-string-regexp: 5.0.0 - dev: true - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true + cli-boxes@3.0.0: {} - /cli-cursor@2.1.0: - resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} - engines: {node: '>=4'} + cli-cursor@2.1.0: dependencies: restore-cursor: 2.0.0 - dev: true - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cli-truncate@0.2.1: - resolution: {integrity: sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==} - engines: {node: '>=0.10.0'} + cli-truncate@0.2.1: dependencies: slice-ansi: 0.0.4 string-width: 1.0.2 - dev: true - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 - dev: true - /cli-width@2.2.1: - resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} - dev: true + cli-width@2.2.1: {} - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-width@3.0.0: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + cli-width@4.1.0: {} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: true + code-point-at@1.1.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: false - - /commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - dev: true - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + commander@12.1.0: {} - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: false + commander@4.1.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - dev: true + confbox@0.1.7: {} - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: true - /configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} + configstore@6.0.0: dependencies: dot-prop: 6.0.1 graceful-fs: 4.2.11 unique-string: 3.0.0 write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: false - /cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - dev: false - - /core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + core-js-compat@3.37.1: dependencies: browserslist: 4.23.0 - dev: true - /cosmiconfig@8.3.6(typescript@5.4.5): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.4.5): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.4.5 - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} + crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 - dev: true - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true + damerau-levenshtein@1.0.8: {} - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /date-fns@1.30.1: - resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} - dev: true + date-fns@1.30.1: {} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - /decamelize@5.0.1: - resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} - engines: {node: '>=10'} - dev: true + decamelize@1.2.0: {} - /decircular@0.1.1: - resolution: {integrity: sha512-V2Vy+QYSXdgxRPmOZKQWCDf1KQNTUP/Eqswv/3W20gz7+6GB1HTosNrWqK3PqstVpFw/Dd/cGTmXSTKPeOiGVg==} - engines: {node: '>=18'} - dev: false + decamelize@5.0.1: {} - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: true - - /dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - dev: true + default-browser-id@5.0.0: {} - /default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} + default-browser@5.2.1: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.0 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true + defer-to-connect@2.0.1: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: true - - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: true - /del-cli@5.1.0: - resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} - engines: {node: '>=14.16'} - hasBin: true + del-cli@5.1.0: dependencies: del: 7.1.0 meow: 10.1.5 - dev: true - /del@7.1.0: - resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} - engines: {node: '>=14.16'} + del@7.1.0: dependencies: globby: 13.2.2 graceful-fs: 4.2.11 @@ -2301,102 +4528,55 @@ packages: p-map: 5.5.0 rimraf: 3.0.2 slash: 4.0.0 - dev: true - /delay@6.0.0: - resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} - engines: {node: '>=16'} - dev: false + delay@6.0.0: {} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false + delayed-stream@1.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + dequal@2.0.3: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + diff-sequences@29.6.3: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 - dev: true - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: false + dotenv@16.4.5: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true + eastasianwidth@0.2.0: {} - /electron-to-chromium@1.4.773: - resolution: {integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==} + electron-to-chromium@1.4.773: {} - /elegant-spinner@1.0.1: - resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} - engines: {node: '>=0.10.0'} - dev: true + elegant-spinner@1.0.1: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /enhanced-resolve@5.16.1: - resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.16.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -2444,21 +4624,14 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -2474,44 +4647,28 @@ packages: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - dev: true - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 '@esbuild/android-arm': 0.19.12 @@ -2536,13 +4693,8 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 '@esbuild/android-arm': 0.20.2 @@ -2567,62 +4719,36 @@ packages: '@esbuild/win32-arm64': 0.20.2 '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-goat@4.0.0: - resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} - engines: {node: '>=12'} - dev: true + escape-goat@4.0.0: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true + escape-string-regexp@5.0.0: {} - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -2632,49 +4758,20 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -2683,7 +4780,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -2693,53 +4790,30 @@ packages: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-jest-dom@5.4.0(eslint@8.57.0): - resolution: {integrity: sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} - peerDependencies: - '@testing-library/dom': ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - '@testing-library/dom': - optional: true + eslint-plugin-jest-dom@5.4.0(eslint@8.57.0): dependencies: '@babel/runtime': 7.24.5 eslint: 8.57.0 requireindex: 1.2.0 - dev: true - /eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.9.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-6np6DGdmNq/eBbA7HOUNV8fkfL86PYwBfwyb8n23FXgJNTR8+ot3smRHjza9LGsBBZRypK3qyF79vMjohIL8eQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true + eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5): dependencies: - '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - supports-color - typescript - dev: true - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: '@babel/runtime': 7.24.5 aria-query: 5.3.0 @@ -2758,22 +4832,12 @@ packages: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - dev: true - /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-react@7.34.1(eslint@8.57.0): - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.34.1(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -2794,27 +4858,16 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 - dev: true - /eslint-plugin-security@2.1.1: - resolution: {integrity: sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==} + eslint-plugin-security@2.1.1: dependencies: safe-regex: 2.1.1 - dev: true - /eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): - resolution: {integrity: sha512-Y2fqAfC11TcG/WP3TrI1Gi3p3nc8XJyEOJYHyEPEGI/UAgNx6akxxlX74p7SbAQdLcgASKhj8M0GKvH3vq/+ig==} - peerDependencies: - eslint: '>=5.0.0' + eslint-plugin-simple-import-sort@12.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-unicorn@52.0.0(eslint@8.57.0): - resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.56.0' + eslint-plugin-unicorn@52.0.0(eslint@8.57.0): dependencies: '@babel/helper-validator-identifier': 7.24.5 '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -2835,25 +4888,15 @@ packages: strip-indent: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -2895,59 +4938,34 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: true - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false + event-target-shim@5.0.1: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true + eventemitter3@5.0.1: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -2958,11 +4976,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -2973,235 +4988,114 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /exit-hook@4.0.0: - resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} - engines: {node: '>=18'} + exit-hook@4.0.0: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: false + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /figures@1.7.0: - resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} - engines: {node: '>=0.10.0'} + figures@1.7.0: dependencies: escape-string-regexp: 1.0.5 object-assign: 4.1.1 - dev: true - /figures@2.0.0: - resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} - engines: {node: '>=4'} + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - /find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - dev: true + find-up-simple@1.0.0: {} - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false + follow-redirects@1.15.6: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - - /form-data-encoder@1.7.2: - resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - dev: false - - /form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - dev: true - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false + form-data-encoder@2.1.4: {} - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false - /formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - dev: false - - /formidable@1.2.6: - resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} - deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' - dev: false - - /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false + functions-have-names@1.2.3: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true + get-east-asian-width@1.2.0: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -3209,62 +5103,39 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /github-url-from-git@1.5.0: - resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==} - dev: true + github-url-from-git@1.5.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.15: - resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true + glob@10.3.15: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 minipass: 7.1.1 path-scurry: 1.11.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3273,43 +5144,24 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} + global-dirs@3.0.1: dependencies: ini: 2.0.0 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.0.1 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -3317,27 +5169,20 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@13.2.2: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 ignore: 5.3.1 merge2: 1.4.1 slash: 4.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - /got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 '@szmarczak/http-timer': 5.0.1 @@ -3350,236 +5195,118 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 - dev: true - /graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true + graceful-fs@4.2.10: {} - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 - dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - - /hash-object@5.0.1: - resolution: {integrity: sha512-iaRY4jYOow1caHkXW7wotYRjZDQk2nq4U7904anGJj8l4x1SLId+vuR8RpGoywZz9puD769hNFVFLFH9t+baJw==} - engines: {node: '>=18'} - dependencies: - decircular: 0.1.1 - is-obj: 3.0.0 - sort-keys: 5.0.0 - type-fest: 4.18.2 - dev: false - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.2.2 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: true - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@2.1.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: false + human-signals@5.0.0: {} - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.0.11: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore-walk@6.0.5: - resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@6.0.5: dependencies: minimatch: 9.0.4 - dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + import-lazy@4.0.0: {} - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@3.2.0: - resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} - engines: {node: '>=4'} - dev: true + indent-string@3.2.0: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - dev: true + indent-string@5.0.0: {} - /index-to-position@0.1.2: - resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} - engines: {node: '>=18'} + index-to-position@0.1.2: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true + ini@2.0.0: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.1: {} - /inquirer-autosubmit-prompt@0.2.0: - resolution: {integrity: sha512-mzNrusCk5L6kSzlN0Ioddn8yzrhYNLli+Sn2ZxMuLechMYAzakiFCIULxsxlQb5YKzthLGfrFACcWoAvM7p04Q==} + inquirer-autosubmit-prompt@0.2.0: dependencies: chalk: 2.4.2 inquirer: 6.5.2 rxjs: 6.6.7 - dev: true - /inquirer@6.5.2: - resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} - engines: {node: '>=6.0.0'} + inquirer@6.5.2: dependencies: ansi-escapes: 3.2.0 chalk: 2.4.2 @@ -3594,11 +5321,8 @@ packages: string-width: 2.1.1 strip-ansi: 5.2.0 through: 2.3.8 - dev: true - /inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} + inquirer@7.3.3: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -3613,11 +5337,8 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - dev: true - /inquirer@9.2.21: - resolution: {integrity: sha512-c/dwDruM1FtzeISV+xMHm+JZTmhpmgWPEZI2bU3+Fwu5MhbAX0zMHHxj5warNfttE5NUID3aijrFUpDc2yBvcA==} - engines: {node: '>=18'} + inquirer@9.2.21: dependencies: '@inquirer/figures': 1.0.1 '@ljharb/through': 2.3.13 @@ -3634,542 +5355,276 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true + is-docker@3.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 - dev: true - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true + is-fullwidth-code-point@2.0.0: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: true - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-in-ci@0.1.0: - resolution: {integrity: sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ==} - engines: {node: '>=18'} - hasBin: true - dev: true + is-in-ci@0.1.0: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - dev: true - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 is-path-inside: 3.0.3 - dev: true - /is-installed-globally@1.0.0: - resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} - engines: {node: '>=18'} + is-installed-globally@1.0.0: dependencies: global-directory: 4.0.1 is-path-inside: 4.0.0 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-interactive@1.0.0: {} - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + is-interactive@2.0.0: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: true + is-map@2.0.3: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} - dev: false + is-network-error@1.1.0: {} - /is-npm@6.0.0: - resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-npm@6.0.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-number@7.0.0: {} - /is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - dev: false + is-obj@2.0.0: {} - /is-observable@1.1.0: - resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} - engines: {node: '>=4'} + is-observable@1.1.0: dependencies: symbol-observable: 1.2.0 - dev: true - /is-path-cwd@3.0.0: - resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-cwd@3.0.0: {} - /is-path-inside@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-path-inside@4.0.0: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + is-plain-obj@1.1.0: {} - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true + is-promise@2.2.2: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-scoped@3.0.0: - resolution: {integrity: sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g==} - engines: {node: '>=12'} + is-scoped@3.0.0: dependencies: scoped-regex: 3.0.0 - dev: true - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: true + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true + is-stream@1.1.0: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + is-unicode-supported@1.3.0: {} - /is-url-superb@6.1.0: - resolution: {integrity: sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==} - engines: {node: '>=12'} - dev: true + is-url-superb@6.1.0: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: true + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 - dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /issue-regex@4.1.0: - resolution: {integrity: sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + issue-regex@4.1.0: {} - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true + joycon@3.1.1: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true + js-tokens@9.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false + jsesc@0.5.0: {} - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true + jsesc@3.0.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.2: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false - - /jsonrepair@3.8.0: - resolution: {integrity: sha512-89lrxpwp+IEcJ6kwglF0HH3Tl17J08JEpYfXnvvjdp4zV4rjSoGu2NdQHxBs7yTOk3ETjTn9du48pBy8iBqj1w==} - hasBin: true - dev: false - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsonrepair@3.8.0: {} + + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /ky@1.2.4: - resolution: {integrity: sha512-CfSrf4a0yj1n6WgPT6kQNQOopIGLkQzqSAXo05oKByaH7G3SiqW4a8jGox0p9whMXqO49H7ljgigivrMyycAVA==} - engines: {node: '>=18'} + ky@1.2.4: {} - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true + language-subtag-registry@0.3.22: {} - /language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.22 - dev: true - /latest-version@7.0.0: - resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} - engines: {node: '>=14.16'} + latest-version@7.0.0: dependencies: package-json: 8.1.1 - dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - dev: true + lilconfig@3.1.1: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /lint-staged@15.2.4: - resolution: {integrity: sha512-3F9KRQIS2fVDGtCkBp4Bx0jswjX7zUcKx6OF0ZeY1prksUyKPRIIUqZhIUYAstJfvj6i48VFs4dwVIbCYwvTYQ==} - engines: {node: '>=18.12.0'} - hasBin: true + lint-staged@15.2.4: dependencies: chalk: 5.3.0 commander: 12.1.0 @@ -4183,28 +5638,17 @@ packages: yaml: 2.4.2 transitivePeerDependencies: - supports-color - dev: true - /listr-input@0.2.1: - resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==} - engines: {node: '>=6'} + listr-input@0.2.1: dependencies: inquirer: 7.3.3 inquirer-autosubmit-prompt: 0.2.0 rxjs: 6.6.7 through: 2.3.8 - dev: true - /listr-silent-renderer@1.1.1: - resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==} - engines: {node: '>=4'} - dev: true + listr-silent-renderer@1.1.1: {} - /listr-update-renderer@0.5.0(listr@0.14.3): - resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} - engines: {node: '>=6'} - peerDependencies: - listr: ^0.14.2 + listr-update-renderer@0.5.0(listr@0.14.3): dependencies: chalk: 1.1.3 cli-truncate: 0.2.1 @@ -4215,21 +5659,15 @@ packages: log-symbols: 1.0.2 log-update: 2.3.0 strip-ansi: 3.0.1 - dev: true - /listr-verbose-renderer@0.5.0: - resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} - engines: {node: '>=4'} + listr-verbose-renderer@0.5.0: dependencies: chalk: 2.4.2 cli-cursor: 2.1.0 date-fns: 1.30.1 figures: 2.0.0 - dev: true - /listr2@8.2.1: - resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} - engines: {node: '>=18.0.0'} + listr2@8.2.1: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -4237,11 +5675,8 @@ packages: log-update: 6.0.0 rfdc: 1.3.1 wrap-ansi: 9.0.0 - dev: true - /listr@0.14.3: - resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} - engines: {node: '>=6'} + listr@0.14.3: dependencies: '@samverschueren/stream-to-observable': 0.3.1(rxjs@6.6.7) is-observable: 1.1.0 @@ -4255,162 +5690,85 @@ packages: transitivePeerDependencies: - zen-observable - zenObservable - dev: true - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + load-tsconfig@0.2.5: {} - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + local-pkg@0.5.0: dependencies: mlly: 1.7.0 pkg-types: 1.1.1 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true + lodash.sortby@4.7.0: {} - /lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} - dev: true + lodash.zip@4.2.0: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true + lodash@4.17.21: {} - /log-symbols@1.0.2: - resolution: {integrity: sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==} - engines: {node: '>=0.10.0'} + log-symbols@1.0.2: dependencies: chalk: 1.1.3 - dev: true - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + log-symbols@6.0.0: dependencies: chalk: 5.3.0 is-unicode-supported: 1.3.0 - dev: true - /log-update@2.3.0: - resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} - engines: {node: '>=4'} + log-update@2.3.0: dependencies: ansi-escapes: 3.2.0 cli-cursor: 2.1.0 wrap-ansi: 3.0.1 - dev: true - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + log-update@6.0.0: dependencies: ansi-escapes: 6.2.1 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: true - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} - dev: true + lowercase-keys@3.0.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: false + lru-cache@10.2.2: {} - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.2 - dev: false - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: true + memorystream@0.3.1: {} - /meow@10.1.5: - resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + meow@10.1.5: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 7.0.2 @@ -4424,240 +5782,124 @@ packages: trim-newlines: 4.1.1 type-fest: 1.4.0 yargs-parser: 20.2.9 - dev: true - - /meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} - dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + meow@13.2.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge-stream@2.0.0: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: false + merge2@1.4.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /micromatch@4.0.6: - resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} - engines: {node: '>=8.6'} + micromatch@4.0.6: dependencies: braces: 3.0.3 picomatch: 4.0.2 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: false - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false - - /mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - dev: true + mimic-fn@1.2.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + mimic-fn@4.0.0: {} - /mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - dev: true + mimic-function@5.0.1: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true + mimic-response@3.1.0: {} - /mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + mimic-response@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true + minipass@7.1.1: {} - /mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mlly@1.7.0: dependencies: acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.1.1 ufo: 1.5.3 - dev: true - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /mute-stream@0.0.7: - resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} - dev: true + mute-stream@0.0.7: {} - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@0.0.8: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + mute-stream@1.0.0: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /new-github-release-url@2.0.0: - resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + new-github-release-url@2.0.0: dependencies: type-fest: 2.19.0 - dev: true - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: false - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.14: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@6.0.1: - resolution: {integrity: sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==} - engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@6.0.1: dependencies: hosted-git-info: 7.0.2 is-core-module: 2.13.1 semver: 7.6.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} - dev: true + normalize-url@8.0.1: {} - /np@10.0.5(typescript@5.4.5): - resolution: {integrity: sha512-Tu270vVvsh92uh6XDXrGS6D94PhzxQYqM8uUxftYVp0B8qXl78dJRYwQ9wfYMOBB9ynlF79eWlUtPUxPzKGddQ==} - engines: {git: '>=2.11.0', node: '>=18', npm: '>=9', pnpm: '>=8', yarn: '>=1.7.0'} - hasBin: true + np@10.0.5(typescript@5.4.5): dependencies: chalk: 5.3.0 chalk-template: 1.1.0 @@ -4699,11 +5941,8 @@ packages: - typescript - zen-observable - zenObservable - dev: true - /npm-name@8.0.0: - resolution: {integrity: sha512-DIuCGcKYYhASAZW6Xh/tiaGMko8IHOHe0n3zOA7SzTi0Yvy00x8L7sa5yNiZ75Ny58O/KeRtNouy8Ut6gPbKiw==} - engines: {node: '>=18'} + npm-name@8.0.0: dependencies: is-scoped: 3.0.0 is-url-superb: 6.1.0 @@ -4714,17 +5953,10 @@ packages: registry-auth-token: 5.0.2 registry-url: 6.0.1 validate-npm-package-name: 5.0.1 - dev: true - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + npm-normalize-package-bin@3.0.1: {} - /npm-run-all2@6.2.0: - resolution: {integrity: sha512-wA7yVIkthe6qJBfiJ2g6aweaaRlw72itsFGF6HuwCHKwtwAx/4BY1vVpk6bw6lS8RLMsexoasOkd0aYOmsFG7Q==} - engines: {node: ^14.18.0 || >=16.0.0, npm: '>= 8'} - hasBin: true + npm-run-all2@6.2.0: dependencies: ansi-styles: 6.2.1 cross-spawn: 7.0.3 @@ -4733,164 +5965,89 @@ packages: pidtree: 0.6.0 read-package-json-fast: 3.0.2 shell-quote: 1.8.1 - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: true + number-is-nan@1.0.1: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - dev: true - /object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} + onetime@2.0.1: dependencies: mimic-fn: 1.2.0 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - /onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} + onetime@7.0.0: dependencies: mimic-function: 5.0.1 - dev: true - /open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} - engines: {node: '>=18'} + open@10.1.0: dependencies: default-browser: 5.2.1 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 3.1.0 - dev: true - - /openai-fetch@2.0.2: - resolution: {integrity: sha512-OBsuvW0TcWyvRoBLJW+4nrGwSXY7voEMclNFBvZRy1+flT54pS+VsdzILwiKQRM2MQJyh487Dza8xrGrxsASVA==} - engines: {node: '>=18'} - dependencies: - ky: 1.2.4 - dev: false - - /openai@4.47.1: - resolution: {integrity: sha512-WWSxhC/69ZhYWxH/OBsLEirIjUcfpQ5+ihkXKp06hmeYXgBBIUCa9IptMzYx6NdkiOCsSGYCnTIsxaic3AjRCQ==} - hasBin: true - dependencies: - '@types/node': 18.19.33 - '@types/node-fetch': 2.6.11 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - web-streams-polyfill: 3.3.3 - transitivePeerDependencies: - - encoding - dev: false - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -4898,11 +6055,8 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -4913,469 +6067,248 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /org-regex@1.0.0: - resolution: {integrity: sha512-7bqkxkEJwzJQUAlyYniqEZ3Ilzjh0yoa62c7gL6Ijxj5bEpPL+8IE1Z0PFj0ywjjXQcdrwR51g9MIcLezR0hKQ==} - engines: {node: '>=8'} - dev: true + org-regex@1.0.0: {} - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - dev: true + p-cancelable@3.0.0: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@5.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + p-map@2.1.0: {} - /p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} - engines: {node: '>=12'} + p-map@5.5.0: dependencies: aggregate-error: 4.0.1 - dev: true - /p-map@7.0.2: - resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} - engines: {node: '>=18'} + p-map@7.0.2: {} - /p-memoize@7.1.1: - resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} - engines: {node: '>=14.16'} + p-memoize@7.1.1: dependencies: mimic-fn: 4.0.0 type-fest: 3.13.1 - dev: true - /p-retry@6.2.0: - resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} - engines: {node: '>=16.17'} + p-retry@6.2.0: dependencies: '@types/retry': 0.12.2 is-network-error: 1.1.0 retry: 0.13.1 - dev: false - /p-throttle@6.1.0: - resolution: {integrity: sha512-eQMdGTxk2+047La67wefUtt0tEHh7D+C8Jl7QXoFCuIiNYeQ9zWs2AZiJdIAs72rSXZ06t11me2bgalRNdy3SQ==} - engines: {node: '>=18'} - dev: false + p-throttle@6.1.0: {} - /p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} - engines: {node: '>=14.16'} - dev: true + p-timeout@6.1.2: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /package-json@8.1.1: - resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} - engines: {node: '>=14.16'} + package-json@8.1.1: dependencies: got: 12.6.1 registry-auth-token: 5.0.2 registry-url: 6.0.1 semver: 7.6.2 - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-json@8.1.0: - resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} - engines: {node: '>=18'} + parse-json@8.1.0: dependencies: '@babel/code-frame': 7.24.2 index-to-position: 0.1.2 type-fest: 4.18.2 - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + path-parse@1.0.7: {} - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 minipass: 7.1.1 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + path-type@4.0.0: {} - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + pathe@1.1.2: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + pathval@1.1.1: {} - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: true + picocolors@1.0.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + picomatch@2.3.1: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: false + picomatch@4.0.2: {} - /pinecone-client@2.0.0: - resolution: {integrity: sha512-CxpKuck4zxi/LaGaTrnWQNs9NmXiMB3UtynOhD6dVDoWRKGEXmgRbSFipMUdqGyyQEKMFXzTKvzo4qMHi2Gj8Q==} - engines: {node: '>=18'} - dependencies: - ky: 1.2.4 - dev: false + pidtree@0.6.0: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /pkg-dir@8.0.0: - resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} - engines: {node: '>=18'} + pkg-dir@8.0.0: dependencies: find-up-simple: 1.0.0 - dev: true - /pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + pkg-types@1.1.1: dependencies: confbox: 0.1.7 mlly: 1.7.0 pathe: 1.1.2 - dev: true - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.2(postcss@8.4.38): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 - dev: true + optionalDependencies: + postcss: 8.4.38 - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.2.5: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: true - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: true - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false + proto-list@1.2.4: {} - /proxycurl-js-linkedin-profile-scraper@1.0.2(@babel/core@7.24.5): - resolution: {integrity: sha512-aT2RgS4yDU4LeZgpLWJ0x95EkTt4FKNqWtHFnMw5y2CN5287ylgYr+s1YR0A6te28aqQ7jBfz4+Y/J8Pj2TjkA==} - dependencies: - '@babel/cli': 7.24.5(@babel/core@7.24.5) - superagent: 5.3.1 - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: false + proxy-from-env@1.1.0: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} - engines: {node: '>=12.20'} + pupa@3.1.0: dependencies: escape-goat: 4.0.0 - dev: true - - /qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: false - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + quick-lru@5.1.1: {} - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true + react-is@16.13.1: {} - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true + react-is@18.3.1: {} - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 - dev: true - /read-package-up@11.0.0: - resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} - engines: {node: '>=18'} + read-package-up@11.0.0: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 type-fest: 4.18.2 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg-up@8.0.0: - resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} - engines: {node: '>=12'} + read-pkg-up@8.0.0: dependencies: find-up: 5.0.0 read-pkg: 6.0.0 type-fest: 1.4.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /read-pkg@6.0.0: - resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} - engines: {node: '>=12'} + read-pkg@6.0.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 3.0.3 parse-json: 5.2.0 type-fest: 1.4.0 - dev: true - /read-pkg@9.0.1: - resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} - engines: {node: '>=18'} + read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.1 parse-json: 8.1.0 type-fest: 4.18.2 unicorn-magic: 0.1.0 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} + redent@4.0.0: dependencies: indent-string: 5.0.0 strip-indent: 4.0.0 - dev: true - /reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - dev: false - - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5384,160 +6317,91 @@ packages: get-intrinsic: 1.2.4 globalthis: 1.0.4 which-builtin-type: 1.1.3 - dev: true - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: true + regenerator-runtime@0.14.1: {} - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true + regexp-tree@0.1.27: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} - engines: {node: '>=14'} + registry-auth-token@5.0.2: dependencies: '@pnpm/npm-conf': 2.2.2 - dev: true - /registry-url@6.0.1: - resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} - engines: {node: '>=12'} + registry-url@6.0.1: dependencies: rc: 1.2.8 - dev: true - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true + regjsparser@0.10.0: dependencies: jsesc: 0.5.0 - dev: true - /requireindex@1.2.0: - resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} - engines: {node: '>=0.10.5'} - dev: true + requireindex@1.2.0: {} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true + resolve-alpn@1.2.1: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 - dev: true - /restore-cursor@2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} + restore-cursor@2.0.0: dependencies: onetime: 2.0.1 signal-exit: 3.0.7 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@5.0.0: - resolution: {integrity: sha512-Hp93f349DvdEqJFHiPyzNzVjT7lDDFtQJWRotQVQNl3CHr4j7oMHStQB9UH/CJSHTrevAZXFvomgzy8lXjrK0w==} - engines: {node: '>=18'} + restore-cursor@5.0.0: dependencies: onetime: 6.0.0 signal-exit: 4.1.0 - dev: false - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false + retry@0.13.1: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.3.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.17.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -5558,102 +6422,59 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.17.2 '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 - dev: true - /run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} - dev: true + run-applescript@7.0.0: {} - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true + run-async@2.4.1: {} - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + run-async@3.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + rxjs@6.6.7: dependencies: tslib: 1.14.1 - dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safe-regex@2.1.1: - resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + safe-regex@2.1.1: dependencies: regexp-tree: 0.1.27 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /scoped-regex@3.0.0: - resolution: {integrity: sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==} - engines: {node: '>=12'} - dev: true + scoped-regex@3.0.0: {} - /semver-diff@4.0.0: - resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} - engines: {node: '>=12'} + semver-diff@4.0.0: dependencies: semver: 7.6.2 - dev: true - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.2: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -5662,190 +6483,106 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.1: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + siginfo@2.0.0: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@3.0.7: {} - /slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - dev: false + signal-exit@4.1.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + slash@4.0.0: {} - /slice-ansi@0.0.4: - resolution: {integrity: sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==} - engines: {node: '>=0.10.0'} - dev: true + slice-ansi@0.0.4: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - - /sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - dependencies: - is-plain-obj: 4.1.0 - dev: false - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.17: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + stackback@0.0.2: {} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - dev: true + std-env@3.7.0: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + string-width@1.0.2: dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: true - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} + string-width@2.1.1: dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5859,124 +6596,73 @@ packages: regexp.prototype.flags: 1.5.2 set-function-name: 2.0.2 side-channel: 1.0.6 - dev: true - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - dev: true - /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} + strip-ansi@4.0.0: dependencies: ansi-regex: 3.0.1 - dev: true - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} + strip-ansi@5.2.0: dependencies: ansi-regex: 4.1.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + strip-indent@4.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.1.0: dependencies: js-tokens: 9.0.0 - dev: true - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -5985,211 +6671,91 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true - /superagent@5.3.1: - resolution: {integrity: sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==} - engines: {node: '>= 7.0.0'} - deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.3.4 - fast-safe-stringify: 2.1.1 - form-data: 3.0.1 - formidable: 1.2.6 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.12.1 - readable-stream: 3.6.2 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - dev: false - - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true + supports-color@2.0.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-observable@1.2.0: - resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} - engines: {node: '>=0.10.0'} - dev: true + symbol-observable@1.2.0: {} - /symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - dev: true + symbol-observable@4.0.0: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /terminal-link@3.0.0: - resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} - engines: {node: '>=12'} + terminal-link@3.0.0: dependencies: ansi-escapes: 5.0.0 supports-hyperlinks: 2.3.0 - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - /tiktoken@1.0.15: - resolution: {integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw==} - dev: false + through@2.3.8: {} - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: false + tiny-invariant@1.3.3: {} - /tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - dev: true + tinybench@2.8.0: {} - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.8.4: {} - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.1: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: true - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} - dev: true + trim-newlines@4.1.1: {} - /ts-api-utils@1.3.0(typescript@5.4.5): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 - dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + ts-interface-checker@0.1.13: {} - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true + tslib@1.14.1: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true + tslib@2.6.2: {} - /tsup@8.0.2(typescript@5.4.5): - resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + tsup@8.0.2(postcss@8.4.38)(typescript@5.4.5): dependencies: bundle-require: 4.1.0(esbuild@0.19.12) cac: 6.7.14 @@ -6199,113 +6765,70 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2 + postcss-load-config: 4.0.2(postcss@8.4.38) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 typescript: 5.4.5 transitivePeerDependencies: - supports-color - ts-node - dev: true - /tsx@4.10.5: - resolution: {integrity: sha512-twDSbf7Gtea4I2copqovUiNTEDrT8XNFXsuHpfGbdpW/z9ZW4fTghzzhAG0WfrCuJmJiOEY1nLIjq4u3oujRWQ==} - engines: {node: '>=18.0.0'} - hasBin: true + tsx@4.10.5: dependencies: esbuild: 0.20.2 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 - dev: true - /twitter-api-sdk@1.2.1: - resolution: {integrity: sha512-tNQ6DGYucFk94JlnUMsHCkHg5o1wnCdHh71Y2ukygNVssOdD1gNVjOpaojJrdwbEAhoZvcWdGHerCa55F8HKxQ==} - engines: {node: '>=14'} + twitter-api-sdk@1.2.1: dependencies: abort-controller: 3.0.0 node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@3.13.1: {} - /type-fest@4.18.2: - resolution: {integrity: sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==} - engines: {node: '>=16'} + type-fest@4.18.2: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -6313,11 +6836,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -6325,61 +6845,37 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.4.5: {} - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - dev: true + ufo@1.5.3: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - dev: true + unicorn-magic@0.1.0: {} - /unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} + unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 - dev: true - /update-browserslist-db@1.0.16(browserslist@4.23.0): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.16(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.1 - /update-notifier@7.0.0: - resolution: {integrity: sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ==} - engines: {node: '>=18'} + update-notifier@7.0.0: dependencies: boxen: 7.1.1 chalk: 5.3.0 @@ -6393,33 +6889,21 @@ packages: semver: 7.6.2 semver-diff: 4.0.0 xdg-basedir: 5.1.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + validate-npm-package-name@5.0.1: {} - /vite-node@1.6.0(@types/node@20.12.12): - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.6.0(@types/node@20.12.12): dependencies: cac: 6.7.14 debug: 4.3.4 @@ -6435,70 +6919,18 @@ packages: - sugarss - supports-color - terser - dev: true - /vite@5.2.11(@types/node@20.12.12): - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.2.11(@types/node@20.12.12): dependencies: - '@types/node': 20.12.12 esbuild: 0.20.2 postcss: 8.4.38 rollup: 4.17.2 optionalDependencies: + '@types/node': 20.12.12 fsevents: 2.3.3 - dev: true - /vitest@1.6.0(@types/node@20.12.12): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vitest@1.6.0(@types/node@20.12.12): dependencies: - '@types/node': 20.12.12 '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 '@vitest/snapshot': 1.6.0 @@ -6519,6 +6951,8 @@ packages: vite: 5.2.11(@types/node@20.12.12) vite-node: 1.6.0(@types/node@20.12.12) why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.12 transitivePeerDependencies: - less - lightningcss @@ -6527,60 +6961,35 @@ packages: - sugarss - supports-color - terser - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - - /web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - dev: false - - /web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} - dev: false - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + webidl-conversions@4.0.2: {} - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -6594,165 +7003,89 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: true - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: true - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.2.2: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wrap-ansi@3.0.1: - resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} - engines: {node: '>=4'} + wrap-ansi@3.0.1: dependencies: string-width: 2.1.1 strip-ansi: 4.0.0 - dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.1.0 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - - /xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + xdg-basedir@5.1.0: {} - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - dev: true + yallist@4.0.0: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yaml@2.4.2: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@0.1.0: {} - /zod-to-json-schema@3.23.0(zod@3.23.8): - resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} - peerDependencies: - zod: ^3.23.3 - dependencies: - zod: 3.23.8 - dev: false + yocto-queue@1.0.0: {} - /zod-validation-error@3.3.0(zod@3.23.8): - resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.18.0 + zod-to-json-schema@3.23.0(zod@3.23.8): dependencies: zod: 3.23.8 - dev: false - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - dev: false + zod@3.23.8: {} diff --git a/readme.md b/readme.md index fa362f6e2..be503c415 100644 --- a/readme.md +++ b/readme.md @@ -17,6 +17,34 @@ **Coming soon** +## Services + +- Clearbit +- Dexa +- Diffbot +- Proxycurl +- SerpAPI +- Serper +- Twitter +- WeatherAPI + +## TODO + +- core + - company schema + - person schema + - database + - move out to a separate project + - agentic + - walter +- services + - Exa + - Firecrawl + - Unstructured + - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) + - pull from other libs + - pull from [nango](https://docs.nango.dev/integrations/overview) + ## License PROPRIETARY © [Travis Fischer](https://twitter.com/transitive_bs) diff --git a/src/fns.ts b/src/fns.ts index 178d3839a..06a5d1462 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -1,4 +1,4 @@ -import 'reflect-metadata' +import './symbol-polyfill.js' import type { z } from 'zod' @@ -34,7 +34,7 @@ export abstract class AIToolsProvider { const functions = invocables.map((invocable) => ({ ...invocable, name: invocable.name ?? `${namespace}_${invocable.propertyKey}`, - callback: (target as any)[invocable.propertyKey].bind(target) + callback: (this as any)[invocable.propertyKey].bind(target) })) const functions = invocables.map(getFunctionSpec) @@ -88,18 +88,14 @@ export function aiFunction< context: ClassMethodDecoratorContext< This, (this: This, ...args: Args) => Return - > & { - readonly metadata: { - invocables: Invocable[] - } - } + > ) => { const methodName = String(context.name) if (!context.metadata.invocables) { context.metadata.invocables = [] } - context.metadata.invocables.push({ + ;(context.metadata.invocables as Invocable[]).push({ name: name ?? methodName, description, inputSchema, diff --git a/src/services/clearbit-client.ts b/src/services/clearbit-client.ts index 9674ed875..f948f33e8 100644 --- a/src/services/clearbit-client.ts +++ b/src/services/clearbit-client.ts @@ -1,7 +1,7 @@ import defaultKy from 'ky' import pThrottle from 'p-throttle' -import type { DeepNullable } from '../types.js' +import type { DeepNullable, KyInstance } from '../types.js' import { assert, delay, getEnv, throttleKy } from '../utils.js' // Only allow 20 clearbit API requests per 60s @@ -362,7 +362,7 @@ export namespace clearbit { } export class ClearbitClient { - readonly ky: typeof defaultKy + readonly ky: KyInstance readonly apiKey: string readonly _maxPageSize = 100 @@ -516,17 +516,19 @@ export class ClearbitClient { constructor({ apiKey = getEnv('CLEARBIT_API_KEY'), timeoutMs = 30_000, + throttle = true, ky = defaultKy }: { apiKey?: string timeoutMs?: number - ky?: typeof defaultKy + throttle?: boolean + ky?: KyInstance } = {}) { assert(apiKey, 'Error clearbit client missing required "apiKey"') this.apiKey = apiKey - const throttledKy = throttleKy(ky, clearbitAPIThrottle) + const throttledKy = throttle ? throttleKy(ky, clearbitAPIThrottle) : ky this.ky = throttledKy.extend({ timeout: timeoutMs, @@ -652,7 +654,8 @@ export class ClearbitClient { employments: Array | null> | null ) { if (employments && employments.length > 0) { - // We filter by employment endDate because some people could have multiple jobs at the same time. + // We filter by employment endDate because some people could have multiple + // jobs at the same time. // Here we want to filter by people that actively works at a specific company. return employments .filter((item) => !item?.endDate) @@ -660,6 +663,7 @@ export class ClearbitClient { item?.company?.toLowerCase().includes(companyName.toLowerCase()) ) } + return false } } diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index ad050a953..1a10ad789 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -1,6 +1,6 @@ -import { type Prompt } from '@dexaai/dexter' import defaultKy, { type KyInstance } from 'ky' +import type * as types from '../types.js' import { assert, getEnv } from '../utils.js' export class DexaClient { @@ -11,20 +11,22 @@ export class DexaClient { constructor({ apiKey = getEnv('DEXA_API_KEY'), apiBaseUrl = getEnv('DEXA_API_BASE_URL') ?? 'https://dexa.ai', + timeoutMs = 60_000, ky = defaultKy }: { apiKey?: string apiBaseUrl?: string + timeoutMs?: number ky?: KyInstance } = {}) { - assert(apiKey, 'DEXA_API_KEY is required') + assert(apiKey, 'DexaClient missing required "apiKey"') this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl - this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, timeout: 60_000 }) + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, timeout: timeoutMs }) } - async askDexa({ messages }: { messages: Prompt.Msg[] }) { + async askDexa({ messages }: { messages: types.Msg[] }) { return this.ky .post('api/ask-dexa', { json: { diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index d02787ffc..88423a432 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -330,7 +330,7 @@ export namespace diffbot { export class DiffbotClient { readonly ky: KyInstance - readonly kyKnowledgeGraph: typeof defaultKy + readonly kyKnowledgeGraph: KyInstance readonly apiKey: string readonly apiBaseUrl: string @@ -341,21 +341,23 @@ export class DiffbotClient { apiBaseUrl = diffbot.API_BASE_URL, apiKnowledgeGraphBaseUrl = diffbot.KNOWLEDGE_GRAPH_API_BASE_URL, timeoutMs = 30_000, + throttle = true, ky = defaultKy }: { apiKey?: string apiBaseUrl?: string apiKnowledgeGraphBaseUrl?: string timeoutMs?: number + throttle?: boolean ky?: KyInstance } = {}) { - assert(apiKey, `Error DiffbotClient missing required "apiKey"`) + assert(apiKey, `DiffbotClient missing required "apiKey"`) this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl this.apiKnowledgeGraphBaseUrl = apiKnowledgeGraphBaseUrl - const throttledKy = throttleKy(ky, diffbotAPIThrottle) + const throttledKy = throttle ? throttleKy(ky, diffbotAPIThrottle) : ky this.ky = throttledKy.extend({ prefixUrl: apiBaseUrl, diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts new file mode 100644 index 000000000..9aedc08d8 --- /dev/null +++ b/src/services/exa-client.ts @@ -0,0 +1,264 @@ +import defaultKy, { type KyInstance } from 'ky' + +import { assert, getEnv } from '../utils.js' + +export namespace exa { + /** + * Search options for performing a search query. + */ + export type BaseSearchOptions = { + /** Number of search results to return. Default 10. Max 10 for basic plans. */ + numResults?: number + /** List of domains to include in the search. */ + includeDomains?: string[] + /** List of domains to exclude in the search. */ + excludeDomains?: string[] + /** Start date for results based on crawl date. */ + startCrawlDate?: string + /** End date for results based on crawl date. */ + endCrawlDate?: string + /** Start date for results based on published date. */ + startPublishedDate?: string + /** End date for results based on published date. */ + endPublishedDate?: string + /** A data category to focus on, with higher comprehensivity and data cleanliness. Currently, the only category is company. */ + category?: string + } + + /** + * Search options for performing a search query. + */ + export type RegularSearchOptions = BaseSearchOptions & { + /** If true, converts query to a Metaphor query. */ + useAutoprompt?: boolean + /** Type of search, 'keyword' or 'neural'. */ + type?: string + } + + /** + * Options for finding similar links. + */ + export type FindSimilarOptions = BaseSearchOptions & { + /** If true, excludes links from the base domain of the input. */ + excludeSourceDomain?: boolean + } + + /** + * Search options for performing a search query. + */ + export type ContentsOptions = { + /** Options for retrieving text contents. */ + text?: TextContentsOptions | true + /** Options for retrieving highlights. */ + highlights?: HighlightsContentsOptions | true + } + + /** + * Options for retrieving text from page. + */ + export type TextContentsOptions = { + /** The maximum number of characters to return. */ + maxCharacters?: number + /** If true, includes HTML tags in the returned text. Default: false */ + includeHtmlTags?: boolean + } + + /** + * Options for retrieving highlights from page. + * @typedef {Object} HighlightsContentsOptions + */ + export type HighlightsContentsOptions = { + /** The query string to use for highlights search. */ + query?: string + /** The number of sentences to return for each highlight. */ + numSentences?: number + /** The number of highlights to return for each URL. */ + highlightsPerUrl?: number + } + + export type TextResponse = { + /** Text from page */ + text: string + } + + export type HighlightsResponse = { + /** The highlights as an array of strings. */ + highlights: string[] + /** The corresponding scores as an array of floats, 0 to 1 */ + highlightScores: number[] + } + + export type Default = [keyof T] extends [never] ? U : T + + /** + * Depending on 'ContentsOptions', this yields either a 'TextResponse', + * a 'HighlightsResponse', both, or an empty object. + */ + export type ContentsResultComponent = Default< + (T['text'] extends object | true ? TextResponse : {}) & + (T['highlights'] extends object | true ? HighlightsResponse : {}), + TextResponse + > + + /** + * Represents a search result object. + */ + export type SearchResult = { + /** The title of the search result. */ + title: string | null + /** The URL of the search result. */ + url: string + /** The estimated creation date of the content. */ + publishedDate?: string + /** The author of the content, if available. */ + author?: string + /** Similarity score between the query/url and the result. */ + score?: number + /** The temporary ID for the document. */ + id: string + } & ContentsResultComponent + + /** + * Represents a search response object. + */ + export type SearchResponse = { + /** The list of search results. */ + results: SearchResult[] + /** The autoprompt string, if applicable. */ + autopromptString?: string + } +} + +export class ExaClient { + readonly apiKey: string + readonly apiBaseUrl: string + readonly ky: KyInstance + + constructor({ + apiKey = getEnv('EXA_API_KEY'), + apiBaseUrl = getEnv('EXA_API_BASE_URL') ?? 'https://api.exa.ai', + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert(apiKey, 'ExaClient missing required "apiKey"') + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl, + headers: { + 'x-api-key': apiKey + } + }) + } + + async search(query: string, options?: exa.RegularSearchOptions) { + return this.ky + .post('search', { json: { ...options, query } }) + .json() + } + + /** + * Performs a search with a Exa prompt-engineered query and returns the + * contents of the documents. + * + * @param {string} query - The query string. + */ + async searchAndContents( + query: string, + options?: exa.RegularSearchOptions & T + ) { + const { text, highlights, ...rest } = options || {} + + return this.ky + .post('search', { + json: { + query, + contents: + !text && !highlights + ? { text: true } + : { + ...(text ? { text } : {}), + ...(highlights ? { highlights } : {}) + }, + ...rest + } + }) + .json>() + } + + /** + * Finds similar links to the provided URL. + * + * @param {string} url - The URL for which to find similar links. + */ + async findSimilar(url: string, options?: exa.FindSimilarOptions) { + return this.ky + .post('findSimilar', { json: { url, ...options } }) + .json() + } + + /** + * Finds similar links to the provided URL and returns the contents of the + * documents. + * + * @param {string} url - The URL for which to find similar links. + */ + async findSimilarAndContents< + T extends exa.ContentsOptions = exa.ContentsOptions + >(url: string, options?: exa.FindSimilarOptions & T) { + const { text, highlights, ...rest } = options || {} + + return this.ky + .post('findSimilar', { + json: { + url, + contents: + !text && !highlights + ? { text: true } + : { + ...(text ? { text } : {}), + ...(highlights ? { highlights } : {}) + }, + ...rest + } + }) + .json>() + } + + /** + * Retrieves contents of documents based on a list of document IDs. + * + * @param {string | string[] | SearchResult[]} ids - An array of document IDs. + */ + async getContents( + ids: string | string[] | exa.SearchResult[], + options?: T + ) { + let requestIds: string[] + + if (typeof ids === 'string') { + requestIds = [ids] + } else if (typeof ids[0] === 'string') { + requestIds = ids as string[] + } else { + requestIds = (ids as exa.SearchResult[]).map((result) => result.id) + } + + if (ids.length === 0) { + throw new Error('Must provide at least one ID') + } + + return this.ky + .post('contents', { + json: { + ids: requestIds, + ...options + } + }) + .json>() + } +} diff --git a/src/services/index.ts b/src/services/index.ts index 8d452d892..1e7c9c49d 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,7 +1,7 @@ export * from './clearbit-client.js' export * from './dexa-client.js' export * from './diffbot-client.js' -export * from './openai-client.js' +export * from './exa-client.js' export * from './proxycurl-client.js' export * from './scraper-client.js' export * from './serpapi-client.js' diff --git a/src/services/openai-client.ts b/src/services/openai-client.ts deleted file mode 100644 index 70bf0a399..000000000 --- a/src/services/openai-client.ts +++ /dev/null @@ -1 +0,0 @@ -export * from 'openai' diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index 9d9e6706d..e5adec74f 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -2003,6 +2003,7 @@ export namespace proxycurl { export class ProxycurlClient { readonly ky: KyInstance readonly apiKey: string + readonly apiBaseUrl: string constructor({ apiKey = getEnv('PROXYCURL_API_KEY'), @@ -2014,9 +2015,11 @@ export class ProxycurlClient { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert(apiKey, 'Error ProxycurlClient missing required "apiKey"') + assert(apiKey, 'ProxycurlClient missing required "apiKey"') + assert(apiBaseUrl, 'ProxycurlClient missing required "apiBaseUrl"') this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: apiBaseUrl, diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts index 15bfc3fbc..bd5694508 100644 --- a/src/services/scraper-client.ts +++ b/src/services/scraper-client.ts @@ -45,7 +45,7 @@ export class ScraperClient { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert(apiBaseUrl, 'SCRAPER_API_BASE_URL is required') + assert(apiBaseUrl, 'ScraperClient apiBaseUrl is required') this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: this.apiBaseUrl }) diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index 6cefe568b..38a69b4e2 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -667,7 +667,7 @@ export class SerpAPIClient extends AIToolsProvider { } @aiFunction({ - name: 'serpapiGoogleSearch', + name: 'serpapi_google_search', description: 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', inputSchema: z.object({ diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index f94c2c209..485b90e24 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -230,10 +230,12 @@ export class SerperClient extends AIToolsProvider { } @aiFunction({ - name: 'serperGoogleSearch', + name: 'serper_google_search', description: 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', - inputSchema: serper.SearchParamsSchema + inputSchema: serper.SearchParamsSchema.pick({ + q: true + }) }) async search(queryOrOpts: string | serper.SearchParams) { return this._fetch('search', queryOrOpts) diff --git a/src/services/weather-client.ts b/src/services/weather-client.ts index 384a007a1..745b66499 100644 --- a/src/services/weather-client.ts +++ b/src/services/weather-client.ts @@ -98,7 +98,7 @@ export class WeatherClient extends AIToolsProvider { } @aiFunction({ - name: 'getCurrentWeather', + name: 'get_current_weather', description: 'Gets info about the current weather at a given location.', inputSchema: z.object({ q: z diff --git a/src/stringify-for-model.ts b/src/stringify-for-model.ts index 4e6b555c6..8a3602df8 100644 --- a/src/stringify-for-model.ts +++ b/src/stringify-for-model.ts @@ -2,8 +2,6 @@ import type { Jsonifiable } from 'type-fest' /** * Stringifies a JSON value in a way that's optimized for use with LLM prompts. - * - * This is intended to be used with `function` and `tool` arguments and responses. */ export function stringifyForModel(jsonObject?: Jsonifiable): string { if (jsonObject === undefined) { diff --git a/src/types.ts b/src/types.ts index 6597c22fc..bb1979c89 100644 --- a/src/types.ts +++ b/src/types.ts @@ -21,16 +21,21 @@ export interface AIToolSpec { export interface Msg { /** The contents of the message. `content` is required for all messages, and may be null for assistant messages with function calls. */ content: string | null + /** The role of the messages author. One of `system`, `user`, `assistant`, 'tool', or `function`. */ role: Msg.Role + /** The name and arguments of a function that should be called, as generated by the model. */ function_call?: Msg.Call.Function + /** The tool calls generated by the model, such as function calls. */ tool_calls?: Msg.Call.Tool[] + /** * Tool call that this message is responding to. */ tool_call_id?: string + /** * The name of the author of this message. `name` is required if role is * `function`, and it should be the name of the function whose response is in the @@ -50,6 +55,7 @@ export namespace Msg { export type Function = { /** The arguments to call the function with, as generated by the model in JSON format. */ arguments: string + /** The name of the function to call. */ name: string } @@ -58,8 +64,10 @@ export namespace Msg { export type Tool = { /** The ID of the tool call. */ id: string + /** The type of the tool. Currently, only `function` is supported. */ type: 'function' + /** The function that the model called. */ function: Call.Function } diff --git a/tsconfig.json b/tsconfig.json index c4a144fbb..4066d2765 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,8 +12,8 @@ "useDefineForClassFields": true, "jsx": "preserve", - "experimentalDecorators": true, - "emitDecoratorMetadata": true, + // "experimentalDecorators": true, + // "emitDecoratorMetadata": true, "strict": true, "noUncheckedIndexedAccess": true, From 89f8246a3a56136d02c1b8ea3451a0c761dbccd4 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 24 May 2024 18:55:26 -0500 Subject: [PATCH 07/81] feat: core fns --- package.json | 2 + pnpm-lock.yaml | 17 ++++++++ src/ai-function-set.ts | 70 ++++++++++++++++++++++++++++++ src/ai-function.test.ts | 42 ++++++++++++++++++ src/ai-function.ts | 60 ++++++++++++++++++++++++++ src/ai-tool-set.ts | 88 ++++++++++++++++++++++++++++++++++++++ src/fns.ts | 94 ++++++++++++++++------------------------- src/function-set.ts | 70 ------------------------------ src/index.ts | 9 +++- src/tool-set.ts | 85 ------------------------------------- src/types.ts | 71 +++++++++++++++++++++++++++---- 11 files changed, 386 insertions(+), 222 deletions(-) create mode 100644 src/ai-function-set.ts create mode 100644 src/ai-function.test.ts create mode 100644 src/ai-function.ts create mode 100644 src/ai-tool-set.ts delete mode 100644 src/function-set.ts delete mode 100644 src/tool-set.ts diff --git a/package.json b/package.json index ca641c306..3fe2de54a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "dist" ], "scripts": { + "preinstall": "npx only-allow pnpm", "build": "tsup", "dev": "tsup --watch", "clean": "del dist", @@ -71,6 +72,7 @@ "lint-staged": "^15.2.4", "np": "^10.0.5", "npm-run-all2": "^6.2.0", + "only-allow": "^1.2.1", "prettier": "^3.2.5", "tsup": "^8.0.2", "tsx": "^4.10.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7f8541a4..c95a9eca1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,6 +84,9 @@ importers: npm-run-all2: specifier: ^6.2.0 version: 6.2.0 + only-allow: + specifier: ^1.2.1 + version: 1.2.1 prettier: specifier: ^3.2.5 version: 3.2.5 @@ -2505,6 +2508,10 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + only-allow@1.2.1: + resolution: {integrity: sha512-M7CJbmv7UCopc0neRKdzfoGWaVZC+xC1925GitKH9EAqYFzX9//25Q7oX4+jw0tiCCj+t5l6VZh8UPH23NZkMA==} + hasBin: true + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -3429,6 +3436,10 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + which-typed-array@1.1.15: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} @@ -6040,6 +6051,10 @@ snapshots: dependencies: mimic-function: 5.0.1 + only-allow@1.2.1: + dependencies: + which-pm-runs: 1.1.0 + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -7011,6 +7026,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 + which-pm-runs@1.1.0: {} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts new file mode 100644 index 000000000..f2ca814c2 --- /dev/null +++ b/src/ai-function-set.ts @@ -0,0 +1,70 @@ +import type { AIToolSet } from './ai-tool-set.js' +import type * as types from './types.ts' + +export class AIFunctionSet implements Iterable { + protected readonly _map: Map + + constructor(functions?: readonly types.AIFunction[]) { + this._map = new Map(functions ? functions.map((fn) => [fn.name, fn]) : null) + } + + get size(): number { + return this._map.size + } + + add(fn: types.AIFunction): this { + this._map.set(fn.name, fn) + return this + } + + get(name: string): types.AIFunction | undefined { + return this._map.get(name) + } + + set(name: string, fn: types.AIFunction): this { + this._map.set(name, fn) + return this + } + + has(name: string): boolean { + return this._map.has(name) + } + + clear(): void { + this._map.clear() + } + + delete(name: string): boolean { + return this._map.delete(name) + } + + pick(...keys: string[]): AIFunctionSet { + const keysToIncludeSet = new Set(keys) + return new AIFunctionSet( + Array.from(this).filter((fn) => keysToIncludeSet.has(fn.spec.name)) + ) + } + + omit(...keys: string[]): AIFunctionSet { + const keysToExcludeSet = new Set(keys) + return new AIFunctionSet( + Array.from(this).filter((fn) => !keysToExcludeSet.has(fn.spec.name)) + ) + } + + get entries(): IterableIterator { + return this._map.values() + } + + [Symbol.iterator](): Iterator { + return this.entries + } + + static fromAIToolSet(tools: AIToolSet): AIFunctionSet { + return new AIFunctionSet( + Array.from(tools) + .filter((tool) => tool.spec.type === 'function') + .map((tool) => tool.function) + ) + } +} diff --git a/src/ai-function.test.ts b/src/ai-function.test.ts new file mode 100644 index 000000000..8b5262a2d --- /dev/null +++ b/src/ai-function.test.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from 'vitest' +import { z } from 'zod' + +import { createAIFunction } from './ai-function.js' + +const fullName = createAIFunction( + { + name: 'fullName', + description: 'Returns the full name of a person.', + inputSchema: z.object({ + first: z.string(), + last: z.string() + }) + }, + async ({ first, last }) => { + return `${first} ${last}` + } +) + +describe('createAIFunction()', () => { + it('exposes OpenAI function calling spec', () => { + expect(fullName.spec.name).toEqual('fullName') + expect(fullName.spec.description).toEqual( + 'Returns the full name of a person.' + ) + expect(fullName.spec.parameters).toEqual({ + properties: { + first: { type: 'string' }, + last: { type: 'string' } + }, + required: ['first', 'last'], + type: 'object', + additionalProperties: false + }) + }) + + it('executes the function', async () => { + expect(await fullName('{"first": "John", "last": "Doe"}')).toEqual( + 'John Doe' + ) + }) +}) diff --git a/src/ai-function.ts b/src/ai-function.ts new file mode 100644 index 000000000..504c97270 --- /dev/null +++ b/src/ai-function.ts @@ -0,0 +1,60 @@ +import type { z } from 'zod' + +import type * as types from './types.js' +import { parseStructuredOutput } from './parse-structured-output.js' +import { assert } from './utils.js' +import { zodToJsonSchema } from './zod-to-json-schema.js' + +/** + * Create a function meant to be used with OpenAI tool or function calling. + * + * The returned function will parse the arguments string and call the + * implementation function with the parsed arguments. + * + * The `spec` property of the returned function is the spec for adding the + * function to the OpenAI API `functions` property. + */ +export function createAIFunction, Return>( + spec: { + /** Name of the function. */ + name: string + /** Description of the function. */ + description?: string + /** Zod schema for the arguments string. */ + inputSchema: InputSchema + }, + /** Implementation of the function to call with the parsed arguments. */ + implementation: (params: z.infer) => types.MaybePromise +): types.AIFunction { + /** Parse the arguments string, optionally reading from a message. */ + const parseInput = (input: string | types.Msg) => { + if (typeof input === 'string') { + return parseStructuredOutput(input, spec.inputSchema) + } else { + const args = input.function_call?.arguments + assert( + args, + `Missing required function_call.arguments for function ${spec.name}` + ) + return parseStructuredOutput(args, spec.inputSchema) + } + } + + // Call the implementation function with the parsed arguments. + const aiFunction: types.AIFunction = ( + input: string | types.Msg + ) => { + const parsedInput = parseInput(input) + return implementation(parsedInput) + } + + aiFunction.inputSchema = spec.inputSchema + aiFunction.parseInput = parseInput + aiFunction.spec = { + name: spec.name, + description: spec.description?.trim() ?? '', + parameters: zodToJsonSchema(spec.inputSchema) + } + + return aiFunction +} diff --git a/src/ai-tool-set.ts b/src/ai-tool-set.ts new file mode 100644 index 000000000..cb1d77e8e --- /dev/null +++ b/src/ai-tool-set.ts @@ -0,0 +1,88 @@ +import type * as types from './types.js' +import { AIFunctionSet } from './ai-function-set.js' + +export class AIToolSet implements Iterable { + protected _map: Map + + constructor(tools?: readonly types.AITool[]) { + this._map = new Map( + tools ? tools.map((tool) => [tool.function.name, tool]) : [] + ) + } + + get size(): number { + return this._map.size + } + + add(tool: types.AITool): this { + this._map.set(tool.function.name, tool) + return this + } + + get(name: string): types.AITool | undefined { + return this._map.get(name) + } + + set(name: string, tool: types.AITool): this { + this._map.set(name, tool) + return this + } + + has(name: string): boolean { + return this._map.has(name) + } + + clear(): void { + this._map.clear() + } + + delete(name: string): boolean { + return this._map.delete(name) + } + + pick(...keys: string[]): AIToolSet { + const keysToIncludeSet = new Set(keys) + return new AIToolSet( + Array.from(this).filter((tool) => + keysToIncludeSet.has(tool.function.name) + ) + ) + } + + omit(...keys: string[]): AIToolSet { + const keysToExcludeSet = new Set(keys) + return new AIToolSet( + Array.from(this).filter( + (tool) => !keysToExcludeSet.has(tool.function.name) + ) + ) + } + + get entries(): IterableIterator { + return this._map.values() + } + + [Symbol.iterator](): Iterator { + return this.entries + } + + static fromAIFunctionSet(functions: AIFunctionSet): AIToolSet { + return new AIToolSet( + Array.from(functions).map((fn) => ({ + function: fn, + spec: { + type: 'function' as const, + function: fn.spec + } + })) + ) + } + + static fromFunctions(functions: types.AIFunction[]): AIToolSet { + return AIToolSet.fromAIFunctionSet(new AIFunctionSet(functions)) + } + + static fromTools(tools: types.AITool[]): AIToolSet { + return new AIToolSet(tools) + } +} diff --git a/src/fns.ts b/src/fns.ts index 06a5d1462..cef242a9f 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -1,44 +1,40 @@ import './symbol-polyfill.js' -import type { z } from 'zod' +import type * as z from 'zod' import type * as types from './types.js' -import { FunctionSet } from './function-set.js' -import { ToolSet } from './tool-set.js' -import { zodToJsonSchema } from './zod-to-json-schema.js' +import { createAIFunction } from './ai-function.js' +import { AIFunctionSet } from './ai-function-set.js' +import { AIToolSet } from './ai-tool-set.js' +import { assert } from './utils.js' export const invocableMetadataKey = Symbol('invocable') export abstract class AIToolsProvider { - private _tools?: ToolSet - private _functions?: FunctionSet + private _tools?: AIToolSet + private _functions?: AIFunctionSet - get namespace() { - return this.constructor.name - } - - get tools(): ToolSet { + get tools(): AIToolSet { if (!this._tools) { - this._tools = ToolSet.fromFunctionSet(this.functions) + this._tools = AIToolSet.fromAIFunctionSet(this.functions) } return this._tools } - get functions(): FunctionSet { + get functions(): AIFunctionSet { if (!this._functions) { const metadata = this.constructor[Symbol.metadata] const invocables = (metadata?.invocables as Invocable[]) ?? [] - const namespace = this.namespace - const functions = invocables.map((invocable) => ({ - ...invocable, - name: invocable.name ?? `${namespace}_${invocable.propertyKey}`, - callback: (this as any)[invocable.propertyKey].bind(target) - })) + const aiFunctions = invocables.map((invocable) => { + const impl = (this as any)[invocable.methodName]?.bind(this) + assert(impl) + + return createAIFunction(invocable, impl) + }) - const functions = invocables.map(getFunctionSpec) - this._functions = new FunctionSet(functions) + this._functions = new AIFunctionSet(aiFunctions) } return this._functions @@ -48,29 +44,15 @@ export abstract class AIToolsProvider { export interface Invocable { name: string description?: string - inputSchema?: z.AnyZodObject - callback: (args: Record) => Promise -} - -function getFunctionSpec(invocable: Invocable): types.AIFunctionSpec { - const { name, description, inputSchema } = invocable - - return { - name, - description, - parameters: inputSchema - ? zodToJsonSchema(inputSchema) - : { - type: 'object', - properties: {} - } - } + inputSchema: z.AnyZodObject + methodName: string } export function aiFunction< This, - Args extends any[], - Return extends Promise + InputSchema extends z.SomeZodObject, + OptionalArgs extends Array, + Return extends types.MaybePromise >({ name, description, @@ -78,16 +60,21 @@ export function aiFunction< }: { name?: string description?: string - - // params must be an object, so the underlying function should only expect a - // single parameter - inputSchema?: z.AnyZodObject + inputSchema: InputSchema }) { return ( - targetMethod: (this: This, ...args: Args) => Return, + _targetMethod: ( + this: This, + input: z.infer, + ...optionalArgs: OptionalArgs + ) => Return, context: ClassMethodDecoratorContext< This, - (this: This, ...args: Args) => Return + ( + this: This, + input: z.infer, + ...optionalArgs: OptionalArgs + ) => Return > ) => { const methodName = String(context.name) @@ -99,18 +86,11 @@ export function aiFunction< name: name ?? methodName, description, inputSchema, - callback: targetMethod + methodName }) - return targetMethod - - // function replacementMethod(this: This, ...args: Args): Return { - // console.log(`LOG: Entering method '${methodName}'.`) - // const result = targetMethod.call(this, ...args) - // console.log(`LOG: Exiting method '${methodName}'.`) - // return result - // } - - // return replacementMethod + // context.addInitializer(function () { + // ;(this as any)[methodName] = (this as any)[methodName].bind(this) + // }) } } diff --git a/src/function-set.ts b/src/function-set.ts deleted file mode 100644 index 0f6085c4f..000000000 --- a/src/function-set.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { ToolSet } from './tool-set.js' -import type * as types from './types.ts' - -export class FunctionSet implements Iterable { - protected _map: Map - - constructor(functions?: readonly types.AIFunctionSpec[] | null) { - this._map = new Map(functions ? functions.map((fn) => [fn.name, fn]) : null) - } - - get size(): number { - return this._map.size - } - - add(fn: types.AIFunctionSpec): this { - this._map.set(fn.name, fn) - return this - } - - get(name: string): types.AIFunctionSpec | undefined { - return this._map.get(name) - } - - set(name: string, fn: types.AIFunctionSpec): this { - this._map.set(name, fn) - return this - } - - has(name: string): boolean { - return this._map.has(name) - } - - clear(): void { - this._map.clear() - } - - delete(name: string): boolean { - return this._map.delete(name) - } - - pick(...keys: string[]): FunctionSet { - const keysToIncludeSet = new Set(keys) - return new FunctionSet( - Array.from(this).filter((fn) => keysToIncludeSet.has(fn.name)) - ) - } - - omit(...keys: string[]): FunctionSet { - const keysToExcludeSet = new Set(keys) - return new FunctionSet( - Array.from(this).filter((fn) => !keysToExcludeSet.has(fn.name)) - ) - } - - get entries(): IterableIterator { - return this._map.values() - } - - [Symbol.iterator](): Iterator { - return this.entries - } - - static fromToolSet(toolSet: ToolSet): FunctionSet { - return new FunctionSet( - Array.from(toolSet) - .filter((tool) => tool.type === 'function') - .map((tool) => tool.function) - ) - } -} diff --git a/src/index.ts b/src/index.ts index 43c86488d..2cfdd4cc7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,11 @@ -export * from './function-set.js' +export * from './ai-function.js' +export * from './ai-function-set.js' +export * from './ai-tool-set.js' +export * from './errors.js' +export * from './fns.js' export * from './parse-structured-output.js' export * from './services/index.js' -export * from './tool-set.js' +export * from './stringify-for-model.js' export type * from './types.js' export * from './utils.js' +export * from './zod-to-json-schema.js' diff --git a/src/tool-set.ts b/src/tool-set.ts deleted file mode 100644 index b0250df6c..000000000 --- a/src/tool-set.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type * as types from './types.ts' -import { FunctionSet } from './function-set.js' - -export class ToolSet implements Iterable { - protected _map: Map - - constructor(tools?: readonly types.AIToolSpec[] | null) { - this._map = new Map( - tools ? tools.map((tool) => [tool.function.name, tool]) : null - ) - } - - get size(): number { - return this._map.size - } - - add(tool: types.AIToolSpec): this { - this._map.set(tool.function.name, tool) - return this - } - - get(name: string): types.AIToolSpec | undefined { - return this._map.get(name) - } - - set(name: string, tool: types.AIToolSpec): this { - this._map.set(name, tool) - return this - } - - has(name: string): boolean { - return this._map.has(name) - } - - clear(): void { - this._map.clear() - } - - delete(name: string): boolean { - return this._map.delete(name) - } - - pick(...keys: string[]): ToolSet { - const keysToIncludeSet = new Set(keys) - return new ToolSet( - Array.from(this).filter((tool) => - keysToIncludeSet.has(tool.function.name) - ) - ) - } - - omit(...keys: string[]): ToolSet { - const keysToExcludeSet = new Set(keys) - return new ToolSet( - Array.from(this).filter( - (tool) => !keysToExcludeSet.has(tool.function.name) - ) - ) - } - - get entries(): IterableIterator { - return this._map.values() - } - - [Symbol.iterator](): Iterator { - return this.entries - } - - static fromFunctionSet(functionSet: FunctionSet): ToolSet { - return new ToolSet( - Array.from(functionSet).map((fn) => ({ - type: 'function' as const, - function: fn - })) - ) - } - - static fromFunctionSpecs(functionSpecs: types.AIFunctionSpec[]): ToolSet { - return ToolSet.fromFunctionSet(new FunctionSet(functionSpecs)) - } - - static fromToolSpecs(toolSpecs: types.AIToolSpec[]): ToolSet { - return new ToolSet(toolSpecs) - } -} diff --git a/src/types.ts b/src/types.ts index bb1979c89..8ae4cb2ab 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,9 +1,16 @@ +import type { Jsonifiable } from 'type-fest' +import type { z } from 'zod' + export type { KyInstance } from 'ky' export type { ThrottledFunction } from 'p-throttle' // TODO export type DeepNullable = T | null +export type MaybePromise = T | Promise + +export type RelaxedJsonifiable = Jsonifiable | Record + export interface AIFunctionSpec { name: string description?: string @@ -16,16 +23,58 @@ export interface AIToolSpec { } /** - * Generic/default OpenAI message without any narrowing applied + * A function meant to be used with LLM function calling. + */ +export interface AIFunction< + InputSchema extends z.ZodObject = z.ZodObject, + Return = any +> { + /** The implementation of the function, with arg parsing and validation. */ + (input: string | Msg): MaybePromise + + /** The Zod schema for the arguments string. */ + inputSchema: InputSchema + + /** Parse the function arguments from a message. */ + parseInput(input: string | Msg): z.infer + + /** The function spec for the OpenAI API `functions` property. */ + spec: AIFunctionSpec +} + +/** + * A tool meant to be used with LLM function calling. + */ +export interface AITool< + InputSchema extends z.ZodObject = z.ZodObject, + Return = any +> { + function: AIFunction + + /** The tool spec for the OpenAI API `tools` property. */ + spec: AIToolSpec +} + +/** + * Generic/default OpenAI message without any narrowing applied. */ export interface Msg { - /** The contents of the message. `content` is required for all messages, and may be null for assistant messages with function calls. */ + /** + * The contents of the message. `content` is required for all messages, and + * may be null for assistant messages with function calls. + */ content: string | null - /** The role of the messages author. One of `system`, `user`, `assistant`, 'tool', or `function`. */ + /** + * The role of the messages author. One of `system`, `user`, `assistant`, + * 'tool', or `function`. + */ role: Msg.Role - /** The name and arguments of a function that should be called, as generated by the model. */ + /** + * The name and arguments of a function that should be called, as generated + * by the model. + */ function_call?: Msg.Call.Function /** The tool calls generated by the model, such as function calls. */ @@ -45,15 +94,21 @@ export interface Msg { name?: string } -/** Narrowed ChatModel.Message types. */ +/** Narrowed Message types. */ export namespace Msg { - /** The possible roles for a message. */ + /** Possible roles for a message. */ export type Role = 'system' | 'user' | 'assistant' | 'function' | 'tool' export namespace Call { - /** The name and arguments of a function that should be called, as generated by the model. */ + /** + * The name and arguments of a function that should be called, as generated + * by the model. + */ export type Function = { - /** The arguments to call the function with, as generated by the model in JSON format. */ + /** + * The arguments to call the function with, as generated by the model in + * JSON format. + */ arguments: string /** The name of the function to call. */ From 17f39126542315df40327e8a86bc689e46e48f34 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 01:31:45 -0500 Subject: [PATCH 08/81] =?UTF-8?q?=F0=9F=9A=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/index.ts | 3 + src/services/people-data-labs-client.ts | 525 ++++++++++++++++++++++++ src/services/perigon-client.ts | 304 ++++++++++++++ src/services/predict-leads-client.ts | 478 +++++++++++++++++++++ 4 files changed, 1310 insertions(+) create mode 100644 src/services/people-data-labs-client.ts create mode 100644 src/services/perigon-client.ts create mode 100644 src/services/predict-leads-client.ts diff --git a/src/services/index.ts b/src/services/index.ts index 1e7c9c49d..38eb66121 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,6 +2,9 @@ export * from './clearbit-client.js' export * from './dexa-client.js' export * from './diffbot-client.js' export * from './exa-client.js' +export * from './people-data-labs-client.js' +export * from './perigon-client.js' +export * from './predict-leads-client.js' export * from './proxycurl-client.js' export * from './scraper-client.js' export * from './serpapi-client.js' diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts new file mode 100644 index 000000000..7385c1a56 --- /dev/null +++ b/src/services/people-data-labs-client.ts @@ -0,0 +1,525 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import { assert, getEnv, throttleKy } from '../utils.js' + +const peopleDataLabsAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export namespace peopledatalabs { + export const BASE_URL = 'https://api.peopledatalabs.com/v5/' + + export const JobTitleLevels = [ + 'cxo', + 'director', + 'entry', + 'manager', + 'owner', + 'partner', + 'senior', + 'training', + 'unpaid', + 'vp' + ] + + export const JobTitleRoles = [ + 'customer_service', + 'design', + 'education', + 'engineering', + 'finance', + 'health', + 'human_resources', + 'legal', + 'marketing', + 'media', + 'operations', + 'public_relations', + 'real_estate', + 'sales', + 'trades' + ] + + // TODO configure this type to make pdl_id or name or profile or ticker or website required. + // Only one is required + export interface CompanyLookupOptions { + pdl_id?: string + name?: string + profile?: string + ticker?: string + website?: string + location?: string[] + locality?: string + region?: string + country?: string + street_address?: string + postal_code?: string + data_include?: string + pretty?: boolean + } + + export interface Naics { + naics_code: string + sector: string + sub_sector: string + industry_group: string + naics_industry: string | null + national_industry: string | null + } + + export interface Sic { + sic_code: string + major_group: string + industry_group: string + industry_sector: string | null + } + + export interface Location { + name: string + locality: string + region: string + metro: string + country: string + continent: string + street_address: string + address_line_2: string | null + postal_code: string + geo: string + } + + export interface EmployeeCountByCountry { + [country: string]: number + } + + export interface CompanyLookupResponse { + status: number + name: string + display_name: string + size: string + employee_count: number + id: string + founded: number + industry: string + naics: Naics[] + sic: Sic[] + location: Location + linkedin_id: string + linkedin_url: string + facebook_url: string + twitter_url: string + profiles: string[] + website: string + ticker: string + gics_sector: string | null + mic_exchange: string | null + type: string + summary: string + tags: string[] + headline: string + alternative_names: string[] + alternative_domains: string[] + affiliated_profiles: string[] + employee_count_by_country: EmployeeCountByCountry + likelihood: number + } + + export interface CompanySearchOptions { + limit?: number + query: { + website?: string + tags?: string + industry?: string + 'location.country'?: string + 'location.metro'?: string + summary?: string + size?: string[] + affiliated_profiles?: string + } + } + + export type CompanySearchOptionsQueryKeys = + keyof CompanySearchOptions['query'] + + export interface CompanySearchResponse { + status: number + data: { + name: string + display_name: string + size: string + employee_count: number + id: string + founded: number + industry: string + naics: Naics[] + sic: Sic[] + location: Location + linkedin_id: string + linkedin_url: string + facebook_url: string + twitter_url: string + profiles: string[] + website: string + ticker: string + gics_sector: string | null + mic_exchange: string | null + type: string + summary: string + tags: string[] + headline: string + alternative_names: string[] + alternative_domains: string[] + affiliated_profiles: string[] + employee_count_by_country: EmployeeCountByCountry + }[] + scroll_token: string + total: number + } + + export interface PersonSearchOptions { + limit?: number + query: { + first_name?: string + full_name?: string + last_name?: string + job_company_website?: string + job_title_role?: string + /** + * The docs says this property should be an array of strings. + * But when sending the array a 404 error is returned. + * See: https://docs.peopledatalabs.com/docs/fields#job_title_levels + */ + job_title_levels?: string + job_company_name?: string + job_company_location_country?: string + } + } + + export type PersonSearchOptionsQueryKeys = keyof PersonSearchOptions['query'] + + // Person response + export interface SearchPersonApiResponse { + id: string + full_name: string + first_name: string + middle_initial: null | string + middle_name: null | string + last_initial: string + last_name: string + gender: string + birth_year: null | number + birth_date: null | string + linkedin_url: string + linkedin_username: string + linkedin_id: string + facebook_url: null | string + facebook_username: null | string + facebook_id: null | string + twitter_url: string + twitter_username: string + github_url: null | string + github_username: null | string + work_email: string + personal_emails: string[] + recommended_personal_email: null | string + mobile_phone: null | string + industry: null | string + job_title: string + job_title_role: null | string + job_title_sub_role: null | string + job_title_levels: string[] + job_onet_code: string + job_onet_major_group: string + job_onet_minor_group: string + job_onet_broad_occupation: string + job_onet_specific_occupation: string + job_onet_specific_occupation_detail: string + job_company_id: string + job_company_name: string + job_company_website: string + job_company_size: string + job_company_founded: number + job_company_industry: string + job_company_linkedin_url: string + job_company_linkedin_id: string + job_company_facebook_url: string + job_company_twitter_url: string + job_company_type: string + job_company_ticker: null | string + job_company_location_name: string + job_company_location_locality: string + job_company_location_metro: string + job_company_location_region: string + job_company_location_geo: string + job_company_location_street_address: string + job_company_location_address_line_2: string + job_company_location_postal_code: string + job_company_location_country: string + job_company_location_continent: string + job_last_updated: string + job_start_date: string + job_summary: null | string + location_name: null | string + location_locality: null | string + location_metro: null | string + location_region: null | string + location_country: null | string + location_continent: null | string + location_street_address: null | string + location_address_line_2: null | string + location_postal_code: null | string + location_geo: null | string + location_last_updated: null | string + linkedin_connections: number + facebook_friends: null | string + inferred_salary: string + inferred_years_experience: number + summary: null | string + phone_numbers: string[] + phones: string[] + emails: Email[] + interests: string[] + skills: string[] + location_names: string[] + regions: string[] + countries: string[] + street_addresses: string[] + experience: Experience[] + education: Education[] + profiles: Profile[] + name_aliases: string[] + possible_emails: PossibleEmail[] + possible_profiles: PossibleProfile[] + possible_phones: PossiblePhone[] + possible_street_addresses: string[] + possible_location_names: string[] + possible_birth_dates: string[] + job_history: JobHistory[] + certifications: string[] + languages: string[] + first_seen: string + num_sources: number + num_records: number + version_status: VersionStatus + } + + export interface Email { + address: string + type: null | string + first_seen: string + last_seen: string + num_sources: number + } + + export interface Experience { + company: Company + start_date: null | string + end_date: null | string + title: Title + location_names: string[] + is_primary: boolean + summary: null | string + num_sources: number + first_seen: string + last_seen: string + } + + export interface Company { + name: string + size: string + id: string + founded: number + industry: string + location: Location + linkedin_url: string + linkedin_id: string + facebook_url: null | string + twitter_url: string + website: string + ticker: null | string + type: string + raw: string[] + fuzzy_match: boolean + } + + export interface Title { + name: string + raw: string[] + role: null | string + sub_role: null | string + levels: string[] + } + + export interface Education { + school: School + degrees: string[] + start_date: string + end_date: string + majors: string[] + minors: string[] + gpa: null | string + raw: string[] + summary: null | string + } + + export interface School { + name: string + type: string + id: string + location: Location + linkedin_url: string + facebook_url: string + twitter_url: string + linkedin_id: string + website: string + domain: string + raw: string[] + } + + export interface Profile { + network: string + id: null | string + url: string + username: string + num_sources: number + first_seen: string + last_seen: string + } + + export interface PossibleEmail { + address: string + type: null | string + first_seen: string + last_seen: string + num_sources: number + } + + export interface PossibleProfile { + network: string + id: null | string + url: string + username: null | string + num_sources: number + first_seen: string + last_seen: string + } + + export interface PossiblePhone { + number: string + first_seen: string + last_seen: string + num_sources: number + } + + export interface VersionStatus { + status: string + contains: string[] + previous_version: string + current_version: string + } + + export interface JobHistory { + company_id: string + company_name: string + title: string + first_seen: string + last_seen: string + num_sources: number + } +} + +export class PeopleDataLabsClient { + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('PEOPLE_DATA_LABS_API_KEY'), + apiBaseUrl = peopledatalabs.BASE_URL, + timeoutMs = 30_000, + throttle = true, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + timeoutMs?: number + throttle?: boolean + ky?: KyInstance + } = {}) { + assert(apiKey, 'PeopleDataLabsClient missing required "apiKey"') + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + const throttledKy = throttle + ? throttleKy(ky, peopleDataLabsAPIThrottle) + : ky + + this.ky = throttledKy.extend({ + prefixUrl: apiBaseUrl, + timeout: timeoutMs, + headers: { + 'X-Api-Key': `${this.apiKey}` + } + }) + } + + async companyLookup(options: peopledatalabs.CompanySearchOptions) { + const terms = options.query + const termsQuery = [] + + for (const term of Object.keys( + terms + ) as peopledatalabs.CompanySearchOptionsQueryKeys[]) { + termsQuery.push({ term: { [term]: terms[term] } }) + } + + return this.ky + .get('company/search', { + searchParams: { + size: options.limit || 1, + query: JSON.stringify({ + bool: { + must: termsQuery + } + }) + } + }) + .json() + } + + async companyProfile(options: peopledatalabs.CompanyLookupOptions) { + return this.ky + .get('company/enrich', { + // @ts-expect-error location is a string[] and searchparams shows a TS error heres + searchParams: { ...options } + }) + .json() + } + + async personSearch(options: peopledatalabs.PersonSearchOptions) { + const terms = options.query + const termsQuery = [] + + for (const term of Object.keys( + terms + ) as peopledatalabs.PersonSearchOptionsQueryKeys[]) { + termsQuery.push({ term: { [term]: terms[term] } }) + } + + return this.ky + .get('person/search', { + searchParams: { + size: options.limit || 10, + query: JSON.stringify({ + bool: { + must: termsQuery + } + }) + } + }) + .json() + } +} diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts new file mode 100644 index 000000000..2886504fe --- /dev/null +++ b/src/services/perigon-client.ts @@ -0,0 +1,304 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import { assert, getEnv, throttleKy } from '../utils.js' + +const perigonAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export namespace perigon { + export type ArticleLabel = + | 'Opinion' + | 'Non-news' + | 'Paid News' + | 'Fact Check' + | 'Pop Culture' + | 'Roundup' + | 'Press Release' + + export type Categories = + | 'Politics' + | 'Tech' + | 'Sports' + | 'Business' + | 'Finance' + | 'Entertainment' + | 'Health' + | 'Weather' + | 'Lifestyle' + | 'Auto' + | 'Science' + | 'Travel' + | 'Environment' + | 'World' + | 'General' + | 'none' + + export type ArticlesOptions = { + q: string + title?: string + desc?: string + content?: string + url?: string + from?: string | Date + to?: string | Date + addDateFrom?: string | Date + addDateTo?: string | Date + refreshDateFrom?: string | Date + refreshDateTo?: string | Date + articleId?: string + clusterId?: string + medium?: 'article' | 'video' + source?: string + sourceGroup?: + | 'top10' + | 'top100' + | 'top500English' + | 'top25crypto' + | 'top25finance' + | 'top50tech' + | 'top100sports' + | 'top100leftUS' + | 'top100rightUS' + | 'top100centerUS' + excludeSource?: string + paywall?: boolean + country?: string + language?: string + label?: ArticleLabel + excludeLabel?: ArticleLabel | 'Low Content' + byline?: string + topic?: string + category?: Categories + journalistId?: string + state?: string + city?: string + area?: string + location?: string + sortBy?: 'date' | 'relevance' | 'addDate' | 'pubDate' | 'refreshDate' + relevance?: number + size?: number + showReprints?: boolean + showNumResults?: boolean + type?: 'all' | 'local' | 'world' + linkTo?: string + reprintGroupId?: string + personWikidataId?: string[] + personName?: string[] + companyId?: string[] + companyName?: string + companyDomain?: string[] + companySymbol?: string[] + maxDistance?: number + lat?: number + lon?: number + searchTranslation?: boolean + } + + export type ArticlesResponse = { + status: number + numResults: number + articles: { + url: string + authorsByline: string + articleId: string + clusterId: string + source: { + domain: string + } + imageUrl: string + country: string + language: string + pubDate: string + addDate: string + refreshDate: string + score: number + title: string + description: string + content: string + medium: string + links: string[] + labels: string[] + matchedAuthors: string[] + claim: string + verdict: string + keywords: { + name: string + weight: number + }[] + topics: { + name: string + }[] + categories: { + name: string + }[] + entities: { + data: string + type: string + mentions: number + }[] + sentiment: { + positive: number + negative: number + neutral: number + } + summary: string + translation: string + locations: string[] + reprint: boolean + reprintGroupId: string + places: null + }[] + } + + export type StoriesOptions = { + clusterId?: string + topic?: string + category?: Categories + name?: string + nameExists?: boolean + from?: string + to?: string + initializedFrom?: string + initializedTo?: string + updatedFrom?: string + updatedTo?: string + minClusterSize?: number + maxClusterSize?: number + state?: string + city?: string + area?: string + page?: number + size?: number + sortBy?: 'count' | 'createdAt' | 'updatedAt' + showNumResults?: boolean + } + + export type StoriesResponse = { + status: number + numResults: number + results: Array<{ + createdAt: string + updatedAt: string + initializedAt: string + id: string + name: string + summary: string + summaryReferences: Array + keyPoints: Array<{ + point: string + references: Array + }> + sentiment: { + positive: number + negative: number + neutral: number + } + uniqueCount: number + reprintCount: number + totalCount: number + countries: Array<{ + name: string + count: number + }> + topCountries: Array + topics: Array<{ + name: string + count: number + }> + topTopics: Array<{ name: string }> + categories: Array<{ + name: string + count: number + }> + topCategories: Array<{ name: string }> + people: Array<{ wikidataId: string; name: string; count: number }> + topPeople: Array<{ wikidataId: string; name: string }> + companies: Array<{ + id: string + name: string + domains: Array + symbols: Array + count: number + }> + topCompanies: Array<{ + id: string + name: string + domains: Array + symbols: Array + }> + locations: Array<{ + state: string + city?: string + area?: string + county?: string + count: number + }> + topLocations: Array<{ + state: string + city?: string + area?: string + county?: string + }> + }> + } +} + +export class PerigonClient { + readonly ky: KyInstance + readonly apiKey: string + readonly _maxPageSize = 10 + + constructor({ + apiKey = getEnv('PERIGON_API_KEY'), + timeoutMs = 30_000, + throttle = true, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + throttle?: boolean + timeoutMs?: number + ky?: KyInstance + } = {}) { + assert(apiKey, 'Error perigon client missing required "apiKey"') + + this.apiKey = apiKey + + const throttledKy = throttle ? throttleKy(ky, perigonAPIThrottle) : ky + + this.ky = throttledKy.extend({ + prefixUrl: 'https://api.goperigon.com/v1/', + timeout: timeoutMs + }) + } + + async articles(options: perigon.ArticlesOptions) { + return this.ky + .get('all', { + // @ts-expect-error there are multiple query params that array of strings + // and KY SearchParamsOption shows a TS error for those types + searchParams: { + apiKey: this.apiKey, + ...options, + size: Math.min(this._maxPageSize, options.size || this._maxPageSize) + } + }) + .json() + } + + async stories(options: perigon.StoriesOptions) { + return this.ky + .get('stories/all', { + searchParams: { + apiKey: this.apiKey, + ...options, + size: Math.min(this._maxPageSize, options.size || this._maxPageSize) + } + }) + .json() + } +} diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts new file mode 100644 index 000000000..b69599c27 --- /dev/null +++ b/src/services/predict-leads-client.ts @@ -0,0 +1,478 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import type { DeepNullable } from '../types.js' +import { assert, getEnv, throttleKy } from '../utils.js' + +const predictionLeadsAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export namespace predictleads { + export type Meta = DeepNullable<{ + count: number + message?: string | null + message_type?: string + }> + + export type GenericSuccessResponse = { + success: { + type: string + message: string + } + } + + export type FollowedCompaniesResponse = { + data: DeepNullable< + Array<{ + domain: string + custom_company_identifier: string | null + }> + > + meta: Meta + } + + export type Relationship = Record< + string, + { + data: { + id: string + type: string + } + } + > + + export type AdditionalData = { + relationships: { + companies: [string, string] + } + date: string + location: string + location_data: { + region?: string + continent?: string + country?: string + state?: string + zip_code?: string + city?: string + fuzzy_match?: boolean + } + contact?: string + job_title?: string + product?: string + product_tags?: string[] + amount?: number + recognition?: string + assets?: string + asset_tags?: string[] + headcount?: number + award?: string + financing_type?: string + financing_type_tags?: string[] + funding_round?: string + division?: string + conference?: string + vulnerability?: string + planning?: boolean + article_title?: string + article_sentence?: string + article_body?: string + article_source?: string + article_published_at?: string + article_image_url?: string + } + + export type Event = { + id: string + type: string + attributes: { + categories: string[] + title: string + url: string + found_at: string + additional_data: AdditionalData + domain: string + location: string + location_data: { + state: string + country: string + } + company_name: string + friendly_company_name: string + ticker: null + meta_title: string + meta_description: string + published_at: string + post_type: string + post_url: string + company_domain: string + fuzzy_match: boolean + } + relationships: Relationship + } + + export type Response = DeepNullable<{ + data: Event[] + included: Relationship + meta: Meta + }> + + export type JobOpeningData = { + id: string + type: string + attributes: { + title: string + url: string + description: string + salary: string + salary_data: { + salary_low: number + salary_high: number + salary_currency: string + salary_low_usd: number + salary_high_usd: number + salary_time_unit: string + } + job_opening_closed: boolean + location: string + contract_types: string[] + first_seen_at: string + last_seen_at: string + last_processed_at: string + categories: string[] + onet_code: string + additional_data: { + job_title_seniority: string + tags: string[] + location_data: { + country: string + city: string + fuzzy_match: boolean + } + } + } + relationships: { + company: { + data: { + id: string + type: string + } + } + } + } + + export type CompanyData = { + id: string + type: string + attributes: { + domain: string + company_name: string + ticker: string | null + } + } + + export type JobOpeningResponse = DeepNullable<{ + data: JobOpeningData[] + included: CompanyData[] + meta: { + count: number + } + }> + + export type JobOpeningByIdResponse = Omit +} + +export class PredictLeadsClient { + readonly ky: KyInstance + readonly apiKey: string + readonly apiToken: string + readonly _maxPageSize = 100 + + constructor({ + apiKey = getEnv('PREDICT_LEADS_API_KEY'), + apiToken = getEnv('PREDICT_LEADS_API_TOKEN'), + timeoutMs = 30_000, + throttle = true, + ky = defaultKy + }: { + apiKey?: string + apiToken?: string + apiBaseUrl?: string + timeoutMs?: number + throttle?: boolean + ky?: KyInstance + } = {}) { + assert(apiKey, 'PredictLeadsClient missing required "apiKey"') + assert(apiToken, 'PredictLeadsClient missing required "apiToken"') + + this.apiKey = apiKey + this.apiToken = apiToken + + const throttledKy = throttle + ? throttleKy(ky, predictionLeadsAPIThrottle) + : ky + + this.ky = throttledKy.extend({ + timeout: timeoutMs, + headers: { + 'X-Api-Key': apiKey, + 'X-Api-Token': apiToken + } + }) + } + + async followCompany(domain: string, customCompanyIdentifier?: string) { + return this.ky + .post( + `https://predictleads.com/api/v2/companies/${domain}/follow`, + customCompanyIdentifier + ? { + json: { customCompanyIdentifier } + } + : undefined + ) + .json() + } + + async getFollowingCompanies(limit: number = this._maxPageSize) { + return this.ky + .get(`https://predictleads.com/api/v2/followings`, { + searchParams: { limit } + }) + .json() + } + + async unfollowCompany(domain: string, customCompanyIdentifier?: string) { + return this.ky + .post( + `https://predictleads.com/api/v2/companies/${domain}/unfollow`, + customCompanyIdentifier + ? { + json: { customCompanyIdentifier } + } + : undefined + ) + .json() + } + + async events( + domain: string, + params: { + categories?: string + found_at_from?: string + found_at_until?: string + page?: number + limit?: string + with_news_article_bodies?: boolean + } = {} + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/events`, { + searchParams: { page: 1, ...params } + }) + .json() + } + + async eventById(id: string) { + return this.ky + .get(`https://predictleads.com/api/v2/events/${id}`) + .json() + } + + async financingEvents(domain: string) { + return this.ky + .get( + `https://predictleads.com/api/v2/companies/${domain}/financing_events` + ) + .json() + } + + async jobOpenings( + domain: string, + params: { + categories?: string + with_job_descriptions?: boolean + active_only?: boolean + not_closed?: boolean + limit?: string + } = {} + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/job_openings`, { + searchParams: params + }) + .json() + } + + async jobOpeningById(id: string) { + return this.ky + .get(`https://predictleads.com/api/v2/job_openings/${id}`) + .json() + } + + async technologies( + domain: string, + params: { + categories: string + limit?: string + } + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/technologies`, { + searchParams: params + }) + .json() + } + + async connections( + domain: string, + params?: { + categories: string + limit?: string + } + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/connections`, { + searchParams: params + }) + .json() + } + + async websiteEvolution( + domain: string, + { limit = 100 }: { limit?: number } = {} + ) { + return this.ky + .get( + `https://predictleads.com/api/v2/companies/${domain}/website_evolution`, + { + searchParams: { limit } + } + ) + .json() + } + + async githubRepositories( + domain: string, + { limit = 100 }: { limit?: number } = {} + ) { + return this.ky + .get( + `https://predictleads.com/api/v2/companies/${domain}/github_repositories`, + { + searchParams: { limit } + } + ) + .json() + } + + async products( + domain: string, + params?: { + sources: string + limit?: number + } + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/products`, { + searchParams: params + }) + .json() + } + + async company(domain: string) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}`) + .json() + } + + async discoverStartupJobs(params?: { + post_datetime_from?: string + post_datetime_until?: string + min_score?: string + limit?: string + }) { + return this.ky + .get( + `https://predictleads.com/api/v2/discover/startup_platform/jobs_hn`, + { + searchParams: params + } + ) + .json() + } + + async discoverStartupShow(params?: { + post_datetime_from?: string + post_datetime_until?: string + min_score?: string + limit?: string + }) { + return this.ky + .get( + `https://predictleads.com/api/v2/discover/startup_platform/show_hn`, + { + searchParams: params + } + ) + .json() + } + + /* + TODO this returns 500 error, even using the curl example from docs. + Also for this reason I couldn't test the other segments endpoints + curl -X POST "https://predictleads.com/api/v2/segments" + -d '{"technologies":"Salesforce", "job_categories":"sales"}' + -H "Content-Type: application/json" \ + -H 'X-Api-Key: ' \ + -H 'X-Api-Token: ' + */ + async createSegment(params: { + webhook_url?: string + locations?: string + headquarters_locations?: string + job_categories?: string + technologies?: string + found_at_from?: string + found_at_until?: string + active?: string + limit?: string + }) { + return this.ky + .post(`https://predictleads.com/api/v2/segments`, { + json: params + }) + .json() + } + + async updateSegment(params: { + id: string + webhook_url: string + active: string + }) { + return this.ky + .put( + `https://predictleads.com/api/v2/discover/startup_platform/show_hn`, + { + json: params + } + ) + .json() + } + + async showSegment(id: string) { + return this.ky + .get(`https://predictleads.com/api/v2/segments/${id}`) + .json() + } + + async showAllSegment(limit = 100) { + return this.ky + .get(`https://predictleads.com/api/v2/segments`, { + searchParams: { limit } + }) + .json() + } +} From 4cd1f38dcba1a2518686751225eccca551b34629 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 01:43:10 -0500 Subject: [PATCH 09/81] =?UTF-8?q?=F0=9F=98=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/clearbit-client.ts | 16 +++++++------- src/services/dexa-client.ts | 1 + src/services/diffbot-client.ts | 14 ++++++------ src/services/exa-client.ts | 1 + src/services/people-data-labs-client.ts | 16 ++++++-------- src/services/perigon-client.ts | 14 ++++++------ src/services/predict-leads-client.ts | 16 ++++++-------- src/services/serpapi-client.ts | 29 ++++++++++--------------- src/services/serper-client.ts | 14 ++++++------ src/services/weather-client.ts | 5 ++++- 10 files changed, 61 insertions(+), 65 deletions(-) diff --git a/src/services/clearbit-client.ts b/src/services/clearbit-client.ts index f948f33e8..b213559bf 100644 --- a/src/services/clearbit-client.ts +++ b/src/services/clearbit-client.ts @@ -4,14 +4,14 @@ import pThrottle from 'p-throttle' import type { DeepNullable, KyInstance } from '../types.js' import { assert, delay, getEnv, throttleKy } from '../utils.js' -// Only allow 20 clearbit API requests per 60s -const clearbitAPIThrottle = pThrottle({ - limit: 20, - interval: 60 * 1000, - strict: true -}) - export namespace clearbit { + // Only allow 20 clearbit API requests per 60s + export const throttle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true + }) + export interface CompanyEnrichmentOptions { domain: string webhook_url?: string @@ -528,7 +528,7 @@ export class ClearbitClient { this.apiKey = apiKey - const throttledKy = throttle ? throttleKy(ky, clearbitAPIThrottle) : ky + const throttledKy = throttle ? throttleKy(ky, clearbit.throttle) : ky this.ky = throttledKy.extend({ timeout: timeoutMs, diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index 1a10ad789..6acf3caee 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -23,6 +23,7 @@ export class DexaClient { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, timeout: timeoutMs }) } diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 88423a432..8e4b70ee7 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -4,16 +4,16 @@ import pThrottle from 'p-throttle' import { assert, getEnv, throttleKy } from '../utils.js' -const diffbotAPIThrottle = pThrottle({ - limit: 5, - interval: 1000, - strict: true -}) - export namespace diffbot { export const API_BASE_URL = 'https://api.diffbot.com' export const KNOWLEDGE_GRAPH_API_BASE_URL = 'https://kg.diffbot.com' + export const throttle = pThrottle({ + limit: 5, + interval: 1000, + strict: true + }) + export interface DiffbotExtractOptions { /** Specify optional fields to be returned from any fully-extracted pages, e.g.: &fields=querystring,links. See available fields within each API's individual documentation pages. * @see https://docs.diffbot.com/reference/extract-optional-fields @@ -357,7 +357,7 @@ export class DiffbotClient { this.apiBaseUrl = apiBaseUrl this.apiKnowledgeGraphBaseUrl = apiKnowledgeGraphBaseUrl - const throttledKy = throttle ? throttleKy(ky, diffbotAPIThrottle) : ky + const throttledKy = throttle ? throttleKy(ky, diffbot.throttle) : ky this.ky = throttledKy.extend({ prefixUrl: apiBaseUrl, diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index 9aedc08d8..d4bf6274a 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -147,6 +147,7 @@ export class ExaClient { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, headers: { diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts index 7385c1a56..e0846ea16 100644 --- a/src/services/people-data-labs-client.ts +++ b/src/services/people-data-labs-client.ts @@ -3,15 +3,15 @@ import pThrottle from 'p-throttle' import { assert, getEnv, throttleKy } from '../utils.js' -const peopleDataLabsAPIThrottle = pThrottle({ - limit: 20, - interval: 60 * 1000, - strict: true -}) - export namespace peopledatalabs { export const BASE_URL = 'https://api.peopledatalabs.com/v5/' + export const throttle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true + }) + export const JobTitleLevels = [ 'cxo', 'director', @@ -453,9 +453,7 @@ export class PeopleDataLabsClient { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl - const throttledKy = throttle - ? throttleKy(ky, peopleDataLabsAPIThrottle) - : ky + const throttledKy = throttle ? throttleKy(ky, peopledatalabs.throttle) : ky this.ky = throttledKy.extend({ prefixUrl: apiBaseUrl, diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index 2886504fe..a3be8e08e 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -3,13 +3,13 @@ import pThrottle from 'p-throttle' import { assert, getEnv, throttleKy } from '../utils.js' -const perigonAPIThrottle = pThrottle({ - limit: 20, - interval: 60 * 1000, - strict: true -}) - export namespace perigon { + export const throttle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true + }) + export type ArticleLabel = | 'Opinion' | 'Non-news' @@ -268,7 +268,7 @@ export class PerigonClient { this.apiKey = apiKey - const throttledKy = throttle ? throttleKy(ky, perigonAPIThrottle) : ky + const throttledKy = throttle ? throttleKy(ky, perigon.throttle) : ky this.ky = throttledKy.extend({ prefixUrl: 'https://api.goperigon.com/v1/', diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts index b69599c27..5cca84aa8 100644 --- a/src/services/predict-leads-client.ts +++ b/src/services/predict-leads-client.ts @@ -4,13 +4,13 @@ import pThrottle from 'p-throttle' import type { DeepNullable } from '../types.js' import { assert, getEnv, throttleKy } from '../utils.js' -const predictionLeadsAPIThrottle = pThrottle({ - limit: 20, - interval: 60 * 1000, - strict: true -}) - export namespace predictleads { + export const throttle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true + }) + export type Meta = DeepNullable<{ count: number message?: string | null @@ -210,9 +210,7 @@ export class PredictLeadsClient { this.apiKey = apiKey this.apiToken = apiToken - const throttledKy = throttle - ? throttleKy(ky, predictionLeadsAPIThrottle) - : ky + const throttledKy = throttle ? throttleKy(ky, predictleads.throttle) : ky this.ky = throttledKy.extend({ timeout: timeoutMs, diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index 38a69b4e2..af5f13091 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -2,7 +2,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' import { aiFunction, AIToolsProvider } from '../fns.js' -import { getEnv } from '../utils.js' +import { assert, getEnv } from '../utils.js' /** * All types have been exported from the `serpapi` package, which we're @@ -625,13 +625,7 @@ export namespace serpapi { device?: 'desktop' | 'tablet' | 'mobile' } - export type Params = Omit - - export interface ClientOptions extends Partial { - apiKey?: string - apiBaseUrl?: string - ky?: KyInstance - } + export type ClientParams = Partial> } /** @@ -640,28 +634,29 @@ export namespace serpapi { * @see https://serpapi.com/search-api */ export class SerpAPIClient extends AIToolsProvider { - protected api: KyInstance + protected ky: KyInstance protected apiKey: string protected apiBaseUrl: string - protected params: Partial + protected params: serpapi.ClientParams constructor({ apiKey = getEnv('SERPAPI_API_KEY') ?? getEnv('SERP_API_KEY'), apiBaseUrl = serpapi.BASE_URL, ky = defaultKy, ...params - }: serpapi.ClientOptions = {}) { - if (!apiKey) { - throw new Error(`Error SerpAPIClient missing required "apiKey"`) - } - + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } & serpapi.ClientParams = {}) { + assert(apiKey, `Error SerpAPIClient missing required "apiKey"`) super() this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl this.params = params - this.api = ky.extend({ + this.ky = ky.extend({ prefixUrl: this.apiBaseUrl }) } @@ -684,7 +679,7 @@ export class SerpAPIClient extends AIToolsProvider { const { timeout, ...rest } = this.params // console.log('SerpAPIClient.search', options) - return this.api + return this.ky .get('search', { searchParams: { ...rest, diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 485b90e24..064f56de9 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -186,11 +186,7 @@ export namespace serper { position: number } - export interface ClientOptions extends Omit, 'q'> { - apiKey?: string - apiBaseUrl?: string - ky?: KyInstance - } + export type ClientParams = Partial> } /** @@ -202,14 +198,18 @@ export class SerperClient extends AIToolsProvider { readonly ky: KyInstance readonly apiKey: string readonly apiBaseUrl: string - readonly params: Omit, 'q'> + readonly params: serper.ClientParams constructor({ apiKey = getEnv('SERPER_API_KEY'), apiBaseUrl = serper.BASE_URL, ky = defaultKy, ...params - }: serper.ClientOptions = {}) { + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } & serper.ClientParams = {}) { assert( apiKey, `SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)` diff --git a/src/services/weather-client.ts b/src/services/weather-client.ts index 745b66499..91dea80e7 100644 --- a/src/services/weather-client.ts +++ b/src/services/weather-client.ts @@ -88,7 +88,10 @@ export class WeatherClient extends AIToolsProvider { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert(apiKey, 'WEATHER_API_KEY is required') + assert( + apiKey, + 'WeatherClient missing required "apiKey" (defaults to "WEATHER_API_KEY")' + ) super() this.apiKey = apiKey From b57e7985319b840de9a7d140d653abda5a49e14d Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 01:45:48 -0500 Subject: [PATCH 10/81] =?UTF-8?q?=F0=9F=92=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/readme.md b/readme.md index be503c415..12d7f8bce 100644 --- a/readme.md +++ b/readme.md @@ -19,14 +19,18 @@ ## Services -- Clearbit -- Dexa -- Diffbot -- Proxycurl -- SerpAPI -- Serper -- Twitter -- WeatherAPI +- clearbit +- dexa +- diffbot +- exa +- people data labs +- perigon +- predict leads +- proxycurl +- serpapi +- serper +- twitter +- weatherapi ## TODO @@ -38,9 +42,12 @@ - agentic - walter - services - - Exa - - Firecrawl - - Unstructured + - exa - need to update to correct format + - searxng + - wikipedia + - midjourney + - firecrawl + - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) From 2ea18abab2d3f907048d353ace1c6f8414380c4f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 15:41:18 -0500 Subject: [PATCH 11/81] =?UTF-8?q?=F0=9F=91=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 3 +- src/services/index.ts | 1 + src/services/searxng-client.ts | 77 ++++++++++++++++++++++++++++++++++ src/utils.ts | 6 +-- tsconfig.json | 1 + 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/services/searxng-client.ts diff --git a/readme.md b/readme.md index 12d7f8bce..94b45d08a 100644 --- a/readme.md +++ b/readme.md @@ -27,6 +27,7 @@ - perigon - predict leads - proxycurl +- searxng - serpapi - serper - twitter @@ -43,7 +44,7 @@ - walter - services - exa - need to update to correct format - - searxng + - wolfram alpha - wikipedia - midjourney - firecrawl diff --git a/src/services/index.ts b/src/services/index.ts index 38eb66121..32b1c9fbd 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -7,6 +7,7 @@ export * from './perigon-client.js' export * from './predict-leads-client.js' export * from './proxycurl-client.js' export * from './scraper-client.js' +export * from './searxng-client.js' export * from './serpapi-client.js' export * from './serper-client.js' export * from './twitter-client.js' diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts new file mode 100644 index 000000000..315fff67f --- /dev/null +++ b/src/services/searxng-client.ts @@ -0,0 +1,77 @@ +import defaultKy, { type KyInstance } from 'ky' + +import { assert, getEnv, omit, pick, pruneUndefined } from '../utils.js' + +export namespace searxng { + export interface SearchOptions { + query: string + categories?: string[] + engines?: string[] + language?: string + pageno?: number + } + + export interface SearchResult { + title: string + url: string + img_src?: string + thumbnail_src?: string + thumbnail?: string + content?: string + author?: string + iframe_src?: string + } + + export interface SearchResponse { + results: SearchResult[] + suggestions: string[] + } +} + +/** + * @see https://docs.searxng.org + */ +export class SearxngClient { + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('SEARXNG_API_KEY'), + apiBaseUrl = getEnv('SEARXNG_API_BASE_URL'), + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'SearxngClient missing required "apiKey" (defaults to "SEARXNG_API_KEY")' + ) + assert( + apiBaseUrl, + 'SearxngClient missing required "apiBaseUrl" (defaults to "SEARXNG_API_BASE_URL")' + ) + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ prefixUrl: apiBaseUrl }) + } + + async search(opts: searxng.SearchOptions): Promise { + const res = await this.ky + .get('search', { + searchParams: pruneUndefined({ + ...omit(opts, 'categories', 'engines'), + categories: opts.categories?.join(','), + engines: opts.categories?.join(','), + format: 'json' + }) + }) + .json() + + return pick(res, 'results', 'suggestions') + } +} diff --git a/src/utils.ts b/src/utils.ts index b0575d9e0..b080d1d97 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -12,7 +12,7 @@ export { default as assert } from 'tiny-invariant' * ``` */ export const omit = < - T extends Record, + T extends Record | object, K extends keyof T = keyof T >( inputObj: T, @@ -33,7 +33,7 @@ export const omit = < * ``` */ export const pick = < - T extends Record, + T extends Record | object, K extends keyof T = keyof T >( inputObj: T, @@ -47,7 +47,7 @@ export const pick = < export function pruneUndefined>( obj: T -): NonNullable { +): NonNullable<{ [K in keyof T]: Exclude }> { return Object.fromEntries( Object.entries(obj).filter(([, value]) => value !== undefined) ) as NonNullable diff --git a/tsconfig.json b/tsconfig.json index 4066d2765..07b69730c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,7 @@ // "emitDecoratorMetadata": true, "strict": true, + "strictNullChecks": true, "noUncheckedIndexedAccess": true, "forceConsistentCasingInFileNames": true, From ca31b560a8c1577d911b7d90b7a515ae405b48e8 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 17:07:47 -0500 Subject: [PATCH 12/81] =?UTF-8?q?=F0=9F=91=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 3 +- src/services/exa-client.ts | 50 ++++---- src/services/firecrawl-client.ts | 205 +++++++++++++++++++++++++++++++ src/services/index.ts | 1 + 4 files changed, 232 insertions(+), 27 deletions(-) create mode 100644 src/services/firecrawl-client.ts diff --git a/readme.md b/readme.md index 94b45d08a..89345bcc9 100644 --- a/readme.md +++ b/readme.md @@ -23,6 +23,7 @@ - dexa - diffbot - exa +- firecrawl - people data labs - perigon - predict leads @@ -43,11 +44,9 @@ - agentic - walter - services - - exa - need to update to correct format - wolfram alpha - wikipedia - midjourney - - firecrawl - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) - pull from other libs diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index d4bf6274a..8bda881a9 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -156,24 +156,23 @@ export class ExaClient { }) } - async search(query: string, options?: exa.RegularSearchOptions) { - return this.ky - .post('search', { json: { ...options, query } }) - .json() + /** + * Performs an Exa search for the given query. + */ + async search(opts: { query: string } & exa.RegularSearchOptions) { + return this.ky.post('search', { json: opts }).json() } /** * Performs a search with a Exa prompt-engineered query and returns the * contents of the documents. - * - * @param {string} query - The query string. */ - async searchAndContents( - query: string, - options?: exa.RegularSearchOptions & T - ) { - const { text, highlights, ...rest } = options || {} - + async searchAndContents({ + query, + text, + highlights, + ...rest + }: { query: string } & exa.RegularSearchOptions & T) { return this.ky .post('search', { json: { @@ -193,12 +192,10 @@ export class ExaClient { /** * Finds similar links to the provided URL. - * - * @param {string} url - The URL for which to find similar links. */ - async findSimilar(url: string, options?: exa.FindSimilarOptions) { + async findSimilar(opts: { url: string } & exa.FindSimilarOptions) { return this.ky - .post('findSimilar', { json: { url, ...options } }) + .post('findSimilar', { json: opts }) .json() } @@ -210,9 +207,12 @@ export class ExaClient { */ async findSimilarAndContents< T extends exa.ContentsOptions = exa.ContentsOptions - >(url: string, options?: exa.FindSimilarOptions & T) { - const { text, highlights, ...rest } = options || {} - + >({ + url, + text, + highlights, + ...rest + }: { url: string } & exa.FindSimilarOptions & T) { return this.ky .post('findSimilar', { json: { @@ -235,10 +235,10 @@ export class ExaClient { * * @param {string | string[] | SearchResult[]} ids - An array of document IDs. */ - async getContents( - ids: string | string[] | exa.SearchResult[], - options?: T - ) { + async getContents({ + ids, + ...opts + }: { ids: string | string[] | exa.SearchResult[] } & T) { let requestIds: string[] if (typeof ids === 'string') { @@ -256,8 +256,8 @@ export class ExaClient { return this.ky .post('contents', { json: { - ids: requestIds, - ...options + ...opts, + ids: requestIds } }) .json>() diff --git a/src/services/firecrawl-client.ts b/src/services/firecrawl-client.ts new file mode 100644 index 000000000..970b97935 --- /dev/null +++ b/src/services/firecrawl-client.ts @@ -0,0 +1,205 @@ +import defaultKy, { type KyInstance } from 'ky' +import z from 'zod' + +import { assert, delay, getEnv } from '../utils.js' +import { zodToJsonSchema } from '../zod-to-json-schema.js' + +export namespace firecrawl { + /** + * Generic parameter interface. + */ + export interface Params { + [key: string]: any + extractorOptions?: { + extractionSchema: z.ZodSchema | any + mode?: 'llm-extraction' + extractionPrompt?: string + } + } + + /** + * Response interface for scraping operations. + */ + export interface ScrapeResponse { + success: boolean + data?: any + error?: string + } + + /** + * Response interface for searching operations. + */ + export interface SearchResponse { + success: boolean + data?: any + error?: string + } + + /** + * Response interface for crawling operations. + */ + export interface CrawlResponse { + success: boolean + jobId?: string + data?: any + error?: string + } + + /** + * Response interface for job status checks. + */ + export interface JobStatusResponse { + success: boolean + status: string + jobId?: string + data?: any + error?: string + } +} + +/** + * @see https://www.firecrawl.dev + */ +export class FirecrawlClient { + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('FIRECRAWL_API_KEY'), + apiBaseUrl = getEnv('FIRECRAWL_API_BASE_URL') ?? + 'https://api.firecrawl.dev', + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'FirecrawlClient missing required "apiKey" (defaults to "FIRECRAWL_API_KEY")' + ) + assert( + apiBaseUrl, + 'FirecrawlClient missing required "apiBaseUrl" (defaults to "FIRECRAWL_API_BASE_URL")' + ) + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + headers: { + Authorization: `Bearer ${this.apiKey}` + } + }) + } + + async scrapeUrl( + opts: { + url: string + } & firecrawl.Params + ) { + const json = { + ...opts + } + + if (opts?.extractorOptions?.extractionSchema) { + let schema = opts.extractorOptions.extractionSchema + if (schema instanceof z.ZodSchema) { + schema = zodToJsonSchema(schema) + } + + json.extractorOptions = { + mode: 'llm-extraction', + ...opts.extractorOptions, + extractionSchema: schema + } + } + + return this.ky + .post('v0/scrapeUrl', { json }) + .json() + } + + async search( + opts: { + query: string + } & firecrawl.Params + ) { + return this.ky + .post('v0/search', { json: opts }) + .json() + } + + async crawlUrl({ + waitUntilDone = true, + timeoutMs = 30_000, + idempotencyKey, + ...params + }: { + url: string + waitUntilDone?: boolean + timeoutMs?: number + idempotencyKey?: string + } & firecrawl.Params) { + const res = await this.ky + .post('v0/crawl', { + json: params, + timeout: timeoutMs, + headers: idempotencyKey + ? { + 'x-idempotency-key': idempotencyKey + } + : undefined + }) + .json() + + assert(res.jobId) + if (waitUntilDone) { + return this.waitForCrawlJob({ jobId: res.jobId, timeoutMs }) + } + + return res + } + + async checkCrawlStatus(jobId: string) { + assert(jobId) + + return this.ky + .get(`v0/crawl/status/${jobId}`) + .json() + } + + async waitForCrawlJob({ + jobId, + timeoutMs = 30_000 + }: { + jobId: string + timeoutMs?: number + }) { + assert(jobId) + + const start = Date.now() + do { + const res = await this.checkCrawlStatus(jobId) + if (res.status === 'completed') { + return res + } + + if (!['active', 'paused', 'pending', 'queued'].includes(res.status)) { + throw new Error( + `Crawl job "${jobId}" failed or was stopped. Status: ${res.status}` + ) + } + + if (Date.now() - start > timeoutMs) { + throw new Error( + `Timeout waiting for crawl job "${jobId}" to complete: ${res.status}` + ) + } + + await delay(1000) + } while (true) + } +} diff --git a/src/services/index.ts b/src/services/index.ts index 32b1c9fbd..06daec68a 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,6 +2,7 @@ export * from './clearbit-client.js' export * from './dexa-client.js' export * from './diffbot-client.js' export * from './exa-client.js' +export * from './firecrawl-client.js' export * from './people-data-labs-client.js' export * from './perigon-client.js' export * from './predict-leads-client.js' From 8eda30709610503eadf3efa57fa033d9bcc4d6e0 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 18:11:56 -0500 Subject: [PATCH 13/81] =?UTF-8?q?=F0=9F=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 17 +++- readme.md | 2 +- src/services/exa-client.ts | 6 +- src/services/index.ts | 1 + src/services/wikipedia-client.ts | 158 +++++++++++++++++++++++++++++++ tsconfig.json | 1 - tsup.config.ts | 2 +- 7 files changed, 174 insertions(+), 13 deletions(-) create mode 100644 src/services/wikipedia-client.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index 119781a78..e77ed2d68 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -5,7 +5,8 @@ import { gracefulExit } from 'exit-hook' import restoreCursor from 'restore-cursor' // import { ClearbitClient } from '../src/index.js' -import { ProxycurlClient } from '../src/services/proxycurl-client.js' +// import { ProxycurlClient } from '../src/services/proxycurl-client.js' +import { WikipediaClient } from '../src/services/wikipedia-client.js' /** * Scratch pad for testing. @@ -19,10 +20,16 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const proxycurl = new ProxycurlClient() - const res = await proxycurl.getLinkedInPerson({ - linkedin_profile_url: 'https://linkedin.com/in/fisch2' - // personal_email: 'fisch0920@gmail.com' + // const proxycurl = new ProxycurlClient() + // const res = await proxycurl.getLinkedInPerson({ + // linkedin_profile_url: 'https://linkedin.com/in/fisch2' + // // personal_email: 'fisch0920@gmail.com' + // }) + // console.log(JSON.stringify(res, null, 2)) + + const wikipedia = new WikipediaClient() + const res = await wikipedia.getPageSummary({ + title: 'Naruto_(TV_series)' }) console.log(JSON.stringify(res, null, 2)) diff --git a/readme.md b/readme.md index 89345bcc9..ee4e9d54a 100644 --- a/readme.md +++ b/readme.md @@ -33,6 +33,7 @@ - serper - twitter - weatherapi +- wikipedia ## TODO @@ -45,7 +46,6 @@ - walter - services - wolfram alpha - - wikipedia - midjourney - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index 8bda881a9..a516fe2d1 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -160,7 +160,7 @@ export class ExaClient { * Performs an Exa search for the given query. */ async search(opts: { query: string } & exa.RegularSearchOptions) { - return this.ky.post('search', { json: opts }).json() + return this.ky.get('search', { json: opts }).json() } /** @@ -202,8 +202,6 @@ export class ExaClient { /** * Finds similar links to the provided URL and returns the contents of the * documents. - * - * @param {string} url - The URL for which to find similar links. */ async findSimilarAndContents< T extends exa.ContentsOptions = exa.ContentsOptions @@ -232,8 +230,6 @@ export class ExaClient { /** * Retrieves contents of documents based on a list of document IDs. - * - * @param {string | string[] | SearchResult[]} ids - An array of document IDs. */ async getContents({ ids, diff --git a/src/services/index.ts b/src/services/index.ts index 06daec68a..d477b668c 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -13,3 +13,4 @@ export * from './serpapi-client.js' export * from './serper-client.js' export * from './twitter-client.js' export * from './weather-client.js' +export * from './wikipedia-client.js' diff --git a/src/services/wikipedia-client.ts b/src/services/wikipedia-client.ts new file mode 100644 index 000000000..7dfd591fb --- /dev/null +++ b/src/services/wikipedia-client.ts @@ -0,0 +1,158 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import { assert, getEnv, throttleKy } from '../utils.js' + +export namespace wikipedia { + // Only allow 200 requests per second + export const throttle = pThrottle({ + limit: 200, + interval: 1000 + }) + + export interface SearchOptions { + query: string + limit?: number + } + + export interface PageSearchResponse { + pages: Page[] + } + + export interface Page { + id: number + key: string + title: string + matched_title: null + excerpt: string + description: null | string + thumbnail: Thumbnail | null + } + + export interface Thumbnail { + url: string + width: number + height: number + mimetype: string + duration: null + } + + export interface PageSummaryOptions { + title: string + redirect?: boolean + acceptLanguage?: string + } + + export interface PageSummary { + ns?: number + index?: number + type: string + title: string + displaytitle: string + namespace: { id: number; text: string } + wikibase_item: string + titles: { canonical: string; normalized: string; display: string } + pageid: number + thumbnail: { + source: string + width: number + height: number + } + originalimage: { + source: string + width: number + height: number + } + lang: string + dir: string + revision: string + tid: string + timestamp: string + description: string + description_source: string + content_urls: { + desktop: { + page: string + revisions: string + edit: string + talk: string + } + mobile: { + page: string + revisions: string + edit: string + talk: string + } + } + extract: string + extract_html: string + normalizedtitle?: string + coordinates?: { + lat: number + lon: number + } + } +} + +export class WikipediaClient { + readonly apiBaseUrl: string + readonly apiUserAgent: string + readonly ky: KyInstance + + constructor({ + apiBaseUrl = getEnv('WIKIPEDIA_API_BASE_URL') ?? + 'https://en.wikipedia.org/api/rest_v1', + apiUserAgent = getEnv('WIKIPEDIA_API_USER_AGENT') ?? + 'Agentic (https://github.com/transitive-bullshit/agentic)', + throttle = true, + ky = defaultKy + }: { + apiBaseUrl?: string + apiUserAgent?: string + throttle?: boolean + ky?: KyInstance + } = {}) { + assert(apiBaseUrl, 'WikipediaClient missing required "apiBaseUrl"') + assert(apiUserAgent, 'WikipediaClient missing required "apiUserAgent"') + + this.apiBaseUrl = apiBaseUrl + this.apiUserAgent = apiUserAgent + + const throttledKy = throttle ? throttleKy(ky, wikipedia.throttle) : ky + + this.ky = throttledKy.extend({ + headers: { + 'api-user-agent': apiUserAgent + } + }) + } + + async search({ query, ...opts }: wikipedia.SearchOptions) { + return ( + // https://www.mediawiki.org/wiki/API:REST_API + this.ky + .get('https://en.wikipedia.org/w/rest.php/v1/search/page', { + searchParams: { q: query, ...opts } + }) + .json() + ) + } + + async getPageSummary({ + title, + acceptLanguage = 'en-us', + redirect = true, + ...opts + }: wikipedia.PageSummaryOptions) { + // https://en.wikipedia.org/api/rest_v1/ + return this.ky + .get(`page/summary/${title}`, { + prefixUrl: this.apiBaseUrl, + searchParams: { redirect, ...opts }, + headers: { + 'accept-language': acceptLanguage + } + }) + .json() + } +} diff --git a/tsconfig.json b/tsconfig.json index 07b69730c..4066d2765 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,6 @@ // "emitDecoratorMetadata": true, "strict": true, - "strictNullChecks": true, "noUncheckedIndexedAccess": true, "forceConsistentCasingInFileNames": true, diff --git a/tsup.config.ts b/tsup.config.ts index bbb2d78b9..3710148e1 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -4,7 +4,7 @@ export default defineConfig([ { entry: ['src/index.ts'], outDir: 'dist', - target: 'node18', + target: 'node22', platform: 'node', format: ['esm'], splitting: false, From b7bd3ce15d57c79a46c8ada1cd16b2d4aaba45a5 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 18:12:07 -0500 Subject: [PATCH 14/81] =?UTF-8?q?=F0=9F=97=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsup.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsup.config.ts b/tsup.config.ts index 3710148e1..bbb2d78b9 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -4,7 +4,7 @@ export default defineConfig([ { entry: ['src/index.ts'], outDir: 'dist', - target: 'node22', + target: 'node18', platform: 'node', format: ['esm'], splitting: false, From b9d125191c5443841d71c38139bfa8ac8a8a20a1 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 18:25:46 -0500 Subject: [PATCH 15/81] =?UTF-8?q?=F0=9F=97=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/searxng-client.ts | 211 ++++++++++++++++++++++++++++++++- 1 file changed, 209 insertions(+), 2 deletions(-) diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 315fff67f..4b5d3b656 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -3,10 +3,217 @@ import defaultKy, { type KyInstance } from 'ky' import { assert, getEnv, omit, pick, pruneUndefined } from '../utils.js' export namespace searxng { + export type SearchCategory = + | 'general' + | 'images' + | 'videos' + | 'news' + | 'map' + | 'music' + | 'it' + | 'science' + | 'files' + | 'social media' + + export type SearchEngine = + | '9gag' + | 'annas archive' + | 'apk mirror' + | 'apple app store' + | 'ahmia' + | 'anaconda' + | 'arch linux wiki' + | 'artic' + | 'arxiv' + | 'ask' + | 'bandcamp' + | 'wikipedia' + | 'bilibili' + | 'bing' + | 'bing images' + | 'bing news' + | 'bing videos' + | 'bitbucket' + | 'bpb' + | 'btdigg' + | 'ccc-tv' + | 'openverse' + | 'chefkoch' + | 'crossref' + | 'crowdview' + | 'yep' + | 'yep images' + | 'yep news' + | 'curlie' + | 'currency' + | 'bahnhof' + | 'deezer' + | 'destatis' + | 'deviantart' + | 'ddg definitions' + | 'docker hub' + | 'erowid' + | 'wikidata' + | 'duckduckgo' + | 'duckduckgo images' + | 'duckduckgo videos' + | 'duckduckgo news' + | 'duckduckgo weather' + | 'apple maps' + | 'emojipedia' + | 'tineye' + | 'etymonline' + | '1x' + | 'fdroid' + | 'flickr' + | 'free software directory' + | 'frinkiac' + | 'fyyd' + | 'genius' + | 'gentoo' + | 'gitlab' + | 'github' + | 'codeberg' + | 'goodreads' + | 'google' + | 'google images' + | 'google news' + | 'google videos' + | 'google scholar' + | 'google play apps' + | 'google play movies' + | 'material icons' + | 'gpodder' + | 'habrahabr' + | 'hackernews' + | 'hoogle' + | 'imdb' + | 'imgur' + | 'ina' + | 'invidious' + | 'jisho' + | 'kickass' + | 'lemmy communities' + | 'lemmy users' + | 'lemmy posts' + | 'lemmy comments' + | 'library genesis' + | 'z-library' + | 'library of congress' + | 'lingva' + | 'lobste.rs' + | 'mastodon users' + | 'mastodon hashtags' + | 'mdn' + | 'metacpan' + | 'mixcloud' + | 'mozhi' + | 'mwmbl' + | 'npm' + | 'nyaa' + | 'mankier' + | 'odysee' + | 'openairedatasets' + | 'openairepublications' + | 'openstreetmap' + | 'openrepos' + | 'packagist' + | 'pdbe' + | 'photon' + | 'pinterest' + | 'piped' + | 'piped.music' + | 'piratebay' + | 'podcastindex' + | 'presearch' + | 'presearch images' + | 'presearch videos' + | 'presearch news' + | 'pub.dev' + | 'pubmed' + | 'pypi' + | 'qwant' + | 'qwant news' + | 'qwant images' + | 'qwant videos' + | 'radio browser' + | 'reddit' + | 'rottentomatoes' + | 'sepiasearch' + | 'soundcloud' + | 'stackoverflow' + | 'askubuntu' + | 'internetarchivescholar' + | 'superuser' + | 'searchcode code' + | 'semantic scholar' + | 'startpage' + | 'tokyotoshokan' + | 'solidtorrents' + | 'tagesschau' + | 'tmdb' + | 'torch' + | 'unsplash' + | 'yandex music' + | 'yahoo' + | 'yahoo news' + | 'youtube' + | 'dailymotion' + | 'vimeo' + | 'wiby' + | 'alexandria' + | 'wikibooks' + | 'wikinews' + | 'wikiquote' + | 'wikisource' + | 'wikispecies' + | 'wiktionary' + | 'wikiversity' + | 'wikivoyage' + | 'wikicommons.images' + | 'wolframalpha' + | 'dictzone' + | 'mymemory translated' + | '1337x' + | 'duden' + | 'seznam' + | 'mojeek' + | 'moviepilot' + | 'naver' + | 'rubygems' + | 'peertube' + | 'mediathekviewweb' + | 'yacy' + | 'yacy images' + | 'rumble' + | 'livespace' + | 'wordnik' + | 'woxikon.de synonyme' + | 'seekr news' + | 'seekr images' + | 'seekr videos' + | 'sjp.pwn' + | 'stract' + | 'svgrepo' + | 'tootfinder' + | 'wallhaven' + | 'wikimini' + | 'wttr.in' + | 'yummly' + | 'brave' + | 'brave.images' + | 'brave.videos' + | 'brave.news' + | 'lib.rs' + | 'sourcehut' + | 'goo' + | 'bt4g' + | 'pkg.go.dev' + export interface SearchOptions { query: string - categories?: string[] - engines?: string[] + categories?: SearchCategory[] + engines?: SearchEngine[] language?: string pageno?: number } From 4b9e9aed35eea831919104e35e803bf584224e23 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 19:51:11 -0500 Subject: [PATCH 16/81] =?UTF-8?q?=F0=9F=92=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 17 +++++++++++++---- src/services/searxng-client.ts | 34 +++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index e77ed2d68..98da7cbf1 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -4,9 +4,11 @@ import 'dotenv/config' import { gracefulExit } from 'exit-hook' import restoreCursor from 'restore-cursor' +import { SearxngClient } from '../src/services/searxng-client.js' + // import { ClearbitClient } from '../src/index.js' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' -import { WikipediaClient } from '../src/services/wikipedia-client.js' +// import { WikipediaClient } from '../src/services/wikipedia-client.js' /** * Scratch pad for testing. @@ -27,9 +29,16 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const wikipedia = new WikipediaClient() - const res = await wikipedia.getPageSummary({ - title: 'Naruto_(TV_series)' + // const wikipedia = new WikipediaClient() + // const res = await wikipedia.getPageSummary({ + // title: 'Naruto_(TV_series)' + // }) + // console.log(JSON.stringify(res, null, 2)) + + const searxng = new SearxngClient() + const res = await searxng.search({ + query: '4 + 2 * 10' + // engines: ['google'] }) console.log(JSON.stringify(res, null, 2)) diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 4b5d3b656..42a889631 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -227,11 +227,15 @@ export namespace searxng { content?: string author?: string iframe_src?: string + category?: SearchCategory + engine?: SearchEngine + publishedDate?: string } export interface SearchResponse { results: SearchResult[] suggestions: string[] + query: string } } @@ -240,11 +244,9 @@ export namespace searxng { */ export class SearxngClient { readonly ky: KyInstance - readonly apiKey: string readonly apiBaseUrl: string constructor({ - apiKey = getEnv('SEARXNG_API_KEY'), apiBaseUrl = getEnv('SEARXNG_API_BASE_URL'), ky = defaultKy }: { @@ -252,33 +254,43 @@ export class SearxngClient { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert( - apiKey, - 'SearxngClient missing required "apiKey" (defaults to "SEARXNG_API_KEY")' - ) assert( apiBaseUrl, 'SearxngClient missing required "apiBaseUrl" (defaults to "SEARXNG_API_BASE_URL")' ) - this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: apiBaseUrl }) } - async search(opts: searxng.SearchOptions): Promise { + async search({ + query, + ...opts + }: searxng.SearchOptions): Promise { const res = await this.ky .get('search', { searchParams: pruneUndefined({ - ...omit(opts, 'categories', 'engines'), + q: query, + ...opts, categories: opts.categories?.join(','), - engines: opts.categories?.join(','), + engines: opts.engines?.join(','), format: 'json' }) }) .json() - return pick(res, 'results', 'suggestions') + res.results = res.results?.map( + (result: any) => + omit( + result, + 'parsed_url', + 'engines', + 'positions', + 'template' + ) as searxng.SearchResult + ) + + return pick(res, 'results', 'suggestions', 'query') } } From fa6796d528bd423969d1408d9e8e7b8e999e205a Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 19:55:41 -0500 Subject: [PATCH 17/81] =?UTF-8?q?=F0=9F=9A=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/searxng-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 42a889631..4d19fceec 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -271,8 +271,8 @@ export class SearxngClient { const res = await this.ky .get('search', { searchParams: pruneUndefined({ - q: query, ...opts, + q: query, categories: opts.categories?.join(','), engines: opts.engines?.join(','), format: 'json' From f4e78610648dd9ff9cf5f5fbc293b3d84ba9a18e Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 26 May 2024 20:15:17 -0500 Subject: [PATCH 18/81] =?UTF-8?q?=F0=9F=8E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 16 +-- src/services/perigon-client.ts | 232 +++++++++++++++++---------------- src/services/searxng-client.ts | 4 + 3 files changed, 131 insertions(+), 121 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 98da7cbf1..2000e617c 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -4,8 +4,7 @@ import 'dotenv/config' import { gracefulExit } from 'exit-hook' import restoreCursor from 'restore-cursor' -import { SearxngClient } from '../src/services/searxng-client.js' - +// import { SearxngClient } from '../src/services/searxng-client.js' // import { ClearbitClient } from '../src/index.js' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' // import { WikipediaClient } from '../src/services/wikipedia-client.js' @@ -25,7 +24,6 @@ async function main() { // const proxycurl = new ProxycurlClient() // const res = await proxycurl.getLinkedInPerson({ // linkedin_profile_url: 'https://linkedin.com/in/fisch2' - // // personal_email: 'fisch0920@gmail.com' // }) // console.log(JSON.stringify(res, null, 2)) @@ -35,12 +33,12 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const searxng = new SearxngClient() - const res = await searxng.search({ - query: '4 + 2 * 10' - // engines: ['google'] - }) - console.log(JSON.stringify(res, null, 2)) + // const searxng = new SearxngClient() + // const res = await searxng.search({ + // query: 'golden gate bridge', + // engines: ['reddit'] + // }) + // console.log(JSON.stringify(res, null, 2)) return gracefulExit(0) } diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index a3be8e08e..60d19fae6 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -101,63 +101,66 @@ export namespace perigon { export type ArticlesResponse = { status: number numResults: number - articles: { - url: string - authorsByline: string - articleId: string - clusterId: string - source: { - domain: string - } - imageUrl: string - country: string - language: string - pubDate: string - addDate: string - refreshDate: string - score: number - title: string - description: string - content: string - medium: string - links: string[] - labels: string[] - matchedAuthors: string[] - claim: string - verdict: string - keywords: { - name: string - weight: number - }[] - topics: { - name: string - }[] - categories: { - name: string - }[] - entities: { - data: string - type: string - mentions: number - }[] - sentiment: { - positive: number - negative: number - neutral: number - } - summary: string - translation: string - locations: string[] - reprint: boolean - reprintGroupId: string - places: null + articles: Article[] + } + + export type Article = { + url: string + authorsByline: string + articleId: string + clusterId: string + source: { + domain: string + } + imageUrl: string + country: string + language: string + pubDate: string + addDate: string + refreshDate: string + score: number + title: string + description: string + content: string + medium: string + links: string[] + labels: string[] + matchedAuthors: string[] + claim: string + verdict: string + keywords: { + name: string + weight: number }[] + topics: { + name: string + }[] + categories: { + name: string + }[] + entities: { + data: string + type: string + mentions: number + }[] + sentiment: { + positive: number + negative: number + neutral: number + } + summary: string + translation: string + locations: string[] + reprint: boolean + reprintGroupId: string + places: null } export type StoriesOptions = { clusterId?: string topic?: string category?: Categories + q?: string name?: string nameExists?: boolean from?: string @@ -180,73 +183,78 @@ export namespace perigon { export type StoriesResponse = { status: number numResults: number - results: Array<{ - createdAt: string - updatedAt: string - initializedAt: string + results: Story[] + } + + export type Story = { + createdAt: string + updatedAt: string + initializedAt: string + id: string + name: string + summary: string + summaryReferences: Array + keyPoints: Array<{ + point: string + references: Array + }> + sentiment: { + positive: number + negative: number + neutral: number + } + uniqueCount: number + reprintCount: number + totalCount: number + countries: Array<{ + name: string + count: number + }> + topCountries: Array + topics: Array<{ + name: string + count: number + }> + topTopics: Array<{ name: string }> + categories: Array<{ + name: string + count: number + }> + topCategories: Array<{ name: string }> + people: Array<{ wikidataId: string; name: string; count: number }> + topPeople: Array<{ wikidataId: string; name: string }> + companies: Array<{ id: string name: string - summary: string - summaryReferences: Array - keyPoints: Array<{ - point: string - references: Array - }> - sentiment: { - positive: number - negative: number - neutral: number - } - uniqueCount: number - reprintCount: number - totalCount: number - countries: Array<{ - name: string - count: number - }> - topCountries: Array - topics: Array<{ - name: string - count: number - }> - topTopics: Array<{ name: string }> - categories: Array<{ - name: string - count: number - }> - topCategories: Array<{ name: string }> - people: Array<{ wikidataId: string; name: string; count: number }> - topPeople: Array<{ wikidataId: string; name: string }> - companies: Array<{ - id: string - name: string - domains: Array - symbols: Array - count: number - }> - topCompanies: Array<{ - id: string - name: string - domains: Array - symbols: Array - }> - locations: Array<{ - state: string - city?: string - area?: string - county?: string - count: number - }> - topLocations: Array<{ - state: string - city?: string - area?: string - county?: string - }> + domains: Array + symbols: Array + count: number + }> + topCompanies: Array<{ + id: string + name: string + domains: Array + symbols: Array + }> + locations: Array<{ + state: string + city?: string + area?: string + county?: string + count: number + }> + topLocations: Array<{ + state: string + city?: string + area?: string + county?: string }> } } +/** + * @see https://www.goperigon.com + */ export class PerigonClient { readonly ky: KyInstance readonly apiKey: string @@ -264,7 +272,7 @@ export class PerigonClient { timeoutMs?: number ky?: KyInstance } = {}) { - assert(apiKey, 'Error perigon client missing required "apiKey"') + assert(apiKey, 'Error PerigonClient missing required "apiKey"') this.apiKey = apiKey diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 4d19fceec..97adc00e9 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -241,6 +241,10 @@ export namespace searxng { /** * @see https://docs.searxng.org + * + * NOTE: You'll need to run a local instance of Searxng to use this client. + * + * See [perplexica](https://github.com/ItzCrazyKns/Perplexica/blob/master/docker-compose.yaml) for an example. */ export class SearxngClient { readonly ky: KyInstance From 839f46097c5e0791c09ed70b33c67e58a8deabdd Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sat, 1 Jun 2024 19:34:25 -0500 Subject: [PATCH 19/81] =?UTF-8?q?=F0=9F=8F=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 2 - bin/resolve-company.ts | 96 +++ bin/scratch.ts | 12 +- package.json | 20 +- pnpm-lock.yaml | 1090 ++++++++++++++------------- src/ai-function-set.ts | 4 +- src/ai-function.ts | 9 + src/ai-tool-set.ts | 8 +- src/fns.ts | 10 +- src/services/weather-client.test.ts | 14 + src/symbol-polyfill.ts | 8 + src/types.ts | 2 + tsconfig.json | 1 + vite.config.ts | 7 + 14 files changed, 746 insertions(+), 537 deletions(-) create mode 100644 bin/resolve-company.ts create mode 100644 src/services/weather-client.test.ts create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example index 7622aa5df..c783a49a2 100644 --- a/.env.example +++ b/.env.example @@ -4,5 +4,3 @@ # All of these environment vars must be defined either in your environment or in # a local .env file in order to run this project. # ------------------------------------------------------------------------------ - -OPENAI_API_KEY= diff --git a/bin/resolve-company.ts b/bin/resolve-company.ts new file mode 100644 index 000000000..613512e94 --- /dev/null +++ b/bin/resolve-company.ts @@ -0,0 +1,96 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { + ChatModel, + createAIFunction, + createAIRunner, + Msg +} from '@dexaai/dexter' +import { gracefulExit } from 'exit-hook' +import restoreCursor from 'restore-cursor' +import { z } from 'zod' + +import { WeatherClient } from '../src/index.js' + +/** Get the capital city for a given state. */ +const getCapitalCity = createAIFunction( + { + name: 'get_capital_city', + description: 'Use this to get the the capital city for a given state', + argsSchema: z.object({ + state: z + .string() + .length(2) + .describe( + 'The state to get the capital city for, using the two letter abbreviation e.g. CA' + ) + }) + }, + async ({ state }) => { + await new Promise((resolve) => setTimeout(resolve, 500)) + let capitalCity = '' + switch (state) { + case 'CA': + capitalCity = 'Sacramento' + break + case 'NY': + capitalCity = 'Albany' + break + default: + capitalCity = 'Unknown' + } + return { capitalCity } + } +) + +const weather = new WeatherClient() + +const fns = [...weather.functions] +console.log('fns', fns) + +const getCurrentWeather = weather.functions.get('get_current_weather')! +console.log('get_current_weather', getCurrentWeather) + +/** A runner that uses the weather and capital city functions. */ +const weatherCapitalRunner = createAIRunner({ + chatModel: new ChatModel({ params: { model: 'gpt-4-1106-preview' } }), + functions: [ + createAIFunction( + { + ...getCurrentWeather.spec, + argsSchema: getCurrentWeather.inputSchema + }, + getCurrentWeather.impl + ), + getCapitalCity + ], + systemMessage: `You use functions to answer questions about the weather and capital cities.` +}) + +async function main() { + restoreCursor() + + // Run with a string input + const rString = await weatherCapitalRunner( + `Whats the capital of California and NY and the weather for both?` + ) + console.log('rString', rString) + + // Run with a message input + const rMessage = await weatherCapitalRunner({ + messages: [ + Msg.user( + `Whats the capital of California and NY and the weather for both?` + ) + ] + }) + console.log('rMessage', rMessage) +} + +try { + await main() +} catch (err) { + console.error('unexpected error', err) + gracefulExit(1) +} diff --git a/bin/scratch.ts b/bin/scratch.ts index 2000e617c..3441579cb 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -7,7 +7,7 @@ import restoreCursor from 'restore-cursor' // import { SearxngClient } from '../src/services/searxng-client.js' // import { ClearbitClient } from '../src/index.js' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' -// import { WikipediaClient } from '../src/services/wikipedia-client.js' +import { WikipediaClient } from '../src/index.js' /** * Scratch pad for testing. @@ -27,11 +27,11 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - // const wikipedia = new WikipediaClient() - // const res = await wikipedia.getPageSummary({ - // title: 'Naruto_(TV_series)' - // }) - // console.log(JSON.stringify(res, null, 2)) + const wikipedia = new WikipediaClient() + const res = await wikipedia.getPageSummary({ + title: 'Naruto_(TV_series)' + }) + console.log(JSON.stringify(res, null, 2)) // const searxng = new SearxngClient() // const res = await searxng.search({ diff --git a/package.json b/package.json index 3fe2de54a..f31088ff0 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ ], "scripts": { "preinstall": "npx only-allow pnpm", - "build": "tsup", + "build": "tsc", "dev": "tsup --watch", "clean": "del dist", "prebuild": "run-s clean", @@ -45,7 +45,7 @@ "test:unit": "vitest run" }, "dependencies": { - "@nangohq/node": "^0.39.30", + "@nangohq/node": "^0.39.32", "chalk": "^5.3.0", "delay": "^6.0.0", "dotenv": "^16.4.5", @@ -58,32 +58,38 @@ "restore-cursor": "^5.0.0", "tiny-invariant": "^1.3.3", "twitter-api-sdk": "^1.2.1", - "type-fest": "^4.16.0", + "type-fest": "^4.18.3", "zod": "^3.23.3", "zod-to-json-schema": "^3.23.0" }, "devDependencies": { + "@dexaai/dexter": "^2.0.3", "@fisch0920/eslint-config": "^1.3.1", "@total-typescript/ts-reset": "^0.5.1", "@types/node": "^20.12.7", "del-cli": "^5.1.0", "eslint": "^8.57.0", "husky": "^9.0.11", - "lint-staged": "^15.2.4", + "lint-staged": "^15.2.5", "np": "^10.0.5", "npm-run-all2": "^6.2.0", "only-allow": "^1.2.1", "prettier": "^3.2.5", + "ts-node": "^10.9.2", "tsup": "^8.0.2", - "tsx": "^4.10.5", + "tsx": "^4.11.0", "typescript": "^5.4.5", - "vite": "^5.2.10", - "vitest": "^1.5.0" + "vitest": "2.0.0-beta.3" }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix", "prettier --ignore-unknown --write" ] + }, + "pnpm": { + "overrides": { + "esbuild": "~0.21.4" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c95a9eca1..41627bc21 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,13 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + esbuild: ~0.21.4 + importers: .: dependencies: '@nangohq/node': - specifier: ^0.39.30 - version: 0.39.30 + specifier: ^0.39.32 + version: 0.39.32 chalk: specifier: ^5.3.0 version: 5.3.0 @@ -48,8 +51,8 @@ importers: specifier: ^1.2.1 version: 1.2.1 type-fest: - specifier: ^4.16.0 - version: 4.18.2 + specifier: ^4.18.3 + version: 4.18.3 zod: specifier: ^3.23.3 version: 3.23.8 @@ -57,6 +60,9 @@ importers: specifier: ^3.23.0 version: 3.23.0(zod@3.23.8) devDependencies: + '@dexaai/dexter': + specifier: ^2.0.3 + version: 2.0.3 '@fisch0920/eslint-config': specifier: ^1.3.1 version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) @@ -76,8 +82,8 @@ importers: specifier: ^9.0.11 version: 9.0.11 lint-staged: - specifier: ^15.2.4 - version: 15.2.4 + specifier: ^15.2.5 + version: 15.2.5 np: specifier: ^10.0.5 version: 10.0.5(typescript@5.4.5) @@ -90,21 +96,21 @@ importers: prettier: specifier: ^3.2.5 version: 3.2.5 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.12.12)(typescript@5.4.5) tsup: specifier: ^8.0.2 - version: 8.0.2(postcss@8.4.38)(typescript@5.4.5) + version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5))(typescript@5.4.5) tsx: - specifier: ^4.10.5 - version: 4.10.5 + specifier: ^4.11.0 + version: 4.11.0 typescript: specifier: ^5.4.5 version: 5.4.5 - vite: - specifier: ^5.2.10 - version: 5.2.11(@types/node@20.12.12) vitest: - specifier: ^1.5.0 - version: 1.6.0(@types/node@20.12.12) + specifier: 2.0.0-beta.3 + version: 2.0.0-beta.3(@types/node@20.12.12) packages: @@ -124,278 +130,148 @@ packages: resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + '@dexaai/dexter@2.0.3': + resolution: {integrity: sha512-9ek3DpbW+snFByW6djG9JxSrQogE+3T8V5b6T2Cy0nZr3P/cyQk3z6V8LisGLHlOavKBbJMioiblqWvvplYvgQ==} + engines: {node: '>= 18'} + + '@esbuild/aix-ppc64@0.21.4': + resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + '@esbuild/android-arm64@0.21.4': + resolution: {integrity: sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + '@esbuild/android-arm@0.21.4': + resolution: {integrity: sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + '@esbuild/android-x64@0.21.4': + resolution: {integrity: sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + '@esbuild/darwin-arm64@0.21.4': + resolution: {integrity: sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + '@esbuild/darwin-x64@0.21.4': + resolution: {integrity: sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + '@esbuild/freebsd-arm64@0.21.4': + resolution: {integrity: sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + '@esbuild/freebsd-x64@0.21.4': + resolution: {integrity: sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + '@esbuild/linux-arm64@0.21.4': + resolution: {integrity: sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + '@esbuild/linux-arm@0.21.4': + resolution: {integrity: sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + '@esbuild/linux-ia32@0.21.4': + resolution: {integrity: sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + '@esbuild/linux-loong64@0.21.4': + resolution: {integrity: sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + '@esbuild/linux-mips64el@0.21.4': + resolution: {integrity: sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + '@esbuild/linux-ppc64@0.21.4': + resolution: {integrity: sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + '@esbuild/linux-riscv64@0.21.4': + resolution: {integrity: sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + '@esbuild/linux-s390x@0.21.4': + resolution: {integrity: sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + '@esbuild/linux-x64@0.21.4': + resolution: {integrity: sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + '@esbuild/netbsd-x64@0.21.4': + resolution: {integrity: sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + '@esbuild/openbsd-x64@0.21.4': + resolution: {integrity: sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + '@esbuild/sunos-x64@0.21.4': + resolution: {integrity: sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + '@esbuild/win32-arm64@0.21.4': + resolution: {integrity: sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + '@esbuild/win32-ia32@0.21.4': + resolution: {integrity: sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-x64@0.21.4': + resolution: {integrity: sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -418,6 +294,9 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/deepmerge@1.3.0': + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + '@fisch0920/eslint-config@1.3.2': resolution: {integrity: sha512-CUpMxCPWzoxvWFlmvH0OthooRlenqrezrVVleKEZv+NbibwgT4phyZadBLYsF8aB7Et2OoEzk4LKg8Xsdu5spA==} engines: {node: '>=18'} @@ -465,12 +344,15 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@ljharb/through@2.3.13': resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} - '@nangohq/node@0.39.30': - resolution: {integrity: sha512-ZHi3yZp4/osP8oNmlzXrASmXPHWj+AijD8TWO4uDrQL5lr87GcSRtFYLYVOEQ0hASuXEPD1eXcT3lX3AHnD1+A==} + '@nangohq/node@0.39.32': + resolution: {integrity: sha512-WmruUSZisKIB6Y3PIlhV/IjsPhag0DOqoP3RWZRXeI1MrenuKWRF6z31c+lViqfjTQoxp4KuEwx0QQbxMaztLg==} engines: {node: '>=18.0'} '@nodelib/fs.scandir@2.1.5': @@ -506,81 +388,161 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.17.2': resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.17.2': resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.17.2': resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.17.2': resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.17.2': resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.17.2': resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.17.2': resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.17.2': resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.17.2': resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.17.2': resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.17.2': resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.17.2': resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.17.2': resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + '@rushstack/eslint-patch@1.10.3': resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} @@ -610,6 +572,18 @@ packages: '@total-typescript/ts-reset@0.5.1': resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -692,20 +666,20 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.0-beta.3': + resolution: {integrity: sha512-nbspKRdknioSmLK7NxBTtwRoOjPMbCWesnmhyLG8BMPDAXhse8LPiG1kY1hvpC6moCf0BHUEeiJ5rGIEFxzdAw==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.0.0-beta.3': + resolution: {integrity: sha512-kXv1nelRHt7uRAxX7GMfRFB336DmiQ+9n+voEpN5HmSxJw+SE6k8MbzTsULxBKLtjI2BdpwF48UQaKmXP9adDg==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.0.0-beta.3': + resolution: {integrity: sha512-39Clmuu7TQjcOBMs+gbWt3T93Ud+gxa3iTaI0DaTgXjQZLu03qeAhYS6iOyw257A6Nt2+TSGZhTlqm3wyYbl2Q==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.0-beta.3': + resolution: {integrity: sha512-3qIAJhJ0rgZ5R540G0Xwy/8OYHyydv4A1gx+IA7PA8IQbMTfJenmvvJE6JWDYqn1jit0C17XFCtXxYGrIqKY3w==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.0-beta.3': + resolution: {integrity: sha512-zVIp7HwPWooG7WKe44QfknrXS7uAGPp0xpGJxDmD+zCGCRhjI94ugv2AtuI1oe5Yf3uGElIVMrY1eBc1LiwbbQ==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -810,6 +784,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -858,8 +835,9 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -932,7 +910,7 @@ packages: resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.17' + esbuild: ~0.21.4 cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -969,9 +947,9 @@ packages: caniuse-lite@1.0.30001620: resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk-template@1.1.0: resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} @@ -996,8 +974,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1093,9 +1072,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1115,6 +1091,9 @@ packages: typescript: optional: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1170,12 +1149,24 @@ packages: resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} engines: {node: '>=10'} + decircular@0.1.1: + resolution: {integrity: sha512-V2Vy+QYSXdgxRPmOZKQWCDf1KQNTUP/Eqswv/3W20gz7+6GB1HTosNrWqK3PqstVpFw/Dd/cGTmXSTKPeOiGVg==} + engines: {node: '>=18'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@5.0.1: + resolution: {integrity: sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==} engines: {node: '>=6'} deep-extend@0.6.0: @@ -1237,6 +1228,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1314,13 +1309,8 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + esbuild@0.21.4: + resolution: {integrity: sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==} engines: {node: '>=12'} hasBin: true @@ -1721,6 +1711,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hash-object@5.0.1: + resolution: {integrity: sha512-iaRY4jYOow1caHkXW7wotYRjZDQk2nq4U7904anGJj8l4x1SLId+vuR8RpGoywZz9puD769hNFVFLFH9t+baJw==} + engines: {node: '>=18'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1975,6 +1969,10 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-observable@1.1.0: resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} engines: {node: '>=4'} @@ -1995,6 +1993,10 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} @@ -2092,9 +2094,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -2169,8 +2168,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.2.4: - resolution: {integrity: sha512-3F9KRQIS2fVDGtCkBp4Bx0jswjX7zUcKx6OF0ZeY1prksUyKPRIIUqZhIUYAstJfvj6i48VFs4dwVIbCYwvTYQ==} + lint-staged@15.2.5: + resolution: {integrity: sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==} engines: {node: '>=18.12.0'} hasBin: true @@ -2204,10 +2203,6 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2252,8 +2247,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} @@ -2270,6 +2265,9 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -2301,8 +2299,8 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} - micromatch@4.0.6: - resolution: {integrity: sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -2359,9 +2357,6 @@ packages: resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2516,6 +2511,10 @@ packages: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} + openai-fetch@2.0.3: + resolution: {integrity: sha512-3Kv2lRgld3MYj+TaSgDBb8YnYEVdn601U+I1y0oZs4bCaPINEZXgcQAQAUGFmFVFpG4vU2Jr6ZAKiF5ZlmM5Fg==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2638,8 +2637,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -2648,15 +2648,15 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true + pinecone-client@2.0.0: + resolution: {integrity: sha512-CxpKuck4zxi/LaGaTrnWQNs9NmXiMB3UtynOhD6dVDoWRKGEXmgRbSFipMUdqGyyQEKMFXzTKvzo4qMHi2Gj8Q==} + engines: {node: '>=18'} + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -2669,9 +2669,6 @@ packages: resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} engines: {node: '>=18'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -2880,6 +2877,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} @@ -2993,6 +2995,10 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + sort-keys@5.0.0: + resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} + engines: {node: '>=12'} + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -3109,9 +3115,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3166,15 +3169,18 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiktoken@1.0.15: + resolution: {integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinypool@0.9.0: + resolution: {integrity: sha512-/aMLccuigz3ZZV8pv/LvOVkOzOfcKkz0V2d5JfHhXUSlp0JJ8h2lAjveUZFTKqII9L4iJh4jod5bfZxx3mditw==} + engines: {node: ^18.0.0 || >=20.0.0} tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} @@ -3211,6 +3217,20 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -3239,8 +3259,8 @@ packages: typescript: optional: true - tsx@4.10.5: - resolution: {integrity: sha512-twDSbf7Gtea4I2copqovUiNTEDrT8XNFXsuHpfGbdpW/z9ZW4fTghzzhAG0WfrCuJmJiOEY1nLIjq4u3oujRWQ==} + tsx@4.11.0: + resolution: {integrity: sha512-vzGGELOgAupsNVssAmZjbUDfdm/pWP4R+Kg8TVdsonxbXk0bEpE1qh0yV6/QxUVXaVlNemgcPajGdJJ82n3stg==} engines: {node: '>=18.0.0'} hasBin: true @@ -3252,10 +3272,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -3284,8 +3300,8 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - type-fest@4.18.2: - resolution: {integrity: sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==} + type-fest@4.18.3: + resolution: {integrity: sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==} engines: {node: '>=16'} typed-array-buffer@1.0.2: @@ -3312,9 +3328,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -3345,6 +3358,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -3352,13 +3368,13 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite-node@2.0.0-beta.3: + resolution: {integrity: sha512-oOO88OkozvBCyy640b4JFo+g1FAPcYrJcC7JgcuJD3SlgAnGrhD9CvE2ujiG6pxgeSL5U/9wWshGVbBuWsVjxg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + vite@5.2.12: + resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3385,15 +3401,15 @@ packages: terser: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.0.0-beta.3: + resolution: {integrity: sha512-ItxDOo9yzTy4A+BQoUDlegpIbFb4c/KuALBoHogvhBwHkTZwkPVHGkJRsNB4Kj1yvuwV+Mnhdh+PB9TLSN/t4Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.0-beta.3 + '@vitest/ui': 2.0.0-beta.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3504,6 +3520,10 @@ packages: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -3517,6 +3537,12 @@ packages: peerDependencies: zod: ^3.23.3 + zod-validation-error@3.3.0: + resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -3540,142 +3566,96 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@esbuild/aix-ppc64@0.19.12': - optional: true - - '@esbuild/aix-ppc64@0.20.2': - optional: true - - '@esbuild/android-arm64@0.19.12': - optional: true - - '@esbuild/android-arm64@0.20.2': - optional: true - - '@esbuild/android-arm@0.19.12': - optional: true - - '@esbuild/android-arm@0.20.2': - optional: true - - '@esbuild/android-x64@0.19.12': - optional: true - - '@esbuild/android-x64@0.20.2': - optional: true - - '@esbuild/darwin-arm64@0.19.12': - optional: true - - '@esbuild/darwin-arm64@0.20.2': - optional: true - - '@esbuild/darwin-x64@0.19.12': - optional: true - - '@esbuild/darwin-x64@0.20.2': - optional: true - - '@esbuild/freebsd-arm64@0.19.12': - optional: true - - '@esbuild/freebsd-arm64@0.20.2': - optional: true - - '@esbuild/freebsd-x64@0.19.12': - optional: true - - '@esbuild/freebsd-x64@0.20.2': - optional: true - - '@esbuild/linux-arm64@0.19.12': - optional: true - - '@esbuild/linux-arm64@0.20.2': - optional: true - - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-arm@0.20.2': - optional: true - - '@esbuild/linux-ia32@0.19.12': - optional: true - - '@esbuild/linux-ia32@0.20.2': - optional: true + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/linux-loong64@0.19.12': - optional: true + '@dexaai/dexter@2.0.3': + dependencies: + '@fastify/deepmerge': 1.3.0 + dedent: 1.5.3 + hash-object: 5.0.1 + jsonrepair: 3.8.0 + ky: 1.2.4 + openai-fetch: 2.0.3 + p-map: 7.0.2 + p-throttle: 6.1.0 + parse-json: 8.1.0 + pinecone-client: 2.0.0 + tiktoken: 1.0.15 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-validation-error: 3.3.0(zod@3.23.8) + transitivePeerDependencies: + - babel-plugin-macros - '@esbuild/linux-loong64@0.20.2': + '@esbuild/aix-ppc64@0.21.4': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/android-arm64@0.21.4': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/android-arm@0.21.4': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/android-x64@0.21.4': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/darwin-arm64@0.21.4': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/darwin-x64@0.21.4': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/freebsd-arm64@0.21.4': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/freebsd-x64@0.21.4': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/linux-arm64@0.21.4': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/linux-arm@0.21.4': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-ia32@0.21.4': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/linux-loong64@0.21.4': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/linux-mips64el@0.21.4': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/linux-ppc64@0.21.4': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/linux-riscv64@0.21.4': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/linux-s390x@0.21.4': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/linux-x64@0.21.4': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/netbsd-x64@0.21.4': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/openbsd-x64@0.21.4': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/sunos-x64@0.21.4': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-arm64@0.21.4': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-ia32@0.21.4': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-x64@0.21.4': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': @@ -3701,6 +3681,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@fastify/deepmerge@1.3.0': {} + '@fisch0920/eslint-config@1.3.2(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@rushstack/eslint-patch': 1.10.3 @@ -3771,11 +3753,16 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@ljharb/through@2.3.13': dependencies: call-bind: 1.0.7 - '@nangohq/node@0.39.30': + '@nangohq/node@0.39.32': dependencies: axios: 1.7.2 transitivePeerDependencies: @@ -3811,51 +3798,99 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.17.2': optional: true + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + '@rollup/rollup-android-arm64@4.17.2': optional: true + '@rollup/rollup-android-arm64@4.18.0': + optional: true + '@rollup/rollup-darwin-arm64@4.17.2': optional: true + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + '@rollup/rollup-darwin-x64@4.17.2': optional: true + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.17.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.17.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.17.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.17.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.17.2': optional: true + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.17.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.17.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + '@rushstack/eslint-patch@1.10.3': {} '@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7)': @@ -3876,6 +3911,14 @@ snapshots: '@total-typescript/ts-reset@0.5.1': {} + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@types/estree@1.0.5': {} '@types/http-cache-semantics@4.0.4': {} @@ -3975,33 +4018,33 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/expect@1.6.0': + '@vitest/expect@2.0.0-beta.3': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vitest/spy': 2.0.0-beta.3 + '@vitest/utils': 2.0.0-beta.3 + chai: 5.1.1 - '@vitest/runner@1.6.0': + '@vitest/runner@2.0.0-beta.3': dependencies: - '@vitest/utils': 1.6.0 + '@vitest/utils': 2.0.0-beta.3 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@2.0.0-beta.3': dependencies: magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/spy@1.6.0': + '@vitest/spy@2.0.0-beta.3': dependencies: tinyspy: 2.2.1 - '@vitest/utils@1.6.0': + '@vitest/utils@2.0.0-beta.3': dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 - loupe: 2.3.7 + loupe: 3.1.1 pretty-format: 29.7.0 abort-controller@3.0.0: @@ -4079,6 +4122,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: {} + argparse@2.0.1: {} aria-query@5.3.0: @@ -4161,7 +4206,7 @@ snapshots: arrify@1.0.1: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} ast-types-flow@0.0.8: {} @@ -4243,9 +4288,9 @@ snapshots: dependencies: run-applescript: 7.0.0 - bundle-require@4.1.0(esbuild@0.19.12): + bundle-require@4.1.0(esbuild@0.21.4): dependencies: - esbuild: 0.19.12 + esbuild: 0.21.4 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -4285,15 +4330,13 @@ snapshots: caniuse-lite@1.0.30001620: {} - chai@4.4.1: + chai@5.1.1: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.1 + loupe: 3.1.1 + pathval: 2.0.0 chalk-template@1.1.0: dependencies: @@ -4322,9 +4365,7 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} chokidar@3.6.0: dependencies: @@ -4408,8 +4449,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -4436,6 +4475,8 @@ snapshots: optionalDependencies: typescript: 5.4.5 + create-require@1.1.1: {} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -4485,13 +4526,15 @@ snapshots: decamelize@5.0.1: {} + decircular@0.1.1: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 + dedent@1.5.3: {} + + deep-eql@5.0.1: {} deep-extend@0.6.0: {} @@ -4548,6 +4591,8 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4679,57 +4724,31 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - esbuild@0.19.12: + esbuild@0.21.4: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - esbuild@0.20.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.21.4 + '@esbuild/android-arm': 0.21.4 + '@esbuild/android-arm64': 0.21.4 + '@esbuild/android-x64': 0.21.4 + '@esbuild/darwin-arm64': 0.21.4 + '@esbuild/darwin-x64': 0.21.4 + '@esbuild/freebsd-arm64': 0.21.4 + '@esbuild/freebsd-x64': 0.21.4 + '@esbuild/linux-arm': 0.21.4 + '@esbuild/linux-arm64': 0.21.4 + '@esbuild/linux-ia32': 0.21.4 + '@esbuild/linux-loong64': 0.21.4 + '@esbuild/linux-mips64el': 0.21.4 + '@esbuild/linux-ppc64': 0.21.4 + '@esbuild/linux-riscv64': 0.21.4 + '@esbuild/linux-s390x': 0.21.4 + '@esbuild/linux-x64': 0.21.4 + '@esbuild/netbsd-x64': 0.21.4 + '@esbuild/openbsd-x64': 0.21.4 + '@esbuild/sunos-x64': 0.21.4 + '@esbuild/win32-arm64': 0.21.4 + '@esbuild/win32-ia32': 0.21.4 + '@esbuild/win32-x64': 0.21.4 escalade@3.1.2: {} @@ -5237,6 +5256,13 @@ snapshots: dependencies: has-symbols: 1.0.3 + hash-object@5.0.1: + dependencies: + decircular: 0.1.1 + is-obj: 3.0.0 + sort-keys: 5.0.0 + type-fest: 4.18.3 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -5481,6 +5507,8 @@ snapshots: is-obj@2.0.0: {} + is-obj@3.0.0: {} + is-observable@1.1.0: dependencies: symbol-observable: 1.2.0 @@ -5493,6 +5521,8 @@ snapshots: is-plain-obj@1.1.0: {} + is-plain-obj@4.1.0: {} + is-promise@2.2.2: {} is-regex@1.1.4: @@ -5575,8 +5605,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -5635,7 +5663,7 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@15.2.4: + lint-staged@15.2.5: dependencies: chalk: 5.3.0 commander: 12.1.0 @@ -5643,7 +5671,7 @@ snapshots: execa: 8.0.1 lilconfig: 3.1.1 listr2: 8.2.1 - micromatch: 4.0.6 + micromatch: 4.0.7 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.4.2 @@ -5704,11 +5732,6 @@ snapshots: load-tsconfig@0.2.5: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5757,7 +5780,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -5773,6 +5796,8 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + make-error@1.3.6: {} + map-obj@1.0.1: {} map-obj@4.3.0: {} @@ -5805,10 +5830,10 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 - micromatch@4.0.6: + micromatch@4.0.7: dependencies: braces: 3.0.3 - picomatch: 4.0.2 + picomatch: 2.3.1 mime-db@1.52.0: {} @@ -5848,13 +5873,6 @@ snapshots: minipass@7.1.1: {} - mlly@1.7.0: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 - ms@2.1.2: {} ms@2.1.3: {} @@ -6062,6 +6080,10 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 + openai-fetch@2.0.3: + dependencies: + ky: 1.2.4 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6156,7 +6178,7 @@ snapshots: dependencies: '@babel/code-frame': 7.24.2 index-to-position: 0.1.2 - type-fest: 4.18.2 + type-fest: 4.18.3 path-exists@4.0.0: {} @@ -6179,16 +6201,18 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} picocolors@1.0.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} - pidtree@0.6.0: {} + pinecone-client@2.0.0: + dependencies: + ky: 1.2.4 + pirates@4.0.6: {} pkg-dir@4.2.0: @@ -6199,22 +6223,17 @@ snapshots: dependencies: find-up-simple: 1.0.0 - pkg-types@1.1.1: - dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 - pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.2(postcss@8.4.38): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: postcss: 8.4.38 + ts-node: 10.9.2(@types/node@20.12.12)(typescript@5.4.5) postcss@8.4.38: dependencies: @@ -6272,7 +6291,7 @@ snapshots: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 - type-fest: 4.18.2 + type-fest: 4.18.3 read-pkg-up@7.0.1: dependencies: @@ -6305,7 +6324,7 @@ snapshots: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.1 parse-json: 8.1.0 - type-fest: 4.18.2 + type-fest: 4.18.3 unicorn-magic: 0.1.0 readable-stream@3.6.2: @@ -6438,6 +6457,28 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 + rollup@4.18.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + run-applescript@7.0.0: {} run-async@2.4.1: {} @@ -6542,6 +6583,10 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + sort-keys@5.0.0: + dependencies: + is-plain-obj: 4.1.0 + source-map-js@1.2.0: {} source-map@0.8.0-beta.0: @@ -6673,10 +6718,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -6727,11 +6768,13 @@ snapshots: through@2.3.8: {} + tiktoken@1.0.15: {} + tiny-invariant@1.3.3: {} tinybench@2.8.0: {} - tinypool@0.8.4: {} + tinypool@0.9.0: {} tinyspy@2.2.1: {} @@ -6759,6 +6802,24 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.12.12 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -6770,17 +6831,17 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(postcss@8.4.38)(typescript@5.4.5): + tsup@8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5))(typescript@5.4.5): dependencies: - bundle-require: 4.1.0(esbuild@0.19.12) + bundle-require: 4.1.0(esbuild@0.21.4) cac: 6.7.14 chokidar: 3.6.0 debug: 4.3.4 - esbuild: 0.19.12 + esbuild: 0.21.4 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 @@ -6793,9 +6854,9 @@ snapshots: - supports-color - ts-node - tsx@4.10.5: + tsx@4.11.0: dependencies: - esbuild: 0.20.2 + esbuild: 0.21.4 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 @@ -6811,8 +6872,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -6827,7 +6886,7 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.18.2: {} + type-fest@4.18.3: {} typed-array-buffer@1.0.2: dependencies: @@ -6867,8 +6926,6 @@ snapshots: typescript@5.4.5: {} - ufo@1.5.3: {} - unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -6911,6 +6968,8 @@ snapshots: util-deprecate@1.0.2: {} + v8-compile-cache-lib@3.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -6918,13 +6977,13 @@ snapshots: validate-npm-package-name@5.0.1: {} - vite-node@1.6.0(@types/node@20.12.12): + vite-node@2.0.0-beta.3(@types/node@20.12.12): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.2.11(@types/node@20.12.12) + vite: 5.2.12(@types/node@20.12.12) transitivePeerDependencies: - '@types/node' - less @@ -6935,36 +6994,33 @@ snapshots: - supports-color - terser - vite@5.2.11(@types/node@20.12.12): + vite@5.2.12(@types/node@20.12.12): dependencies: - esbuild: 0.20.2 + esbuild: 0.21.4 postcss: 8.4.38 - rollup: 4.17.2 + rollup: 4.18.0 optionalDependencies: '@types/node': 20.12.12 fsevents: 2.3.3 - vitest@1.6.0(@types/node@20.12.12): + vitest@2.0.0-beta.3(@types/node@20.12.12): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 + '@vitest/expect': 2.0.0-beta.3 + '@vitest/runner': 2.0.0-beta.3 + '@vitest/snapshot': 2.0.0-beta.3 + '@vitest/spy': 2.0.0-beta.3 + '@vitest/utils': 2.0.0-beta.3 + chai: 5.1.1 debug: 4.3.4 execa: 8.0.1 - local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.12.12) - vite-node: 1.6.0(@types/node@20.12.12) + tinypool: 0.9.0 + vite: 5.2.12(@types/node@20.12.12) + vite-node: 2.0.0-beta.3(@types/node@20.12.12) why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.12.12 @@ -7097,6 +7153,8 @@ snapshots: yargs-parser@20.2.9: {} + yn@3.1.1: {} + yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} @@ -7105,4 +7163,8 @@ snapshots: dependencies: zod: 3.23.8 + zod-validation-error@3.3.0(zod@3.23.8): + dependencies: + zod: 3.23.8 + zod@3.23.8: {} diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index f2ca814c2..580ac8abb 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -5,7 +5,9 @@ export class AIFunctionSet implements Iterable { protected readonly _map: Map constructor(functions?: readonly types.AIFunction[]) { - this._map = new Map(functions ? functions.map((fn) => [fn.name, fn]) : null) + this._map = new Map( + functions ? functions.map((fn) => [fn.spec.name, fn]) : null + ) } get size(): number { diff --git a/src/ai-function.ts b/src/ai-function.ts index 504c97270..6c8fd1e1a 100644 --- a/src/ai-function.ts +++ b/src/ai-function.ts @@ -26,6 +26,14 @@ export function createAIFunction, Return>( /** Implementation of the function to call with the parsed arguments. */ implementation: (params: z.infer) => types.MaybePromise ): types.AIFunction { + assert(spec.name, 'Missing required AIFunction "spec.name"') + assert(spec.inputSchema, 'Missing required AIFunction "spec.inputSchema"') + assert(implementation, 'Missing required AIFunction "implementation"') + assert( + typeof implementation === 'function', + 'Required AIFunction "implementation" must be a function' + ) + /** Parse the arguments string, optionally reading from a message. */ const parseInput = (input: string | types.Msg) => { if (typeof input === 'string') { @@ -55,6 +63,7 @@ export function createAIFunction, Return>( description: spec.description?.trim() ?? '', parameters: zodToJsonSchema(spec.inputSchema) } + aiFunction.impl = implementation return aiFunction } diff --git a/src/ai-tool-set.ts b/src/ai-tool-set.ts index cb1d77e8e..ddc5245d6 100644 --- a/src/ai-tool-set.ts +++ b/src/ai-tool-set.ts @@ -6,7 +6,7 @@ export class AIToolSet implements Iterable { constructor(tools?: readonly types.AITool[]) { this._map = new Map( - tools ? tools.map((tool) => [tool.function.name, tool]) : [] + tools ? tools.map((tool) => [tool.spec.function.name, tool]) : [] ) } @@ -15,7 +15,7 @@ export class AIToolSet implements Iterable { } add(tool: types.AITool): this { - this._map.set(tool.function.name, tool) + this._map.set(tool.spec.function.name, tool) return this } @@ -44,7 +44,7 @@ export class AIToolSet implements Iterable { const keysToIncludeSet = new Set(keys) return new AIToolSet( Array.from(this).filter((tool) => - keysToIncludeSet.has(tool.function.name) + keysToIncludeSet.has(tool.spec.function.name) ) ) } @@ -53,7 +53,7 @@ export class AIToolSet implements Iterable { const keysToExcludeSet = new Set(keys) return new AIToolSet( Array.from(this).filter( - (tool) => !keysToExcludeSet.has(tool.function.name) + (tool) => !keysToExcludeSet.has(tool.spec.function.name) ) ) } diff --git a/src/fns.ts b/src/fns.ts index cef242a9f..75eb0ab16 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -8,8 +8,6 @@ import { AIFunctionSet } from './ai-function-set.js' import { AIToolSet } from './ai-tool-set.js' import { assert } from './utils.js' -export const invocableMetadataKey = Symbol('invocable') - export abstract class AIToolsProvider { private _tools?: AIToolSet private _functions?: AIFunctionSet @@ -25,7 +23,9 @@ export abstract class AIToolsProvider { get functions(): AIFunctionSet { if (!this._functions) { const metadata = this.constructor[Symbol.metadata] + assert(metadata) const invocables = (metadata?.invocables as Invocable[]) ?? [] + console.log({ metadata, invocables }) const aiFunctions = invocables.map((invocable) => { const impl = (this as any)[invocable.methodName]?.bind(this) @@ -81,13 +81,17 @@ export function aiFunction< if (!context.metadata.invocables) { context.metadata.invocables = [] } - ;(context.metadata.invocables as Invocable[]).push({ name: name ?? methodName, description, inputSchema, methodName }) + console.log({ + name, + methodName, + context + }) // context.addInitializer(function () { // ;(this as any)[methodName] = (this as any)[methodName].bind(this) diff --git a/src/services/weather-client.test.ts b/src/services/weather-client.test.ts new file mode 100644 index 000000000..e351f40a8 --- /dev/null +++ b/src/services/weather-client.test.ts @@ -0,0 +1,14 @@ +import { expect, test } from 'vitest' + +import { WeatherClient } from './weather-client.js' + +test('WeatherClient.functions', () => { + const weather = new WeatherClient({ + apiKey: 'sk-test' + }) + + const fns = [...weather.functions] + console.log(fns) + + expect(weather.functions.get('getCurrentWeather')).toBeTruthy() +}) diff --git a/src/symbol-polyfill.ts b/src/symbol-polyfill.ts index c9a5b23cd..82fe04c91 100644 --- a/src/symbol-polyfill.ts +++ b/src/symbol-polyfill.ts @@ -19,3 +19,11 @@ if (typeof Symbol === 'function' && Symbol.metadata) { value: _metadata }) } + +// export {}; +// declare global { +// interface SymbolConstructor { +// readonly metadata: unique symbol +// } +// } +// (Symbol as any).metadata ??= Symbol.for("Symbol.metadata") diff --git a/src/types.ts b/src/types.ts index 8ae4cb2ab..c26377d30 100644 --- a/src/types.ts +++ b/src/types.ts @@ -40,6 +40,8 @@ export interface AIFunction< /** The function spec for the OpenAI API `functions` property. */ spec: AIFunctionSpec + + impl: (params: z.infer) => MaybePromise } /** diff --git a/tsconfig.json b/tsconfig.json index 4066d2765..2c566bf40 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,7 @@ "useDefineForClassFields": true, "jsx": "preserve", + // NOTE: these are deprecated // "experimentalDecorators": true, // "emitDecoratorMetadata": true, diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..9bcd5c941 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + esbuild: { + target: 'es2022' + } +}) From 8aa53fed7197e58237d49525eaa5733468c7174f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sat, 1 Jun 2024 21:04:13 -0500 Subject: [PATCH 20/81] =?UTF-8?q?=F0=9F=A4=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 2 +- examples/ai-sdk/weather.ts | 24 + .../dexter/weather.ts | 31 +- examples/package.json | 33 + examples/tsconfig.json | 4 + package.json | 27 +- pnpm-lock.yaml | 1022 +- pnpm-workspace.yaml | 2 + proxycurl-openapi.json | 11380 ---------------- proxycurl-openapi.yaml | 9978 -------------- src/ai-function-set.ts | 6 +- src/ai-tool-set.ts | 4 + src/fns.ts | 26 +- src/sdks/ai-sdk.ts | 19 + src/sdks/dexter.ts | 19 + src/services/proxycurl-client.ts | 2 +- src/services/weather-client.ts | 14 - src/types.ts | 12 +- tsconfig.json | 2 +- tsup.config.ts | 2 +- 20 files changed, 826 insertions(+), 21783 deletions(-) create mode 100644 examples/ai-sdk/weather.ts rename bin/resolve-company.ts => examples/dexter/weather.ts (72%) create mode 100644 examples/package.json create mode 100644 examples/tsconfig.json create mode 100644 pnpm-workspace.yaml delete mode 100644 proxycurl-openapi.json delete mode 100644 proxycurl-openapi.yaml create mode 100644 src/sdks/ai-sdk.ts create mode 100644 src/sdks/dexter.ts diff --git a/.eslintrc.json b/.eslintrc.json index 7b1e9e832..d03d820ec 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,4 +1,4 @@ { "root": true, - "extends": ["@fisch0920/eslint-config", "@fisch0920/eslint-config/node"] + "extends": ["@fisch0920/eslint-config/node"] } diff --git a/examples/ai-sdk/weather.ts b/examples/ai-sdk/weather.ts new file mode 100644 index 000000000..d9e03f3cc --- /dev/null +++ b/examples/ai-sdk/weather.ts @@ -0,0 +1,24 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { openai } from '@ai-sdk/openai' +import { generateText } from 'ai' + +import { WeatherClient } from '../../src/index.js' +import { tools } from '../../src/sdks/ai-sdk.js' + +async function main() { + const weather = new WeatherClient() + + const result = await generateText({ + model: openai('gpt-4-turbo'), + tools: tools(weather), + toolChoice: 'required', + prompt: + 'What is the weather in San Francisco and what attractions should I visit?' + }) + + console.log(result.toolResults[0]) +} + +await main() diff --git a/bin/resolve-company.ts b/examples/dexter/weather.ts similarity index 72% rename from bin/resolve-company.ts rename to examples/dexter/weather.ts index 613512e94..7e12d3146 100644 --- a/bin/resolve-company.ts +++ b/examples/dexter/weather.ts @@ -7,11 +7,10 @@ import { createAIRunner, Msg } from '@dexaai/dexter' -import { gracefulExit } from 'exit-hook' -import restoreCursor from 'restore-cursor' import { z } from 'zod' -import { WeatherClient } from '../src/index.js' +import { WeatherClient } from '../../src/index.js' +import { functions } from '../../src/sdks/dexter.js' /** Get the capital city for a given state. */ const getCapitalCity = createAIFunction( @@ -46,31 +45,14 @@ const getCapitalCity = createAIFunction( const weather = new WeatherClient() -const fns = [...weather.functions] -console.log('fns', fns) - -const getCurrentWeather = weather.functions.get('get_current_weather')! -console.log('get_current_weather', getCurrentWeather) - /** A runner that uses the weather and capital city functions. */ const weatherCapitalRunner = createAIRunner({ chatModel: new ChatModel({ params: { model: 'gpt-4-1106-preview' } }), - functions: [ - createAIFunction( - { - ...getCurrentWeather.spec, - argsSchema: getCurrentWeather.inputSchema - }, - getCurrentWeather.impl - ), - getCapitalCity - ], + functions: [...functions(weather), getCapitalCity], systemMessage: `You use functions to answer questions about the weather and capital cities.` }) async function main() { - restoreCursor() - // Run with a string input const rString = await weatherCapitalRunner( `Whats the capital of California and NY and the weather for both?` @@ -88,9 +70,4 @@ async function main() { console.log('rMessage', rMessage) } -try { - await main() -} catch (err) { - console.error('unexpected error', err) - gracefulExit(1) -} +await main() diff --git a/examples/package.json b/examples/package.json new file mode 100644 index 000000000..ef73f3329 --- /dev/null +++ b/examples/package.json @@ -0,0 +1,33 @@ +{ + "name": "agentic-examples", + "private": true, + "version": "0.1.0", + "description": "TODO", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "transitive-bullshit/agentic" + }, + "packageManager": "pnpm@9.1.4", + "engines": { + "node": ">=18" + }, + "type": "module", + "scripts": { + "preinstall": "npx only-allow pnpm", + "build": "tsc", + "clean": "del dist", + "prebuild": "run-s clean", + "pretest": "run-s build", + "test": "run-s test:*", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "ai": "^3.1.22", + "@ai-sdk/openai": "^0.0.18", + "@dexaai/dexter": "^2.0.3", + "dotenv": "^16.4.5", + "zod": "^3.23.3" + } +} diff --git a/examples/tsconfig.json b/examples/tsconfig.json new file mode 100644 index 000000000..e46af6401 --- /dev/null +++ b/examples/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["ai-sdk", "dexter"] +} diff --git a/package.json b/package.json index f31088ff0..6ab2c3109 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,32 @@ { - "name": "gptlint", + "name": "@agentic/stdlib", "private": true, "version": "0.1.0", "description": "TODO", "author": "Travis Fischer ", - "license": "PROPRIETARY", - "homepage": "https://trywalter.ai", + "license": "MIT", "repository": { "type": "git", - "url": "transitive-bullshit/walter" + "url": "transitive-bullshit/agentic" }, - "packageManager": "pnpm@8.15.7", + "packageManager": "pnpm@9.1.4", "engines": { "node": ">=18" }, "type": "module", - "source": "./src/gptlint.ts", + "source": "./src/index.ts", "types": "./dist/index.d.ts", "sideEffects": false, "exports": { ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js", - "default": "./dist/src/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./ai-sdk": { + "types": "./dist/sdks/ai-sdk.d.ts", + "import": "./dist/sdks/ai-sdk.js", + "default": "./dist/sdks/ai-sdk.js" } }, "files": [ @@ -67,6 +71,7 @@ "@fisch0920/eslint-config": "^1.3.1", "@total-typescript/ts-reset": "^0.5.1", "@types/node": "^20.12.7", + "ai": "^3.1.22", "del-cli": "^5.1.0", "eslint": "^8.57.0", "husky": "^9.0.11", @@ -81,6 +86,10 @@ "typescript": "^5.4.5", "vitest": "2.0.0-beta.3" }, + "optionalDependencies": { + "@dexaai/dexter": "^2.0.3", + "ai": "^3.1.22" + }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41627bc21..69687d8ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: version: 3.8.0 ky: specifier: ^1.2.4 - version: 1.2.4 + version: 1.3.0 p-map: specifier: ^7.0.2 version: 7.0.2 @@ -59,10 +59,14 @@ importers: zod-to-json-schema: specifier: ^3.23.0 version: 3.23.0(zod@3.23.8) - devDependencies: + optionalDependencies: '@dexaai/dexter': specifier: ^2.0.3 - version: 2.0.3 + version: 2.1.0 + ai: + specifier: ^3.1.22 + version: 3.1.22(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + devDependencies: '@fisch0920/eslint-config': specifier: ^1.3.1 version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) @@ -71,7 +75,7 @@ importers: version: 0.5.1 '@types/node': specifier: ^20.12.7 - version: 20.12.12 + version: 20.13.0 del-cli: specifier: ^5.1.0 version: 5.1.0 @@ -95,13 +99,13 @@ importers: version: 1.2.1 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.12)(typescript@5.4.5) + version: 10.9.2(@types/node@20.13.0)(typescript@5.4.5) tsup: specifier: ^8.0.2 - version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5))(typescript@5.4.5) + version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5))(typescript@5.4.5) tsx: specifier: ^4.11.0 version: 4.11.0 @@ -110,32 +114,86 @@ importers: version: 5.4.5 vitest: specifier: 2.0.0-beta.3 - version: 2.0.0-beta.3(@types/node@20.12.12) + version: 2.0.0-beta.3(@types/node@20.13.0) + + examples: + dependencies: + '@ai-sdk/openai': + specifier: ^0.0.18 + version: 0.0.18(zod@3.23.8) + '@dexaai/dexter': + specifier: ^2.0.3 + version: 2.1.0 + ai: + specifier: ^3.1.22 + version: 3.1.22(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + zod: + specifier: ^3.23.3 + version: 3.23.8 packages: - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@ai-sdk/openai@0.0.18': + resolution: {integrity: sha512-5iJ+/mbns0uLbNpACMYGUONUqQmqGJYrPbQvmGC+XVD4DZLvyZqBi0NDoQguOrZTz6u5O7rl51o9PDO+bEtmcA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@0.0.11': + resolution: {integrity: sha512-JRDrqL2FGDmLh+a4R5qbS8UrWN9Lt7DpDIY1x6owgXjXkz3Umm1czs1X32VlL0M1dpoSxu4hGBFtXd56+kDzXA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider@0.0.8': + resolution: {integrity: sha512-+gcMvyPUDfDXV9caN3CG5Le0M5K4CjqTdMV1ODg/AosApQiJW9ByN5imJPdI043zVdt+HS9WG+s0j4am7ca4bg==} + engines: {node: '>=18'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dexaai/dexter@2.0.3': - resolution: {integrity: sha512-9ek3DpbW+snFByW6djG9JxSrQogE+3T8V5b6T2Cy0nZr3P/cyQk3z6V8LisGLHlOavKBbJMioiblqWvvplYvgQ==} + '@dexaai/dexter@2.1.0': + resolution: {integrity: sha512-3vhTSlpoW0DhQy2DaI3ocoZdw8RxBmsSysrGT0yZP6ZT2zHXlNVzYMj/ffbHmcR2y+VCkESKDJ/Vde4Ytf4agQ==} engines: {node: '>= 18'} '@esbuild/aix-ppc64@0.21.4': @@ -314,8 +372,8 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - '@inquirer/figures@1.0.1': - resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} + '@inquirer/figures@1.0.3': + resolution: {integrity: sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==} engines: {node: '>=18'} '@isaacs/cliui@8.0.2': @@ -383,161 +441,81 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.17.2': - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.18.0': resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.17.2': - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.18.0': resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.17.2': - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.17.2': - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.17.2': - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.17.2': - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.17.2': - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.17.2': - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.17.2': - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.18.0': resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.17.2': - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.17.2': - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] @@ -584,6 +562,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -596,8 +577,8 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/node@20.12.12': - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@types/node@20.13.0': + resolution: {integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -605,8 +586,8 @@ packages: '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - '@typescript-eslint/eslint-plugin@7.9.0': - resolution: {integrity: sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==} + '@typescript-eslint/eslint-plugin@7.11.0': + resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -616,8 +597,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.9.0': - resolution: {integrity: sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==} + '@typescript-eslint/parser@7.11.0': + resolution: {integrity: sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -626,12 +607,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.9.0': - resolution: {integrity: sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==} + '@typescript-eslint/scope-manager@7.11.0': + resolution: {integrity: sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.9.0': - resolution: {integrity: sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==} + '@typescript-eslint/type-utils@7.11.0': + resolution: {integrity: sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -640,12 +621,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.9.0': - resolution: {integrity: sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==} + '@typescript-eslint/types@7.11.0': + resolution: {integrity: sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.9.0': - resolution: {integrity: sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==} + '@typescript-eslint/typescript-estree@7.11.0': + resolution: {integrity: sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -653,14 +634,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.9.0': - resolution: {integrity: sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==} + '@typescript-eslint/utils@7.11.0': + resolution: {integrity: sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.9.0': - resolution: {integrity: sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==} + '@typescript-eslint/visitor-keys@7.11.0': + resolution: {integrity: sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': @@ -681,6 +662,35 @@ packages: '@vitest/utils@2.0.0-beta.3': resolution: {integrity: sha512-zVIp7HwPWooG7WKe44QfknrXS7uAGPp0xpGJxDmD+zCGCRhjI94ugv2AtuI1oe5Yf3uGElIVMrY1eBc1LiwbbQ==} + '@vue/compiler-core@3.4.27': + resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + + '@vue/compiler-dom@3.4.27': + resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + + '@vue/compiler-sfc@3.4.27': + resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} + + '@vue/compiler-ssr@3.4.27': + resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} + + '@vue/reactivity@3.4.27': + resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} + + '@vue/runtime-core@3.4.27': + resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} + + '@vue/runtime-dom@3.4.27': + resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} + + '@vue/server-renderer@3.4.27': + resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} + peerDependencies: + vue: 3.4.27 + + '@vue/shared@3.4.27': + resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -703,6 +713,30 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} + ai@3.1.22: + resolution: {integrity: sha512-Vgy490Q6p6pZ39VrRzL9ovr2N1YPsR+KvWNs+n73VAQoGBZtU/vwiiWrFU9LHXGhB9X+EBfQD0vixnTDS2dJWA==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 + solid-js: ^1.7.7 + svelte: ^3.0.0 || ^4.0.0 + vue: ^3.3.4 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + zod: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -859,6 +893,9 @@ packages: axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -882,10 +919,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -906,8 +939,8 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - bundle-require@4.1.0: - resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + bundle-require@4.2.1: + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: ~0.21.4 @@ -944,8 +977,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001620: - resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} + caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} @@ -1041,6 +1074,9 @@ packages: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} + code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1102,6 +1138,13 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -1128,8 +1171,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1224,6 +1267,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1255,8 +1301,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.773: - resolution: {integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==} + electron-to-chromium@1.4.788: + resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} elegant-spinner@1.0.1: resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} @@ -1275,6 +1321,10 @@ packages: resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -1416,8 +1466,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react@7.34.1: - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + eslint-plugin-react@7.34.2: + resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -1465,6 +1515,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1479,6 +1532,10 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventsource-parser@1.1.2: + resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} + engines: {node: '>=14.18'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1629,13 +1686,14 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.15: - resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -1800,6 +1858,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1826,8 +1885,8 @@ packages: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} - inquirer@9.2.21: - resolution: {integrity: sha512-c/dwDruM1FtzeISV+xMHm+JZTmhpmgWPEZI2bU3+Fwu5MhbAX0zMHHxj5warNfttE5NUID3aijrFUpDc2yBvcA==} + inquirer@9.2.23: + resolution: {integrity: sha512-kod5s+FBPIDM2xiy9fu+6wdU/SkK5le5GS9lh4FEBjBHqiMgD9lLFbCbuqFNAjNL2ZOy9Wd9F694IOzN9pZHBA==} engines: {node: '>=18'} internal-slot@1.0.7: @@ -2000,6 +2059,9 @@ packages: is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2083,8 +2145,8 @@ packages: iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + jackspeak@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} engines: {node: '>=14'} joycon@3.1.1: @@ -2120,6 +2182,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2127,6 +2192,11 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonrepair@3.8.0: resolution: {integrity: sha512-89lrxpwp+IEcJ6kwglF0HH3Tl17J08JEpYfXnvvjdp4zV4rjSoGu2NdQHxBs7yTOk3ETjTn9du48pBy8iBqj1w==} hasBin: true @@ -2142,12 +2212,12 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - ky@1.2.4: - resolution: {integrity: sha512-CfSrf4a0yj1n6WgPT6kQNQOopIGLkQzqSAXo05oKByaH7G3SiqW4a8jGox0p9whMXqO49H7ljgigivrMyycAVA==} + ky@1.3.0: + resolution: {integrity: sha512-QUViPXlgP6NKA57IAPff/aZSmRA6qs9wKxlEpayBorwRZG+x2LG7jD4kXh8lnH3q/gkUr64NyZ7kwErUEZJmlw==} engines: {node: '>=18'} - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} @@ -2203,6 +2273,9 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2276,6 +2349,9 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -2295,10 +2371,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - micromatch@4.0.7: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} @@ -2353,8 +2425,8 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.1: - resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} ms@2.1.2: @@ -2376,6 +2448,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2641,6 +2718,9 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -2697,8 +2777,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.3.0: + resolution: {integrity: sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==} engines: {node: '>=14'} hasBin: true @@ -2740,6 +2820,10 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + read-package-json-fast@3.0.2: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2870,11 +2954,7 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - - rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup@4.18.0: @@ -2925,6 +3005,9 @@ packages: resolution: {integrity: sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==} engines: {node: '>=12'} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver-diff@4.0.0: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} engines: {node: '>=12'} @@ -2942,6 +3025,16 @@ packages: engines: {node: '>=10'} hasBin: true + seroval-plugins@1.0.7: + resolution: {integrity: sha512-GO7TkWvodGp6buMEX9p7tNyIkbwlyuAWbI6G9Ec5bhcm7mQdu3JOK1IXbEUwb3FVzSc363GraG/wLW23NSavIw==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.0.7: + resolution: {integrity: sha512-n6ZMQX5q0Vn19Zq7CIKNIo7E75gPkGCFUEqDpa8jgwpYr/vScjqnQ6H09t1uIiZ0ZSK0ypEGvrYK2bhBGWsGdw==} + engines: {node: '>=10'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2995,6 +3088,16 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + solid-js@1.8.17: + resolution: {integrity: sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==} + + solid-swr-store@0.10.7: + resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==} + engines: {node: '>=10'} + peerDependencies: + solid-js: ^1.2 + swr-store: ^0.10 + sort-keys@5.0.0: resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} engines: {node: '>=12'} @@ -3016,8 +3119,13 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + + sswr@2.0.0: + resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==} + peerDependencies: + svelte: ^4.0.0 stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -3140,6 +3248,27 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte@4.2.17: + resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} + engines: {node: '>=16'} + + swr-store@0.10.6: + resolution: {integrity: sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==} + engines: {node: '>=10'} + + swr@2.2.0: + resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + + swrev@4.0.0: + resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} + + swrv@1.0.4: + resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} + peerDependencies: + vue: '>=3.2.26 < 4' + symbol-observable@1.2.0: resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} engines: {node: '>=0.10.0'} @@ -3190,6 +3319,10 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3355,6 +3488,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3426,6 +3564,14 @@ packages: jsdom: optional: true + vue@3.4.27: + resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -3532,6 +3678,11 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zod-to-json-schema@3.22.5: + resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} + peerDependencies: + zod: ^3.22.4 + zod-to-json-schema@3.23.0: resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} peerDependencies: @@ -3548,35 +3699,71 @@ packages: snapshots: - '@babel/code-frame@7.24.2': + '@ai-sdk/openai@0.0.18(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.8 + '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/provider-utils@0.0.11(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.8 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider@0.0.8': + dependencies: + json-schema: 0.4.0 + + '@ampproject/remapping@2.3.0': dependencies: - '@babel/highlight': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.6': + dependencies: + '@babel/highlight': 7.24.6 picocolors: 1.0.1 - '@babel/helper-validator-identifier@7.24.5': {} + '@babel/helper-string-parser@7.24.6': {} + + '@babel/helper-validator-identifier@7.24.6': {} - '@babel/highlight@7.24.5': + '@babel/highlight@7.24.6': dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/runtime@7.24.5': + '@babel/parser@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/runtime@7.24.6': dependencies: regenerator-runtime: 0.14.1 + '@babel/types@7.24.6': + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dexaai/dexter@2.0.3': + '@dexaai/dexter@2.1.0': dependencies: '@fastify/deepmerge': 1.3.0 dedent: 1.5.3 hash-object: 5.0.1 jsonrepair: 3.8.0 - ky: 1.2.4 + ky: 1.3.0 openai-fetch: 2.0.3 p-map: 7.0.2 p-throttle: 6.1.0 @@ -3668,7 +3855,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -3686,16 +3873,16 @@ snapshots: '@fisch0920/eslint-config@1.3.2(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-jest: 28.5.0(@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) eslint-plugin-jest-dom: 5.4.0(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.1(eslint@8.57.0) + eslint-plugin-react: 7.34.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) eslint-plugin-security: 2.1.1 eslint-plugin-simple-import-sort: 12.1.0(eslint@8.57.0) @@ -3712,7 +3899,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3721,7 +3908,7 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@inquirer/figures@1.0.1': {} + '@inquirer/figures@1.0.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -3795,99 +3982,51 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.17.2': - optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': optional: true - '@rollup/rollup-android-arm64@4.17.2': - optional: true - '@rollup/rollup-android-arm64@4.18.0': optional: true - '@rollup/rollup-darwin-arm64@4.17.2': - optional: true - '@rollup/rollup-darwin-arm64@4.18.0': optional: true - '@rollup/rollup-darwin-x64@4.17.2': - optional: true - '@rollup/rollup-darwin-x64@4.18.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.17.2': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.17.2': - optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.17.2': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.17.2': - optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-x64-musl@4.17.2': - optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.17.2': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.17.2': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.17.2': - optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true @@ -3919,6 +4058,8 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/diff-match-patch@1.0.36': {} + '@types/estree@1.0.5': {} '@types/http-cache-semantics@4.0.4': {} @@ -3927,7 +4068,7 @@ snapshots: '@types/minimist@1.2.5': {} - '@types/node@20.12.12': + '@types/node@20.13.0': dependencies: undici-types: 5.26.5 @@ -3935,14 +4076,14 @@ snapshots: '@types/retry@0.12.2': {} - '@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/type-utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/type-utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.11.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -3953,29 +4094,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.4 + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.11.0 + debug: 4.3.5 eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.9.0': + '@typescript-eslint/scope-manager@7.11.0': dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 - '@typescript-eslint/type-utils@7.9.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.11.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.5 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -3983,13 +4124,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.9.0': {} + '@typescript-eslint/types@7.11.0': {} - '@typescript-eslint/typescript-estree@7.9.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.11.0(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/visitor-keys': 7.9.0 - debug: 4.3.4 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/visitor-keys': 7.11.0 + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 @@ -4000,20 +4141,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.9.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.11.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.9.0 - '@typescript-eslint/types': 7.9.0 - '@typescript-eslint/typescript-estree': 7.9.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.11.0 + '@typescript-eslint/types': 7.11.0 + '@typescript-eslint/typescript-estree': 7.11.0(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.9.0': + '@typescript-eslint/visitor-keys@7.11.0': dependencies: - '@typescript-eslint/types': 7.9.0 + '@typescript-eslint/types': 7.11.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -4047,6 +4188,59 @@ snapshots: loupe: 3.1.1 pretty-format: 29.7.0 + '@vue/compiler-core@3.4.27': + dependencies: + '@babel/parser': 7.24.6 + '@vue/shared': 3.4.27 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.27': + dependencies: + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/compiler-sfc@3.4.27': + dependencies: + '@babel/parser': 7.24.6 + '@vue/compiler-core': 3.4.27 + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.27': + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/reactivity@3.4.27': + dependencies: + '@vue/shared': 3.4.27 + + '@vue/runtime-core@3.4.27': + dependencies: + '@vue/reactivity': 3.4.27 + '@vue/shared': 3.4.27 + + '@vue/runtime-dom@3.4.27': + dependencies: + '@vue/runtime-core': 3.4.27 + '@vue/shared': 3.4.27 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))': + dependencies: + '@vue/compiler-ssr': 3.4.27 + '@vue/shared': 3.4.27 + vue: 3.4.27(typescript@5.4.5) + + '@vue/shared@3.4.27': {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -4064,6 +4258,28 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 + ai@3.1.22(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 0.0.8 + '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + solid-swr-store: 0.10.7(solid-js@1.8.17)(swr-store@0.10.6) + sswr: 2.0.0(svelte@4.2.17) + swr: 2.2.0(react@18.3.1) + swr-store: 0.10.6 + swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) + zod-to-json-schema: 3.22.5(zod@3.23.8) + optionalDependencies: + react: 18.3.1 + solid-js: 1.8.17 + svelte: 4.2.17 + vue: 3.4.27(typescript@5.4.5) + zod: 3.23.8 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4230,6 +4446,10 @@ snapshots: dependencies: dequal: 2.0.3 + axobject-query@4.0.0: + dependencies: + dequal: 2.0.3 + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -4262,18 +4482,14 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.1.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001620 - electron-to-chromium: 1.4.773 + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.788 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) @@ -4288,7 +4504,7 @@ snapshots: dependencies: run-applescript: 7.0.0 - bundle-require@4.1.0(esbuild@0.21.4): + bundle-require@4.2.1(esbuild@0.21.4): dependencies: esbuild: 0.21.4 load-tsconfig: 0.2.5 @@ -4328,7 +4544,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001620: {} + caniuse-lite@1.0.30001625: {} chai@5.1.1: dependencies: @@ -4370,7 +4586,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -4425,6 +4641,14 @@ snapshots: code-point-at@1.1.0: {} + code-red@1.0.4: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.5 + acorn: 8.11.3 + estree-walker: 3.0.3 + periscopic: 3.1.0 + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -4487,6 +4711,13 @@ snapshots: dependencies: type-fest: 1.4.0 + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + csstype@3.1.3: {} + damerau-levenshtein@1.0.8: {} data-view-buffer@1.0.1: @@ -4513,7 +4744,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4: + debug@4.3.5: dependencies: ms: 2.1.2 @@ -4589,6 +4820,8 @@ snapshots: dequal@2.0.3: {} + diff-match-patch@1.0.5: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -4613,7 +4846,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.773: {} + electron-to-chromium@1.4.788: {} elegant-spinner@1.0.1: {} @@ -4628,6 +4861,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + entities@4.5.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -4772,13 +5007,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.3.4 + debug: 4.3.5 enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -4789,18 +5024,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -4810,7 +5045,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -4821,7 +5056,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.11.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4829,23 +5064,23 @@ snapshots: eslint-plugin-jest-dom@5.4.0(eslint@8.57.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 eslint: 8.57.0 requireindex: 1.2.0 - eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5): + eslint-plugin-jest@28.5.0(@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5): dependencies: - '@typescript-eslint/utils': 7.9.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.11.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.9.0(@typescript-eslint/parser@7.9.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - supports-color - typescript eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 aria-query: 5.3.0 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 @@ -4867,7 +5102,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react@7.34.1(eslint@8.57.0): + eslint-plugin-react@7.34.2(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4899,7 +5134,7 @@ snapshots: eslint-plugin-unicorn@52.0.0(eslint@8.57.0): dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.6 '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint/eslintrc': 2.1.4 ci-info: 4.0.0 @@ -4939,7 +5174,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -4985,6 +5220,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 @@ -4995,6 +5232,8 @@ snapshots: eventemitter3@5.0.1: {} + eventsource-parser@1.1.2: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -5035,7 +5274,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} @@ -5157,12 +5396,12 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.15: + glob@10.4.1: dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.6 + jackspeak: 3.1.2 minimatch: 9.0.4 - minipass: 7.1.1 + minipass: 7.1.2 path-scurry: 1.11.1 glob@7.2.3: @@ -5375,9 +5614,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@9.2.21: + inquirer@9.2.23: dependencies: - '@inquirer/figures': 1.0.1 + '@inquirer/figures': 1.0.3 '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 chalk: 5.3.0 @@ -5525,6 +5764,10 @@ snapshots: is-promise@2.2.2: {} + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.5 + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -5595,7 +5838,7 @@ snapshots: reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - jackspeak@2.3.6: + jackspeak@3.1.2: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -5621,12 +5864,20 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: dependencies: minimist: 1.2.8 + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.3.0 + diff-match-patch: 1.0.5 + jsonrepair@3.8.0: {} jsx-ast-utils@3.3.5: @@ -5642,13 +5893,13 @@ snapshots: kind-of@6.0.3: {} - ky@1.2.4: {} + ky@1.3.0: {} - language-subtag-registry@0.3.22: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 latest-version@7.0.0: dependencies: @@ -5667,7 +5918,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4 + debug: 4.3.5 execa: 8.0.1 lilconfig: 3.1.1 listr2: 8.2.1 @@ -5732,6 +5983,8 @@ snapshots: load-tsconfig@0.2.5: {} + locate-character@3.0.0: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -5802,6 +6055,8 @@ snapshots: map-obj@4.3.0: {} + mdn-data@2.0.30: {} + memorystream@0.3.1: {} meow@10.1.5: @@ -5825,11 +6080,6 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - micromatch@4.0.7: dependencies: braces: 3.0.3 @@ -5871,7 +6121,7 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.1: {} + minipass@7.1.2: {} ms@2.1.2: {} @@ -5889,6 +6139,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.6: {} + nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -5942,7 +6194,7 @@ snapshots: hosted-git-info: 7.0.2 ignore-walk: 6.0.5 import-local: 3.1.0 - inquirer: 9.2.21 + inquirer: 9.2.23 is-installed-globally: 1.0.0 is-interactive: 2.0.0 is-scoped: 3.0.0 @@ -5975,7 +6227,7 @@ snapshots: dependencies: is-scoped: 3.0.0 is-url-superb: 6.1.0 - ky: 1.2.4 + ky: 1.3.0 lodash.zip: 4.2.0 org-regex: 1.0.0 p-map: 7.0.2 @@ -6082,7 +6334,7 @@ snapshots: openai-fetch@2.0.3: dependencies: - ky: 1.2.4 + ky: 1.3.0 optionator@0.9.4: dependencies: @@ -6169,14 +6421,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@8.1.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 index-to-position: 0.1.2 type-fest: 4.18.3 @@ -6195,7 +6447,7 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 - minipass: 7.1.1 + minipass: 7.1.2 path-type@4.0.0: {} @@ -6203,6 +6455,12 @@ snapshots: pathval@2.0.0: {} + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -6211,7 +6469,7 @@ snapshots: pinecone-client@2.0.0: dependencies: - ky: 1.2.4 + ky: 1.3.0 pirates@4.0.6: {} @@ -6227,13 +6485,13 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.12.12)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.13.0)(typescript@5.4.5) postcss@8.4.38: dependencies: @@ -6243,7 +6501,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.2.5: {} + prettier@3.3.0: {} pretty-format@29.7.0: dependencies: @@ -6282,6 +6540,10 @@ snapshots: react-is@18.3.1: {} + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.2 @@ -6435,28 +6697,6 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.17.2: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 - fsevents: 2.3.3 - rollup@4.18.0: dependencies: '@types/estree': 1.0.5 @@ -6520,6 +6760,8 @@ snapshots: scoped-regex@3.0.0: {} + secure-json-parse@2.7.0: {} + semver-diff@4.0.0: dependencies: semver: 7.6.2 @@ -6530,6 +6772,12 @@ snapshots: semver@7.6.2: {} + seroval-plugins@1.0.7(seroval@1.0.7): + dependencies: + seroval: 1.0.7 + + seroval@1.0.7: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -6583,6 +6831,17 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + solid-js@1.8.17: + dependencies: + csstype: 3.1.3 + seroval: 1.0.7 + seroval-plugins: 1.0.7(seroval@1.0.7) + + solid-swr-store@0.10.7(solid-js@1.8.17)(swr-store@0.10.6): + dependencies: + solid-js: 1.8.17 + swr-store: 0.10.6 + sort-keys@5.0.0: dependencies: is-plain-obj: 4.1.0 @@ -6596,16 +6855,21 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 - spdx-license-ids@3.0.17: {} + spdx-license-ids@3.0.18: {} + + sswr@2.0.0(svelte@4.2.17): + dependencies: + svelte: 4.2.17 + swrev: 4.0.0 stackback@0.0.2: {} @@ -6722,7 +6986,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.15 + glob: 10.4.1 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -6745,6 +7009,38 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte@4.2.17: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@types/estree': 1.0.5 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.10 + periscopic: 3.1.0 + + swr-store@0.10.6: + dependencies: + dequal: 2.0.3 + + swr@2.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + + swrev@4.0.0: {} + + swrv@1.0.4(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + symbol-observable@1.2.0: {} symbol-observable@4.0.0: {} @@ -6782,6 +7078,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + to-fast-properties@2.0.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -6802,14 +7100,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5): + ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.12 + '@types/node': 20.13.0 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -6831,19 +7129,19 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5))(typescript@5.4.5): + tsup@8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5))(typescript@5.4.5): dependencies: - bundle-require: 4.1.0(esbuild@0.21.4) + bundle-require: 4.2.1(esbuild@0.21.4) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.4 + debug: 4.3.5 esbuild: 0.21.4 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5)) resolve-from: 5.0.0 - rollup: 4.17.2 + rollup: 4.18.0 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tree-kill: 1.2.2 @@ -6966,6 +7264,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} v8-compile-cache-lib@3.0.1: {} @@ -6977,13 +7279,13 @@ snapshots: validate-npm-package-name@5.0.1: {} - vite-node@2.0.0-beta.3(@types/node@20.12.12): + vite-node@2.0.0-beta.3(@types/node@20.13.0): dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.2.12(@types/node@20.12.12) + vite: 5.2.12(@types/node@20.13.0) transitivePeerDependencies: - '@types/node' - less @@ -6994,16 +7296,16 @@ snapshots: - supports-color - terser - vite@5.2.12(@types/node@20.12.12): + vite@5.2.12(@types/node@20.13.0): dependencies: esbuild: 0.21.4 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: - '@types/node': 20.12.12 + '@types/node': 20.13.0 fsevents: 2.3.3 - vitest@2.0.0-beta.3(@types/node@20.12.12): + vitest@2.0.0-beta.3(@types/node@20.13.0): dependencies: '@vitest/expect': 2.0.0-beta.3 '@vitest/runner': 2.0.0-beta.3 @@ -7011,7 +7313,7 @@ snapshots: '@vitest/spy': 2.0.0-beta.3 '@vitest/utils': 2.0.0-beta.3 chai: 5.1.1 - debug: 4.3.4 + debug: 4.3.5 execa: 8.0.1 magic-string: 0.30.10 pathe: 1.1.2 @@ -7019,11 +7321,11 @@ snapshots: std-env: 3.7.0 tinybench: 2.8.0 tinypool: 0.9.0 - vite: 5.2.12(@types/node@20.12.12) - vite-node: 2.0.0-beta.3(@types/node@20.12.12) + vite: 5.2.12(@types/node@20.13.0) + vite-node: 2.0.0-beta.3(@types/node@20.13.0) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.12.12 + '@types/node': 20.13.0 transitivePeerDependencies: - less - lightningcss @@ -7033,6 +7335,16 @@ snapshots: - supports-color - terser + vue@3.4.27(typescript@5.4.5): + dependencies: + '@vue/compiler-dom': 3.4.27 + '@vue/compiler-sfc': 3.4.27 + '@vue/runtime-dom': 3.4.27 + '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.4.5)) + '@vue/shared': 3.4.27 + optionalDependencies: + typescript: 5.4.5 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -7159,6 +7471,10 @@ snapshots: yocto-queue@1.0.0: {} + zod-to-json-schema@3.22.5(zod@3.23.8): + dependencies: + zod: 3.23.8 + zod-to-json-schema@3.23.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..8cef1c0ab --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'examples' diff --git a/proxycurl-openapi.json b/proxycurl-openapi.json deleted file mode 100644 index ef94ab6e8..000000000 --- a/proxycurl-openapi.json +++ /dev/null @@ -1,11380 +0,0 @@ -{ - "servers": [ - { - "url": "https://nubela.co/proxycurl", - "description": "With SSL Proxycurl Server" - }, - { - "url": "http://nubela.co/proxycurl", - "description": "Without SSL Proxycurl Server" - } - ], - "security": [ - { - "BearerAuth": ["client"] - } - ], - "paths": { - "/api/linkedin/school": { - "get": { - "description": "Cost: 1 credit / successful request.\nGet structured data of a LinkedIn School Profile", - "parameters": [ - { - "in": "query", - "name": "url", - "required": true, - "description": "\n URL of the LinkedIn School Profile to crawl.\n\n URL should be in the format of `https://www.linkedin.com/school/`\n ", - "example": "https://www.linkedin.com/school/national-university-of-singapore", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "use_cache", - "required": false, - "description": "`if-present` The default behavior. Fetches profile from cache regardless of age of profile. If profile is not available in cache, API will attempt to source profile externally.\n\n`if-recent` API will make a best effort to return a fresh profile no older than 29 days.Costs an extra `1` credit on top of the cost of the base endpoint.", - "example": "if-present", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LinkedinSchool" - }, - "example": { - "linkedin_internal_id": "5524", - "description": "At NUS, we are shaping the future through our people and our pursuit of new frontiers in knowledge. In a single century, we have become a university of global influence and an Asian thought leader. Our location at the crossroads of Asia informs our mission and gives us a tremendous vantage point to help create opportunities and address the pressing issues facing Singapore, Asia and the world.\r\rAt NUS, we believe in education, research and service that change lives.", - "website": "http://nus.edu.sg", - "industry": "Higher Education", - "company_size": [5001, 10000], - "company_size_on_linkedin": 16084, - "hq": { - "country": "SG", - "city": "Singapore", - "postal_code": "119077", - "line_1": "21 Lower Kent Ridge Road, Singapore", - "is_hq": true, - "state": null - }, - "company_type": "EDUCATIONAL_INSTITUTION", - "founded_year": 1905, - "specialities": ["education", "research"], - "locations": [ - { - "country": "SG", - "city": "Singapore", - "postal_code": "119077", - "line_1": "21 Lower Kent Ridge Road, Singapore", - "is_hq": true, - "state": null - } - ], - "name": "National University of Singapore", - "tagline": null, - "universal_name_id": "national-university-of-singapore", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140", - "search_id": "5524", - "similar_companies": [ - { - "name": "NUS Business School", - "link": "https://www.linkedin.com/school/nus-business-school/", - "industry": "Higher Education", - "location": null - }, - { - "name": "NUS Faculty of Arts and Social Sciences", - "link": "https://www.linkedin.com/school/nusfass/", - "industry": "Higher Education", - "location": null - } - ], - "affiliated_companies": [], - "updates": [], - "follower_count": 539321 - } - } - }, - "description": "Profile data with profile picture, school location, etc" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["School API"], - "operationId": "School Profile Endpoint" - }, - "summary": "School Profile Endpoint" - }, - "/api/linkedin/company": { - "get": { - "description": "Cost: 1 credit / successful request.\nGet structured data of a Company Profile", - "parameters": [ - { - "in": "query", - "name": "url", - "required": true, - "description": "\n URL of the LinkedIn Company Profile to crawl.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", - "example": "https://www.linkedin.com/company/google/", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "resolve_numeric_id", - "required": false, - "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator.\n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb).\n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n\n This parameter accepts the following values:\n - `false` - Will not resolve numerical IDs.\n - `true` (default value) - Enable support for Company Profile URLs with numerical IDs.\n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", - "example": "true", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "categories", - "required": false, - "description": "\n Appends categories data of this company.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "funding_data", - "required": false, - "description": "\n Returns a list of funding rounds that this company has received.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "exit_data", - "required": false, - "description": "\n Returns a list of investment portfolio exits.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these categories (if available) for `1` extra credit.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "acquisitions", - "required": false, - "description": "\n Provides further enriched data on acquisitions made by this company from external sources.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these acquisition data (if available) for `1` extra credit.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "extra", - "required": false, - "description": "\n Enriches the Company Profile with extra details from external sources.\n Details include Crunchbase ranking, contact email, phone number, Facebook account, Twitter account, funding rounds and amount, IPO status, investor information, etc.\n\n Default value is `\"exclude\"`.\n The other acceptable value is `\"include\"`, which will include these extra details (if available) for `1` extra credit.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "use_cache", - "required": false, - "description": "\n `if-present` The default behavior.\n Fetches profile from cache regardless of age of profile.\n If profile is not available in cache, API will attempt to source profile externally.\n\n `if-recent` API will make a best effort to return a fresh profile no older than 29 days.\"\n Costs an extra `1` credit on top of the cost of the base endpoint.\n ", - "example": "if-present", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "fallback_to_cache", - "required": false, - "description": "\n Tweaks the fallback behavior if an error arises from fetching a fresh profile.\n\n This parameter accepts the following values:\n * `on-error` (default value) - Fallback to reading the profile from cache if an error arises.\n * `never` - Do not ever read profile from cache.\n ", - "example": "on-error", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LinkedinCompany" - }, - "example": { - "linkedin_internal_id": "1441", - "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", - "website": "https://goo.gle/3m1IN7m", - "industry": "Software Development", - "company_size": [10001, null], - "company_size_on_linkedin": 319856, - "hq": { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": ["search", "ads"], - "locations": [ - { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - { - "country": "US", - "city": "New York", - "postal_code": "10011", - "line_1": "111 8th Ave", - "is_hq": false, - "state": "NY" - } - ], - "name": "Google", - "tagline": null, - "universal_name_id": "google", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", - "search_id": "1441", - "similar_companies": [ - { - "name": "Amazon", - "link": "https://www.linkedin.com/company/amazon", - "industry": "Software Development", - "location": "Seattle, WA" - }, - { - "name": "Microsoft", - "link": "https://www.linkedin.com/company/microsoft", - "industry": "Software Development", - "location": "Redmond, Washington" - } - ], - "affiliated_companies": [ - { - "name": "YouTube", - "link": "https://www.linkedin.com/company/youtube", - "industry": "Software Development", - "location": "San Bruno, CA" - }, - { - "name": "Google Cloud", - "link": "https://www.linkedin.com/showcase/google-cloud", - "industry": "Software Development", - "location": "Mountain View, California" - } - ], - "updates": [ - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", - "posted_on": { - "day": 13, - "month": 9, - "year": 2022 - }, - "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", - "total_likes": 4267 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", - "posted_on": null, - "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", - "total_likes": 397 - } - ], - "follower_count": 27472792 - } - } - }, - "description": "Profile data with profile picture, office locations, etc" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Company API"], - "operationId": "Company Profile Endpoint" - }, - "summary": "Company Profile Endpoint" - }, - "/api/v2/linkedin": { - "get": { - "description": "Cost: 1 credit / successful request.\nGet structured data of a Personal Profile", - "parameters": [ - { - "in": "query", - "name": "extra", - "required": false, - "description": "\n Enriches the Person Profile with extra details from external sources.\n Extra details include gender, birth date, industry and interests.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide extra data field.\n - `include` - Append extra data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "github_profile_id", - "required": false, - "description": "\n Enriches the Person Profile with Github Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Github Id data field.\n - `include` - Append Github Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "facebook_profile_id", - "required": false, - "description": "\n Enriches the Person Profile with Facebook Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Facebook Id data field.\n - `include` - Append Facebook Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_id", - "required": false, - "description": "\n Enriches the Person Profile with Twitter Id from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide Twitter Id data field.\n - `include` - Append Twitter Id data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "personal_contact_number", - "required": false, - "description": "\n Enriches the Person Profile with personal numbers from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide personal numbers data field.\n - `include` - Append personal numbers data to the person profile object.\n Costs an extra `1` credit per email returned on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "personal_email", - "required": false, - "description": "\n Enriches the Person Profile with personal emails from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide personal emails data field.\n - `include` - Append personal emails data to the person profile object.\n Costs an extra `1` credit per email returned on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "inferred_salary", - "required": false, - "description": "\n Include inferred salary range from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide inferred salary data field.\n - `include` - Append inferred salary range data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "skills", - "required": false, - "description": "\n Include skills data from external sources.\n\n This parameter accepts the following values:\n - `exclude` (default value) - Does not provide skills data field.\n - `include` - Append skills data to the person profile object.\n Costs an extra `1` credit on top of the cost of the base endpoint (if data is available).\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "use_cache", - "required": false, - "description": "\n `if-present` The default behavior.\n Fetches profile from cache regardless of age of profile.\n If profile is not available in cache, API will attempt to source profile externally.\n\n `if-recent` API will make a best effort to return a fresh profile no older than 29 days.\"\n Costs an extra `1` credit on top of the cost of the base endpoint.\n ", - "example": "if-present", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "fallback_to_cache", - "required": false, - "description": "\n Tweaks the fallback behavior if an error arises from fetching a fresh profile.\n\n This parameter accepts the following values:\n * `on-error` (default value) - Fallback to reading the profile from cache if an error arises.\n * `never` - Do not ever read profile from cache.\n ", - "example": "on-error", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "\n The Twitter/X Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://x.com/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", - "example": "https://x.com/johnrmarty/", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "facebook_profile_url", - "required": false, - "description": "\n The Facebook Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://facebook.com/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", - "example": "https://facebook.com/johnrmarty/", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_profile_url", - "required": false, - "description": "\n The LinkedIn Profile URL from which you wish to extract person profile\n\n URL should be in the format of `https://linkedin.com/in/`\n \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", - "example": "https://linkedin.com/in/johnrmarty/", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PersonEndpointResponse" - }, - "example": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [], - "groups": [] - } - } - }, - "description": "Profile data with profile picture, job history, etc." - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["People API"], - "operationId": "Person Profile Endpoint" - }, - "summary": "Person Profile Endpoint" - }, - "/api/customers": { - "get": { - "description": "Cost: 10 credits / result for users on an annual subscription or Enterprise plan.\nGet a list of probable corporate customers of a target company.", - "parameters": [ - { - "in": "query", - "name": "linkedin_company_profile_url", - "required": false, - "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of customers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://www.linkedin.com/company/watsons", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of customers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://x.com/watsonsproperty", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Limit the maximum results of customer companies returned per API call.\n\n The default value of this parameter is 10.\n\n Accepted values for this parameter is an integer ranging from 0 to 1000.\n ", - "example": "10", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CustomerList" - }, - "example": { - "companies": [ - { - "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", - "twitter_profile_url": "https://twitter.com/spirellp", - "email": "info@spiresolicitors.co.uk" - }, - { - "linkedin_company_profile_url": "https://www.linkedin.com/company/mall-wood-insurance-services-ltd", - "twitter_profile_url": "https://twitter.com/draytonins", - "email": null - } - ], - "next_page": null - } - } - }, - "description": "A list of probable customers of the target company." - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Customer API `EXPERIMENTAL`"], - "operationId": "Customer Listing Endpoint `EXPERIMENTAL`" - }, - "summary": "Customer Listing Endpoint `EXPERIMENTAL`" - }, - "/api/customers/count/": { - "get": { - "description": "Cost: 1 credit / result for users on an annual subscription or Enterprise plan.\nGet the total count of probable corporate customers of a target company.", - "parameters": [ - { - "in": "query", - "name": "linkedin_company_profile_url", - "required": false, - "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of customers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://www.linkedin.com/company/watsons", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of customers of.\n\n URL should be in the format of https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://x.com/watsonsproperty", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CustomerCount" - }, - "example": { - "company_count": 125 - } - } - }, - "description": "Number of probable customers of the target company." - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Customer API `EXPERIMENTAL`"], - "operationId": "Customer Listing Count Endpoint `EXPERIMENTAL`" - }, - "summary": "Customer Listing Count Endpoint `EXPERIMENTAL`" - }, - "/api/linkedin/company/employees/": { - "get": { - "description": "Cost: 3 credits / employee returned.\nGet a list of employees of a Company.\n\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our comprehensive dataset of people and company profiles.", - "parameters": [ - { - "in": "query", - "name": "country", - "required": false, - "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US. Or you can set the parameter to `country=us,sg` if you want employees from both the US and Singapore.\n\n This parameter accepts a comma-separated case-insensitive values of [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", - "example": "us", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profiles", - "required": false, - "description": "\n Get the full profile of employees instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists employee's profile url\n * `enrich`: lists full profile of employees\n\n Calling this API endpoint with this parameter would add `1` credit per employee returned.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "role_search", - "required": false, - "description": "\n Filter employees by their title by matching the employee's title against a *regular expression*.\n\n The default value of this parameter is `null`.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n\n (The base cost of calling this API endpoint with this parameter would be `10` credits.\n Each employee matched and returned would cost 3 extra credits.)\n ", - "example": "(co)?-?founder", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Limit the maximum results returned per API call.\n\n The default value of this parameter is `10`.\n\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `10`.\n ", - "example": "10", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "employment_status", - "required": false, - "description": "\n Parameter to tell the API to return past or current employees.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : lists current employees\n * `past` : lists past employees\n * `all` : lists current & past employees\n ", - "example": "current", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "sort_by", - "required": false, - "description": "\n Sort employees by recency.\n\n Valid values are:\n * `recently-joined` - Sort employees by their join date. The most recent employee is on the top of the list.\n * `recently-left` - Sort employees by their departure date. The most recent employee who had just left is on the top of this list.\n * `oldest` - Returns the oldest employees first. The oldest employee who had joined this company historically is on the top of this list.\n * `none` - The default value. Do not sort.\n\n If this parameter is supplied with a value other than `none`, will add `50` credits to the base cost of the API endpoint regardless number of results returned. It will also add an additional cost of `10` credits per employee returned.\n ", - "example": "recently-joined", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "resolve_numeric_id", - "required": false, - "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for Company Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", - "example": "false", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "url", - "required": true, - "description": "\n URL of the LinkedIn Company Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", - "example": "https://www.linkedin.com/company/microsoft", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmployeeList" - }, - "example": { - "employees": [ - { - "profile_url": "https://www.linkedin.com/in/williamhgates", - "profile": { - "public_identifier": "williamhgates", - "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "background_cover_image_url": null, - "first_name": "Bill", - "last_name": "Gates", - "full_name": "Bill Gates", - "occupation": "Co-chair at Bill & Melinda Gates Foundation", - "headline": "Co-chair, Bill & Melinda Gates Foundation", - "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "company": "Breakthrough Energy ", - "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", - "title": "Founder", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2000 - }, - "ends_at": null, - "company": "Bill & Melinda Gates Foundation", - "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", - "title": "Co-chair", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 1973 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 1975 - }, - "field_of_study": null, - "degree_name": null, - "school": "Harvard University", - "school_linkedin_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw" - }, - { - "starts_at": null, - "ends_at": null, - "field_of_study": null, - "degree_name": null, - "school": "Lakeside School", - "school_linkedin_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ" - } - ], - "languages": [], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [], - "connections": null, - "people_also_viewed": [], - "recommendations": [], - "activities": [], - "similarly_named_profiles": [], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null - } - } - }, - "description": "List of employees" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Company API"], - "operationId": "Employee Listing Endpoint" - }, - "summary": "Employee Listing Endpoint" - }, - "/api/linkedin/company/employees/count": { - "get": { - "description": "Cost: 1 credit / successful request.\nGet a number of total employees of a Company.\n\nGet an employee count of this company from various sources.", - "parameters": [ - { - "in": "query", - "name": "use_cache", - "required": false, - "description": "\n `if-present`: The default behavior. Fetches data from LinkDB cache regardless of age of profile.\n\n `if-recent`: API will make a best effort to return a fresh data no older than 29 days. Costs an extra 1 credit on top of the cost of the base endpoint.\n ", - "example": "if-present", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_employee_count", - "required": false, - "description": "\n Option to include a scraped employee count value from the target company's LinkedIn profile.\n\n Valid values are `include` and `exclude`:\n\n * `exclude` (default) : To exclude the scraped employee count.\n * `include` : To include the scraped employee count.\n\n Costs an extra `1` credit on top of the base cost of the endpoint.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "employment_status", - "required": false, - "description": "\n Parameter to tell the API to filter past or current employees.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : count current employees\n * `past` : count past employees\n * `all` : count current & past employees\n ", - "example": "current", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "url", - "required": true, - "description": "\n URL of the LinkedIn Company Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n ", - "example": "https://www.linkedin.com/company/apple/", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmployeeCount" - }, - "example": { - "linkedin_employee_count": 529274, - "linkdb_employee_count": 3 - } - } - }, - "description": "Number of employees in a company" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Company API"], - "operationId": "Employee Count Endpoint" - }, - "summary": "Employee Count Endpoint" - }, - "/api/linkedin/person/profile-picture": { - "get": { - "description": "Cost: 0 credit / successful request.\nGet the profile picture of a person.\n\nProfile pictures are served from cached people profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb).\nIf the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), then the API will return a `404` status code.", - "parameters": [ - { - "in": "query", - "name": "linkedin_person_profile_url", - "required": true, - "description": "\n LinkedIn Profile URL of the person that you are trying to get the profile picture of.\n ", - "example": "https://www.linkedin.com/in/williamhgates/", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProfilePicture" - }, - "example": { - "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" - } - } - }, - "description": "Profile picture of a person" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["People API"], - "operationId": "Person Profile Picture Endpoint" - }, - "summary": "Person Profile Picture Endpoint" - }, - "/api/linkedin/company/profile-picture": { - "get": { - "description": "Cost: 0 credit / successful request.\nGet the profile picture of a company.\n\nProfile pictures are served from cached company profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb).\nIf the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), then the API will return a `404` status code.", - "parameters": [ - { - "in": "query", - "name": "linkedin_company_profile_url", - "required": true, - "description": "\n LinkedIn Profile URL of the company that you are trying to get the profile picture of.\n ", - "example": "https://www.linkedin.com/company/apple/", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProfilePicture" - }, - "example": { - "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" - } - } - }, - "description": "Profile picture of a company" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Company API"], - "operationId": "Company Profile Picture Endpoint" - }, - "summary": "Company Profile Picture Endpoint" - }, - "/api/linkedin/profile/resolve": { - "get": { - "description": "Cost: 2 credits / successful request.\nLook up a person with a name and company information.", - "parameters": [ - { - "in": "query", - "name": "similarity_checks", - "required": false, - "description": "\n Controls whether the API endpoint performs\n similarity comparisons between the input parameters\n and the results or simply returns the closest match.\n For instance, if you are searching for a person named\n \"Ben Chad\", and the closest result we have is \"Chavvy\n Plum\", our similarity checks will discard the obviously\n incorrect result and return `null` instead of a false\n positive.\n\n Include similarity checks to eliminate false positives.\n However, be aware that this might yield fewer results\n as false positives are discarded. Credits will still be\n deducted even if we return `null`.\n\n You can choose to skip similarity checks, in which\n case no credits will be charged if we return `null`.\n\n This parameter accepts the following values:\n * `include` (default) - Perform similarity checks and\n discard false positives. Credits will be deducted even\n if we return null .\n * `skip` - Bypass similarity checks. No credits will be\n deducted if no results are returned.\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profile", - "required": false, - "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [People Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "company_domain", - "required": true, - "description": "Company name or domain", - "example": "gatesfoundation.org", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "location", - "required": false, - "description": "\n The location of this user.\n\n Name of country, city or state.\n ", - "example": "Seattle", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "title", - "required": false, - "description": "Title that user is holding at his/her current job", - "example": "Co-chair", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "last_name", - "required": false, - "description": "Last name of the user", - "example": "Gates", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "first_name", - "required": true, - "description": "First name of the user", - "example": "Bill", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PersonLookupUrlEnrichResult" - }, - "example": { - "url": "https://www.linkedin.com/in/senatormarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - } - }, - "description": "LinkedIn (Person) Profile URL" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["People API"], - "operationId": "Person Lookup Endpoint" - }, - "summary": "Person Lookup Endpoint" - }, - "/api/v2/linkedin/company/job": { - "get": { - "description": "Cost: 2 credits / successful request.\nList jobs posted by a company on LinkedIn", - "parameters": [ - { - "in": "query", - "name": "job_type", - "required": false, - "description": "\n The nature of the job.\n It accepts the following 7 case-insensitive values only:\n - `full-time`\n - `part-time`\n - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n - `anything` (default)\n ", - "example": "anything", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "experience_level", - "required": false, - "description": "\n The experience level needed for the job.\n It accepts the following 6 case-insensitive values only:\n - `internship`\n - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n - `anything` (default)\n ", - "example": "entry_level", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "when", - "required": false, - "description": "\n The time when the job is posted,\n It accepts the following case-insensitive values only:\n - `yesterday`\n - `past-week`\n - `past-month`\n - `anytime` (default)\n ", - "example": "past-month", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "flexibility", - "required": false, - "description": "\n The flexibility of the job.\n It accepts the following 3 case insensitive values only:\n - `remote`\n - `on-site`\n - `hybrid`\n - `anything` (default)\n ", - "example": "remote", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "geo_id", - "required": false, - "description": "\n The `geo_id` of the location to search for.\n For example, `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article) as to how you may be able to match regions to `geo_id` input values.\n ", - "example": "92000000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "keyword", - "required": false, - "description": "\n The keyword to search for.\n ", - "example": "software engineer", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "search_id", - "required": false, - "description": "\n The `search_id` of the company on LinkedIn.\n You can get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n ", - "example": "1035", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobListPage" - }, - "example": { - "job": [ - { - "company": "Microsoft", - "company_url": "https://www.linkedin.com/company/microsoft", - "job_title": "Product Management: Intern Opportunities for University Students", - "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", - "list_date": "2022-10-09", - "location": "New York, NY" - }, - { - "company": "Microsoft", - "company_url": "https://www.linkedin.com/company/microsoft", - "job_title": "Content Strategist", - "job_url": "https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764", - "list_date": "2022-10-21", - "location": "United States" - } - ], - "next_page_no": 1, - "next_page_api_url": "http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035", - "previous_page_no": null, - "previous_page_api_url": null - } - } - }, - "description": "List of open job position" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Jobs API"], - "operationId": "Job Search Endpoint" - }, - "summary": "Job Search Endpoint" - }, - "/api/v2/linkedin/company/job/count": { - "get": { - "description": "Cost: 2 credits / successful request.\nCount number of jobs posted by a company on LinkedIn", - "parameters": [ - { - "in": "query", - "name": "job_type", - "required": false, - "description": "\n The nature of the job.\n It accepts the following 7 case-insensitive values only:\n - `full-time`\n - `part-time`\n - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n - `anything` (default)\n ", - "example": "entry_level", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "experience_level", - "required": false, - "description": "\n The experience level needed for the job.\n It accepts the following 6 case-insensitive values only:\n - `internship`\n - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n - `anything` (default)\n ", - "example": "entry_level", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "when", - "required": false, - "description": "\n The time when the job is posted,\n It accepts the following case-insensitive values only:\n - `yesterday`\n - `past-week`\n - `past-month`\n - `anytime` (default)\n ", - "example": "past-month", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "flexibility", - "required": false, - "description": "\n The flexibility of the job.\n It accepts the following 3 case insensitive values only:\n - `remote`\n - `on-site`\n - `hybrid`\n - `anything` (default)\n ", - "example": "remote", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "geo_id", - "required": false, - "description": "\n The `geo_id` of the location to search for.\n For example, `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article) as to how you may be able to match regions to `geo_id` input values.\n ", - "example": "92000000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "keyword", - "required": false, - "description": "\n The keyword to search for.\n ", - "example": "software engineer", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "search_id", - "required": false, - "description": "\n The `search_id` of the company on LinkedIn.\n You can get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n ", - "example": "1035", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobListCount" - }, - "example": { - "count": 887622 - } - } - }, - "description": "Count number of jobs posted" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Jobs API"], - "operationId": "Jobs Listing Count Endpoint" - }, - "summary": "Jobs Listing Count Endpoint" - }, - "/api/find/company/role/": { - "get": { - "description": "Cost: 3 credits / successful request.\nReturns the profile of a person who most closely matches a specified role\nin a company. For instance, it can be used to identify the \"CTO\" of\n\"Apple\". The endpoint yields a single result that represents the closest\nmatch. For a detailed comparison between this API endpoint and the\n[Employee Search Endpoint](#company-api-employee-search-endpoint)\nor the [Person Search Endpoint](#search-api-person-search-endpoint),\nrefer to [this article](\n https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).", - "parameters": [ - { - "in": "query", - "name": "enrich_profile", - "required": false, - "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [Person Profile Endpoint](#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "role", - "required": true, - "description": "Role of the profile that you are lookin up", - "example": "ceo", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "company_name", - "required": true, - "description": "Name of the company that you are searching for", - "example": "nubela", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleSearchEnrichedResult" - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - } - }, - "description": "LinkedIn (Person) Profile URL" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["People API"], - "operationId": "Role Lookup Endpoint" - }, - "summary": "Role Lookup Endpoint" - }, - "/api/linkedin/company/resolve": { - "get": { - "description": "Cost: 2 credits / successful request.\nResolve Company LinkedIn Profile from company name,\n domain name and location.", - "parameters": [ - { - "in": "query", - "name": "company_location", - "required": false, - "description": "\n The location / region of company.\n ISO 3166-1 alpha-2 codes\n ", - "example": "sg", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "company_domain", - "required": false, - "description": "Company website or Company domain\nRequires either `company_domain` or `company_name`", - "example": "accenture.com", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "company_name", - "required": false, - "description": "Company Name\nRequires either `company_domain` or `company_name`", - "example": "Accenture", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profile", - "required": false, - "description": "\n Enrich the result with a cached profile of the lookup result.\n\n The valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data\n * `enrich`: enriches the result with cached profile data\n\n Calling this API endpoint with this parameter would add 1 credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n please chain this API call with the [Company Profile Endpoint](https://nubela.co/proxycurl/docs#company-api-company-profile-endpoint) with the `use_cache=if-recent` parameter.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CompanyUrlEnrichResult" - }, - "example": { - "url": "https://www.linkedin.com/company/accenture", - "profile": { - "linkedin_internal_id": "1033", - "description": "Accenture is a global professional services company with leading capabilities in digital, cloud, and security. Combining unmatched experience and specialized skills across more than 40 industries, we offer Strategy and Consulting, Technology and Operations Services, and Accenture Song—all powered by the world’s largest network of Advanced Technology and Intelligent Operations centers. \n\nOur people deliver on the promise of technology and human ingenuity every day, serving clients in more than 120 countries. We embrace the power of change to create value and shared success for our clients, people, shareholders, partners, and communities. \n\nVisit us at accenture.com.", - "website": "http://www.accenture.com", - "industry": "Business Consulting and Services", - "company_size": [10001, null], - "company_size_on_linkedin": 541251, - "hq": { - "country": "IE", - "city": "Dublin 2", - "postal_code": null, - "line_1": "Grand Canal Harbour", - "is_hq": true, - "state": null - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": [ - "Management Consulting", - "Systems Integration and Technology" - ], - "locations": [ - { - "country": "IE", - "city": "Dublin 2", - "postal_code": null, - "line_1": "Grand Canal Harbour", - "is_hq": true, - "state": null - }, - { - "country": "US", - "city": "San Francisco", - "postal_code": "94105", - "line_1": "415 Mission Street Floor 31-34", - "is_hq": false, - "state": "California" - } - ], - "name": "Accenture", - "tagline": null, - "universal_name_id": "accenture", - "profile_pic_url": "https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY", - "background_cover_image_url": "https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0", - "search_id": "1033", - "similar_companies": [ - { - "name": "Deloitte", - "link": "https://www.linkedin.com/company/deloitte", - "industry": "Business Consulting and Services", - "location": null - }, - { - "name": "Tata Consultancy Services", - "link": "https://in.linkedin.com/company/tata-consultancy-services", - "industry": "IT Services and IT Consulting", - "location": "Mumbai, Maharashtra" - } - ], - "affiliated_companies": [ - { - "name": "Accenture in India", - "link": "https://in.linkedin.com/company/accentureindia", - "industry": "IT Services and IT Consulting", - "location": "Bengaluru, Karnatka" - }, - { - "name": "Accenture Brasil", - "link": "https://br.linkedin.com/company/accenturebrasil", - "industry": "IT Services and IT Consulting", - "location": "São Paulo, São Paulo" - } - ], - "updates": [ - { - "article_link": null, - "image": null, - "posted_on": { - "day": 25, - "month": 10, - "year": 2023 - }, - "text": "Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4", - "total_likes": 325 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA", - "posted_on": { - "day": 25, - "month": 10, - "year": 2023 - }, - "text": "The ability to learn new things, without forgetting those that came before, is a huge differentiator between the #AI we're familiar with, and the #GenerativeAI powered by foundation models that we're seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n \n#TechVision2023", - "total_likes": 541 - } - ], - "follower_count": 11125167, - "acquisitions": null, - "exit_data": null, - "extra": null, - "funding_data": null, - "categories": null - }, - "last_updated": "2023-10-26T11:33:24Z" - } - } - }, - "description": "LinkedIn (Company) Profile URL" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Company API"], - "operationId": "Company Lookup Endpoint" - }, - "summary": "Company Lookup Endpoint" - }, - "/api/linkedin/company/employee/search/": { - "get": { - "description": "Cost: 10 credits / successful request.\nSearch employees of a target by their job title. This API endpoint is syntactic\nsugar for the role_search parameter under the [Employee Listing Endpoint](#company-api-employee-listing-endpoint).\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our comprehensive dataset of people\nand company profiles. For a detailed comparison between this API endpoint\nand the [Role Lookup Endpoint](#people-api-role-lookup-endpoint) or the [Person Search Endpoint](#search-api-person-search-endpoint), refer to [this article](https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).", - "parameters": [ - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Tune the maximum results returned per API call.\n The default value of this parameter is `200000`.\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `100`.\n ", - "example": "10", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_company_profile_url", - "required": true, - "description": "\n LinkedIn Profile URL of the target company.\n ", - "example": "https://www.linkedin.com/company/microsoft/", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "keyword_regex", - "required": true, - "description": "\n Job title keyword to search for in regular expression format.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n ", - "example": "ceo|cto", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "country", - "required": false, - "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", - "example": "us", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profiles", - "required": false, - "description": "\n Get the full profile of employees instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists employee's profile url\n * `enrich`: lists full profile of employees\n\n Calling this API endpoint with this parameter would add `1` credit per employee returned.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "resolve_numeric_id", - "required": false, - "description": "\n Enable support for Company Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for Company Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", - "example": "false", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmployeeList" - }, - "example": { - "employees": [ - { - "profile_url": "https://www.linkedin.com/in/satyanadella", - "profile": { - "public_identifier": "williamhgates", - "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "background_cover_image_url": null, - "first_name": "Bill", - "last_name": "Gates", - "full_name": "Bill Gates", - "occupation": "Co-chair at Bill & Melinda Gates Foundation", - "headline": "Co-chair, Bill & Melinda Gates Foundation", - "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "company": "Breakthrough Energy ", - "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", - "title": "Founder", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2000 - }, - "ends_at": null, - "company": "Bill & Melinda Gates Foundation", - "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", - "title": "Co-chair", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 1973 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 1975 - }, - "field_of_study": null, - "degree_name": null, - "school": "Harvard University", - "school_linkedin_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw" - }, - { - "starts_at": null, - "ends_at": null, - "field_of_study": null, - "degree_name": null, - "school": "Lakeside School", - "school_linkedin_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ" - } - ], - "languages": [], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [], - "connections": null, - "people_also_viewed": [], - "recommendations": [], - "activities": [], - "similarly_named_profiles": [], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null - } - } - }, - "description": "List of employees" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Company API"], - "operationId": "Employee Search Endpoint" - }, - "summary": "Employee Search Endpoint" - }, - "/api/linkedin/school/students/": { - "get": { - "description": "Cost: 3 credits / student returned.\nGet a list of students of a school or university.", - "parameters": [ - { - "in": "query", - "name": "country", - "required": false, - "description": "\n Limit the result set to the country locality of the profile. For example, set the parameter of `country=us` if you only want profiles from the US.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs an extra `3` credit per result returned.\n ", - "example": "us", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profiles", - "required": false, - "description": "\n Get the full profile of students instead of only their profile urls.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n \n * `skip` (default): lists student's profile url\n * `enrich`: lists full profile of students\n\n *Calling this API endpoint with this parameter would add `1` credit per student returned.*\n ", - "example": "enrich", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "search_keyword", - "required": false, - "description": "\n Filter students by their major by matching the student's major against a *regular expression*.\n\n The default value of this parameter is `null`.\n\n The accepted value for this parameter is a **case-insensitive** regular expression.\n\n (The base cost of calling this API endpoint with this parameter would be `10` credits.\n Each student matched and returned would cost `6` credits per student returned.)\n ", - "example": "computer*|cs", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Limit the maximum results returned per API call.\n\n The default value of this parameter is `10`.\n\n Accepted values for this parameter is an integer ranging from `1` to `200000`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10` and the default value is `10`.\n ", - "example": "10", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "student_status", - "required": false, - "description": "\n Parameter to tell the API to return past or current students.\n\n Valid values are `current`, `past`, and `all`:\n\n * `current` (default) : lists current students\n * `past` : lists past students\n * `all` : lists current & past students\n ", - "example": "current", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "sort_by", - "required": false, - "description": "\n Sort students by matriculation or graduation dates.\n\n Valid values are:\n * `recently-matriculated` - Sort students by their matriculation date. Students who had had most recently started school is on the top of the list.\n * `recently-graduated` - Sort students by their graduation date. The most recently graduated student is on the top of this list.\n * `none` - The default value. Do not sort.\n\n If this parameter is supplied with a value other than `none`, will add `50` credits to the base cost of the API endpoint regardless number of results returned. It will also add an additional cost of `10` credits per student returned.\n ", - "example": "recently-matriculated", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "resolve_numeric_id", - "required": false, - "description": "\n Enable support for School Profile URLs with numerical IDs that you most frequently fetch from Sales Navigator. \n We achieve this by resolving numerical IDs into vanity IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example, we will turn `https://www.linkedin.com/school/1234567890` to `https://www.linkedin.com/school/acme-corp` -- for which the API endpoint only supports the latter.\n \n This parameter accepts the following values:\n - `false` (default value) - Will not resolve numerical IDs.\n - `true` - Enable support for School Profile URLs with numerical IDs. \n Costs an extra `2` credit on top of the base cost of the endpoint.\n ", - "example": "false", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_school_url", - "required": true, - "description": "\n URL of the LinkedIn School Profile to target.\n\n URL should be in the format of `https://www.linkedin.com/school/`\n ", - "example": "https://www.linkedin.com/school/stanford-university", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/StudentList" - }, - "example": { - "students": [ - { - "profile_url": "https://www.linkedin.com/in/johnrmarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null - } - } - }, - "description": "List of students" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["School API"], - "operationId": "Student Listing Endpoint" - }, - "summary": "Student Listing Endpoint" - }, - "/api/linkedin/profile/resolve/email": { - "get": { - "description": "Cost: 3 credits / successful request.\nResolve social media profiles correlated from an email address.\nThis API endpoint works with both personal and work emails.", - "parameters": [ - { - "in": "query", - "name": "email", - "required": false, - "description": "Email address of the user you want to look up.\nyes", - "example": "danial@nubela.co", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "lookup_depth", - "required": false, - "description": "\n This parameter describes the depth options for our API lookup function. This endpoint can execute either a superficial or a deep lookup.\n\n A **superficial lookup** involves comparing the provided email with entries in our database. This approach tends to yield fewer results and is typically less effective for work-related email addresses. However, it does not consume any credits if no results are returned.\n\n On the other hand, a **deep lookup** extends beyond our database to utilize advanced heuristics and identify the individual associated with a given email. This method is particularly recommended for work emails.\n\n Please note the following valid values for the depth of the lookup:\n\n * `superficial`: No credits are consumed if no results are found.\n * `deep` (default): Credits are used regardless of whether any results are returned.\n \nyes", - "example": "deep", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profile", - "required": false, - "description": "\n Enrich the result with a cached LinkedIn profile of the LinkedIn Profile URL result (if any).\n\n Valid values are:\n\n * `skip` (default): do not enrich the results with cached profile data.\n * `enrich`: enriches the result with cached profile data. \n\n Calling this API endpoint with this parameter would add `1` additional credit.\n\n If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/), please chain this API call with the `linkedin_profile_url` result with the [Person Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint) with the `use_cache=if-recent` parameter.\n \nno", - "example": "enrich", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReverseEmailUrlEnrichResult" - }, - "example": { - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - } - }, - "description": "Twitter, Facebook, and LinkedIn (Person) Profile URL" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Contact API"], - "operationId": "Reverse Email Lookup Endpoint" - }, - "summary": "Reverse Email Lookup Endpoint" - }, - "/api/resolve/phone": { - "get": { - "description": "Cost: 3 credits / successful request.\nFind social media profiles from a contact phone number.", - "parameters": [ - { - "in": "query", - "name": "phone_number", - "required": true, - "description": "[E.164 formatted](https://www.twilio.com/docs/glossary/what-e164) phone number of the person you want to identify social media profiles of.", - "example": "+14155552671", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReverseContactNumberResult" - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", - "twitter_profile_url": "https://www.twitter.com/proxycurl", - "facebook_profile_url": "https://www.facebook.com/zuck" - } - } - }, - "description": "Twitter, Facebook, and LinkedIn Profile URL" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Contact API"], - "operationId": "Reverse Contact Number Lookup Endpoint" - }, - "summary": "Reverse Contact Number Lookup Endpoint" - }, - "/api/linkedin/profile/email": { - "get": { - "description": "Cost: 3 credits / request.\nLookup work email address of a LinkedIn Person Profile.\n\nEmail addresses returned are verified to not be role-based or catch-all emails. Email addresses\nreturned by our API endpoint come with a 95+% deliverability guarantee\n\n**Endpoint behavior**\n\n*This endpoint* **_may not_** *return results immediately.*\n\nIf you provided a webhook in your request parameter, our application will call your webhook with\nthe result once. See `Webhook request` below.", - "parameters": [ - { - "in": "query", - "name": "linkedin_profile_url", - "required": true, - "description": "\n Linkedin Profile URL of the person you want to\n extract work email address from.\n ", - "example": "https://sg.linkedin.com/in/williamhgates", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "callback_url", - "required": false, - "description": "\n Webhook to notify your application when\n the request has finished processing.\n ", - "example": "https://webhook.site/29e12f17-d5a2-400a-9d08-42ee9d83600a", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExtractionEmailResult" - }, - "example": { - "email_queue_count": 0 - } - } - }, - "description": "Work Email Address" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Contact API"], - "operationId": "Work Email Lookup Endpoint" - }, - "summary": "Work Email Lookup Endpoint" - }, - "/api/linkedin/job": { - "get": { - "description": "Cost: 2 credits / successful request.\nGet structured data of a LinkedIn Job Profile", - "parameters": [ - { - "in": "query", - "name": "url", - "required": true, - "description": "\n URL of the LinkedIn Job Profile to target.\n\n URL should be in the format of\n `https://www.linkedin.com/jobs/view/`.\n [Jobs Listing Endpoint](#jobs-api-jobs-listing-endpoint)\n can be used to retrieve a job URL.\n ", - "example": "https://www.linkedin.com/jobs/view/3667167926/", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobProfile" - }, - "example": { - "linkedin_internal_id": "content-strategist-at-microsoft-3257696537", - "job_description": "The Global Demand Center (GDC) within the Cloud Marketing group is leading the marketing transformation of Microsoft’s largest and fastest growing commercial businesses. Our always-on integrated marketing programs work to nurture and acquire new customers across segments, targeting business and technical audiences across our commercial cloud portfolio, with programs available in 42 markets and 30 languages. The GDC team is modernizing and integrating these channels through advanced analytics, marketing automation, and digital marketing. We are on a mission to drive market share, consumption, and consistent double-digit+ revenue growth. Content is the fuel that drives the digitally connected customer journeys at the core of the GDC engine, and we’re looking for a skilled, self-motivated, data-driven content strategist to build the content that motivates customers to take action. The Content Strategist will develop and execute content strategies for the ever-critical security space. You will be accountable for understanding the business priorities, getting close to our target audiences, defining the content journeys that attract, nurture, inspire, and retain customers, and manage quality execution and delivery of the content. You will work closely with your counterparts, the integrated marketing strategists, to drive business outcomes. Your network will include product marketers, integrated marketers, relationship marketers, sales, engineering, and agency partners to develop and execute on your plan. Our team: The Lifecycle Programs team is a fast-paced digital marketing organization. We put a focus on getting things done, simplifying anything and everything, and having fun while doing it. We all believe in connecting with customers at scale, supporting them at each stage of the customer journey, from early awareness and consideration, through onboarding and post purchase engagement. You will be in the middle of it all helping to identify the right content that delivers what customers want—where they want it, when they want it, and how they want it. \n \n**_Responsibilities \n_**\n * Define content journeys for Security and IT professionals across industries.\n * Build the resulting content strategies designed to accelerate the customer through the lifecycle.\n * Create a content plan to address the insights in the customer journey and strategy, ensuring the content is aligned to what the customer needs at each stage.\n * Deliver the content through our internal Studio or with select agency partners.\n * Be a customer advocate. Relentlessly champion the customer and the experiences they have with the content you create—how they find it, how they consume it, how they use it to make decisions.\n * Leverage data and market insights for decision making including content optimization and new concept development. \n\n\n**_Qualifications \n \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 1+ year(s) integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 3+ years integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience.\n * Strong customer centric mindset and demonstrated ability to put the customer first.\n * Clear and persuasive communication skills, both written and verbal.\n * Experience with program performance tracking and communications.\n * Recognized as a self-starter with a bias for action.\n * Creative problem-solving skills, and a growth mindset approach\n * Experience managing across highly matrixed organizations, often with competing priorities.\n * A demonstrated track record of business impact through content\n * Well-versed in digital marketing best practices, including journey mapping.\n * Understanding of content disciplines, including SEO, content strategy, and execution.\n * Preferred, but not required: experience with commercial technology sales process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The typical base pay range for this role across the U.S. is USD $80,900 - $162,200 per year. There is a different range applicable to specific work locations, within the San Francisco Bay area and New York City metropolitan area, and the base pay range for this role in those locations is USD $105,300 - $176,900 per year. \n \nMicrosoft has different base pay ranges for different work locations within the United States, which allows us to pay employees competitively and consistently in different geographic markets (see below). The range above reflects the potential base pay across the U.S. for this role (except as noted below); the applicable base pay range will depend on what ultimately is determined to be the candidate’s primary work location. Individual base pay depends on various factors, in addition to primary work location, such as complexity and responsibility of role, job duties/requirements, and relevant experience and skills. Base pay ranges are reviewed and typically updated each year. Offers are made within the base pay range applicable at the time. \n \nAt Microsoft certain roles are eligible for additional rewards, including merit increases, annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed here may vary depending on the nature of employment with Microsoft and the country work location. U.S.-based employees have access to healthcare benefits, a 401(k) plan and company match, short-term and long-term disability coverage, basic life insurance, wellbeing benefits, paid vacation time, paid sick and mental health time, and several paid holidays, among others. \n \nOur commitment to pay equity \n \nWe are committed to the principle of pay equity – paying employees equitably for substantially similar work. To learn more about pay equity and our other commitments to increase representation and strengthen our culture of inclusion, check out our annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page displays the role for which the base pay ranges apply – Integrated Marketing IC3. The way we define roles includes two things: discipline (the type of work) and career stage (scope and complexity). The career stage has two parts – the first identifies whether the role is a manager (M), an individual contributor (IC), an admin-technician-retail (ATR) job, or an intern. The second part identifies the relative seniority of the role – a higher number (or later letter alphabetically in the case of ATR) indicates greater scope and complexity. \n \nMicrosoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. If you need assistance and/or a reasonable accommodation due to a disability during the application or the recruiting process, please send a request via the Accommodation request form. \n \nThe salary for this role in the state of Colorado is between $108,200 and $162,200. \n \nAt Microsoft, certain roles are eligible for additional rewards, including annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work. \n", - "apply_url": "https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite", - "title": "Content Strategist", - "location": { - "country": "United States", - "region": "Hawaii", - "city": null, - "postal_code": null, - "latitude": null, - "longitude": null, - "street": null - }, - "company": { - "name": "Microsoft", - "url": "https://www.linkedin.com/company/microsoft", - "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" - }, - "seniority_level": "Mid-Senior level", - "industry": [ - "IT Services and IT Consulting, Computer Hardware Manufacturing, and Software Development" - ], - "employment_type": "Full-time", - "job_functions": ["Marketing"], - "total_applicants": 200 - } - } - }, - "description": "Detailed job data" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Jobs API"], - "operationId": "Job Profile Endpoint" - }, - "summary": "Job Profile Endpoint" - }, - "/api/followers": { - "get": { - "description": "Cost: 10 credits / result for users on an annual subscription or Enterprise plan.\nGet a list of individual followers of a company.", - "parameters": [ - { - "in": "query", - "name": "linkedin_company_profile_url", - "required": false, - "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of followers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://www.linkedin.com/company/henry-schein", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of followers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://x.com/henryschein", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Limit the maximum results of followers returned per API call.\n\n The default value of this parameter is 10.\n\n Accepted values for this parameter is an integer ranging from 0 to 1000.\n ", - "example": "10", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FollowerList" - }, - "example": { - "followers": [ - { - "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", - "twitter_profile_url": "https://www.x.com/agilio_software", - "email": null - }, - { - "linkedin_profile_url": "https://www.linkedin.com/in/air-techniques", - "twitter_profile_url": "https://www.x.com/airtechniques", - "email": null - } - ], - "next_page": null - } - } - }, - "description": "A list of individual followers of the company" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Customer API `EXPERIMENTAL`"], - "operationId": "Follower Listing Endpoint `EXPERIMENTAL`" - }, - "summary": "Follower Listing Endpoint `EXPERIMENTAL`" - }, - "/api/followers/count": { - "get": { - "description": "Cost: 1 credit / result for users on an annual subscription or Enterprise plan.\nGet the count of followers of a company.", - "parameters": [ - { - "in": "query", - "name": "linkedin_company_profile_url", - "required": false, - "description": "\n The LinkedIn Profile URL of the company from which you want to get a list of followers of.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://www.linkedin.com/company/henry-schein", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "\n The Twitter/X Profile URL belonging to the company that you want to get a list of followers of.\n\n URL should be in the format of `https://x.com/`\n \n\n Yes (Include only one of: `linkedin_company_profile_url` or `twitter_profile_url`)\n ", - "example": "https://x.com/henryschein", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FollowerListCount" - }, - "example": { - "follower_count": 74 - } - } - }, - "description": "Count individuals of that company's followers" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Customer API `EXPERIMENTAL`"], - "operationId": "Follower Listing Count Endpoint `EXPERIMENTAL`" - }, - "summary": "Follower Listing Count Endpoint `EXPERIMENTAL`" - }, - "/api/v2/search/company": { - "get": { - "description": "Cost: 3 credits / result returned.\nSearch for companies that meet a set of criteria within\n our exhaustive dataset of company profiles.\n\n This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our exhaustive dataset of company profiles.\n\n This API endpoint can return at most of 10,000 results per search.\n\n Each search expression for a parameter is limited to a maximum of 255 characters.", - "parameters": [ - { - "in": "query", - "name": "country", - "required": false, - "description": "\n Filter companies with an office based in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", - "example": "US", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "region", - "required": false, - "description": "\n Filter companies with an office based in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", - "example": "United States", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "city", - "required": false, - "description": "\n Filter companies based in cities matching the provided search expression.\n ", - "example": "new AND york", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "type", - "required": false, - "description": "\n Filter companies of the provided LinkedIn type.\n\n Possible values:\n\n * `EDUCATIONAL`: Educational Institution\n * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT` : Nonprofit\n * `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY` : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED` : Sole Proprietorship\n ", - "example": "PRIVATELY_HELD", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "follower_count_min", - "required": false, - "description": "\n Filter companies with a LinkedIn follower count **more than** this value.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "follower_count_max", - "required": false, - "description": "\n Filter companies with a LinkedIn follower count **less than** this value.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "name", - "required": false, - "description": "\n Filter companies with a name matching the provided search expression.\n ", - "example": "google OR apple", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "industry", - "required": false, - "description": "\n Filter companies belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n ", - "example": "technology", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "employee_count_max", - "required": false, - "description": "\n Filter companies with **at most** this many employees.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "employee_count_min", - "required": false, - "description": "\n Filter companies with **at least** this many employees.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "description", - "required": false, - "description": "\n Filter companies with a description matching the provided search expression.\n ", - "example": "medical device", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "founded_after_year", - "required": false, - "description": "\n Filter companies founded **after** this year.\n ", - "example": "1999", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "founded_before_year", - "required": false, - "description": "\n Filter companies founded **before** this year.\n ", - "example": "1999", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "funding_amount_max", - "required": false, - "description": "\n Filter companies that have raised **at most** this much (USD) funding amount.\n ", - "example": "1000000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "funding_amount_min", - "required": false, - "description": "\n Filter companies that have raised **at least** this much (USD) funding amount.\n ", - "example": "1000000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "funding_raised_after", - "required": false, - "description": "\n Filter companies that have raised funding **after** this date.\n ", - "example": "2019-12-30", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "funding_raised_before", - "required": false, - "description": "\n Filter companies that have raised funding **before** this date.\n ", - "example": "2019-12-30", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "public_identifier_in_list", - "required": false, - "description": "\n A list of public identifiers (the identifying portion of the company’s profile URL).\n The target company’s identifier must be a member of this list.\n ", - "example": "stripe,amazon", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "public_identifier_not_in_list", - "required": false, - "description": "\n A list of public identifiers (the identifying portion of the company’s profile URL).\n The target company’s identifier must **not** be a member of this list.\n ", - "example": "stripe,amazon", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Tune the maximum results returned per API call.\n\n The default value of this parameter is 100.\n\n Accepted values for this parameter is an integer ranging from 1 to 100.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10`.\n ", - "example": "10", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profiles", - "required": false, - "description": "\n Get the company's complete profile data rather than just the URLs to their LinkedIn profiles.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n\n - skip (default): lists company's profile url\n - enrich: include company's profile data in the list\n\n Calling this API endpoint with this parameter would add 1 credit per result returned.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CompanySearchResult" - }, - "example": { - "results": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple/", - "profile": { - "linkedin_internal_id": "1441", - "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", - "website": "https://goo.gle/3m1IN7m", - "industry": "Software Development", - "company_size": [10001, null], - "company_size_on_linkedin": 319856, - "hq": { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": ["search", "ads"], - "locations": [ - { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - { - "country": "US", - "city": "New York", - "postal_code": "10011", - "line_1": "111 8th Ave", - "is_hq": false, - "state": "NY" - } - ], - "name": "Google", - "tagline": null, - "universal_name_id": "google", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", - "search_id": "1441", - "similar_companies": [ - { - "name": "Amazon", - "link": "https://www.linkedin.com/company/amazon", - "industry": "Software Development", - "location": "Seattle, WA" - }, - { - "name": "Microsoft", - "link": "https://www.linkedin.com/company/microsoft", - "industry": "Software Development", - "location": "Redmond, Washington" - } - ], - "affiliated_companies": [ - { - "name": "YouTube", - "link": "https://www.linkedin.com/company/youtube", - "industry": "Software Development", - "location": "San Bruno, CA" - }, - { - "name": "Google Cloud", - "link": "https://www.linkedin.com/showcase/google-cloud", - "industry": "Software Development", - "location": "Mountain View, California" - } - ], - "updates": [ - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", - "posted_on": { - "day": 13, - "month": 9, - "year": 2022 - }, - "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", - "total_likes": 4267 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", - "posted_on": null, - "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", - "total_likes": 397 - } - ], - "follower_count": 27472792 - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null, - "total_result_count": 1 - } - } - }, - "description": "List of companies" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Search API"], - "operationId": "Company Search Endpoint" - }, - "summary": "Company Search Endpoint" - }, - "/api/v2/search/person/": { - "get": { - "description": "Cost: 3 credits / result returned.\nSearch for people who meet a set of criteria within our exhaustive dataset of people profiles.\n\nThis API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), our exhaustive dataset of people and company profiles.\n\nThis API endpoint can return at most 10,000 results per search.\n\nEach search expression for a parameter is limited to a maximum of 255 characters.", - "parameters": [ - { - "in": "query", - "name": "country", - "required": true, - "description": "\n Filter people located in this country.\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", - "example": "US", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "first_name", - "required": false, - "description": "\n Filter people whose first names match the provided search expression.\n ", - "example": "Sarah", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "last_name", - "required": false, - "description": "\n Filter people whose last names match the provided search expression.\n ", - "example": "Jackson OR Johnson", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "education_field_of_study", - "required": false, - "description": "\n Filter people with a field of study matching the provided search expression, based on education history.\n ", - "example": "computer science", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "education_degree_name", - "required": false, - "description": "\n Filter people who earned a degree matching the provided search expression, based on education history.\n ", - "example": "MBA", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "education_school_name", - "required": false, - "description": "\n Filter people who have attended a school whose name matches the provided search expression, based on education history.\n ", - "example": "Caltech OR Massachusetts Institute of Technology", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "education_school_linkedin_profile_url", - "required": false, - "description": "\n Filter people who have attended a school with a specific LinkedIn profile URL, based on education history.\n ", - "example": "https://www.linkedin.com/school/national-university-of-singapore/", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_role_title", - "required": false, - "description": "\n Filter people who are **currently** working as a role whose title matches the provided search expression. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n ", - "example": "founder", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "past_role_title", - "required": false, - "description": "\n Filter people who have **in the past** worked as a role whose title matches the provided search expression.\n ", - "example": "founder", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_role_before", - "required": false, - "description": "\n Filter people who started their current role **before** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n\n This parameter takes a ISO8601 date. Default value of this parameter is `null`.\n ", - "example": "2019-12-30", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_role_after", - "required": false, - "description": "\n Filter people who started their current role **after** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that show a person's current job. However, keep in mind that some of these profiles may not be up-to-date, which means you might sometimes see a person's old job instead of their current job on LinkedIn.\n\n This parameter takes a ISO8601 date. Default value of this parameter is `null`.\n ", - "example": "2019-12-30", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_linkedin_profile_url", - "required": false, - "description": "\n Filter people who are **currently** working at a company represented by this LinkedIn Company Profile URL.\n\n Default value of this parameter is `null`.\n ", - "example": "https://www.linkedin.com/company/apple", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "past_company_linkedin_profile_url", - "required": false, - "description": "\n Filter people who have **in the past** worked at the company represented by this LinkedIn Company Profile URL.\n\n This parameter takes a LinkedIn Company Profile URL. Default value of this parameter is `null`.\n ", - "example": "https://www.linkedin.com/company/apple", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_job_description", - "required": false, - "description": "\n Filter people with **current** job descriptions matching the provided search expression.\n ", - "example": "education", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "past_job_description", - "required": false, - "description": "\n Filter people with **past** job descriptions matching the provided search expression.\n ", - "example": "education", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_name", - "required": false, - "description": "\n Filter people who are **currently** working at a company whose name matches the provided search expression.\n ", - "example": "Stripe OR Apple", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "past_company_name", - "required": false, - "description": "\n Filter people who **have previously** worked at a company whose name matches the provided search expression.\n ", - "example": "Stripe OR Apple", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_groups", - "required": false, - "description": "\n Filter people who are members of LinkedIn groups whose names match the provided search expression.\n ", - "example": "haskell", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "languages", - "required": false, - "description": "\n Filter people who list a language matching the provided search expression.\n ", - "example": "Mandarin OR Chinese", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "region", - "required": false, - "description": "\n Filter people located in a region matching the provided search expression.\n A “region” in this context means “state,” “province,” or similar political division, depending on what country you’re querying.\n ", - "example": "California", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "city", - "required": false, - "description": "\n Filter people located in a city matching the provided search expression.\n ", - "example": "Seattle OR Los Angeles", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "headline", - "required": false, - "description": "\n Filter people whose LinkedIn headline fields match the provided search expression.\n ", - "example": "founder", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "summary", - "required": false, - "description": "\n Filter people whose LinkedIn summary fields match the provided search expression.\n ", - "example": "founder", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "industries", - "required": false, - "description": "\n Person's inferred industry. May sometimes exist when `current_company_industry` does not, but `current_company_industry` should be preferred when it exists.\n ", - "example": "automotive", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "interests", - "required": false, - "description": "\n Filter people whose Linkedin interest fields match the provided search expression.\n ", - "example": "technology", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "skills", - "required": false, - "description": "\n Filter people whose Linkedin skill fields match the provided search expression.\n ", - "example": "accounting", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_country", - "required": false, - "description": "\n Filter people who are currently working at a company with an office based in this country.\n\n This parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n ", - "example": "us", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_region", - "required": false, - "description": "\n Filter people who are currently working at a company based in a region matching the provided search expression.\n ", - "example": "United States", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_city", - "required": false, - "description": "\n Filter people who are currently working at a company based in a city matching the provided search expression.\n ", - "example": "Seattle OR Los Angeles", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_type", - "required": false, - "description": "\n Filter people who are currently working at a company of the provided LinkedIn type.\n\n Possible values:\n\n * `EDUCATIONAL`: Educational Institution\n * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT` : Nonprofit\n * `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY` : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED` : Sole Proprietorship\n ", - "example": "NON_PROFIT", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_follower_count_min", - "required": false, - "description": "\n Filter people who are currently working at a company with a LinkedIn follower count **more than** this value.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_follower_count_max", - "required": false, - "description": "\n Filter people who are currently working at a company with a LinkedIn follower count **less than** this value.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_industry", - "required": false, - "description": "\n Filter people who are currently working at a company belonging to an `industry` that matches the provided search expression. The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n ", - "example": "higher AND education", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_employee_count_min", - "required": false, - "description": "\n Filter people who are currently working at a company with **at least** this many employees.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_employee_count_max", - "required": false, - "description": "\n Filter people who are currently working at a company with **at most** this many employees.\n ", - "example": "1000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_description", - "required": false, - "description": "\n Filter people who are currently working at a company with a description matching the provided search expression.\n ", - "example": "medical device", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_founded_after_year", - "required": false, - "description": "\n Filter people who are currently working at a company that was founded **after** this year.\n ", - "example": "1999", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_founded_before_year", - "required": false, - "description": "\n Filter people who are currently working at a company that was founded **before** this year.\n ", - "example": "1999", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_funding_amount_min", - "required": false, - "description": "\n Filter people who are currently working at a company that has raised **at least** this much (USD) funding amount.\n ", - "example": "1000000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_funding_amount_max", - "required": false, - "description": "\n Filter people who are currently working at a company that has raised **at most** this much (USD) funding amount.\n ", - "example": "1000000", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_funding_raised_after", - "required": false, - "description": "\n Filter people who are currently working at a company that has raised funding **after** this date.\n ", - "example": "2019-12-30", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "current_company_funding_raised_before", - "required": false, - "description": "\n Filter people who are currently working at a company that has raised funding **before** this date.\n ", - "example": "2019-12-30", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "public_identifier_in_list", - "required": false, - "description": "\n A list of public identifiers (the identifying portion of the person’s profile URL).\n The target person’s identifier must be a member of this list.\n ", - "example": "williamhgates,johnrmarty", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "public_identifier_not_in_list", - "required": false, - "description": "\n A list of public identifiers (the identifying portion of the person’s profile URL).\n The target person’s identifier must **not** be a member of this list.\n ", - "example": "williamhgates,johnrmarty", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n Tune the maximum results returned per API call.\n\n The default value of this parameter is `100`.\n\n Accepted values for this parameter is an integer ranging from `1` to `100`.\n\n When `enrich_profiles=enrich`, this parameter accepts value ranging from `1` to `10`.\n ", - "example": "10", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "enrich_profiles", - "required": false, - "description": "\n Get the person's complete profile data rather than just the URLs to their LinkedIn profiles.\n\n Each request respond with a streaming response of profiles.\n\n The valid values are:\n\n * `skip` (default): lists person's profile url only\n * `enrich`: include person's profile data in the list\n\n Calling this API endpoint with this parameter would add `1` credit per result returned.\n ", - "example": "enrich", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PersonSearchResult" - }, - "example": { - "results": [ - { - "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [], - "accomplishment_publications": [], - "accomplishment_honors_awards": [], - "accomplishment_patents": [], - "accomplishment_courses": [], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [], - "volunteer_work": [], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [], - "groups": [] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null, - "total_result_count": 1 - } - } - }, - "description": "LinkedIn (Person) Profile URL" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Search API"], - "operationId": "Person Search Endpoint" - }, - "summary": "Person Search Endpoint" - }, - "/api/credit-balance": { - "get": { - "description": "Cost: 0 credit / successful request.\nGet your current credit(s) balance", - "parameters": [], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreditBalance" - }, - "example": { - "credit_balance": 100000 - } - } - }, - "description": "Balance of credits" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Meta API"], - "operationId": "View Credit Balance Endpoint" - }, - "summary": "View Credit Balance Endpoint" - }, - "/api/disposable-email": { - "get": { - "description": "Cost: 0 credit / successful request.\nGiven an email address, checks if the email address belongs to a disposable email service.", - "parameters": [ - { - "in": "query", - "name": "email", - "required": true, - "description": "Email address to check", - "example": "steven@nubela.co", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DisposableEmail" - }, - "example": { - "is_disposable_email": false, - "is_free_email": false - } - } - }, - "description": "Disposable Email Check" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Contact API"], - "operationId": "Disposable Email Address Check Endpoint" - }, - "summary": "Disposable Email Address Check Endpoint" - }, - "/api/contact-api/personal-contact": { - "get": { - "description": "Cost: 1 credit / contact number returned.\nFind personal phone numbers associated with a given social media profile.", - "parameters": [ - { - "in": "query", - "name": "page_size", - "required": false, - "description": "\n This controls the maximum number of numbers returned per API call.\n It's useful for limiting credit consumption as the number of numbers\n per identity can vary. The default value is 0, meaning there's no limit\n to the number of returned results.\n ", - "example": "0", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "\n The Twitter/X Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", - "example": "https://x.com/proxycurl", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "facebook_profile_url", - "required": false, - "description": "\n The Facebook Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", - "example": "https://www.facebook.com/zuck", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_profile_url", - "required": false, - "description": "\n The LinkedIn Profile URL from which you wish to extract personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n `twitter_profile_url`, or `facebook_profile_url`)\n ", - "example": "https://linkedin.com/in/steven-goh-6738131b", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PersonalContactNumbers" - }, - "example": { - "numbers": ["+1123123123"] - } - } - }, - "description": "List of Personal Contact Numbers" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Contact API"], - "operationId": "Personal Contact Number Lookup Endpoint" - }, - "summary": "Personal Contact Number Lookup Endpoint" - }, - "/api/contact-api/personal-email": { - "get": { - "description": "Cost: 1 credit / email returned.\nFind personal email addresses associated with a given social media profile.", - "parameters": [ - { - "in": "query", - "name": "email_validation", - "required": false, - "description": "\n How to validate each email.\n \n Takes the following values:\n * `none` (default) - Do not perform email validation.\n * `fast` - Perform fast email validation (does not cost extra credit).\n * `precise` - Perform deliverability validation (costs 1 extra credit per email found).\n\n For backward-compatibility these are also accepted:\n * `include` - Equivalent to `precise`\n * `exclude` - Equivalent to `none`\n ", - "example": "include", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "page_size", - "required": false, - "description": "This controls the maximum number of emails returned per API call. It's useful for limiting credit consumption as the number of emails per identity can vary. The default value is `0`, meaning there's no limit to the number of returned results.", - "example": 0, - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "twitter_profile_url", - "required": false, - "description": "The Twitter/X Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", - "example": "https://x.com/proxycurl", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "facebook_profile_url", - "required": false, - "description": "The Facebook Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", - "example": "https://www.facebook.com/zuck", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "linkedin_profile_url", - "required": false, - "description": "The LinkedIn Profile URL from which you wish to extract personal email addresses.\nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, or `facebook_profile_url`)", - "example": "https://linkedin.com/in/steven-goh-6738131b", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PDLEmailResult" - }, - "example": { - "emails": ["random@gmail.com", "random2@yahoo.com"], - "invalid_emails": ["random3@gmail.com"] - } - } - }, - "description": "List of Personal Emails" - }, - "400": { - "description": "Invalid parameters provided. Refer to the documentation and message body for more info" - }, - "401": { - "description": "Invalid API key" - }, - "403": { - "description": "You have run out of credits" - }, - "404": { - "description": "The requested resource (e.g: user profile, company) could not be found" - }, - "429": { - "description": "Rate limited. Please retry" - }, - "500": { - "description": "Internal Server Error" - }, - "503": { - "description": "Enrichment failed, please retry." - } - }, - "tags": ["Contact API"], - "operationId": "Personal Email Lookup Endpoint" - }, - "summary": "Personal Email Lookup Endpoint" - } - }, - "info": { - "title": "Proxycurl API", - "version": "1.0.0" - }, - "openapi": "3.0.0", - "components": { - "schemas": { - "CompanyLocation": { - "type": "object", - "properties": { - "country": { - "type": "string", - "nullable": true - }, - "city": { - "type": "string", - "nullable": true - }, - "postal_code": { - "type": "string", - "nullable": true - }, - "line_1": { - "type": "string", - "nullable": true - }, - "is_hq": { - "type": "boolean" - }, - "state": { - "type": "string", - "nullable": true - } - }, - "example": { - "country": "SG", - "city": "Singapore", - "postal_code": "119077", - "line_1": "21 Lower Kent Ridge Road, Singapore", - "is_hq": true, - "state": null - } - }, - "CompanyType": { - "type": "string", - "enum": [ - "EDUCATIONAL", - "GOVERNMENT_AGENCY", - "NON_PROFIT", - "PARTNERSHIP", - "PRIVATELY_HELD", - "PUBLIC_COMPANY", - "SELF_EMPLOYED", - "SELF_OWNED" - ] - }, - "SimilarCompany": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true - }, - "link": { - "type": "string", - "nullable": true - }, - "industry": { - "type": "string", - "nullable": true - }, - "location": { - "type": "string", - "nullable": true - } - }, - "example": { - "name": "NUS Business School", - "link": "https://www.linkedin.com/school/nus-business-school/", - "industry": "Higher Education", - "location": null - } - }, - "AffiliatedCompany": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true - }, - "link": { - "type": "string", - "nullable": true - }, - "industry": { - "type": "string", - "nullable": true - }, - "location": { - "type": "string", - "nullable": true - } - }, - "example": { - "name": "LinkedIn", - "link": "https://www.linkedin.com/company/linkedin", - "industry": "Internet", - "location": "Sunnyvale, California" - } - }, - "Date": { - "type": "object", - "properties": { - "day": { - "type": "integer", - "nullable": true - }, - "month": { - "type": "integer", - "nullable": true - }, - "year": { - "type": "integer" - } - }, - "example": { - "day": 30, - "month": 9, - "year": 2021 - } - }, - "CompanyUpdate": { - "type": "object", - "properties": { - "article_link": { - "type": "string", - "nullable": true, - "description": "The URL for which the post links out to" - }, - "image": { - "type": "string", - "nullable": true, - "description": "The URL to the image to the post (if it exists)" - }, - "posted_on": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "text": { - "type": "string", - "nullable": true, - "description": "The body of the update" - }, - "total_likes": { - "type": "integer", - "nullable": true, - "description": "The total likes a post has received" - } - }, - "example": { - "article_link": "https://lnkd.in/gr7cb5by", - "image": "https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c", - "posted_on": { - "day": 30, - "month": 9, - "year": 2021 - }, - "text": "Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by", - "total_likes": 3 - } - }, - "LinkedinSchool": { - "type": "object", - "properties": { - "linkedin_internal_id": { - "type": "string", - "description": "\n LinkedIn's Internal and immutable ID of this Company profile.\n " - }, - "description": { - "type": "string", - "nullable": true, - "description": "A textual description of the company." - }, - "website": { - "type": "string", - "nullable": true, - "description": "The URL of the company's website." - }, - "industry": { - "type": "string", - "nullable": true, - "description": "The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link)." - }, - "company_size": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "integer", - "nullable": true - }, - { - "type": "integer", - "nullable": true - } - ] - }, - "minItems": 2, - "maxItems": 2, - "description": "Sequenceed range of company head count" - }, - "company_size_on_linkedin": { - "type": "integer", - "nullable": true, - "description": "The size of the company as indicated on LinkedIn." - }, - "hq": { - "$ref": "#/components/schemas/CompanyLocation", - "nullable": true - }, - "company_type": { - "$ref": "#/components/schemas/CompanyType", - "nullable": true, - "description": "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT` : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`: Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" - }, - "founded_year": { - "type": "integer", - "nullable": true, - "description": "The year the company was founded." - }, - "specialities": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n A list of specialities.\n " - }, - "locations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CompanyLocation" - } - }, - "name": { - "type": "string", - "nullable": true, - "description": "The name of the company." - }, - "tagline": { - "type": "string", - "nullable": true, - "description": "A short, catchy phrase that represents the company's mission or brand." - }, - "universal_name_id": { - "type": "string", - "nullable": true, - "description": "A unique numerical identifier for the company used in the LinkedIn platform." - }, - "profile_pic_url": { - "type": "string", - "nullable": true, - "description": "The URL of the company's profile picture." - }, - "background_cover_image_url": { - "type": "string", - "nullable": true, - "description": "The URL of the company's background cover image." - }, - "search_id": { - "type": "string", - "description": "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n " - }, - "similar_companies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SimilarCompany" - } - }, - "affiliated_companies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AffiliatedCompany" - } - }, - "updates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CompanyUpdate" - }, - "description": "A list of post updates made by the company. This field is not guaranteed to be returned. Do not rely on this attribute in production." - }, - "follower_count": { - "type": "integer", - "nullable": true, - "description": "The number of followers the company has on LinkedIn." - } - }, - "example": { - "linkedin_internal_id": "5524", - "description": "At NUS, we are shaping the future through our people and our pursuit of new frontiers in knowledge. In a single century, we have become a university of global influence and an Asian thought leader. Our location at the crossroads of Asia informs our mission and gives us a tremendous vantage point to help create opportunities and address the pressing issues facing Singapore, Asia and the world.\r\rAt NUS, we believe in education, research and service that change lives.", - "website": "http://nus.edu.sg", - "industry": "Higher Education", - "company_size": [5001, 10000], - "company_size_on_linkedin": 16084, - "hq": { - "country": "SG", - "city": "Singapore", - "postal_code": "119077", - "line_1": "21 Lower Kent Ridge Road, Singapore", - "is_hq": true, - "state": null - }, - "company_type": "EDUCATIONAL_INSTITUTION", - "founded_year": 1905, - "specialities": ["education", "research"], - "locations": [ - { - "country": "SG", - "city": "Singapore", - "postal_code": "119077", - "line_1": "21 Lower Kent Ridge Road, Singapore", - "is_hq": true, - "state": null - } - ], - "name": "National University of Singapore", - "tagline": "Think Different - But Not Too Different", - "universal_name_id": "national-university-of-singapore", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140", - "search_id": "5524", - "similar_companies": [ - { - "name": "NUS Business School", - "link": "https://www.linkedin.com/school/nus-business-school/", - "industry": "Higher Education", - "location": null - }, - { - "name": "NUS Faculty of Arts and Social Sciences", - "link": "https://www.linkedin.com/school/nusfass/", - "industry": "Higher Education", - "location": null - } - ], - "affiliated_companies": [ - { - "name": "LinkedIn", - "link": "https://www.linkedin.com/company/linkedin", - "industry": "Internet", - "location": "Sunnyvale, California" - } - ], - "updates": [ - { - "article_link": "https://lnkd.in/gr7cb5by", - "image": "https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c", - "posted_on": { - "day": 30, - "month": 9, - "year": 2021 - }, - "text": "Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by", - "total_likes": 3 - } - ], - "follower_count": 539321 - } - }, - "AcquiredCompany": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "\n LinkedIn Company Profile URL of company that was involved\n " - }, - "crunchbase_profile_url": { - "type": "string", - "nullable": true, - "description": "Crunchbase Profile URL of company that was involved" - }, - "announced_date": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date by which this event was announced" - }, - "price": { - "type": "integer", - "nullable": true, - "description": "Price of acquisition" - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/company/apple", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", - "announced_date": { - "day": 1, - "month": 4, - "year": 1976 - }, - "price": 300000000 - } - }, - "Acquisitor": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "\n LinkedIn Company Profile URL of company that was involved\n " - }, - "crunchbase_profile_url": { - "type": "string", - "nullable": true, - "description": "Crunchbase Profile URL of company that was involved" - }, - "announced_date": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date by which this event was announced" - }, - "price": { - "type": "integer", - "nullable": true, - "description": "Price of acquisition" - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "announced_date": { - "day": 6, - "month": 3, - "year": 2020 - }, - "price": 10000 - } - }, - "Acquisition": { - "type": "object", - "properties": { - "acquired": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AcquiredCompany" - } - }, - "acquired_by": { - "$ref": "#/components/schemas/Acquisitor", - "nullable": true - } - }, - "example": { - "acquired": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", - "announced_date": { - "day": 1, - "month": 4, - "year": 1976 - }, - "price": 300000000 - } - ], - "acquired_by": { - "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "announced_date": { - "day": 6, - "month": 3, - "year": 2020 - }, - "price": 10000 - } - } - }, - "Exit": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "LinkedIn Profile URL of the company that has exited" - }, - "crunchbase_profile_url": { - "type": "string", - "nullable": true, - "description": "Crunchbase Profile URL of the company that has exited" - }, - "name": { - "type": "string", - "nullable": true, - "description": "Name of the company" - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", - "name": "MotionDSP" - } - }, - "CompanyDetails": { - "type": "object", - "properties": { - "crunchbase_profile_url": { - "type": "string", - "nullable": true, - "description": "Crunchbase Profile URL of the company" - }, - "ipo_status": { - "type": "string", - "nullable": true, - "description": "IPO status of the company" - }, - "crunchbase_rank": { - "type": "integer", - "nullable": true, - "description": "A measure of prominence of this company by Crunchbase" - }, - "founding_date": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date of founding" - }, - "operating_status": { - "type": "string", - "nullable": true, - "description": "Status of the company's operational status" - }, - "company_type": { - "type": "string", - "nullable": true, - "description": "Type of company" - }, - "contact_email": { - "type": "string", - "nullable": true, - "description": "General contact email of the company" - }, - "phone_number": { - "type": "string", - "nullable": true, - "description": "General contact number of the company" - }, - "facebook_id": { - "type": "string", - "nullable": true, - "description": "ID of the company's official Facebook account" - }, - "twitter_id": { - "type": "string", - "nullable": true, - "description": "ID of the company's official Twitter account" - }, - "number_of_funding_rounds": { - "type": "integer", - "nullable": true, - "description": "Total rounds of funding that this company has raised" - }, - "total_funding_amount": { - "type": "integer", - "nullable": true, - "description": "Total venture capital raised by this company" - }, - "stock_symbol": { - "type": "string", - "nullable": true, - "description": "Stock symbol of this public company" - }, - "ipo_date": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "The date by which this public company went public" - }, - "number_of_lead_investors": { - "type": "integer", - "nullable": true, - "description": "Total lead investors" - }, - "number_of_investors": { - "type": "integer", - "nullable": true, - "description": "Total investors" - }, - "total_fund_raised": { - "type": "integer", - "nullable": true, - "description": "\n The total amount of funds raised (by this VC firm) to be deployed as\n subsidiary investments (applicable only for VC firms)\n " - }, - "number_of_investments": { - "type": "integer", - "nullable": true, - "description": "\n Total investments made by this VC firm (applicable only for VC firms)\n " - }, - "number_of_lead_investments": { - "type": "integer", - "nullable": true, - "description": "\n Total investments that was led by this VC firm\n (applicable only for VC firms)\n " - }, - "number_of_exits": { - "type": "integer", - "nullable": true, - "description": "Total exits by this VC (applicable only for VC firms)" - }, - "number_of_acquisitions": { - "type": "integer", - "nullable": true, - "description": "Total companies acquired by this company" - } - }, - "example": { - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "ipo_status": "Public", - "crunchbase_rank": 13, - "founding_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "operating_status": "Active", - "company_type": "For Profit", - "contact_email": "info@nvidia.com", - "phone_number": "(140) 848-6200", - "facebook_id": "NVIDIA.IN", - "twitter_id": "nvidia", - "number_of_funding_rounds": 3, - "total_funding_amount": 4000000, - "stock_symbol": "NASDAQ:NVDA", - "ipo_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "number_of_lead_investors": 3, - "number_of_investors": 4, - "total_fund_raised": 1000, - "number_of_investments": 50, - "number_of_lead_investments": 3, - "number_of_exits": 7, - "number_of_acquisitions": 2 - } - }, - "Investor": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "LinkedIn Profile URL of investor" - }, - "name": { - "type": "string", - "nullable": true, - "description": "Name of investor" - }, - "type": { - "type": "string", - "nullable": true, - "description": "Type of investor" - } - }, - "example": { - "linkedin_profile_url": "https://linkedin.com/company/darpa", - "name": "DARPA", - "type": "organization" - } - }, - "Funding": { - "type": "object", - "properties": { - "funding_type": { - "type": "string", - "nullable": true, - "description": "Type of funding" - }, - "money_raised": { - "type": "integer", - "nullable": true, - "description": "Amount of money raised" - }, - "announced_date": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date of announcement" - }, - "number_of_investor": { - "type": "integer", - "nullable": true, - "description": "Number of investors in this round" - }, - "investor_list": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Investor" - }, - "nullable": true - } - }, - "example": { - "funding_type": "Grant", - "money_raised": 25000000, - "announced_date": { - "day": 1, - "month": 1, - "year": 2001 - }, - "number_of_investor": 1, - "investor_list": [ - { - "linkedin_profile_url": "https://linkedin.com/company/darpa", - "name": "DARPA", - "type": "organization" - } - ] - } - }, - "LinkedinCompany": { - "type": "object", - "properties": { - "linkedin_internal_id": { - "type": "string", - "description": "\n LinkedIn's Internal and immutable ID of this Company profile.\n " - }, - "description": { - "type": "string", - "nullable": true, - "description": "A textual description of the company." - }, - "website": { - "type": "string", - "nullable": true, - "description": "The URL of the company's website." - }, - "industry": { - "type": "string", - "nullable": true, - "description": "The `industry` attribute, found in a LinkedIn Company profile, describes the industry in which the company operates. The value of this attribute is an enumerator. [This CSV file provides an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link)." - }, - "company_size": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "integer", - "nullable": true - }, - { - "type": "integer", - "nullable": true - } - ] - }, - "minItems": 2, - "maxItems": 2, - "description": "Sequenceed range of company head count" - }, - "company_size_on_linkedin": { - "type": "integer", - "nullable": true, - "description": "The size of the company as indicated on LinkedIn." - }, - "hq": { - "$ref": "#/components/schemas/CompanyLocation", - "nullable": true - }, - "company_type": { - "$ref": "#/components/schemas/CompanyType", - "nullable": true, - "description": "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT` : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`: Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" - }, - "founded_year": { - "type": "integer", - "nullable": true, - "description": "The year the company was founded." - }, - "specialities": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n A list of specialities.\n " - }, - "locations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CompanyLocation" - } - }, - "name": { - "type": "string", - "nullable": true, - "description": "The name of the company." - }, - "tagline": { - "type": "string", - "nullable": true, - "description": "A short, catchy phrase that represents the company's mission or brand." - }, - "universal_name_id": { - "type": "string", - "nullable": true, - "description": "A unique numerical identifier for the company used in the LinkedIn platform." - }, - "profile_pic_url": { - "type": "string", - "nullable": true, - "description": "The URL of the company's profile picture." - }, - "background_cover_image_url": { - "type": "string", - "nullable": true, - "description": "The URL of the company's background cover image." - }, - "search_id": { - "type": "string", - "description": "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n " - }, - "similar_companies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SimilarCompany" - } - }, - "affiliated_companies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AffiliatedCompany" - } - }, - "updates": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CompanyUpdate" - }, - "description": "A list of post updates made by the company. This field is not guaranteed to be returned. Do not rely on this attribute in production." - }, - "follower_count": { - "type": "integer", - "nullable": true, - "description": "The number of followers the company has on LinkedIn." - }, - "acquisitions": { - "$ref": "#/components/schemas/Acquisition", - "nullable": true - }, - "exit_data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Exit" - }, - "nullable": true - }, - "extra": { - "$ref": "#/components/schemas/CompanyDetails", - "nullable": true, - "description": "Company extra when `extra=include`" - }, - "funding_data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Funding" - }, - "description": "Company Funding data when `funding_data=include`" - }, - "categories": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true, - "description": "The `categories` attribute is fetched from the company's Crunchbase profile. Values for this attribute are free-form text, and there is no exhaustive list of categories. Consider the categories attribute as \"hints\" regarding the products or services offered by the company." - }, - "customer_list": { - "type": "array", - "items": { - "type": "string" - }, - "nullable": true - } - }, - "example": { - "linkedin_internal_id": "1441", - "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", - "website": "https://goo.gle/3m1IN7m", - "industry": "Software Development", - "company_size": [10001, null], - "company_size_on_linkedin": 319856, - "hq": { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": ["search", "ads"], - "locations": [ - { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - { - "country": "US", - "city": "New York", - "postal_code": "10011", - "line_1": "111 8th Ave", - "is_hq": null, - "state": "NY" - } - ], - "name": "Google", - "tagline": "Think Different - But Not Too Different", - "universal_name_id": "google", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", - "search_id": "1441", - "similar_companies": [ - { - "name": "Amazon", - "link": "https://www.linkedin.com/company/amazon", - "industry": "Software Development", - "location": "Seattle, WA" - }, - { - "name": "Microsoft", - "link": "https://www.linkedin.com/company/microsoft", - "industry": "Software Development", - "location": "Redmond, Washington" - } - ], - "affiliated_companies": [ - { - "name": "YouTube", - "link": "https://www.linkedin.com/company/youtube", - "industry": "Software Development", - "location": "San Bruno, CA" - }, - { - "name": "Google Cloud", - "link": "https://www.linkedin.com/showcase/google-cloud", - "industry": "Software Development", - "location": "Mountain View, California" - } - ], - "updates": [ - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", - "posted_on": { - "day": 13, - "month": 9, - "year": 2022 - }, - "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", - "total_likes": 4267 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", - "posted_on": null, - "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", - "total_likes": 397 - } - ], - "follower_count": 27472792, - "acquisitions": { - "acquired": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", - "announced_date": { - "day": 1, - "month": 4, - "year": 1976 - }, - "price": 300000000 - } - ], - "acquired_by": { - "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "announced_date": { - "day": 6, - "month": 3, - "year": 2020 - }, - "price": 10000 - } - }, - "exit_data": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", - "name": "MotionDSP" - } - ], - "extra": { - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "ipo_status": "Public", - "crunchbase_rank": 13, - "founding_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "operating_status": "Active", - "company_type": "For Profit", - "contact_email": "info@nvidia.com", - "phone_number": "(140) 848-6200", - "facebook_id": "NVIDIA.IN", - "twitter_id": "nvidia", - "number_of_funding_rounds": 3, - "total_funding_amount": 4000000, - "stock_symbol": "NASDAQ:NVDA", - "ipo_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "number_of_lead_investors": 3, - "number_of_investors": 4, - "total_fund_raised": 1000, - "number_of_investments": 50, - "number_of_lead_investments": 3, - "number_of_exits": 7, - "number_of_acquisitions": 2 - }, - "funding_data": [ - { - "funding_type": "Grant", - "money_raised": 25000000, - "announced_date": { - "day": 1, - "month": 1, - "year": 2001 - }, - "number_of_investor": 1, - "investor_list": [ - { - "linkedin_profile_url": "https://linkedin.com/company/darpa", - "name": "DARPA", - "type": "organization" - } - ] - } - ], - "categories": ["artificial-intelligence", "virtual-reality"] - } - }, - "Experience": { - "type": "object", - "properties": { - "starts_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "ends_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "company": { - "type": "string", - "nullable": true, - "description": "The company's display name." - }, - "company_linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "\n The company's profile URL on Linkedin.\n If present, could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint) for more info.\n " - }, - "company_facebook_profile_url": { - "type": "string", - "nullable": true, - "description": "\n The company's profile URL on Facebook.\n " - }, - "title": { - "type": "string", - "nullable": true - }, - "description": { - "type": "string", - "nullable": true - }, - "location": { - "type": "string", - "nullable": true - }, - "logo_url": { - "type": "string", - "nullable": true, - "description": "URL of the logo of the organisation." - } - }, - "example": { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - } - }, - "Education": { - "type": "object", - "properties": { - "starts_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "ends_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "field_of_study": { - "type": "string", - "nullable": true - }, - "degree_name": { - "type": "string", - "nullable": true - }, - "school": { - "type": "string", - "nullable": true - }, - "school_linkedin_profile_url": { - "type": "string", - "nullable": true - }, - "school_facebook_profile_url": { - "type": "string", - "nullable": true, - "description": "\n The school's profile URL on Facebook.\n " - }, - "description": { - "type": "string", - "nullable": true - }, - "logo_url": { - "type": "string", - "nullable": true - }, - "grade": { - "type": "string" - }, - "activities_and_societies": { - "type": "string" - } - }, - "example": { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - } - }, - "AccomplishmentOrg": { - "type": "object", - "properties": { - "starts_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "ends_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "org_name": { - "type": "string", - "nullable": true - }, - "title": { - "type": "string", - "nullable": true - }, - "description": { - "type": "string", - "nullable": true - } - }, - "example": { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - }, - "Publication": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "description": "Name of the publication." - }, - "publisher": { - "type": "string", - "nullable": true, - "description": "The publishing organisation body." - }, - "published_on": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date of publication." - }, - "description": { - "type": "string", - "nullable": true, - "description": "Description of the publication." - }, - "url": { - "type": "string", - "nullable": true, - "description": "URL of the publication." - } - }, - "example": { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - }, - "HonourAward": { - "type": "object", - "properties": { - "title": { - "type": "string", - "nullable": true, - "description": "Title of the honour/award." - }, - "issuer": { - "type": "string", - "nullable": true, - "description": "The organisation body issuing this honour/award." - }, - "issued_on": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date that this honour/awared was issued." - }, - "description": { - "type": "string", - "nullable": true, - "description": "Description of the honour/award." - } - }, - "example": { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - }, - "Patent": { - "type": "object", - "properties": { - "title": { - "type": "string", - "nullable": true, - "description": "Title of the patent." - }, - "issuer": { - "type": "string", - "nullable": true, - "description": "The organisation body that issued the patent." - }, - "issued_on": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date of patent issuance." - }, - "description": { - "type": "string", - "nullable": true, - "description": "Description of the patent." - }, - "application_number": { - "type": "string", - "nullable": true, - "description": "Numerical representation that identifies the patent." - }, - "patent_number": { - "type": "string", - "nullable": true, - "description": "Application number of the patent." - }, - "url": { - "type": "string", - "nullable": true - } - }, - "example": { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - }, - "Course": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "description": "Name of the course" - }, - "number": { - "type": "string", - "nullable": true, - "description": "The numerical representation of the course" - } - }, - "example": { - "name": "The course about ABCs", - "number": "123" - } - }, - "Project": { - "type": "object", - "properties": { - "starts_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "ends_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "title": { - "type": "string", - "nullable": true, - "description": "\n Name of the project that has been or is currently being worked on.\n " - }, - "description": { - "type": "string", - "nullable": true, - "description": "Description of the project." - }, - "url": { - "type": "string", - "nullable": true, - "description": "A web location related to the project." - } - }, - "example": { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - } - }, - "TestScore": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "description": "\n Title of the course for which test score was derived from.\n " - }, - "score": { - "type": "string", - "nullable": true, - "description": "Test score" - }, - "date_on": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Date of test was assesed." - }, - "description": { - "type": "string", - "nullable": true, - "description": "Description of the test score." - } - }, - "example": { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - }, - "VolunteeringExperience": { - "type": "object", - "properties": { - "starts_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "ends_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "title": { - "type": "string", - "nullable": true, - "description": "Name of volunteer activity." - }, - "cause": { - "type": "string", - "nullable": true - }, - "company": { - "type": "string", - "nullable": true, - "description": "The company's display name." - }, - "company_linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "\n The company's profile URL.\n If present, could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint) for more info.\n " - }, - "description": { - "type": "string", - "nullable": true - }, - "logo_url": { - "type": "string", - "nullable": true, - "description": "URL of the logo of the organisation." - } - }, - "example": { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - }, - "Certification": { - "type": "object", - "properties": { - "starts_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "ends_at": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "name": { - "type": "string", - "nullable": true, - "description": "Name of the course or program." - }, - "license_number": { - "type": "string", - "nullable": true - }, - "display_source": { - "type": "string", - "nullable": true - }, - "authority": { - "type": "string", - "nullable": true, - "description": "The organisation body issuing this certificate." - }, - "url": { - "type": "string", - "nullable": true - } - }, - "example": { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - } - }, - "PeopleAlsoViewed": { - "type": "object", - "properties": { - "link": { - "type": "string", - "nullable": true, - "description": "\n URL of the profile.\n Useable with [Person profile endpoint](#people-api-person-profile-endpoint)\n " - }, - "name": { - "type": "string", - "nullable": true - }, - "summary": { - "type": "string", - "nullable": true - }, - "location": { - "type": "string", - "nullable": true - } - }, - "example": { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - }, - "Activity": { - "type": "object", - "properties": { - "title": { - "type": "string", - "nullable": true - }, - "link": { - "type": "string", - "nullable": true - }, - "activity_status": { - "type": "string", - "nullable": true - } - }, - "example": { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - }, - "SimilarProfile": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true - }, - "link": { - "type": "string", - "nullable": true - }, - "summary": { - "type": "string", - "nullable": true - }, - "location": { - "type": "string", - "nullable": true - } - }, - "example": { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - } - }, - "Article": { - "type": "object", - "properties": { - "title": { - "type": "string", - "nullable": true - }, - "link": { - "type": "string", - "nullable": true - }, - "published_date": { - "$ref": "#/components/schemas/Date", - "nullable": true - }, - "author": { - "type": "string", - "nullable": true - }, - "image_url": { - "type": "string", - "nullable": true - } - }, - "example": { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - }, - "PersonGroup": { - "type": "object", - "properties": { - "profile_pic_url": { - "type": "string", - "nullable": true, - "description": "The URL to the profile picture of this LinkedIn Group" - }, - "name": { - "type": "string", - "nullable": true, - "description": "Name of LinkedIn group for which this user is in" - }, - "url": { - "type": "string", - "nullable": true, - "description": "URL to the LinkedIn Group" - } - }, - "example": { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - }, - "InferredSalary": { - "type": "object", - "properties": { - "min": { - "type": "number", - "nullable": true - }, - "max": { - "type": "number", - "nullable": true - } - }, - "example": { - "min": 35000, - "max": 45000 - } - }, - "PersonExtra": { - "type": "object", - "properties": { - "github_profile_id": { - "type": "string", - "nullable": true, - "description": "This profile's Github account." - }, - "facebook_profile_id": { - "type": "string", - "nullable": true, - "description": "This profile's Facebook account." - }, - "twitter_profile_id": { - "type": "string", - "nullable": true, - "description": "This profile's twitter account." - }, - "website": { - "type": "string", - "nullable": true, - "description": "This account's website listed on his profile." - } - }, - "example": { - "github_profile_id": "github-username", - "facebook_profile_id": "facebook-username", - "twitter_profile_id": "twitter-username", - "website": "https://proxycurl.com" - } - }, - "PersonEndpointResponse": { - "type": "object", - "properties": { - "public_identifier": { - "type": "string", - "nullable": true, - "description": "\n The vanity identifier of the public LinkedIn profile.\n The vanity identifier comes after the `/in/` part of the LinkedIn Profile URL\n in the following format: `https://www.linkedin.com/in/`\n " - }, - "profile_pic_url": { - "type": "string", - "description": "\n A temporary link to the user's profile picture that is valid for 30 minutes. \n The temporal nature of the link is by design to prevent having Proxycurl be the mirror for the images.\n The developer is expected to handle these images by downloading the image and re-hosting the image.\n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n Some profile pictures might be of the standard LinkedIn's profile picture placeholder. It is so because. See [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/) for context.\n " - }, - "background_cover_image_url": { - "type": "string", - "nullable": true, - "description": "\n A temporary link to the user's background cover picture\n that is valid for 30 minutes.\n The temporal nature of the link is by design to prevent\n having Proxycurl be the mirror for the images.\n The developer is expected to handle these images \n by downloading the image and re-hosting the image. \n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n " - }, - "first_name": { - "type": "string", - "nullable": true, - "description": "First name of the user." - }, - "last_name": { - "type": "string", - "nullable": true, - "description": "Last name of the user." - }, - "full_name": { - "type": "string", - "nullable": true, - "description": "\n Full name of the user (`first_name` + `last_name`)\n " - }, - "follower_count": { - "type": "integer", - "description": "Follower count for this profile" - }, - "occupation": { - "type": "string", - "nullable": true, - "description": "\n The title and company name of the user's current employment.\n " - }, - "headline": { - "type": "string", - "nullable": true, - "description": "\n The tagline written by the user for his profile.\n " - }, - "summary": { - "type": "string", - "nullable": true, - "description": "\n A blurb (longer than the tagline) written by the user for his profile.\n " - }, - "country": { - "type": "string", - "nullable": true, - "description": "\n The user's country of residence depicted by\n a 2-letter country code (ISO 3166-1 alpha-2).\n " - }, - "country_full_name": { - "type": "string", - "nullable": true, - "description": "The user's country of residence, in English words." - }, - "city": { - "type": "string", - "nullable": true, - "description": "The city that the user is living at." - }, - "state": { - "type": "string", - "nullable": true, - "description": "The state that the user is living at." - }, - "experiences": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Experience" - }, - "description": "The user's list of historic work experiences." - }, - "education": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Education" - }, - "description": "The user's list of education background." - }, - "languages": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n A list of languages that the user claims to be familiar with,\n and has added to his/her profile.\n Do note that we do not have the proficiency level as\n that data point is not available on a public LinkedIn profile.\n " - }, - "accomplishment_organisations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AccomplishmentOrg" - }, - "description": "\n List of noteworthy organizations that this user is part of.\n " - }, - "accomplishment_publications": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Publication" - }, - "description": "\n List of noteworthy publications that this user has partook in.\n " - }, - "accomplishment_honors_awards": { - "type": "array", - "items": { - "$ref": "#/components/schemas/HonourAward" - }, - "description": "\n List of noteworthy honours and awards that this user has won.\n " - }, - "accomplishment_patents": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Patent" - }, - "description": "List of noteworthy patents won by this user." - }, - "accomplishment_courses": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - }, - "description": "List of noteworthy courses partook by this user." - }, - "accomplishment_projects": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Project" - }, - "description": "\n List of noteworthy projects undertaken by this user.\n " - }, - "accomplishment_test_scores": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TestScore" - }, - "description": "\n List of noteworthy test scores accomplished by this user.\n " - }, - "volunteer_work": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VolunteeringExperience" - }, - "description": "List of historic volunteer work experiences." - }, - "certifications": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Certification" - }, - "description": "\n List of noteworthy certifications accomplished by this user.\n " - }, - "connections": { - "type": "integer", - "nullable": true, - "description": "Total *count* of LinkedIn connections." - }, - "people_also_viewed": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PeopleAlsoViewed" - }, - "description": "\n A list of other LinkedIn profiles closely related to this user.\n " - }, - "recommendations": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n List of recommendations made by other users about this profile.\n " - }, - "activities": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Activity" - }, - "description": "A list of LinkedIn status activities. This field is not guaranteed to be returned. Do not rely on this attribute in production." - }, - "similarly_named_profiles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SimilarProfile" - }, - "description": "\n A list of other LinkedIn profiles with similar names.\n " - }, - "articles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Article" - }, - "description": "\n A list of content-based articles posted by this user. This field is not guaranteed to be returned. Do not rely on this attribute in production.\n " - }, - "groups": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PersonGroup" - }, - "description": "\n A list of LinkedIn groups that this user is a part of.\",\n " - }, - "skills": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of keyword-based skills that this user boasts of on his LinkedIn profile." - }, - "inferred_salary": { - "$ref": "#/components/schemas/InferredSalary", - "nullable": true, - "description": "A salary range inferred from the user's current job title and company." - }, - "gender": { - "type": "string", - "nullable": true, - "description": "Gender of the user." - }, - "birth_date": { - "$ref": "#/components/schemas/Date", - "nullable": true, - "description": "Birth date of the user." - }, - "industry": { - "type": "string", - "nullable": true, - "description": "Industry that the user works in." - }, - "extra": { - "$ref": "#/components/schemas/PersonExtra", - "nullable": true, - "description": "A bundle of extra data on this user." - }, - "interests": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of interests that the user has." - }, - "personal_emails": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of personal emails associated with this user." - }, - "personal_numbers": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of personal mobile phone numbers associated with this user." - } - }, - "example": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ], - "inferred_salary": { - "min": 35000, - "max": 45000 - }, - "gender": "male", - "birth_date": { - "day": 1, - "month": 1, - "year": 1990 - }, - "industry": "government administration", - "extra": { - "github_profile_id": "github-username", - "facebook_profile_id": "facebook-username", - "twitter_profile_id": "twitter-username", - "website": "https://proxycurl.com" - }, - "interests": ["education", "health", "human rights"], - "personal_emails": [ - "abc@gmail.com", - "bcd@gmail.com", - "cde@@outlook.com" - ], - "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] - } - }, - "CompanyCustomer": { - "type": "object", - "properties": { - "linkedin_company_profile_url": { - "type": "string", - "description": "LinkedIn Company Profile URL of a probable customer" - }, - "twitter_profile_url": { - "type": "string", - "nullable": true, - "description": "Twitter Profile URL of a probable customer" - }, - "email": { - "type": "string", - "nullable": true, - "description": "General Email address of company (if any)" - } - }, - "example": { - "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", - "twitter_profile_url": "https://twitter.com/spirellp", - "email": "info@spiresolicitors.co.uk" - } - }, - "CustomerList": { - "type": "object", - "properties": { - "companies": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CompanyCustomer" - }, - "description": "A list of companies that are probable customers." - }, - "next_page": { - "type": "string", - "nullable": true, - "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " - } - }, - "example": { - "companies": [ - { - "linkedin_company_profile_url": "https://www.linkedin.com/company/spire-solicitors-llp", - "twitter_profile_url": "https://twitter.com/spirellp", - "email": "info@spiresolicitors.co.uk" - }, - { - "linkedin_company_profile_url": "https://www.linkedin.com/company/mall-wood-insurance-services-ltd", - "twitter_profile_url": "https://twitter.com/draytonins", - "email": "hello@example.com" - } - ], - "next_page": null - } - }, - "CustomerCount": { - "type": "object", - "properties": { - "company_count": { - "type": "integer", - "nullable": true, - "description": "A count of of companies that are probable customers." - } - }, - "example": { - "company_count": 125 - } - }, - "PublicPerson": { - "type": "object", - "properties": { - "public_identifier": { - "type": "string", - "nullable": true, - "description": "\n The vanity identifier of the public LinkedIn profile.\n The vanity identifier comes after the `/in/` part of the LinkedIn Profile URL\n in the following format: `https://www.linkedin.com/in/`\n " - }, - "profile_pic_url": { - "type": "string", - "description": "\n A temporary link to the user's profile picture that is valid for 30 minutes. \n The temporal nature of the link is by design to prevent having Proxycurl be the mirror for the images.\n The developer is expected to handle these images by downloading the image and re-hosting the image.\n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n Some profile pictures might be of the standard LinkedIn's profile picture placeholder. It is so because. See [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/) for context.\n " - }, - "background_cover_image_url": { - "type": "string", - "nullable": true, - "description": "\n A temporary link to the user's background cover picture\n that is valid for 30 minutes.\n The temporal nature of the link is by design to prevent\n having Proxycurl be the mirror for the images.\n The developer is expected to handle these images \n by downloading the image and re-hosting the image. \n See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for context.\n " - }, - "first_name": { - "type": "string", - "nullable": true, - "description": "First name of the user." - }, - "last_name": { - "type": "string", - "nullable": true, - "description": "Last name of the user." - }, - "full_name": { - "type": "string", - "nullable": true, - "description": "\n Full name of the user (`first_name` + `last_name`)\n " - }, - "follower_count": { - "type": "integer", - "description": "Follower count for this profile" - }, - "occupation": { - "type": "string", - "nullable": true, - "description": "\n The title and company name of the user's current employment.\n " - }, - "headline": { - "type": "string", - "nullable": true, - "description": "\n The tagline written by the user for his profile.\n " - }, - "summary": { - "type": "string", - "nullable": true, - "description": "\n A blurb (longer than the tagline) written by the user for his profile.\n " - }, - "country": { - "type": "string", - "nullable": true, - "description": "\n The user's country of residence depicted by\n a 2-letter country code (ISO 3166-1 alpha-2).\n " - }, - "country_full_name": { - "type": "string", - "nullable": true, - "description": "The user's country of residence, in English words." - }, - "city": { - "type": "string", - "nullable": true, - "description": "The city that the user is living at." - }, - "state": { - "type": "string", - "nullable": true, - "description": "The state that the user is living at." - }, - "experiences": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Experience" - }, - "description": "The user's list of historic work experiences." - }, - "education": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Education" - }, - "description": "The user's list of education background." - }, - "languages": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n A list of languages that the user claims to be familiar with,\n and has added to his/her profile.\n Do note that we do not have the proficiency level as\n that data point is not available on a public LinkedIn profile.\n " - }, - "accomplishment_organisations": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AccomplishmentOrg" - }, - "description": "\n List of noteworthy organizations that this user is part of.\n " - }, - "accomplishment_publications": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Publication" - }, - "description": "\n List of noteworthy publications that this user has partook in.\n " - }, - "accomplishment_honors_awards": { - "type": "array", - "items": { - "$ref": "#/components/schemas/HonourAward" - }, - "description": "\n List of noteworthy honours and awards that this user has won.\n " - }, - "accomplishment_patents": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Patent" - }, - "description": "List of noteworthy patents won by this user." - }, - "accomplishment_courses": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Course" - }, - "description": "List of noteworthy courses partook by this user." - }, - "accomplishment_projects": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Project" - }, - "description": "\n List of noteworthy projects undertaken by this user.\n " - }, - "accomplishment_test_scores": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TestScore" - }, - "description": "\n List of noteworthy test scores accomplished by this user.\n " - }, - "volunteer_work": { - "type": "array", - "items": { - "$ref": "#/components/schemas/VolunteeringExperience" - }, - "description": "List of historic volunteer work experiences." - }, - "certifications": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Certification" - }, - "description": "\n List of noteworthy certifications accomplished by this user.\n " - }, - "connections": { - "type": "integer", - "nullable": true, - "description": "Total *count* of LinkedIn connections." - }, - "people_also_viewed": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PeopleAlsoViewed" - }, - "description": "\n A list of other LinkedIn profiles closely related to this user.\n " - }, - "recommendations": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n List of recommendations made by other users about this profile.\n " - }, - "activities": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Activity" - }, - "description": "A list of LinkedIn status activities. This field is not guaranteed to be returned. Do not rely on this attribute in production." - }, - "similarly_named_profiles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SimilarProfile" - }, - "description": "\n A list of other LinkedIn profiles with similar names.\n " - }, - "articles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Article" - }, - "description": "\n A list of content-based articles posted by this user. This field is not guaranteed to be returned. Do not rely on this attribute in production.\n " - }, - "groups": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PersonGroup" - }, - "description": "\n A list of LinkedIn groups that this user is a part of.\",\n " - }, - "skills": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of keyword-based skills that this user boasts of on his LinkedIn profile." - } - }, - "example": { - "public_identifier": "williamhgates", - "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "background_cover_image_url": null, - "first_name": "Bill", - "last_name": "Gates", - "full_name": "Bill Gates", - "follower_count": null, - "occupation": "Co-chair at Bill & Melinda Gates Foundation", - "headline": "Co-chair, Bill & Melinda Gates Foundation", - "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "company": "Breakthrough Energy ", - "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", - "company_facebook_profile_url": null, - "title": "Founder", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2000 - }, - "ends_at": null, - "company": "Bill & Melinda Gates Foundation", - "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", - "company_facebook_profile_url": null, - "title": "Co-chair", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 1973 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 1975 - }, - "field_of_study": null, - "degree_name": null, - "school": "Harvard University", - "school_linkedin_profile_url": null, - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": null, - "ends_at": null, - "field_of_study": null, - "degree_name": null, - "school": "Lakeside School", - "school_linkedin_profile_url": null, - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Chinese", "Japanese"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [], - "connections": null, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Professional and dedicated approach towards clients and collegues." - ], - "activities": [ - { - "title": "I am hiring!", - "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", - "activity_status": "posted" - } - ], - "similarly_named_profiles": null, - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - } - }, - "Employee": { - "type": "object", - "properties": { - "profile_url": { - "type": "string", - "description": "\n LinkedIn Profile URL of the employee.\n " - }, - "profile": { - "$ref": "#/components/schemas/PublicPerson", - "nullable": true, - "description": "\n Enriched profile data of the employee.\n " - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " - } - }, - "example": { - "profile_url": "https://www.linkedin.com/in/williamhgates", - "profile": { - "public_identifier": "williamhgates", - "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "background_cover_image_url": null, - "first_name": "Bill", - "last_name": "Gates", - "full_name": "Bill Gates", - "follower_count": null, - "occupation": "Co-chair at Bill & Melinda Gates Foundation", - "headline": "Co-chair, Bill & Melinda Gates Foundation", - "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "company": "Breakthrough Energy ", - "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", - "company_facebook_profile_url": null, - "title": "Founder", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2000 - }, - "ends_at": null, - "company": "Bill & Melinda Gates Foundation", - "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", - "company_facebook_profile_url": null, - "title": "Co-chair", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 1973 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 1975 - }, - "field_of_study": null, - "degree_name": null, - "school": "Harvard University", - "school_linkedin_profile_url": null, - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": null, - "ends_at": null, - "field_of_study": null, - "degree_name": null, - "school": "Lakeside School", - "school_linkedin_profile_url": null, - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Chinese", "Japanese"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [], - "connections": null, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Professional and dedicated approach towards clients and collegues." - ], - "activities": [ - { - "title": "I am hiring!", - "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", - "activity_status": "posted" - } - ], - "similarly_named_profiles": null, - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "EmployeeList": { - "type": "object", - "properties": { - "employees": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Employee" - }, - "description": "\n A list of employee profiles (if enriched) and their associated profile URL.\n " - }, - "next_page": { - "type": "string", - "nullable": true, - "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " - } - }, - "example": { - "employees": [ - { - "profile_url": "https://www.linkedin.com/in/williamhgates", - "profile": { - "public_identifier": "williamhgates", - "profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "background_cover_image_url": null, - "first_name": "Bill", - "last_name": "Gates", - "full_name": "Bill Gates", - "follower_count": null, - "occupation": "Co-chair at Bill & Melinda Gates Foundation", - "headline": "Co-chair, Bill & Melinda Gates Foundation", - "summary": "Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "company": "Breakthrough Energy ", - "company_linkedin_profile_url": "https://www.linkedin.com/company/breakthrough-energy/", - "company_facebook_profile_url": null, - "title": "Founder", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2000 - }, - "ends_at": null, - "company": "Bill & Melinda Gates Foundation", - "company_linkedin_profile_url": "https://www.linkedin.com/company/bill-&-melinda-gates-foundation/", - "company_facebook_profile_url": null, - "title": "Co-chair", - "description": null, - "location": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 1973 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 1975 - }, - "field_of_study": null, - "degree_name": null, - "school": "Harvard University", - "school_linkedin_profile_url": null, - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": null, - "ends_at": null, - "field_of_study": null, - "degree_name": null, - "school": "Lakeside School", - "school_linkedin_profile_url": null, - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Chinese", "Japanese"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [], - "connections": null, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Professional and dedicated approach towards clients and collegues." - ], - "activities": [ - { - "title": "I am hiring!", - "link": "https://www.linkedin.com/feed/update/urn:li:activity:666", - "activity_status": "posted" - } - ], - "similarly_named_profiles": null, - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null - } - }, - "EmployeeCount": { - "type": "object", - "properties": { - "total_employee": { - "type": "integer" - }, - "linkedin_employee_count": { - "type": "integer", - "nullable": true, - "description": "The scraped value of employee count of this company from it's LinkedIn profile. This value does not respect `employement_status` parameter. It will always return the curent employee count of this company from LinkedIn." - }, - "linkdb_employee_count": { - "type": "integer", - "description": "The total number of employees found in LinkDB for this company. This value is limited by pre-crawled LinkedIn profiles stored in [LinkDB](https://nubela.co/proxycurl/linkdb)" - }, - "regression_notice": { - "type": "string" - } - }, - "example": { - "linkedin_employee_count": 529274, - "linkdb_employee_count": 3 - } - }, - "ProfilePicture": { - "type": "object", - "properties": { - "tmp_profile_pic_url": { - "type": "string", - "description": "\n Temporary URL to the profile picture (valid for just 30 minutes).\n See this [blog post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/) for more information." - } - }, - "example": { - "tmp_profile_pic_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU" - } - }, - "PersonLookupUrlEnrichResult": { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true, - "description": "The LinkedIn profile URL" - }, - "name_similarity_score": { - "type": "number", - "nullable": true, - "description": "A measure of how similar the input name is to the name in the returned profile. Values can range from `0` to `1` , with `0` indicating no similarity and `1` implying high similarity. In cases where a current profile for comparison is not available in our dataset, the result may be `null`." - }, - "company_similarity_score": { - "type": "number", - "nullable": true, - "description": "A measure of how similar the input company name/domain is to the name/domain of past or present companies in the returned profile. The score ranges from `0` to `1` , with `0` signifying no similarity and `1` denoting high similarity. If a relevant profile is unavailable in our dataset for comparison, a `null` score may be returned." - }, - "title_similarity_score": { - "type": "number", - "nullable": true, - "description": "A measure of how similar the input title is to the returned profile's past or present titles. Scores vary from `0` to `1` , where `0` means no similarity and `1` indicates high similarity. If a relevant profile for comparison isn't available in our dataset, a `null` result may occur." - }, - "location_similarity_score": { - "type": "number", - "nullable": true, - "description": "A measure of how similar the input location is to the returned profile's current location. The range is from `0` to `1` , with `0` representing no similarity and `1` signifying high similarity. If there isn't a relevant profile in our dataset for comparison, the score might be `null`. " - }, - "profile": { - "$ref": "#/components/schemas/PersonEndpointResponse" - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "ISO 8601 timestamp since the enriched profile was last scraped." - } - }, - "example": { - "url": "https://www.linkedin.com/in/senatormarty", - "name_similarity_score": 0.5, - "company_similarity_score": 0.5, - "title_similarity_score": 0.5, - "location_similarity_score": 0.5, - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ], - "inferred_salary": { - "min": 35000, - "max": 45000 - }, - "gender": "male", - "birth_date": { - "day": 1, - "month": 1, - "year": 1990 - }, - "industry": "government administration", - "extra": { - "github_profile_id": "github-username", - "facebook_profile_id": "facebook-username", - "twitter_profile_id": "twitter-username", - "website": "https://proxycurl.com" - }, - "interests": ["education", "health", "human rights"], - "personal_emails": [ - "abc@gmail.com", - "bcd@gmail.com", - "cde@@outlook.com" - ], - "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "JobListEntry": { - "type": "object", - "properties": { - "company": { - "type": "string", - "nullable": true, - "description": "\n The name of the company that posted this job.\n " - }, - "company_url": { - "type": "string", - "nullable": true, - "description": "\n The LinkedIn Company Profile URL that posted this job.\n " - }, - "job_title": { - "type": "string", - "nullable": true, - "description": "\n Job title of the posted job.\n " - }, - "job_url": { - "type": "string", - "nullable": true, - "description": "\n Job Profile URL. You can fetch details about this job using this URL via the [Job Profile API Endpoint](https://nubela.co/proxycurl/docs#jobs-api-job-profile-endpoint).\n " - }, - "list_date": { - "type": "string", - "nullable": true, - "description": "\n The date that this job was listed.\n " - }, - "location": { - "type": "string", - "nullable": true, - "description": "\n The job location.\n " - } - }, - "example": { - "company": "Microsoft", - "company_url": "https://www.linkedin.com/company/microsoft", - "job_title": "Product Management: Intern Opportunities for University Students", - "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", - "list_date": "2022-10-09", - "location": "New York, NY" - } - }, - "JobListPage": { - "type": "object", - "properties": { - "job": { - "type": "array", - "items": { - "$ref": "#/components/schemas/JobListEntry" - } - }, - "next_page_no": { - "type": "integer", - "nullable": true - }, - "next_page_api_url": { - "type": "string", - "nullable": true, - "description": "\n The URL to the next page of results. This will be null for the final page.\n " - }, - "previous_page_no": { - "type": "integer", - "nullable": true - }, - "previous_page_api_url": { - "type": "string", - "nullable": true, - "description": "\n The URL to the previous page of results. This will be null for the first page.\n " - } - }, - "example": { - "job": [ - { - "company": "Microsoft", - "company_url": "https://www.linkedin.com/company/microsoft", - "job_title": "Product Management: Intern Opportunities for University Students", - "job_url": "https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682", - "list_date": "2022-10-09", - "location": "New York, NY" - }, - { - "company": "Microsoft", - "company_url": "https://www.linkedin.com/company/microsoft", - "job_title": "Content Strategist", - "job_url": "https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764", - "list_date": "2022-10-21", - "location": "United States" - } - ], - "next_page_no": 1, - "next_page_api_url": "http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035", - "previous_page_no": null, - "previous_page_api_url": "https://nubela.co/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035" - } - }, - "JobListCount": { - "type": "object", - "properties": { - "count": { - "type": "integer" - } - }, - "example": { - "count": 887622 - } - }, - "RoleSearchEnrichedResult": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "LinkedIn Profile URL of the person that most closely matches the role" - }, - "profile": { - "$ref": "#/components/schemas/PersonEndpointResponse" - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "ISO 8601 timestamp since the enriched profile was last scraped." - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ], - "inferred_salary": { - "min": 35000, - "max": 45000 - }, - "gender": "male", - "birth_date": { - "day": 1, - "month": 1, - "year": 1990 - }, - "industry": "government administration", - "extra": { - "github_profile_id": "github-username", - "facebook_profile_id": "facebook-username", - "twitter_profile_id": "twitter-username", - "website": "https://proxycurl.com" - }, - "interests": ["education", "health", "human rights"], - "personal_emails": [ - "abc@gmail.com", - "bcd@gmail.com", - "cde@@outlook.com" - ], - "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "CompanyUrlEnrichResult": { - "type": "object", - "properties": { - "url": { - "type": "string", - "nullable": true, - "description": "The LinkedIn profile URL" - }, - "profile": { - "$ref": "#/components/schemas/LinkedinCompany" - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "ISO 8601 timestamp since the enriched profile was last scraped." - } - }, - "example": { - "url": "https://www.linkedin.com/company/accenture", - "profile": { - "linkedin_internal_id": "1033", - "description": "Accenture is a global professional services company with leading capabilities in digital, cloud, and security. Combining unmatched experience and specialized skills across more than 40 industries, we offer Strategy and Consulting, Technology and Operations Services, and Accenture Song—all powered by the world’s largest network of Advanced Technology and Intelligent Operations centers. \n\nOur people deliver on the promise of technology and human ingenuity every day, serving clients in more than 120 countries. We embrace the power of change to create value and shared success for our clients, people, shareholders, partners, and communities. \n\nVisit us at accenture.com.", - "website": "http://www.accenture.com", - "industry": "Business Consulting and Services", - "company_size": [10001, null], - "company_size_on_linkedin": 541251, - "hq": { - "country": "IE", - "city": "Dublin 2", - "postal_code": null, - "line_1": "Grand Canal Harbour", - "is_hq": true, - "state": null - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": [ - "Management Consulting", - "Systems Integration and Technology" - ], - "locations": [ - { - "country": "IE", - "city": "Dublin 2", - "postal_code": null, - "line_1": "Grand Canal Harbour", - "is_hq": true, - "state": null - }, - { - "country": "US", - "city": "San Francisco", - "postal_code": "94105", - "line_1": "415 Mission Street Floor 31-34", - "is_hq": null, - "state": "California" - } - ], - "name": "Accenture", - "tagline": "Think Different - But Not Too Different", - "universal_name_id": "accenture", - "profile_pic_url": "https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY", - "background_cover_image_url": "https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0", - "search_id": "1033", - "similar_companies": [ - { - "name": "Deloitte", - "link": "https://www.linkedin.com/company/deloitte", - "industry": "Business Consulting and Services", - "location": null - }, - { - "name": "Tata Consultancy Services", - "link": "https://in.linkedin.com/company/tata-consultancy-services", - "industry": "IT Services and IT Consulting", - "location": "Mumbai, Maharashtra" - } - ], - "affiliated_companies": [ - { - "name": "Accenture in India", - "link": "https://in.linkedin.com/company/accentureindia", - "industry": "IT Services and IT Consulting", - "location": "Bengaluru, Karnatka" - }, - { - "name": "Accenture Brasil", - "link": "https://br.linkedin.com/company/accenturebrasil", - "industry": "IT Services and IT Consulting", - "location": "São Paulo, São Paulo" - } - ], - "updates": [ - { - "article_link": null, - "image": null, - "posted_on": { - "day": 25, - "month": 10, - "year": 2023 - }, - "text": "Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4", - "total_likes": 325 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA", - "posted_on": { - "day": 25, - "month": 10, - "year": 2023 - }, - "text": "The ability to learn new things, without forgetting those that came before, is a huge differentiator between the #AI we're familiar with, and the #GenerativeAI powered by foundation models that we're seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n \n#TechVision2023", - "total_likes": 541 - } - ], - "follower_count": 11125167, - "acquisitions": { - "acquired": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", - "announced_date": { - "day": 1, - "month": 4, - "year": 1976 - }, - "price": 300000000 - } - ], - "acquired_by": { - "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "announced_date": { - "day": 6, - "month": 3, - "year": 2020 - }, - "price": 10000 - } - }, - "exit_data": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", - "name": "MotionDSP" - } - ], - "extra": { - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "ipo_status": "Public", - "crunchbase_rank": 13, - "founding_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "operating_status": "Active", - "company_type": "For Profit", - "contact_email": "info@nvidia.com", - "phone_number": "(140) 848-6200", - "facebook_id": "NVIDIA.IN", - "twitter_id": "nvidia", - "number_of_funding_rounds": 3, - "total_funding_amount": 4000000, - "stock_symbol": "NASDAQ:NVDA", - "ipo_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "number_of_lead_investors": 3, - "number_of_investors": 4, - "total_fund_raised": 1000, - "number_of_investments": 50, - "number_of_lead_investments": 3, - "number_of_exits": 7, - "number_of_acquisitions": 2 - }, - "funding_data": [ - { - "funding_type": "Grant", - "money_raised": 25000000, - "announced_date": { - "day": 1, - "month": 1, - "year": 2001 - }, - "number_of_investor": 1, - "investor_list": [ - { - "linkedin_profile_url": "https://linkedin.com/company/darpa", - "name": "DARPA", - "type": "organization" - } - ] - } - ], - "categories": ["artificial-intelligence", "virtual-reality"] - }, - "last_updated": "2023-10-26T11:33:24Z" - } - }, - "Student": { - "type": "object", - "properties": { - "profile_url": { - "type": "string" - }, - "profile": { - "$ref": "#/components/schemas/PublicPerson", - "nullable": true - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " - } - }, - "example": { - "profile_url": "https://www.linkedin.com/in/johnrmarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "StudentList": { - "type": "object", - "properties": { - "students": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Student" - }, - "description": "\n A list of student profiles (if enriched) and their associated profile URL.\n " - }, - "next_page": { - "type": "string", - "nullable": true, - "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " - } - }, - "example": { - "students": [ - { - "profile_url": "https://www.linkedin.com/in/johnrmarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null - } - }, - "ReverseEmailUrlEnrichResult": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "Returns the closest match of the LinkedIn profile that belongs to this email address." - }, - "twitter_profile_url": { - "type": "string", - "nullable": true, - "description": "Returns the Twitter Profile URL that belongs to this email address." - }, - "facebook_profile_url": { - "type": "string", - "nullable": true, - "description": "Returns the Facebook Profile URL that belongs to this email address." - }, - "url": { - "type": "string", - "nullable": true - }, - "similarity_score": { - "type": "number", - "nullable": true, - "description": "This metric quantifies the degree of resemblance between the queried profile and the retrieved one. Scores range from `0` (no similarity) to `1` (high similarity). In the event that our dataset lacks a pertinent profile for comparison, the assigned score might be `null`." - }, - "backwards_compatibility_notes": { - "type": "string", - "nullable": true - }, - "profile": { - "$ref": "#/components/schemas/PersonEndpointResponse", - "nullable": true - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "ISO 8601 timestamp since the enriched profile was last scraped." - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", - "twitter_profile_url": "https://www.twitter.com/proxycurl", - "facebook_profile_url": "https://www.facebook.com/zuck", - "similarity_score": 0.82, - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ], - "inferred_salary": { - "min": 35000, - "max": 45000 - }, - "gender": "male", - "birth_date": { - "day": 1, - "month": 1, - "year": 1990 - }, - "industry": "government administration", - "extra": { - "github_profile_id": "github-username", - "facebook_profile_id": "facebook-username", - "twitter_profile_id": "twitter-username", - "website": "https://proxycurl.com" - }, - "interests": ["education", "health", "human rights"], - "personal_emails": [ - "abc@gmail.com", - "bcd@gmail.com", - "cde@@outlook.com" - ], - "personal_numbers": ["+6512345678", "+6285123450953", "+6502300340"] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "ReverseContactNumberResult": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true, - "description": "Returns the closest match of the LinkedIn profile that belongs to this phone number." - }, - "twitter_profile_url": { - "type": "string", - "nullable": true, - "description": "Returns the Twitter Profile URL that belongs to this phone number." - }, - "facebook_profile_url": { - "type": "string", - "nullable": true, - "description": "Returns the Facebook Profile URL that belongs to this phone number." - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/senatormarty", - "twitter_profile_url": "https://www.twitter.com/proxycurl", - "facebook_profile_url": "https://www.facebook.com/zuck" - } - }, - "ExtractionEmailResult": { - "type": "object", - "properties": { - "email_queue_count": { - "type": "integer", - "description": "Total queue in the email extraction process" - } - }, - "example": { - "email_queue_count": null - } - }, - "JobLocation": { - "type": "object", - "properties": { - "country": { - "type": "string", - "nullable": true, - "description": "\n Full country name.\n " - }, - "region": { - "type": "string", - "nullable": true, - "description": "\n Region.\n " - }, - "city": { - "type": "string", - "nullable": true, - "description": "\n The city for the job.\n " - }, - "postal_code": { - "type": "string", - "nullable": true, - "description": "\n Postal code of the business location for the job.\n " - }, - "latitude": { - "type": "number", - "nullable": true, - "description": "\n Latitude coordinates of the business location for the job.\n " - }, - "longitude": { - "type": "number", - "nullable": true, - "description": "\n Longitude coordinates of the business location for the job.\n " - }, - "street": { - "type": "string", - "nullable": true, - "description": "\n Street address of the business location for the job.\n " - } - }, - "example": { - "country": "United States", - "region": "Hawaii", - "city": null, - "postal_code": null, - "latitude": null, - "longitude": null, - "street": null - } - }, - "JobCompany": { - "type": "object", - "properties": { - "name": { - "type": "string", - "nullable": true, - "description": "\n The name of the company.\n " - }, - "url": { - "type": "string", - "nullable": true, - "description": "\n The LinkedIn Company Profile URL of the job posting company.\n " - }, - "logo": { - "type": "string", - "nullable": true, - "description": "\n The URL to the logo of this company.\n " - } - }, - "example": { - "name": "Microsoft", - "url": "https://www.linkedin.com/company/microsoft", - "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" - } - }, - "JobProfile": { - "type": "object", - "properties": { - "linkedin_internal_id": { - "type": "string", - "nullable": true, - "description": "\n The internal ID representation of this job that LinkedIn has for this job.\n " - }, - "job_description": { - "type": "string", - "nullable": true, - "description": "\n Description of the posted job.\n " - }, - "apply_url": { - "type": "string", - "nullable": true, - "description": "\n The URL to apply for this job.\n " - }, - "title": { - "type": "string", - "nullable": true, - "description": "\n Title of the posted job.\n " - }, - "location": { - "$ref": "#/components/schemas/JobLocation" - }, - "company": { - "$ref": "#/components/schemas/JobCompany" - }, - "seniority_level": { - "type": "string", - "nullable": true, - "description": "\n The seniority level for this role.\n " - }, - "industry": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n A list of industries that the company which posted this job lies in.\n " - }, - "employment_type": { - "type": "string", - "nullable": true, - "description": "\n Type of employment.\n " - }, - "job_functions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "\n A list of job functions that this role is expected to cover.\n " - }, - "total_applicants": { - "type": "integer", - "nullable": true, - "description": "\n Total applicants for this job so far.\n " - } - }, - "example": { - "linkedin_internal_id": "content-strategist-at-microsoft-3257696537", - "job_description": "The Global Demand Center (GDC) within the Cloud Marketing group is leading the marketing transformation of Microsoft’s largest and fastest growing commercial businesses. Our always-on integrated marketing programs work to nurture and acquire new customers across segments, targeting business and technical audiences across our commercial cloud portfolio, with programs available in 42 markets and 30 languages. The GDC team is modernizing and integrating these channels through advanced analytics, marketing automation, and digital marketing. We are on a mission to drive market share, consumption, and consistent double-digit+ revenue growth. Content is the fuel that drives the digitally connected customer journeys at the core of the GDC engine, and we’re looking for a skilled, self-motivated, data-driven content strategist to build the content that motivates customers to take action. The Content Strategist will develop and execute content strategies for the ever-critical security space. You will be accountable for understanding the business priorities, getting close to our target audiences, defining the content journeys that attract, nurture, inspire, and retain customers, and manage quality execution and delivery of the content. You will work closely with your counterparts, the integrated marketing strategists, to drive business outcomes. Your network will include product marketers, integrated marketers, relationship marketers, sales, engineering, and agency partners to develop and execute on your plan. Our team: The Lifecycle Programs team is a fast-paced digital marketing organization. We put a focus on getting things done, simplifying anything and everything, and having fun while doing it. We all believe in connecting with customers at scale, supporting them at each stage of the customer journey, from early awareness and consideration, through onboarding and post purchase engagement. You will be in the middle of it all helping to identify the right content that delivers what customers want—where they want it, when they want it, and how they want it. \n \n**_Responsibilities \n_**\n * Define content journeys for Security and IT professionals across industries.\n * Build the resulting content strategies designed to accelerate the customer through the lifecycle.\n * Create a content plan to address the insights in the customer journey and strategy, ensuring the content is aligned to what the customer needs at each stage.\n * Deliver the content through our internal Studio or with select agency partners.\n * Be a customer advocate. Relentlessly champion the customer and the experiences they have with the content you create—how they find it, how they consume it, how they use it to make decisions.\n * Leverage data and market insights for decision making including content optimization and new concept development. \n\n\n**_Qualifications \n \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 1+ year(s) integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n * Bachelor's Degree in Business, Marketing, Communications, Economics, Public Relations, or related field AND 3+ years integrated marketing (e.g., digital, relationship, social media, campaign), event management, marketing strategy, business planning, marketing operations, or related work experience\n * OR equivalent experience.\n * Strong customer centric mindset and demonstrated ability to put the customer first.\n * Clear and persuasive communication skills, both written and verbal.\n * Experience with program performance tracking and communications.\n * Recognized as a self-starter with a bias for action.\n * Creative problem-solving skills, and a growth mindset approach\n * Experience managing across highly matrixed organizations, often with competing priorities.\n * A demonstrated track record of business impact through content\n * Well-versed in digital marketing best practices, including journey mapping.\n * Understanding of content disciplines, including SEO, content strategy, and execution.\n * Preferred, but not required: experience with commercial technology sales process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The typical base pay range for this role across the U.S. is USD $80,900 - $162,200 per year. There is a different range applicable to specific work locations, within the San Francisco Bay area and New York City metropolitan area, and the base pay range for this role in those locations is USD $105,300 - $176,900 per year. \n \nMicrosoft has different base pay ranges for different work locations within the United States, which allows us to pay employees competitively and consistently in different geographic markets (see below). The range above reflects the potential base pay across the U.S. for this role (except as noted below); the applicable base pay range will depend on what ultimately is determined to be the candidate’s primary work location. Individual base pay depends on various factors, in addition to primary work location, such as complexity and responsibility of role, job duties/requirements, and relevant experience and skills. Base pay ranges are reviewed and typically updated each year. Offers are made within the base pay range applicable at the time. \n \nAt Microsoft certain roles are eligible for additional rewards, including merit increases, annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed here may vary depending on the nature of employment with Microsoft and the country work location. U.S.-based employees have access to healthcare benefits, a 401(k) plan and company match, short-term and long-term disability coverage, basic life insurance, wellbeing benefits, paid vacation time, paid sick and mental health time, and several paid holidays, among others. \n \nOur commitment to pay equity \n \nWe are committed to the principle of pay equity – paying employees equitably for substantially similar work. To learn more about pay equity and our other commitments to increase representation and strengthen our culture of inclusion, check out our annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page displays the role for which the base pay ranges apply – Integrated Marketing IC3. The way we define roles includes two things: discipline (the type of work) and career stage (scope and complexity). The career stage has two parts – the first identifies whether the role is a manager (M), an individual contributor (IC), an admin-technician-retail (ATR) job, or an intern. The second part identifies the relative seniority of the role – a higher number (or later letter alphabetically in the case of ATR) indicates greater scope and complexity. \n \nMicrosoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to age, ancestry, color, family or medical care leave, gender identity or expression, genetic information, marital status, medical condition, national origin, physical or mental disability, political affiliation, protected veteran status, race, religion, sex (including pregnancy), sexual orientation, or any other characteristic protected by applicable laws, regulations and ordinances. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. If you need assistance and/or a reasonable accommodation due to a disability during the application or the recruiting process, please send a request via the Accommodation request form. \n \nThe salary for this role in the state of Colorado is between $108,200 and $162,200. \n \nAt Microsoft, certain roles are eligible for additional rewards, including annual bonus and stock. These awards are allocated based on individual performance. In addition, certain roles also have the opportunity to earn sales incentives based on revenue or utilization, depending on the terms of the plan and the employee’s role. Benefits/perks listed below may vary depending on the nature of your employment with Microsoft and the country where you work. \n", - "apply_url": "https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite", - "title": "Content Strategist", - "location": { - "country": "United States", - "region": "Hawaii", - "city": null, - "postal_code": null, - "latitude": null, - "longitude": null, - "street": null - }, - "company": { - "name": "Microsoft", - "url": "https://www.linkedin.com/company/microsoft", - "logo": "https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI" - }, - "seniority_level": "Mid-Senior level", - "industry": [ - "IT Services and IT Consulting, Computer Hardware Manufacturing, and Software Development" - ], - "employment_type": "Full-time", - "job_functions": ["Marketing"], - "total_applicants": 200 - } - }, - "Follower": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "nullable": true - }, - "twitter_profile_url": { - "type": "string" - }, - "email": { - "type": "string", - "nullable": true - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", - "twitter_profile_url": "https://www.x.com/agilio_software", - "email": null - } - }, - "FollowerList": { - "type": "object", - "properties": { - "followers": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Follower" - }, - "description": "\n A list of individual followers of a company.\n " - }, - "next_page": { - "type": "string", - "nullable": true, - "description": "\n The API URI that will lead to the next page of results. This will be null for the final page.\n " - } - }, - "example": { - "followers": [ - { - "linkedin_profile_url": "https://www.linkedin.com/in/agiliosoftware", - "twitter_profile_url": "https://www.x.com/agilio_software", - "email": null - }, - { - "linkedin_profile_url": "https://www.linkedin.com/in/air-techniques", - "twitter_profile_url": "https://www.x.com/airtechniques", - "email": null - } - ], - "next_page": null - } - }, - "FollowerListCount": { - "type": "object", - "properties": { - "follower_count": { - "type": "integer", - "description": "A count of all individuals that are probable customers or followers." - } - }, - "example": { - "follower_count": 74 - } - }, - "CSearchResult": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "description": "\n The LinkedIn Profile URL of the company\n " - }, - "profile": { - "$ref": "#/components/schemas/LinkedinCompany", - "nullable": true, - "description": "\n If `enrich_profiles=enrich` is specified, the company's entire profile\n is returned. Otherwise this field will return `null`.\n " - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/company/apple/", - "profile": { - "linkedin_internal_id": "1441", - "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", - "website": "https://goo.gle/3m1IN7m", - "industry": "Software Development", - "company_size": [10001, null], - "company_size_on_linkedin": 319856, - "hq": { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": ["search", "ads"], - "locations": [ - { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - { - "country": "US", - "city": "New York", - "postal_code": "10011", - "line_1": "111 8th Ave", - "is_hq": null, - "state": "NY" - } - ], - "name": "Google", - "tagline": "Think Different - But Not Too Different", - "universal_name_id": "google", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", - "search_id": "1441", - "similar_companies": [ - { - "name": "Amazon", - "link": "https://www.linkedin.com/company/amazon", - "industry": "Software Development", - "location": "Seattle, WA" - }, - { - "name": "Microsoft", - "link": "https://www.linkedin.com/company/microsoft", - "industry": "Software Development", - "location": "Redmond, Washington" - } - ], - "affiliated_companies": [ - { - "name": "YouTube", - "link": "https://www.linkedin.com/company/youtube", - "industry": "Software Development", - "location": "San Bruno, CA" - }, - { - "name": "Google Cloud", - "link": "https://www.linkedin.com/showcase/google-cloud", - "industry": "Software Development", - "location": "Mountain View, California" - } - ], - "updates": [ - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", - "posted_on": { - "day": 13, - "month": 9, - "year": 2022 - }, - "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", - "total_likes": 4267 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", - "posted_on": null, - "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", - "total_likes": 397 - } - ], - "follower_count": 27472792, - "acquisitions": { - "acquired": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", - "announced_date": { - "day": 1, - "month": 4, - "year": 1976 - }, - "price": 300000000 - } - ], - "acquired_by": { - "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "announced_date": { - "day": 6, - "month": 3, - "year": 2020 - }, - "price": 10000 - } - }, - "exit_data": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", - "name": "MotionDSP" - } - ], - "extra": { - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "ipo_status": "Public", - "crunchbase_rank": 13, - "founding_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "operating_status": "Active", - "company_type": "For Profit", - "contact_email": "info@nvidia.com", - "phone_number": "(140) 848-6200", - "facebook_id": "NVIDIA.IN", - "twitter_id": "nvidia", - "number_of_funding_rounds": 3, - "total_funding_amount": 4000000, - "stock_symbol": "NASDAQ:NVDA", - "ipo_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "number_of_lead_investors": 3, - "number_of_investors": 4, - "total_fund_raised": 1000, - "number_of_investments": 50, - "number_of_lead_investments": 3, - "number_of_exits": 7, - "number_of_acquisitions": 2 - }, - "funding_data": [ - { - "funding_type": "Grant", - "money_raised": 25000000, - "announced_date": { - "day": 1, - "month": 1, - "year": 2001 - }, - "number_of_investor": 1, - "investor_list": [ - { - "linkedin_profile_url": "https://linkedin.com/company/darpa", - "name": "DARPA", - "type": "organization" - } - ] - } - ], - "categories": ["artificial-intelligence", "virtual-reality"] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "CompanySearchResult": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/CSearchResult" - }, - "description": "\n A list of SearchResult objects.\n " - }, - "next_page": { - "type": "string", - "nullable": true, - "description": "\n The URL to the next page of search results. This will be null for the final page.\n " - }, - "total_result_count": { - "type": "integer", - "description": "Total results found." - } - }, - "example": { - "results": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple/", - "profile": { - "linkedin_internal_id": "1441", - "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at careers.google.com.", - "website": "https://goo.gle/3m1IN7m", - "industry": "Software Development", - "company_size": [10001, null], - "company_size_on_linkedin": 319856, - "hq": { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - "company_type": "PUBLIC_COMPANY", - "founded_year": null, - "specialities": ["search", "ads"], - "locations": [ - { - "country": "US", - "city": "Mountain View", - "postal_code": "94043", - "line_1": "1600 Amphitheatre Parkway", - "is_hq": true, - "state": "CA" - }, - { - "country": "US", - "city": "New York", - "postal_code": "10011", - "line_1": "111 8th Ave", - "is_hq": null, - "state": "NY" - } - ], - "name": "Google", - "tagline": "Think Different - But Not Too Different", - "universal_name_id": "google", - "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca", - "background_cover_image_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050", - "search_id": "1441", - "similar_companies": [ - { - "name": "Amazon", - "link": "https://www.linkedin.com/company/amazon", - "industry": "Software Development", - "location": "Seattle, WA" - }, - { - "name": "Microsoft", - "link": "https://www.linkedin.com/company/microsoft", - "industry": "Software Development", - "location": "Redmond, Washington" - } - ], - "affiliated_companies": [ - { - "name": "YouTube", - "link": "https://www.linkedin.com/company/youtube", - "industry": "Software Development", - "location": "San Bruno, CA" - }, - { - "name": "Google Cloud", - "link": "https://www.linkedin.com/showcase/google-cloud", - "industry": "Software Development", - "location": "Mountain View, California" - } - ], - "updates": [ - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE", - "posted_on": { - "day": 13, - "month": 9, - "year": 2022 - }, - "text": "Want to kick start your #LifeAtGoogle but not sure where to begin? Explore our Build Your Future site, where you can learn about developmental programs, learn tips for future interviews, sign up for informational events, and even hear real stories from Googlers who’ve been where you are now. Get started → https://bit.ly/3SKPzQB", - "total_likes": 4267 - }, - { - "article_link": null, - "image": "https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg", - "posted_on": null, - "text": "Ariana, welcome to Google. Here’s to a year full of growth, learning, and experiences at #LifeAtGoogle! 🎉", - "total_likes": 397 - } - ], - "follower_count": 27472792, - "acquisitions": { - "acquired": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/apple", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/apple", - "announced_date": { - "day": 1, - "month": 4, - "year": 1976 - }, - "price": 300000000 - } - ], - "acquired_by": { - "linkedin_profile_url": "https://www.linkedin.com/company/nvidia", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "announced_date": { - "day": 6, - "month": 3, - "year": 2020 - }, - "price": 10000 - } - }, - "exit_data": [ - { - "linkedin_profile_url": "https://www.linkedin.com/company/motiondsp", - "crunchbase_profile_url": "https://www.crunchbase.com/organization/motiondsp", - "name": "MotionDSP" - } - ], - "extra": { - "crunchbase_profile_url": "https://www.crunchbase.com/organization/nvidia", - "ipo_status": "Public", - "crunchbase_rank": 13, - "founding_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "operating_status": "Active", - "company_type": "For Profit", - "contact_email": "info@nvidia.com", - "phone_number": "(140) 848-6200", - "facebook_id": "NVIDIA.IN", - "twitter_id": "nvidia", - "number_of_funding_rounds": 3, - "total_funding_amount": 4000000, - "stock_symbol": "NASDAQ:NVDA", - "ipo_date": { - "day": 1, - "month": 1, - "year": 2000 - }, - "number_of_lead_investors": 3, - "number_of_investors": 4, - "total_fund_raised": 1000, - "number_of_investments": 50, - "number_of_lead_investments": 3, - "number_of_exits": 7, - "number_of_acquisitions": 2 - }, - "funding_data": [ - { - "funding_type": "Grant", - "money_raised": 25000000, - "announced_date": { - "day": 1, - "month": 1, - "year": 2001 - }, - "number_of_investor": 1, - "investor_list": [ - { - "linkedin_profile_url": "https://linkedin.com/company/darpa", - "name": "DARPA", - "type": "organization" - } - ] - } - ], - "categories": ["artificial-intelligence", "virtual-reality"] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null, - "total_result_count": 1 - } - }, - "SearchResult": { - "type": "object", - "properties": { - "linkedin_profile_url": { - "type": "string", - "description": "\n The LinkedIn Profile URL of the person\n " - }, - "profile": { - "$ref": "#/components/schemas/PublicPerson", - "nullable": true, - "description": "\n If `enrich_profiles=enrich` is specified, the person's entire profile\n is returned. Otherwise this field will return `null`.\n " - }, - "last_updated": { - "type": "string", - "nullable": true, - "description": "\n ISO 8601 timestamp since the enriched profile was last scraped.\n " - } - }, - "example": { - "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - }, - "PersonSearchResult": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SearchResult" - }, - "description": "\n A list of SearchResult objects\n " - }, - "next_page": { - "type": "string", - "nullable": true, - "description": "\n The URL to the next page of search results. This will be null for the final page.\n " - }, - "total_result_count": { - "type": "integer", - "description": "Total results found." - } - }, - "example": { - "results": [ - { - "linkedin_profile_url": "https://www.linkedin.com/in/johnrmarty", - "profile": { - "public_identifier": "johnrmarty", - "profile_pic_url": "https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI", - "background_cover_image_url": "https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU", - "first_name": "John", - "last_name": "Marty", - "full_name": "John Marty", - "follower_count": null, - "occupation": "Co-Founder at Freedom Fund Real Estate", - "headline": "Financial Freedom through Real Estate - LinkedIn Top Voice", - "summary": "Most people go through life lost, disengaged, and unhappy at work and in their lives - I'm on a mission to solve that.\n\nI spent 10 years as the founder of Axxis Audio, an electronics company that grew to multi-million dollar sales, which I sold in 2012. At that time, I funneled my earnings into the creation of an Internet of Things company, but numerous factors lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less, had a baby on the way, and had zero job prospects (despite applying to 150 companies). My desperate situation led me to take a job at Best Buy for $12 an hour while reinventing myself through the completion of an MBA at the University of Colorado, and a 6-month software development boot camp. \n\nAfter graduation, I landed at American Express as a Senior Product Manager and then got poached by Amazon in 2017 (because of my LinkedIn profile). My journey has led to a deep sense of perspective, humility, and purpose that I draw on to help others find clarity, meaning, and happiness in their careers and lives. \n\nCheck out my website for details on my Mindset Reset Podcast, Public Speaking, Consulting, or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\nA: I'd love to! I've shared my message on the future of employment, breaking into big tech, and my personal story of reinventing myself and discovering my sense of purpose (and how you can too!).\n\n☑️ YouTube Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n☑️ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\nFUN FACTS:\n☑️ I am an Avid cyclist and runner, and I just started learning to skateboard a half-pipe.\n☑️ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n☑️ Email: JohnRmarty@gmail.com (don't forget that \"R\"....The other guy gets my emails all the time)", - "country": "US", - "country_full_name": "United States of America", - "city": "Seattle", - "state": "Washington", - "experiences": [ - { - "starts_at": { - "day": 1, - "month": 8, - "year": 2021 - }, - "ends_at": null, - "company": "Freedom Fund Real Estate", - "company_linkedin_profile_url": "https://www.linkedin.com/company/freedomfund", - "company_facebook_profile_url": null, - "title": "Co-Founder", - "description": "Our mission is to provide everyday people seeking financial freedom long before the age of 65 with the ability to invest in high yield, short-term real estate investments that were only accessible in the past for a select few wealthy individuals. Each of our single family rehab projects require a minimum investment contribution of only $10K, we have simple terms, no multi-year hold periods, and no fees. With our unique model investors can log into our easy to use website, select the projects that they want to invest in, and get realtime updates on the status of their investments.\n\nWebsite: https://www.freedomfundinvestments.com/home", - "location": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2021 - }, - "ends_at": null, - "company": "Mindset Reset Podcast", - "company_linkedin_profile_url": "https://www.linkedin.com/company/mindset-reset-podcast", - "company_facebook_profile_url": null, - "title": "Founder", - "description": "We dive into the mindsets of the world’s foremost thought leaders and turn them into actionable insights so that others can discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607", - "location": "Denver, Colorado, United States", - "logo_url": "https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0" - } - ], - "education": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2013 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "Finance + Economics", - "degree_name": "Master of Business Administration (MBA)", - "school": "University of Colorado Denver", - "school_linkedin_profile_url": "https://www.linkedin.com/school/university-of-colorado-denver/", - "school_facebook_profile_url": null, - "description": null, - "logo_url": "https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE", - "grade": null, - "activities_and_societies": null - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": { - "day": 31, - "month": 12, - "year": 2015 - }, - "field_of_study": "School of Software Development", - "degree_name": null, - "school": "Galvanize Inc", - "school_linkedin_profile_url": "https://www.linkedin.com/school/galvanize-it/", - "school_facebook_profile_url": null, - "description": "rails, ruby, rspec, capybara, bootstrap, css, html, api integration, Jquery, Javascript", - "logo_url": "https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE", - "grade": null, - "activities_and_societies": null - } - ], - "languages": ["English", "Spanish"], - "accomplishment_organisations": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "org_name": "Microsoft", - "title": "Software Developer", - "description": null - } - ], - "accomplishment_publications": [ - { - "name": "Nobel Peace Prize", - "publisher": "Acme Corp", - "published_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "url": "https://example.com" - } - ], - "accomplishment_honors_awards": [ - { - "title": "Nobel Peace Prize", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n " - } - ], - "accomplishment_patents": [ - { - "title": "The art of war", - "issuer": "Acme Corp", - "issued_on": { - "day": 1, - "month": 1, - "year": 1970 - }, - "description": "\n Lorem ipsum dolor sit amet, consectetur adipiscing elit\n ", - "application_number": "123", - "patent_number": "123", - "url": null - } - ], - "accomplishment_courses": [ - { - "name": "The course about ABCs", - "number": "123" - } - ], - "accomplishment_projects": [ - { - "starts_at": { - "day": 1, - "month": 3, - "year": 2015 - }, - "ends_at": null, - "title": "gMessenger", - "description": "gMessenger was built using Ruby on Rails, and the Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration to post a user's message content to the page in real time, with no page refresh required. gMessenger also includes custom authentication with three different permissions levels.", - "url": "http://gmessenger.herokuapp.com/" - }, - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2015 - }, - "ends_at": null, - "title": "Taskly", - "description": "A task and project management responsive web app utilizing Ruby on Rails - CSS and HTML", - "url": "https://hidden-coast-7204.herokuapp.com/" - } - ], - "accomplishment_test_scores": [ - { - "name": "CS1101S", - "score": "A", - "date_on": { - "day": 1, - "month": 1, - "year": 2010 - }, - "description": "Nailed it without studying." - } - ], - "volunteer_work": [ - { - "starts_at": { - "day": 1, - "month": 1, - "year": 2012 - }, - "ends_at": { - "day": 1, - "month": 8, - "year": 2016 - }, - "title": "Surveyor", - "cause": "To help the world", - "company": "Microsoft", - "company_linkedin_profile_url": "https://www.linkedin.com/company/microsoft", - "description": null, - "logo_url": null - } - ], - "certifications": [ - { - "starts_at": null, - "ends_at": null, - "name": "SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices in the SAFe Enterprise)", - "license_number": null, - "display_source": null, - "authority": "Scaled Agile, Inc.", - "url": null - }, - { - "starts_at": null, - "ends_at": null, - "name": "SCRUM Alliance Certified Product Owner", - "license_number": null, - "display_source": null, - "authority": "Scrum Alliance", - "url": null - } - ], - "connections": 500, - "people_also_viewed": [ - { - "link": "https://www.linkedin.com/in/johndoe", - "name": "John Doe", - "summary": "Software Engineer at Google", - "location": "Singapore" - } - ], - "recommendations": [ - "Rebecca Canfield\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John Marty is a genius at his craft. He is skilled in the art of making people feel empowered to seek out roles that they are qualified for, ask for salaries that they deserve, and creates a kind of pay it forward lifestyle. John helps you to get to places that you only thought were possible for other people. Anyone that is fortunate enough to learn from John should consider themselves extremely lucky. I know I do. ", - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \n \n \n \n\n \n John is so focused on helping guide you through an interview process not just for Amazon but on interviewing in general. I've generally done well at interviewing, my skills are top notch now. John is so focused on on his clients and really goes above and beyond. John is genuine, knowledgeable, well spoken and non-judgemental. He is so encouraging, so positive and really easy to talk to. Thank you John!" - ], - "activities": [ - { - "title": "Yesterday I toured a $1.2M property in California that has a large 13K sq ft lot with two homes on it. After 5 minutes of being on-site I…", - "link": "https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo", - "activity_status": "Shared by John Marty" - } - ], - "similarly_named_profiles": [ - { - "name": "John Martinez", - "link": "https://www.linkedin.com/in/john-martinez-90384a229", - "summary": "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty’s Hardwood Works", - "location": "San Antonio, TX" - }, - { - "name": "John Marty", - "link": "https://www.linkedin.com/in/senatormarty", - "summary": null, - "location": "St Paul, MN" - } - ], - "articles": [ - { - "title": "Manufacturing opportunity", - "link": "https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/", - "published_date": { - "day": 27, - "month": 11, - "year": 2019 - }, - "author": "Bill Gates", - "image_url": "https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg" - } - ], - "groups": [ - { - "profile_pic_url": "https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204", - "name": "Hadoop Users", - "url": "https://www.linkedin.com/groups/988957" - } - ] - }, - "last_updated": "2023-10-26T11:34:30Z" - } - ], - "next_page": null, - "total_result_count": 1 - } - }, - "CreditBalance": { - "type": "object", - "properties": { - "credit_balance": { - "type": "integer", - "description": "Your current credit(s)" - } - }, - "example": { - "credit_balance": 100000 - } - }, - "DisposableEmail": { - "type": "object", - "properties": { - "is_disposable_email": { - "type": "boolean", - "description": "Returns a boolean value of the disposable nature of the given email address" - }, - "is_free_email": { - "type": "boolean", - "description": "Returns a boolean value of the free status of the given email address" - } - }, - "example": { - "is_disposable_email": null, - "is_free_email": null - } - }, - "PersonalContactNumbers": { - "type": "object", - "properties": { - "numbers": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of contact numbers" - } - }, - "example": { - "numbers": ["+1123123123"] - } - }, - "PDLEmailResult": { - "type": "object", - "properties": { - "emails": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of personal emails" - }, - "invalid_emails": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of invalid personal emails" - } - }, - "example": { - "emails": ["random@gmail.com", "random2@yahoo.com"], - "invalid_emails": ["random3@gmail.com"] - } - } - }, - "securitySchemes": { - "BearerAuth": { - "type": "http", - "scheme": "bearer" - } - } - } -} diff --git a/proxycurl-openapi.yaml b/proxycurl-openapi.yaml deleted file mode 100644 index 21472f377..000000000 --- a/proxycurl-openapi.yaml +++ /dev/null @@ -1,9978 +0,0 @@ -servers: - - url: https://nubela.co/proxycurl - description: With SSL Proxycurl Server - - url: http://nubela.co/proxycurl - description: Without SSL Proxycurl Server -security: - - BearerAuth: - - client -paths: - /api/linkedin/school: - get: - description: 'Cost: 1 credit / successful request. - - Get structured data of a LinkedIn School Profile' - parameters: - - in: query - name: url - required: true - description: - "\n URL of the LinkedIn School Profile to crawl.\n\n URL\ - \ should be in the format of `https://www.linkedin.com/school/`\n\ - \ " - example: https://www.linkedin.com/school/national-university-of-singapore - schema: - type: string - - in: query - name: use_cache - required: false - description: - '`if-present` The default behavior. Fetches profile from cache - regardless of age of profile. If profile is not available in cache, API - will attempt to source profile externally. - - - `if-recent` API will make a best effort to return a fresh profile no older - than 29 days.Costs an extra `1` credit on top of the cost of the base endpoint.' - example: if-present - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/LinkedinSchool' - example: - linkedin_internal_id: '5524' - description: - "At NUS, we are shaping the future through our people\ - \ and our pursuit of new frontiers in knowledge. In a single century,\ - \ we have become a university of global influence and an Asian thought\ - \ leader. Our location at the crossroads of Asia informs our mission\ - \ and gives us a tremendous vantage point to help create opportunities\ - \ and address the pressing issues facing Singapore, Asia and the\ - \ world.\r\rAt NUS, we believe in education, research and service\ - \ that change lives." - website: http://nus.edu.sg - industry: Higher Education - company_size: - - 5001 - - 10000 - company_size_on_linkedin: 16084 - hq: - country: SG - city: Singapore - postal_code: '119077' - line_1: 21 Lower Kent Ridge Road, Singapore - is_hq: true - state: null - company_type: EDUCATIONAL_INSTITUTION - founded_year: 1905 - specialities: - - education - - research - locations: - - country: SG - city: Singapore - postal_code: '119077' - line_1: 21 Lower Kent Ridge Road, Singapore - is_hq: true - state: null - name: National University of Singapore - tagline: null - universal_name_id: national-university-of-singapore - profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24 - background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140 - search_id: '5524' - similar_companies: - - name: NUS Business School - link: https://www.linkedin.com/school/nus-business-school/ - industry: Higher Education - location: null - - name: NUS Faculty of Arts and Social Sciences - link: https://www.linkedin.com/school/nusfass/ - industry: Higher Education - location: null - affiliated_companies: [] - updates: [] - follower_count: 539321 - description: Profile data with profile picture, school location, etc - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - School API - operationId: School Profile Endpoint - summary: School Profile Endpoint - /api/linkedin/company: - get: - description: 'Cost: 1 credit / successful request. - - Get structured data of a Company Profile' - parameters: - - in: query - name: url - required: true - description: - "\n URL of the LinkedIn Company Profile to\ - \ crawl.\n\n URL should be in the format of `https://www.linkedin.com/company/`\n\ - \ " - example: https://www.linkedin.com/company/google/ - schema: - type: string - - in: query - name: resolve_numeric_id - required: false - description: - "\n Enable support for Company Profile URLs\ - \ with numerical IDs that you most frequently fetch from Sales Navigator.\n\ - \ We achieve this by resolving numerical IDs into vanity\ - \ IDs with cached company profiles from [LinkDB](https://nubela.co/proxycurl/linkdb).\n\ - \ For example, we will turn `https://www.linkedin.com/company/1234567890`\ - \ to `https://www.linkedin.com/company/acme-corp` -- for which the API endpoint\ - \ only supports the latter.\n\n This parameter accepts\ - \ the following values:\n - `false` - Will not resolve\ - \ numerical IDs.\n - `true` (default value) - Enable\ - \ support for Company Profile URLs with numerical IDs.\n \ - \ Costs an extra `2` credit on top of the base cost of the endpoint.\n\ - \ " - example: 'true' - schema: - type: string - - in: query - name: categories - required: false - description: - "\n Appends categories data of this company.\n\ - \n Default value is `\"exclude\"`.\n \ - \ The other acceptable value is `\"include\"`, which will include these\ - \ categories (if available) for `1` extra credit.\n " - example: include - schema: - type: string - - in: query - name: funding_data - required: false - description: - "\n Returns a list of funding rounds that\ - \ this company has received.\n\n Default value is `\"\ - exclude\"`.\n The other acceptable value is `\"include\"\ - `, which will include these categories (if available) for `1` extra credit.\n\ - \ " - example: include - schema: - type: string - - in: query - name: exit_data - required: false - description: - "\n Returns a list of investment portfolio\ - \ exits.\n\n Default value is `\"exclude\"`.\n \ - \ The other acceptable value is `\"include\"`, which will include\ - \ these categories (if available) for `1` extra credit.\n \ - \ " - example: include - schema: - type: string - - in: query - name: acquisitions - required: false - description: - "\n Provides further enriched data on acquisitions\ - \ made by this company from external sources.\n\n Default\ - \ value is `\"exclude\"`.\n The other acceptable value\ - \ is `\"include\"`, which will include these acquisition data (if available)\ - \ for `1` extra credit.\n " - example: include - schema: - type: string - - in: query - name: extra - required: false - description: - "\n Enriches the Company Profile with extra\ - \ details from external sources.\n Details include Crunchbase\ - \ ranking, contact email, phone number, Facebook account, Twitter account,\ - \ funding rounds and amount, IPO status, investor information, etc.\n\n\ - \ Default value is `\"exclude\"`.\n \ - \ The other acceptable value is `\"include\"`, which will include these\ - \ extra details (if available) for `1` extra credit.\n \ - \ " - example: include - schema: - type: string - - in: query - name: use_cache - required: false - description: - "\n `if-present` The default behavior.\n \ - \ Fetches profile from cache regardless of age of profile.\n\ - \ If profile is not available in cache, API will attempt\ - \ to source profile externally.\n\n `if-recent` API will\ - \ make a best effort to return a fresh profile no older than 29 days.\"\n\ - \ Costs an extra `1` credit on top of the cost of the\ - \ base endpoint.\n " - example: if-present - schema: - type: string - - in: query - name: fallback_to_cache - required: false - description: - "\n Tweaks the fallback behavior if an error\ - \ arises from fetching a fresh profile.\n\n This parameter\ - \ accepts the following values:\n * `on-error` (default\ - \ value) - Fallback to reading the profile from cache if an error arises.\n\ - \ * `never` - Do not ever read profile from cache.\n\ - \ " - example: on-error - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/LinkedinCompany' - example: - linkedin_internal_id: '1441' - description: "A problem isn't truly solved until it's solved for - all. Googlers build products that help create opportunities for - everyone, whether down the street or across the globe. Bring your - insight, imagination and a healthy disregard for the impossible. - Bring everything that makes you unique. Together, we can build for - everyone. - - - Check out our career opportunities at careers.google.com." - website: https://goo.gle/3m1IN7m - industry: Software Development - company_size: - - 10001 - - null - company_size_on_linkedin: 319856 - hq: - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - company_type: PUBLIC_COMPANY - founded_year: null - specialities: - - search - - ads - locations: - - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - - country: US - city: New York - postal_code: '10011' - line_1: 111 8th Ave - is_hq: false - state: NY - name: Google - tagline: null - universal_name_id: google - profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca - background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 - search_id: '1441' - similar_companies: - - name: Amazon - link: https://www.linkedin.com/company/amazon - industry: Software Development - location: Seattle, WA - - name: Microsoft - link: https://www.linkedin.com/company/microsoft - industry: Software Development - location: Redmond, Washington - affiliated_companies: - - name: YouTube - link: https://www.linkedin.com/company/youtube - industry: Software Development - location: San Bruno, CA - - name: Google Cloud - link: https://www.linkedin.com/showcase/google-cloud - industry: Software Development - location: Mountain View, California - updates: - - article_link: null - image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE - posted_on: - day: 13 - month: 9 - year: 2022 - text: - "Want to kick start your #LifeAtGoogle but not sure where\ - \ to begin? Explore our Build Your Future site, where you can\ - \ learn about developmental programs, learn tips for future interviews,\ - \ sign up for informational events, and even hear real stories\ - \ from Googlers who\u2019ve been where you are now. Get started\ - \ \u2192 https://bit.ly/3SKPzQB" - total_likes: 4267 - - article_link: null - image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg - posted_on: null - text: - "Ariana, welcome to Google. Here\u2019s to a year full of\ - \ growth, learning, and experiences at #LifeAtGoogle! \U0001F389" - total_likes: 397 - follower_count: 27472792 - description: Profile data with profile picture, office locations, etc - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Company API - operationId: Company Profile Endpoint - summary: Company Profile Endpoint - /api/v2/linkedin: - get: - description: 'Cost: 1 credit / successful request. - - Get structured data of a Personal Profile' - parameters: - - in: query - name: extra - required: false - description: - "\n Enriches the Person Profile with extra\ - \ details from external sources.\n Extra details include\ - \ gender, birth date, industry and interests.\n\n This\ - \ parameter accepts the following values:\n - `exclude`\ - \ (default value) - Does not provide extra data field.\n \ - \ - `include` - Append extra data to the person profile object.\n \ - \ Costs an extra `1` credit on top of the cost of the base\ - \ endpoint (if data is available).\n " - example: include - schema: - type: string - - in: query - name: github_profile_id - required: false - description: - "\n Enriches the Person Profile with Github\ - \ Id from external sources.\n\n This parameter accepts\ - \ the following values:\n - `exclude` (default value)\ - \ - Does not provide Github Id data field.\n - `include`\ - \ - Append Github Id data to the person profile object.\n \ - \ Costs an extra `1` credit on top of the cost of the base endpoint\ - \ (if data is available).\n " - example: include - schema: - type: string - - in: query - name: facebook_profile_id - required: false - description: - "\n Enriches the Person Profile with Facebook\ - \ Id from external sources.\n\n This parameter accepts\ - \ the following values:\n - `exclude` (default value)\ - \ - Does not provide Facebook Id data field.\n - `include`\ - \ - Append Facebook Id data to the person profile object.\n \ - \ Costs an extra `1` credit on top of the cost of the base endpoint\ - \ (if data is available).\n " - example: include - schema: - type: string - - in: query - name: twitter_profile_id - required: false - description: - "\n Enriches the Person Profile with Twitter\ - \ Id from external sources.\n\n This parameter accepts\ - \ the following values:\n - `exclude` (default value)\ - \ - Does not provide Twitter Id data field.\n - `include`\ - \ - Append Twitter Id data to the person profile object.\n \ - \ Costs an extra `1` credit on top of the cost of the base endpoint\ - \ (if data is available).\n " - example: include - schema: - type: string - - in: query - name: personal_contact_number - required: false - description: - "\n Enriches the Person Profile with personal\ - \ numbers from external sources.\n\n This parameter accepts\ - \ the following values:\n - `exclude` (default value)\ - \ - Does not provide personal numbers data field.\n -\ - \ `include` - Append personal numbers data to the person profile object.\n\ - \ Costs an extra `1` credit per email returned on top\ - \ of the cost of the base endpoint (if data is available).\n \ - \ " - example: include - schema: - type: string - - in: query - name: personal_email - required: false - description: - "\n Enriches the Person Profile with personal\ - \ emails from external sources.\n\n This parameter accepts\ - \ the following values:\n - `exclude` (default value)\ - \ - Does not provide personal emails data field.\n -\ - \ `include` - Append personal emails data to the person profile object.\n\ - \ Costs an extra `1` credit per email returned on top\ - \ of the cost of the base endpoint (if data is available).\n \ - \ " - example: include - schema: - type: string - - in: query - name: inferred_salary - required: false - description: - "\n Include inferred salary range from external\ - \ sources.\n\n This parameter accepts the following values:\n\ - \ - `exclude` (default value) - Does not provide inferred\ - \ salary data field.\n - `include` - Append inferred\ - \ salary range data to the person profile object.\n Costs\ - \ an extra `1` credit on top of the cost of the base endpoint (if data is\ - \ available).\n " - example: include - schema: - type: string - - in: query - name: skills - required: false - description: - "\n Include skills data from external sources.\n\ - \n This parameter accepts the following values:\n \ - \ - `exclude` (default value) - Does not provide skills\ - \ data field.\n - `include` - Append skills data to the\ - \ person profile object.\n Costs an extra `1` credit\ - \ on top of the cost of the base endpoint (if data is available).\n \ - \ " - example: include - schema: - type: string - - in: query - name: use_cache - required: false - description: - "\n `if-present` The default behavior.\n \ - \ Fetches profile from cache regardless of age of profile.\n\ - \ If profile is not available in cache, API will attempt\ - \ to source profile externally.\n\n `if-recent` API will\ - \ make a best effort to return a fresh profile no older than 29 days.\"\n\ - \ Costs an extra `1` credit on top of the cost of the\ - \ base endpoint.\n " - example: if-present - schema: - type: string - - in: query - name: fallback_to_cache - required: false - description: - "\n Tweaks the fallback behavior if an error\ - \ arises from fetching a fresh profile.\n\n This parameter\ - \ accepts the following values:\n * `on-error` (default\ - \ value) - Fallback to reading the profile from cache if an error arises.\n\ - \ * `never` - Do not ever read profile from cache.\n\ - \ " - example: on-error - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - "\n The Twitter/X Profile URL from which you\ - \ wish to extract person profile\n\n URL should be in\ - \ the format of `https://x.com/`\n \ - \ \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`,\ - \ or `facebook_profile_url`)" - example: https://x.com/johnrmarty/ - schema: - type: string - - in: query - name: facebook_profile_url - required: false - description: - "\n The Facebook Profile URL from which you\ - \ wish to extract person profile\n\n URL should be in\ - \ the format of `https://facebook.com/`\n \ - \ \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`,\ - \ or `facebook_profile_url`)" - example: https://facebook.com/johnrmarty/ - schema: - type: string - - in: query - name: linkedin_profile_url - required: false - description: - "\n The LinkedIn Profile URL from which you\ - \ wish to extract person profile\n\n URL should be in\ - \ the format of `https://linkedin.com/in/`\n \ - \ \nyes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`,\ - \ or `facebook_profile_url`)" - example: https://linkedin.com/in/johnrmarty/ - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/PersonEndpointResponse' - example: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy\ - \ at work and in their lives - I'm on a mission to solve that.\n\ - \nI spent 10 years as the founder of Axxis Audio, an electronics\ - \ company that grew to multi-million dollar sales, which I sold\ - \ in 2012. At that time, I funneled my earnings into the creation\ - \ of an Internet of Things company, but numerous factors lead to\ - \ its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job\ - \ at Best Buy for $12 an hour while reinventing myself through the\ - \ completion of an MBA at the University of Colorado, and a 6-month\ - \ software development boot camp. \n\nAfter graduation, I landed\ - \ at American Express as a Senior Product Manager and then got poached\ - \ by Amazon in 2017 (because of my LinkedIn profile). My journey\ - \ has led to a deep sense of perspective, humility, and purpose\ - \ that I draw on to help others find clarity, meaning, and happiness\ - \ in their careers and lives. \n\nCheck out my website for details\ - \ on my Mindset Reset Podcast, Public Speaking, Consulting, or my\ - \ free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ - \ podcast?\nA: I'd love to! I've shared my message on the future\ - \ of employment, breaking into big tech, and my personal story of\ - \ reinventing myself and discovering my sense of purpose (and how\ - \ you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John Marty)\ - \ : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\uFE0F YouTube\ - \ Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ - \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ - \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ - \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"R\"\ - ....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking - financial freedom long before the age of 65 with the ability to - invest in high yield, short-term real estate investments that - were only accessible in the past for a select few wealthy individuals. - Each of our single family rehab projects require a minimum investment - contribution of only $10K, we have simple terms, no multi-year - hold periods, and no fees. With our unique model investors can - log into our easy to use website, select the projects that they - want to invest in, and get realtime updates on the status of their - investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost\ - \ thought leaders and turn them into actionable insights so that\ - \ others can discover greater happiness, success, and fulfillment.\n\ - \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, - api integration, Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap - HTML, CSS, and JavaScript framework. It uses a Websocket-Rails - integration to post a user's message content to the page in real - time, with no page refresh required. gMessenger also includes - custom authentication with three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: [] - volunteer_work: [] - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean - Practices in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: [] - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n\ - \ \n John Marty is a genius at his craft. He is skilled\ - \ in the art of making people feel empowered to seek out roles that\ - \ they are qualified for, ask for salaries that they deserve, and\ - \ creates a kind of pay it forward lifestyle. John helps you to\ - \ get to places that you only thought were possible for other people.\ - \ Anyone that is fortunate enough to learn from John should consider\ - \ themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n\ - \ John is so focused on helping guide you through an interview\ - \ process not just for Amazon but on interviewing in general. I've\ - \ generally done well at interviewing, my skills are top notch now.\ - \ John is so focused on on his clients and really goes above and\ - \ beyond. John is genuine, knowledgeable, well spoken and non-judgemental.\ - \ He is so encouraging, so positive and really easy to talk to.\ - \ Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that has\ - \ a large 13K sq ft lot with two homes on it. After 5 minutes\ - \ of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner\ - \ Marty\u2019s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: [] - groups: [] - description: Profile data with profile picture, job history, etc. - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - People API - operationId: Person Profile Endpoint - summary: Person Profile Endpoint - /api/customers: - get: - description: - 'Cost: 10 credits / result for users on an annual subscription - or Enterprise plan. - - Get a list of probable corporate customers of a target company.' - parameters: - - in: query - name: linkedin_company_profile_url - required: false - description: - "\n The LinkedIn Profile URL of the company from\ - \ which you want to get a list of customers of.\n\n URL should\ - \ be in the format of `https://www.linkedin.com/company/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://www.linkedin.com/company/watsons - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - "\n The Twitter/X Profile URL belonging to the\ - \ company that you want to get a list of customers of.\n\n \ - \ URL should be in the format of `https://x.com/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://x.com/watsonsproperty - schema: - type: string - - in: query - name: page_size - required: false - description: - "\n Limit the maximum results of customer companies\ - \ returned per API call.\n\n The default value of this parameter\ - \ is 10.\n\n Accepted values for this parameter is an integer\ - \ ranging from 0 to 1000.\n " - example: '10' - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/CustomerList' - example: - companies: - - linkedin_company_profile_url: https://www.linkedin.com/company/spire-solicitors-llp - twitter_profile_url: https://twitter.com/spirellp - email: info@spiresolicitors.co.uk - - linkedin_company_profile_url: https://www.linkedin.com/company/mall-wood-insurance-services-ltd - twitter_profile_url: https://twitter.com/draytonins - email: null - next_page: null - description: A list of probable customers of the target company. - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Customer API `EXPERIMENTAL` - operationId: Customer Listing Endpoint `EXPERIMENTAL` - summary: Customer Listing Endpoint `EXPERIMENTAL` - /api/customers/count/: - get: - description: - 'Cost: 1 credit / result for users on an annual subscription or - Enterprise plan. - - Get the total count of probable corporate customers of a target company.' - parameters: - - in: query - name: linkedin_company_profile_url - required: false - description: - "\n The LinkedIn Profile URL of the company from\ - \ which you want to get a list of customers of.\n\n URL should\ - \ be in the format of `https://www.linkedin.com/company/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://www.linkedin.com/company/watsons - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - "\n The Twitter/X Profile URL belonging to the\ - \ company that you want to get a list of customers of.\n\n \ - \ URL should be in the format of https://x.com/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://x.com/watsonsproperty - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/CustomerCount' - example: - company_count: 125 - description: Number of probable customers of the target company. - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Customer API `EXPERIMENTAL` - operationId: Customer Listing Count Endpoint `EXPERIMENTAL` - summary: Customer Listing Count Endpoint `EXPERIMENTAL` - /api/linkedin/company/employees/: - get: - description: 'Cost: 3 credits / employee returned. - - Get a list of employees of a Company. - - - This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), - our comprehensive dataset of people and company profiles.' - parameters: - - in: query - name: country - required: false - description: - "\n Limit the result set to the country locality of the profile.\ - \ For example, set the parameter of `country=us` if you only want profiles\ - \ from the US. Or you can set the parameter to `country=us,sg` if you want\ - \ employees from both the US and Singapore.\n\n This parameter accepts\ - \ a comma-separated case-insensitive values of [Alpha-2 ISO3166 country\ - \ code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\n Costs\ - \ an extra `3` credit per result returned.\n " - example: us - schema: - type: string - - in: query - name: enrich_profiles - required: false - description: - "\n Get the full profile of employees instead of only their\ - \ profile urls.\n\n Each request respond with a streaming response of\ - \ profiles.\n\n The valid values are:\n \n * `skip` (default):\ - \ lists employee's profile url\n * `enrich`: lists full profile of employees\n\ - \n Calling this API endpoint with this parameter would add `1` credit\ - \ per employee returned.\n " - example: enrich - schema: - type: string - - in: query - name: role_search - required: false - description: - "\n Filter employees by their title by matching the employee's\ - \ title against a *regular expression*.\n\n The default value of this\ - \ parameter is `null`.\n\n The accepted value for this parameter is a\ - \ **case-insensitive** regular expression.\n\n (The base cost of calling\ - \ this API endpoint with this parameter would be `10` credits.\n Each\ - \ employee matched and returned would cost 3 extra credits.)\n " - example: (co)?-?founder - schema: - type: string - - in: query - name: page_size - required: false - description: - "\n Limit the maximum results returned per API call.\n\n \ - \ The default value of this parameter is `10`.\n\n Accepted values\ - \ for this parameter is an integer ranging from `1` to `200000`.\n\n \ - \ When `enrich_profiles=enrich`, this parameter accepts value ranging from\ - \ `1` to `10` and the default value is `10`.\n " - example: '10' - schema: - type: string - - in: query - name: employment_status - required: false - description: - "\n Parameter to tell the API to return past or current employees.\n\ - \n Valid values are `current`, `past`, and `all`:\n\n * `current`\ - \ (default) : lists current employees\n * `past` : lists past employees\n\ - \ * `all` : lists current & past employees\n " - example: current - schema: - type: string - - in: query - name: sort_by - required: false - description: - "\n Sort employees by recency.\n\n Valid values are:\n\ - \ * `recently-joined` - Sort employees by their join date. The most recent\ - \ employee is on the top of the list.\n * `recently-left` - Sort employees\ - \ by their departure date. The most recent employee who had just left is\ - \ on the top of this list.\n * `oldest` - Returns the oldest employees\ - \ first. The oldest employee who had joined this company historically is\ - \ on the top of this list.\n * `none` - The default value. Do not sort.\n\ - \n If this parameter is supplied with a value other than `none`, will\ - \ add `50` credits to the base cost of the API endpoint regardless number\ - \ of results returned. It will also add an additional cost of `10` credits\ - \ per employee returned.\n " - example: recently-joined - schema: - type: string - - in: query - name: resolve_numeric_id - required: false - description: - "\n Enable support for Company Profile URLs with numerical\ - \ IDs that you most frequently fetch from Sales Navigator. \n We achieve\ - \ this by resolving numerical IDs into vanity IDs with cached company profiles\ - \ from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example,\ - \ we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp`\ - \ -- for which the API endpoint only supports the latter.\n \n This\ - \ parameter accepts the following values:\n - `false` (default value)\ - \ - Will not resolve numerical IDs.\n - `true` - Enable support for Company\ - \ Profile URLs with numerical IDs. \n Costs an extra `2` credit on top\ - \ of the base cost of the endpoint.\n " - example: 'false' - schema: - type: string - - in: query - name: url - required: true - description: - "\n URL of the LinkedIn Company Profile to target.\n\n \ - \ URL should be in the format of `https://www.linkedin.com/company/`\n\ - \ " - example: https://www.linkedin.com/company/microsoft - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/EmployeeList' - example: - employees: - - profile_url: https://www.linkedin.com/in/williamhgates - profile: - public_identifier: williamhgates - profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - background_cover_image_url: null - first_name: Bill - last_name: Gates - full_name: Bill Gates - occupation: Co-chair at Bill & Melinda Gates Foundation - headline: Co-chair, Bill & Melinda Gates Foundation - summary: - Co-chair of the Bill & Melinda Gates Foundation. Founder - of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. - Avid traveler. Active blogger. - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - company: 'Breakthrough Energy ' - company_linkedin_profile_url: https://www.linkedin.com/company/breakthrough-energy/ - title: Founder - description: null - location: null - logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y - - starts_at: - day: 1 - month: 1 - year: 2000 - ends_at: null - company: Bill & Melinda Gates Foundation - company_linkedin_profile_url: https://www.linkedin.com/company/bill-&-melinda-gates-foundation/ - title: Co-chair - description: null - location: null - logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs - education: - - starts_at: - day: 1 - month: 1 - year: 1973 - ends_at: - day: 31 - month: 12 - year: 1975 - field_of_study: null - degree_name: null - school: Harvard University - school_linkedin_profile_url: null - description: null - logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw - - starts_at: null - ends_at: null - field_of_study: null - degree_name: null - school: Lakeside School - school_linkedin_profile_url: null - description: null - logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ - languages: [] - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: [] - accomplishment_test_scores: [] - volunteer_work: [] - certifications: [] - connections: null - people_also_viewed: [] - recommendations: [] - activities: [] - similarly_named_profiles: [] - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - next_page: null - description: List of employees - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Company API - operationId: Employee Listing Endpoint - summary: Employee Listing Endpoint - /api/linkedin/company/employees/count: - get: - description: 'Cost: 1 credit / successful request. - - Get a number of total employees of a Company. - - - Get an employee count of this company from various sources.' - parameters: - - in: query - name: use_cache - required: false - description: - "\n `if-present`: The default behavior. Fetches data from\ - \ LinkDB cache regardless of age of profile.\n\n `if-recent`: API will\ - \ make a best effort to return a fresh data no older than 29 days. Costs\ - \ an extra 1 credit on top of the cost of the base endpoint.\n " - example: if-present - schema: - type: string - - in: query - name: linkedin_employee_count - required: false - description: - "\n Option to include a scraped employee count value from\ - \ the target company's LinkedIn profile.\n\n Valid values are `include`\ - \ and `exclude`:\n\n * `exclude` (default) : To exclude the scraped employee\ - \ count.\n * `include` : To include the scraped employee count.\n\n \ - \ Costs an extra `1` credit on top of the base cost of the endpoint.\n\ - \ " - example: include - schema: - type: string - - in: query - name: employment_status - required: false - description: - "\n Parameter to tell the API to filter past or current employees.\n\ - \n Valid values are `current`, `past`, and `all`:\n\n * `current`\ - \ (default) : count current employees\n * `past` : count past employees\n\ - \ * `all` : count current & past employees\n " - example: current - schema: - type: string - - in: query - name: url - required: true - description: - "\n URL of the LinkedIn Company Profile to target.\n\n \ - \ URL should be in the format of `https://www.linkedin.com/company/`\n\ - \ " - example: https://www.linkedin.com/company/apple/ - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/EmployeeCount' - example: - linkedin_employee_count: 529274 - linkdb_employee_count: 3 - description: Number of employees in a company - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Company API - operationId: Employee Count Endpoint - summary: Employee Count Endpoint - /api/linkedin/person/profile-picture: - get: - description: 'Cost: 0 credit / successful request. - - Get the profile picture of a person. - - - Profile pictures are served from cached people profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb). - - If the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), - then the API will return a `404` status code.' - parameters: - - in: query - name: linkedin_person_profile_url - required: true - description: - "\n LinkedIn Profile URL of the person that you are trying\ - \ to get the profile picture of.\n " - example: https://www.linkedin.com/in/williamhgates/ - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ProfilePicture' - example: - tmp_profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - description: Profile picture of a person - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - People API - operationId: Person Profile Picture Endpoint - summary: Person Profile Picture Endpoint - /api/linkedin/company/profile-picture: - get: - description: 'Cost: 0 credit / successful request. - - Get the profile picture of a company. - - - Profile pictures are served from cached company profiles found within [LinkDB](https://nubela.co/proxycurl/linkdb). - - If the profile does not exist within [LinkDB](https://nubela.co/proxycurl/linkdb), - then the API will return a `404` status code.' - parameters: - - in: query - name: linkedin_company_profile_url - required: true - description: - "\n LinkedIn Profile URL of the company that you are trying\ - \ to get the profile picture of.\n " - example: https://www.linkedin.com/company/apple/ - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ProfilePicture' - example: - tmp_profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - description: Profile picture of a company - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Company API - operationId: Company Profile Picture Endpoint - summary: Company Profile Picture Endpoint - /api/linkedin/profile/resolve: - get: - description: 'Cost: 2 credits / successful request. - - Look up a person with a name and company information.' - parameters: - - in: query - name: similarity_checks - required: false - description: - "\n Controls whether the API endpoint performs\n similarity\ - \ comparisons between the input parameters\n and the results or simply\ - \ returns the closest match.\n For instance, if you are searching for\ - \ a person named\n \"Ben Chad\", and the closest result we have is \"\ - Chavvy\n Plum\", our similarity checks will discard the obviously\n \ - \ incorrect result and return `null` instead of a false\n positive.\n\ - \n Include similarity checks to eliminate false positives.\n However,\ - \ be aware that this might yield fewer results\n as false positives are\ - \ discarded. Credits will still be\n deducted even if we return `null`.\n\ - \n You can choose to skip similarity checks, in which\n case no credits\ - \ will be charged if we return `null`.\n\n This parameter accepts the\ - \ following values:\n * `include` (default) - Perform similarity checks\ - \ and\n discard false positives. Credits will be deducted even\n if\ - \ we return null .\n * `skip` - Bypass similarity checks. No credits\ - \ will be\n deducted if no results are returned.\n " - example: include - schema: - type: string - - in: query - name: enrich_profile - required: false - description: - "\n Enrich the result with a cached profile of the lookup\ - \ result.\n\n The valid values are:\n\n * `skip` (default): do not\ - \ enrich the results with cached profile data\n * `enrich`: enriches\ - \ the result with cached profile data\n\n Calling this API endpoint with\ - \ this parameter would add 1 credit.\n\n If you require [fresh profile\ - \ data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n\ - \ please chain this API call with the [People Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint)\ - \ with the `use_cache=if-recent` parameter.\n " - example: enrich - schema: - type: string - - in: query - name: company_domain - required: true - description: Company name or domain - example: gatesfoundation.org - schema: - type: string - - in: query - name: location - required: false - description: - "\n The location of this user.\n\n Name of country, city\ - \ or state.\n " - example: Seattle - schema: - type: string - - in: query - name: title - required: false - description: Title that user is holding at his/her current job - example: Co-chair - schema: - type: string - - in: query - name: last_name - required: false - description: Last name of the user - example: Gates - schema: - type: string - - in: query - name: first_name - required: true - description: First name of the user - example: Bill - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/PersonLookupUrlEnrichResult' - example: - url: https://www.linkedin.com/in/senatormarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy\ - \ at work and in their lives - I'm on a mission to solve that.\n\ - \nI spent 10 years as the founder of Axxis Audio, an electronics\ - \ company that grew to multi-million dollar sales, which I sold\ - \ in 2012. At that time, I funneled my earnings into the creation\ - \ of an Internet of Things company, but numerous factors lead\ - \ to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job\ - \ at Best Buy for $12 an hour while reinventing myself through\ - \ the completion of an MBA at the University of Colorado, and\ - \ a 6-month software development boot camp. \n\nAfter graduation,\ - \ I landed at American Express as a Senior Product Manager and\ - \ then got poached by Amazon in 2017 (because of my LinkedIn profile).\ - \ My journey has led to a deep sense of perspective, humility,\ - \ and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website\ - \ for details on my Mindset Reset Podcast, Public Speaking, Consulting,\ - \ or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ - \ podcast?\nA: I'd love to! I've shared my message on the future\ - \ of employment, breaking into big tech, and my personal story\ - \ of reinventing myself and discovering my sense of purpose (and\ - \ how you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John\ - \ Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\ - \uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ - \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ - \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ - \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"\ - R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking - financial freedom long before the age of 65 with the ability - to invest in high yield, short-term real estate investments - that were only accessible in the past for a select few wealthy - individuals. Each of our single family rehab projects require - a minimum investment contribution of only $10K, we have simple - terms, no multi-year hold periods, and no fees. With our unique - model investors can log into our easy to use website, select - the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost\ - \ thought leaders and turn them into actionable insights so\ - \ that others can discover greater happiness, success, and fulfillment.\n\ - \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, - api integration, Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the - Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails - integration to post a user's message content to the page in - real time, with no page refresh required. gMessenger also includes - custom authentication with three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app - utilizing Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: [] - volunteer_work: [] - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean - Practices in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: [] - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\ - \n \n John Marty is a genius at his craft. He is\ - \ skilled in the art of making people feel empowered to seek out\ - \ roles that they are qualified for, ask for salaries that they\ - \ deserve, and creates a kind of pay it forward lifestyle. John\ - \ helps you to get to places that you only thought were possible\ - \ for other people. Anyone that is fortunate enough to learn from\ - \ John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \ - \ \n John is so focused on helping guide you through\ - \ an interview process not just for Amazon but on interviewing\ - \ in general. I've generally done well at interviewing, my skills\ - \ are top notch now. John is so focused on on his clients and\ - \ really goes above and beyond. John is genuine, knowledgeable,\ - \ well spoken and non-judgemental. He is so encouraging, so positive\ - \ and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that\ - \ has a large 13K sq ft lot with two homes on it. After 5 minutes\ - \ of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC ,\ - \ Owner Marty\u2019s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - description: LinkedIn (Person) Profile URL - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - People API - operationId: Person Lookup Endpoint - summary: Person Lookup Endpoint - /api/v2/linkedin/company/job: - get: - description: 'Cost: 2 credits / successful request. - - List jobs posted by a company on LinkedIn' - parameters: - - in: query - name: job_type - required: false - description: - "\n The nature of the job.\n It accepts the following 7\ - \ case-insensitive values only:\n - `full-time`\n - `part-time`\n\ - \ - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n\ - \ - `anything` (default)\n " - example: anything - schema: - type: string - - in: query - name: experience_level - required: false - description: - "\n The experience level needed for the job.\n It accepts\ - \ the following 6 case-insensitive values only:\n - `internship`\n \ - \ - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n\ - \ - `anything` (default)\n " - example: entry_level - schema: - type: string - - in: query - name: when - required: false - description: - "\n The time when the job is posted,\n It accepts the following\ - \ case-insensitive values only:\n - `yesterday`\n - `past-week`\n\ - \ - `past-month`\n - `anytime` (default)\n " - example: past-month - schema: - type: string - - in: query - name: flexibility - required: false - description: - "\n The flexibility of the job.\n It accepts the following\ - \ 3 case insensitive values only:\n - `remote`\n - `on-site`\n \ - \ - `hybrid`\n - `anything` (default)\n " - example: remote - schema: - type: string - - in: query - name: geo_id - required: false - description: - "\n The `geo_id` of the location to search for.\n For example,\ - \ `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article)\ - \ as to how you may be able to match regions to `geo_id` input values.\n\ - \ " - example: '92000000' - schema: - type: string - - in: query - name: keyword - required: false - description: "\n The keyword to search for.\n " - example: software engineer - schema: - type: string - - in: query - name: search_id - required: false - description: - "\n The `search_id` of the company on LinkedIn.\n You can\ - \ get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n\ - \ " - example: '1035' - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/JobListPage' - example: - job: - - company: Microsoft - company_url: https://www.linkedin.com/company/microsoft - job_title: - 'Product Management: Intern Opportunities for University - Students' - job_url: https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682 - list_date: '2022-10-09' - location: New York, NY - - company: Microsoft - company_url: https://www.linkedin.com/company/microsoft - job_title: Content Strategist - job_url: https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764 - list_date: '2022-10-21' - location: United States - next_page_no: 1 - next_page_api_url: http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035 - previous_page_no: null - previous_page_api_url: null - description: List of open job position - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Jobs API - operationId: Job Search Endpoint - summary: Job Search Endpoint - /api/v2/linkedin/company/job/count: - get: - description: 'Cost: 2 credits / successful request. - - Count number of jobs posted by a company on LinkedIn' - parameters: - - in: query - name: job_type - required: false - description: - "\n The nature of the job.\n It accepts the following 7\ - \ case-insensitive values only:\n - `full-time`\n - `part-time`\n\ - \ - `contract`\n - `internship`\n - `temporary`\n - `volunteer`\n\ - \ - `anything` (default)\n " - example: entry_level - schema: - type: string - - in: query - name: experience_level - required: false - description: - "\n The experience level needed for the job.\n It accepts\ - \ the following 6 case-insensitive values only:\n - `internship`\n \ - \ - `entry_level`\n - `associate`\n - `mid_senior_level`\n - `director`\n\ - \ - `anything` (default)\n " - example: entry_level - schema: - type: string - - in: query - name: when - required: false - description: - "\n The time when the job is posted,\n It accepts the following\ - \ case-insensitive values only:\n - `yesterday`\n - `past-week`\n\ - \ - `past-month`\n - `anytime` (default)\n " - example: past-month - schema: - type: string - - in: query - name: flexibility - required: false - description: - "\n The flexibility of the job.\n It accepts the following\ - \ 3 case insensitive values only:\n - `remote`\n - `on-site`\n \ - \ - `hybrid`\n - `anything` (default)\n " - example: remote - schema: - type: string - - in: query - name: geo_id - required: false - description: - "\n The `geo_id` of the location to search for.\n For example,\ - \ `92000000` is the `geo_id` of world wide.\n\n See [this article](https://nubela.co/blog/how-to-fetch-geo_id-parameter-for-the-job-api/?utm_source=blog&utm_medium=web&utm_campaign=docs-redirect-to-geo_id-article)\ - \ as to how you may be able to match regions to `geo_id` input values.\n\ - \ " - example: '92000000' - schema: - type: string - - in: query - name: keyword - required: false - description: "\n The keyword to search for.\n " - example: software engineer - schema: - type: string - - in: query - name: search_id - required: false - description: - "\n The `search_id` of the company on LinkedIn.\n You can\ - \ get the `search_id` of a LinkedIn company via\n [Company Profile API](#company-api-company-profile-endpoint).\n\ - \ " - example: '1035' - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/JobListCount' - example: - count: 887622 - description: Count number of jobs posted - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Jobs API - operationId: Jobs Listing Count Endpoint - summary: Jobs Listing Count Endpoint - /api/find/company/role/: - get: - description: - "Cost: 3 credits / successful request.\nReturns the profile of\ - \ a person who most closely matches a specified role\nin a company. For instance,\ - \ it can be used to identify the \"CTO\" of\n\"Apple\". The endpoint yields\ - \ a single result that represents the closest\nmatch. For a detailed comparison\ - \ between this API endpoint and the\n[Employee Search Endpoint](#company-api-employee-search-endpoint)\n\ - or the [Person Search Endpoint](#search-api-person-search-endpoint),\nrefer\ - \ to [this article](\n https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint)." - parameters: - - in: query - name: enrich_profile - required: false - description: - "\n Enrich the result with a cached profile of the lookup\ - \ result.\n\n The valid values are:\n\n * `skip` (default): do not\ - \ enrich the results with cached profile data\n * `enrich`: enriches\ - \ the result with cached profile data\n\n Calling this API endpoint with\ - \ this parameter would add 1 credit.\n\n If you require [fresh profile\ - \ data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n\ - \ please chain this API call with the [Person Profile Endpoint](#people-api-person-profile-endpoint)\ - \ with the `use_cache=if-recent` parameter.\n " - example: enrich - schema: - type: string - - in: query - name: role - required: true - description: Role of the profile that you are lookin up - example: ceo - schema: - type: string - - in: query - name: company_name - required: true - description: Name of the company that you are searching for - example: nubela - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RoleSearchEnrichedResult' - example: - linkedin_profile_url: https://www.linkedin.com/in/senatormarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy\ - \ at work and in their lives - I'm on a mission to solve that.\n\ - \nI spent 10 years as the founder of Axxis Audio, an electronics\ - \ company that grew to multi-million dollar sales, which I sold\ - \ in 2012. At that time, I funneled my earnings into the creation\ - \ of an Internet of Things company, but numerous factors lead\ - \ to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job\ - \ at Best Buy for $12 an hour while reinventing myself through\ - \ the completion of an MBA at the University of Colorado, and\ - \ a 6-month software development boot camp. \n\nAfter graduation,\ - \ I landed at American Express as a Senior Product Manager and\ - \ then got poached by Amazon in 2017 (because of my LinkedIn profile).\ - \ My journey has led to a deep sense of perspective, humility,\ - \ and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website\ - \ for details on my Mindset Reset Podcast, Public Speaking, Consulting,\ - \ or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ - \ podcast?\nA: I'd love to! I've shared my message on the future\ - \ of employment, breaking into big tech, and my personal story\ - \ of reinventing myself and discovering my sense of purpose (and\ - \ how you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John\ - \ Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\ - \uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ - \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ - \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ - \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"\ - R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking - financial freedom long before the age of 65 with the ability - to invest in high yield, short-term real estate investments - that were only accessible in the past for a select few wealthy - individuals. Each of our single family rehab projects require - a minimum investment contribution of only $10K, we have simple - terms, no multi-year hold periods, and no fees. With our unique - model investors can log into our easy to use website, select - the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost\ - \ thought leaders and turn them into actionable insights so\ - \ that others can discover greater happiness, success, and fulfillment.\n\ - \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, - api integration, Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the - Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails - integration to post a user's message content to the page in - real time, with no page refresh required. gMessenger also includes - custom authentication with three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app - utilizing Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: [] - volunteer_work: [] - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean - Practices in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: [] - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\ - \n \n John Marty is a genius at his craft. He is\ - \ skilled in the art of making people feel empowered to seek out\ - \ roles that they are qualified for, ask for salaries that they\ - \ deserve, and creates a kind of pay it forward lifestyle. John\ - \ helps you to get to places that you only thought were possible\ - \ for other people. Anyone that is fortunate enough to learn from\ - \ John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \ - \ \n John is so focused on helping guide you through\ - \ an interview process not just for Amazon but on interviewing\ - \ in general. I've generally done well at interviewing, my skills\ - \ are top notch now. John is so focused on on his clients and\ - \ really goes above and beyond. John is genuine, knowledgeable,\ - \ well spoken and non-judgemental. He is so encouraging, so positive\ - \ and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that\ - \ has a large 13K sq ft lot with two homes on it. After 5 minutes\ - \ of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC ,\ - \ Owner Marty\u2019s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - description: LinkedIn (Person) Profile URL - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - People API - operationId: Role Lookup Endpoint - summary: Role Lookup Endpoint - /api/linkedin/company/resolve: - get: - description: - "Cost: 2 credits / successful request.\nResolve Company LinkedIn\ - \ Profile from company name,\n domain name and location." - parameters: - - in: query - name: company_location - required: false - description: - "\n The location / region of company.\n ISO 3166-1 alpha-2\ - \ codes\n " - example: sg - schema: - type: string - - in: query - name: company_domain - required: false - description: 'Company website or Company domain - - Requires either `company_domain` or `company_name`' - example: accenture.com - schema: - type: string - - in: query - name: company_name - required: false - description: 'Company Name - - Requires either `company_domain` or `company_name`' - example: Accenture - schema: - type: string - - in: query - name: enrich_profile - required: false - description: - "\n Enrich the result with a cached profile of the lookup\ - \ result.\n\n The valid values are:\n\n * `skip` (default): do not\ - \ enrich the results with cached profile data\n * `enrich`: enriches\ - \ the result with cached profile data\n\n Calling this API endpoint with\ - \ this parameter would add 1 credit.\n\n If you require [fresh profile\ - \ data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\n\ - \ please chain this API call with the [Company Profile Endpoint](https://nubela.co/proxycurl/docs#company-api-company-profile-endpoint)\ - \ with the `use_cache=if-recent` parameter.\n " - example: enrich - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/CompanyUrlEnrichResult' - example: - url: https://www.linkedin.com/company/accenture - profile: - linkedin_internal_id: '1033' - description: - "Accenture is a global professional services company\ - \ with leading capabilities in digital, cloud, and security. Combining\ - \ unmatched experience and specialized skills across more than\ - \ 40 industries, we offer Strategy and Consulting, Technology\ - \ and Operations Services, and Accenture Song\u2014all powered\ - \ by the world\u2019s largest network of Advanced Technology and\ - \ Intelligent Operations centers. \n\nOur people deliver on the\ - \ promise of technology and human ingenuity every day, serving\ - \ clients in more than 120 countries. We embrace the power of\ - \ change to create value and shared success for our clients, people,\ - \ shareholders, partners, and communities. \n\nVisit us at accenture.com." - website: http://www.accenture.com - industry: Business Consulting and Services - company_size: - - 10001 - - null - company_size_on_linkedin: 541251 - hq: - country: IE - city: Dublin 2 - postal_code: null - line_1: Grand Canal Harbour - is_hq: true - state: null - company_type: PUBLIC_COMPANY - founded_year: null - specialities: - - Management Consulting - - Systems Integration and Technology - locations: - - country: IE - city: Dublin 2 - postal_code: null - line_1: Grand Canal Harbour - is_hq: true - state: null - - country: US - city: San Francisco - postal_code: '94105' - line_1: 415 Mission Street Floor 31-34 - is_hq: false - state: California - name: Accenture - tagline: null - universal_name_id: accenture - profile_pic_url: https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY - background_cover_image_url: https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0 - search_id: '1033' - similar_companies: - - name: Deloitte - link: https://www.linkedin.com/company/deloitte - industry: Business Consulting and Services - location: null - - name: Tata Consultancy Services - link: https://in.linkedin.com/company/tata-consultancy-services - industry: IT Services and IT Consulting - location: Mumbai, Maharashtra - affiliated_companies: - - name: Accenture in India - link: https://in.linkedin.com/company/accentureindia - industry: IT Services and IT Consulting - location: Bengaluru, Karnatka - - name: Accenture Brasil - link: https://br.linkedin.com/company/accenturebrasil - industry: IT Services and IT Consulting - location: "S\xE3o Paulo, S\xE3o Paulo" - updates: - - article_link: null - image: null - posted_on: - day: 25 - month: 10 - year: 2023 - text: 'Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4' - total_likes: 325 - - article_link: null - image: https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA - posted_on: - day: 25 - month: 10 - year: 2023 - text: - "The ability to learn new things, without forgetting those\ - \ that came before, is a huge differentiator between the #AI\ - \ we're familiar with, and the #GenerativeAI powered by foundation\ - \ models that we're seeing now.\n \nDiscover the trends shaping\ - \ the next decade: https://accntu.re/474YxOH\n \n#TechVision2023" - total_likes: 541 - follower_count: 11125167 - acquisitions: null - exit_data: null - extra: null - funding_data: null - categories: null - last_updated: '2023-10-26T11:33:24Z' - description: LinkedIn (Company) Profile URL - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Company API - operationId: Company Lookup Endpoint - summary: Company Lookup Endpoint - /api/linkedin/company/employee/search/: - get: - description: 'Cost: 10 credits / successful request. - - Search employees of a target by their job title. This API endpoint is syntactic - - sugar for the role_search parameter under the [Employee Listing Endpoint](#company-api-employee-listing-endpoint). - - This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), - our comprehensive dataset of people - - and company profiles. For a detailed comparison between this API endpoint - - and the [Role Lookup Endpoint](#people-api-role-lookup-endpoint) or the [Person - Search Endpoint](#search-api-person-search-endpoint), refer to [this article](https://nubela.co/blog/what-is-the-difference-between-the-person-search-endpoint-role-lookup-endpoint-and-the-employee-search-endpoint).' - parameters: - - in: query - name: page_size - required: false - description: - "\n Tune the maximum results returned per API call.\n The\ - \ default value of this parameter is `200000`.\n Accepted values for\ - \ this parameter is an integer ranging from `1` to `200000`.\n When `enrich_profiles=enrich`,\ - \ this parameter accepts value ranging from `1` to `10` and the default\ - \ value is `100`.\n " - example: '10' - schema: - type: string - - in: query - name: linkedin_company_profile_url - required: true - description: "\n LinkedIn Profile URL of the target company.\n " - example: https://www.linkedin.com/company/microsoft/ - schema: - type: string - - in: query - name: keyword_regex - required: true - description: - "\n Job title keyword to search for in regular expression\ - \ format.\n\n The accepted value for this parameter is a **case-insensitive**\ - \ regular expression.\n " - example: ceo|cto - schema: - type: string - - in: query - name: country - required: false - description: - "\n Limit the result set to the country locality of the profile.\ - \ For example, set the parameter of `country=us` if you only want profiles\ - \ from the US.\n\n This parameter accepts a case-insensitive [Alpha-2\ - \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ - \n Costs an extra `3` credit per result returned.\n " - example: us - schema: - type: string - - in: query - name: enrich_profiles - required: false - description: - "\n Get the full profile of employees instead of only their\ - \ profile urls.\n\n Each request respond with a streaming response of\ - \ profiles.\n\n The valid values are:\n \n * `skip` (default):\ - \ lists employee's profile url\n * `enrich`: lists full profile of employees\n\ - \n Calling this API endpoint with this parameter would add `1` credit\ - \ per employee returned.\n " - example: enrich - schema: - type: string - - in: query - name: resolve_numeric_id - required: false - description: - "\n Enable support for Company Profile URLs with numerical\ - \ IDs that you most frequently fetch from Sales Navigator. \n We achieve\ - \ this by resolving numerical IDs into vanity IDs with cached company profiles\ - \ from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example,\ - \ we will turn `https://www.linkedin.com/company/1234567890` to `https://www.linkedin.com/company/acme-corp`\ - \ -- for which the API endpoint only supports the latter.\n \n This\ - \ parameter accepts the following values:\n - `false` (default value)\ - \ - Will not resolve numerical IDs.\n - `true` - Enable support for Company\ - \ Profile URLs with numerical IDs. \n Costs an extra `2` credit on top\ - \ of the base cost of the endpoint.\n " - example: 'false' - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/EmployeeList' - example: - employees: - - profile_url: https://www.linkedin.com/in/satyanadella - profile: - public_identifier: williamhgates - profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - background_cover_image_url: null - first_name: Bill - last_name: Gates - full_name: Bill Gates - occupation: Co-chair at Bill & Melinda Gates Foundation - headline: Co-chair, Bill & Melinda Gates Foundation - summary: - Co-chair of the Bill & Melinda Gates Foundation. Founder - of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. - Avid traveler. Active blogger. - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - company: 'Breakthrough Energy ' - company_linkedin_profile_url: https://www.linkedin.com/company/breakthrough-energy/ - title: Founder - description: null - location: null - logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y - - starts_at: - day: 1 - month: 1 - year: 2000 - ends_at: null - company: Bill & Melinda Gates Foundation - company_linkedin_profile_url: https://www.linkedin.com/company/bill-&-melinda-gates-foundation/ - title: Co-chair - description: null - location: null - logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs - education: - - starts_at: - day: 1 - month: 1 - year: 1973 - ends_at: - day: 31 - month: 12 - year: 1975 - field_of_study: null - degree_name: null - school: Harvard University - school_linkedin_profile_url: null - description: null - logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw - - starts_at: null - ends_at: null - field_of_study: null - degree_name: null - school: Lakeside School - school_linkedin_profile_url: null - description: null - logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ - languages: [] - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: [] - accomplishment_test_scores: [] - volunteer_work: [] - certifications: [] - connections: null - people_also_viewed: [] - recommendations: [] - activities: [] - similarly_named_profiles: [] - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - next_page: null - description: List of employees - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Company API - operationId: Employee Search Endpoint - summary: Employee Search Endpoint - /api/linkedin/school/students/: - get: - description: 'Cost: 3 credits / student returned. - - Get a list of students of a school or university.' - parameters: - - in: query - name: country - required: false - description: - "\n Limit the result set to the country locality of the profile.\ - \ For example, set the parameter of `country=us` if you only want profiles\ - \ from the US.\n\n This parameter accepts a case-insensitive [Alpha-2\ - \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ - \n Costs an extra `3` credit per result returned.\n " - example: us - schema: - type: string - - in: query - name: enrich_profiles - required: false - description: - "\n Get the full profile of students instead of only their\ - \ profile urls.\n\n Each request respond with a streaming response of\ - \ profiles.\n\n The valid values are:\n \n * `skip` (default):\ - \ lists student's profile url\n * `enrich`: lists full profile of students\n\ - \n *Calling this API endpoint with this parameter would add `1` credit\ - \ per student returned.*\n " - example: enrich - schema: - type: string - - in: query - name: search_keyword - required: false - description: - "\n Filter students by their major by matching the student's\ - \ major against a *regular expression*.\n\n The default value of this\ - \ parameter is `null`.\n\n The accepted value for this parameter is a\ - \ **case-insensitive** regular expression.\n\n (The base cost of calling\ - \ this API endpoint with this parameter would be `10` credits.\n Each\ - \ student matched and returned would cost `6` credits per student returned.)\n\ - \ " - example: computer*|cs - schema: - type: string - - in: query - name: page_size - required: false - description: - "\n Limit the maximum results returned per API call.\n\n \ - \ The default value of this parameter is `10`.\n\n Accepted values\ - \ for this parameter is an integer ranging from `1` to `200000`.\n\n \ - \ When `enrich_profiles=enrich`, this parameter accepts value ranging from\ - \ `1` to `10` and the default value is `10`.\n " - example: '10' - schema: - type: string - - in: query - name: student_status - required: false - description: - "\n Parameter to tell the API to return past or current students.\n\ - \n Valid values are `current`, `past`, and `all`:\n\n * `current`\ - \ (default) : lists current students\n * `past` : lists past students\n\ - \ * `all` : lists current & past students\n " - example: current - schema: - type: string - - in: query - name: sort_by - required: false - description: - "\n Sort students by matriculation or graduation dates.\n\n\ - \ Valid values are:\n * `recently-matriculated` - Sort students by\ - \ their matriculation date. Students who had had most recently started school\ - \ is on the top of the list.\n * `recently-graduated` - Sort students\ - \ by their graduation date. The most recently graduated student is on the\ - \ top of this list.\n * `none` - The default value. Do not sort.\n\n\ - \ If this parameter is supplied with a value other than `none`, will\ - \ add `50` credits to the base cost of the API endpoint regardless number\ - \ of results returned. It will also add an additional cost of `10` credits\ - \ per student returned.\n " - example: recently-matriculated - schema: - type: string - - in: query - name: resolve_numeric_id - required: false - description: - "\n Enable support for School Profile URLs with numerical\ - \ IDs that you most frequently fetch from Sales Navigator. \n We achieve\ - \ this by resolving numerical IDs into vanity IDs with cached company profiles\ - \ from [LinkDB](https://nubela.co/proxycurl/linkdb). \n For example,\ - \ we will turn `https://www.linkedin.com/school/1234567890` to `https://www.linkedin.com/school/acme-corp`\ - \ -- for which the API endpoint only supports the latter.\n \n This\ - \ parameter accepts the following values:\n - `false` (default value)\ - \ - Will not resolve numerical IDs.\n - `true` - Enable support for School\ - \ Profile URLs with numerical IDs. \n Costs an extra `2` credit on top\ - \ of the base cost of the endpoint.\n " - example: 'false' - schema: - type: string - - in: query - name: linkedin_school_url - required: true - description: - "\n URL of the LinkedIn School Profile to target.\n\n URL\ - \ should be in the format of `https://www.linkedin.com/school/`\n\ - \ " - example: https://www.linkedin.com/school/stanford-university - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/StudentList' - example: - students: - - profile_url: https://www.linkedin.com/in/johnrmarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: - Financial Freedom through Real Estate - LinkedIn Top - Voice - summary: - "Most people go through life lost, disengaged, and unhappy\ - \ at work and in their lives - I'm on a mission to solve that.\n\ - \nI spent 10 years as the founder of Axxis Audio, an electronics\ - \ company that grew to multi-million dollar sales, which I sold\ - \ in 2012. At that time, I funneled my earnings into the creation\ - \ of an Internet of Things company, but numerous factors lead\ - \ to its demise after 2 hard fought years. \n\nAt 31, I was\ - \ penny-less, had a baby on the way, and had zero job prospects\ - \ (despite applying to 150 companies). My desperate situation\ - \ led me to take a job at Best Buy for $12 an hour while reinventing\ - \ myself through the completion of an MBA at the University\ - \ of Colorado, and a 6-month software development boot camp.\ - \ \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because\ - \ of my LinkedIn profile). My journey has led to a deep sense\ - \ of perspective, humility, and purpose that I draw on to help\ - \ others find clarity, meaning, and happiness in their careers\ - \ and lives. \n\nCheck out my website for details on my Mindset\ - \ Reset Podcast, Public Speaking, Consulting, or my free 40\ - \ page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\n\ - FAQ's\n\nQ: Can you speak at my Company, University, event or\ - \ podcast?\nA: I'd love to! I've shared my message on the future\ - \ of employment, breaking into big tech, and my personal story\ - \ of reinventing myself and discovering my sense of purpose\ - \ (and how you can too!).\n\n\u2611\uFE0F YouTube Channel #1\ - \ (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers:\ - \ https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner,\ - \ and I just started learning to skateboard a half-pipe.\n\u2611\ - \uFE0F Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS\ - \ CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com (don't\ - \ forget that \"R\"....The other guy gets my emails all the\ - \ time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking - financial freedom long before the age of 65 with the ability - to invest in high yield, short-term real estate investments - that were only accessible in the past for a select few wealthy - individuals. Each of our single family rehab projects require - a minimum investment contribution of only $10K, we have simple - terms, no multi-year hold periods, and no fees. With our unique - model investors can log into our easy to use website, select - the projects that they want to invest in, and get realtime - updates on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - title: Founder - description: - "We dive into the mindsets of the world\u2019s\ - \ foremost thought leaders and turn them into actionable insights\ - \ so that others can discover greater happiness, success,\ - \ and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - description: - rails, ruby, rspec, capybara, bootstrap, css, html, - api integration, Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the - Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails - integration to post a user's message content to the page in - real time, with no page refresh required. gMessenger also - includes custom authentication with three different permissions - levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app - utilizing Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: [] - volunteer_work: [] - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean - Practices in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: [] - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n\ - \ \n \n \n \n\ - \ \n\n \n John Marty is a genius at his craft.\ - \ He is skilled in the art of making people feel empowered to\ - \ seek out roles that they are qualified for, ask for salaries\ - \ that they deserve, and creates a kind of pay it forward lifestyle.\ - \ John helps you to get to places that you only thought were\ - \ possible for other people. Anyone that is fortunate enough\ - \ to learn from John should consider themselves extremely lucky.\ - \ I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n\ - \ \n John is so focused on helping guide you through\ - \ an interview process not just for Amazon but on interviewing\ - \ in general. I've generally done well at interviewing, my\ - \ skills are top notch now. John is so focused on on his clients\ - \ and really goes above and beyond. John is genuine, knowledgeable,\ - \ well spoken and non-judgemental. He is so encouraging, so\ - \ positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that\ - \ has a large 13K sq ft lot with two homes on it. After 5\ - \ minutes of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC\ - \ , Owner Marty\u2019s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - next_page: null - description: List of students - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - School API - operationId: Student Listing Endpoint - summary: Student Listing Endpoint - /api/linkedin/profile/resolve/email: - get: - description: 'Cost: 3 credits / successful request. - - Resolve social media profiles correlated from an email address. - - This API endpoint works with both personal and work emails.' - parameters: - - in: query - name: email - required: false - description: 'Email address of the user you want to look up. - - yes' - example: danial@nubela.co - schema: - type: string - - in: query - name: lookup_depth - required: false - description: - "\n This parameter describes the depth options\ - \ for our API lookup function. This endpoint can execute either a superficial\ - \ or a deep lookup.\n\n A **superficial lookup** involves\ - \ comparing the provided email with entries in our database. This approach\ - \ tends to yield fewer results and is typically less effective for work-related\ - \ email addresses. However, it does not consume any credits if no results\ - \ are returned.\n\n On the other hand, a **deep lookup**\ - \ extends beyond our database to utilize advanced heuristics and identify\ - \ the individual associated with a given email. This method is particularly\ - \ recommended for work emails.\n\n Please note the following\ - \ valid values for the depth of the lookup:\n\n * `superficial`:\ - \ No credits are consumed if no results are found.\n * `deep`\ - \ (default): Credits are used regardless of whether any results are returned.\n\ - \ \nyes" - example: deep - schema: - type: string - - in: query - name: enrich_profile - required: false - description: - "\n Enrich the result with a cached LinkedIn profile\ - \ of the LinkedIn Profile URL result (if any).\n\n Valid\ - \ values are:\n\n * `skip` (default): do not enrich the results\ - \ with cached profile data.\n * `enrich`: enriches the result\ - \ with cached profile data. \n\n Calling this API endpoint\ - \ with this parameter would add `1` additional credit.\n\n \ - \ If you require [fresh profile data](https://nubela.co/blog/how-fresh-are-profiles-returned-by-proxycurl-api/),\ - \ please chain this API call with the `linkedin_profile_url` result with\ - \ the [Person Profile Endpoint](https://nubela.co/proxycurl/docs#people-api-person-profile-endpoint)\ - \ with the `use_cache=if-recent` parameter.\n \nno" - example: enrich - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ReverseEmailUrlEnrichResult' - example: - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy\ - \ at work and in their lives - I'm on a mission to solve that.\n\ - \nI spent 10 years as the founder of Axxis Audio, an electronics\ - \ company that grew to multi-million dollar sales, which I sold\ - \ in 2012. At that time, I funneled my earnings into the creation\ - \ of an Internet of Things company, but numerous factors lead\ - \ to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job\ - \ at Best Buy for $12 an hour while reinventing myself through\ - \ the completion of an MBA at the University of Colorado, and\ - \ a 6-month software development boot camp. \n\nAfter graduation,\ - \ I landed at American Express as a Senior Product Manager and\ - \ then got poached by Amazon in 2017 (because of my LinkedIn profile).\ - \ My journey has led to a deep sense of perspective, humility,\ - \ and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website\ - \ for details on my Mindset Reset Podcast, Public Speaking, Consulting,\ - \ or my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or\ - \ podcast?\nA: I'd love to! I've shared my message on the future\ - \ of employment, breaking into big tech, and my personal story\ - \ of reinventing myself and discovering my sense of purpose (and\ - \ how you can too!).\n\n\u2611\uFE0F YouTube Channel #1 (John\ - \ Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\ - \uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and\ - \ I just started learning to skateboard a half-pipe.\n\u2611\uFE0F\ - \ Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\ - \u2611\uFE0F Email: JohnRmarty@gmail.com (don't forget that \"\ - R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking - financial freedom long before the age of 65 with the ability - to invest in high yield, short-term real estate investments - that were only accessible in the past for a select few wealthy - individuals. Each of our single family rehab projects require - a minimum investment contribution of only $10K, we have simple - terms, no multi-year hold periods, and no fees. With our unique - model investors can log into our easy to use website, select - the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost\ - \ thought leaders and turn them into actionable insights so\ - \ that others can discover greater happiness, success, and fulfillment.\n\ - \nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, - api integration, Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the - Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails - integration to post a user's message content to the page in - real time, with no page refresh required. gMessenger also includes - custom authentication with three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app - utilizing Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: [] - volunteer_work: [] - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean - Practices in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: [] - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\ - \n \n John Marty is a genius at his craft. He is\ - \ skilled in the art of making people feel empowered to seek out\ - \ roles that they are qualified for, ask for salaries that they\ - \ deserve, and creates a kind of pay it forward lifestyle. John\ - \ helps you to get to places that you only thought were possible\ - \ for other people. Anyone that is fortunate enough to learn from\ - \ John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \ - \ \n John is so focused on helping guide you through\ - \ an interview process not just for Amazon but on interviewing\ - \ in general. I've generally done well at interviewing, my skills\ - \ are top notch now. John is so focused on on his clients and\ - \ really goes above and beyond. John is genuine, knowledgeable,\ - \ well spoken and non-judgemental. He is so encouraging, so positive\ - \ and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that\ - \ has a large 13K sq ft lot with two homes on it. After 5 minutes\ - \ of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC ,\ - \ Owner Marty\u2019s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - description: Twitter, Facebook, and LinkedIn (Person) Profile URL - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Contact API - operationId: Reverse Email Lookup Endpoint - summary: Reverse Email Lookup Endpoint - /api/resolve/phone: - get: - description: 'Cost: 3 credits / successful request. - - Find social media profiles from a contact phone number.' - parameters: - - in: query - name: phone_number - required: true - description: - '[E.164 formatted](https://www.twilio.com/docs/glossary/what-e164) - phone number of the person you want to identify social media profiles of.' - example: '+14155552671' - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ReverseContactNumberResult' - example: - linkedin_profile_url: https://www.linkedin.com/in/senatormarty - twitter_profile_url: https://www.twitter.com/proxycurl - facebook_profile_url: https://www.facebook.com/zuck - description: Twitter, Facebook, and LinkedIn Profile URL - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Contact API - operationId: Reverse Contact Number Lookup Endpoint - summary: Reverse Contact Number Lookup Endpoint - /api/linkedin/profile/email: - get: - description: 'Cost: 3 credits / request. - - Lookup work email address of a LinkedIn Person Profile. - - - Email addresses returned are verified to not be role-based or catch-all emails. - Email addresses - - returned by our API endpoint come with a 95+% deliverability guarantee - - - **Endpoint behavior** - - - *This endpoint* **_may not_** *return results immediately.* - - - If you provided a webhook in your request parameter, our application will - call your webhook with - - the result once. See `Webhook request` below.' - parameters: - - in: query - name: linkedin_profile_url - required: true - description: - "\n Linkedin Profile URL of the person you want to\n extract\ - \ work email address from.\n " - example: https://sg.linkedin.com/in/williamhgates - schema: - type: string - - in: query - name: callback_url - required: false - description: - "\n Webhook to notify your application when\n the request\ - \ has finished processing.\n " - example: https://webhook.site/29e12f17-d5a2-400a-9d08-42ee9d83600a - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ExtractionEmailResult' - example: - email_queue_count: 0 - description: Work Email Address - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Contact API - operationId: Work Email Lookup Endpoint - summary: Work Email Lookup Endpoint - /api/linkedin/job: - get: - description: 'Cost: 2 credits / successful request. - - Get structured data of a LinkedIn Job Profile' - parameters: - - in: query - name: url - required: true - description: - "\n URL of the LinkedIn Job Profile to target.\n\n URL\ - \ should be in the format of\n `https://www.linkedin.com/jobs/view/`.\n\ - \ [Jobs Listing Endpoint](#jobs-api-jobs-listing-endpoint)\n can be\ - \ used to retrieve a job URL.\n " - example: https://www.linkedin.com/jobs/view/3667167926/ - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/JobProfile' - example: - linkedin_internal_id: content-strategist-at-microsoft-3257696537 - job_description: - "The Global Demand Center (GDC) within the Cloud\ - \ Marketing group is leading the marketing transformation of Microsoft\u2019\ - s largest and fastest growing commercial businesses. Our always-on\ - \ integrated marketing programs work to nurture and acquire new\ - \ customers across segments, targeting business and technical audiences\ - \ across our commercial cloud portfolio, with programs available\ - \ in 42 markets and 30 languages. The GDC team is modernizing and\ - \ integrating these channels through advanced analytics, marketing\ - \ automation, and digital marketing. We are on a mission to drive\ - \ market share, consumption, and consistent double-digit+ revenue\ - \ growth. Content is the fuel that drives the digitally connected\ - \ customer journeys at the core of the GDC engine, and we\u2019\ - re looking for a skilled, self-motivated, data-driven content strategist\ - \ to build the content that motivates customers to take action.\ - \ The Content Strategist will develop and execute content strategies\ - \ for the ever-critical security space. You will be accountable\ - \ for understanding the business priorities, getting close to our\ - \ target audiences, defining the content journeys that attract,\ - \ nurture, inspire, and retain customers, and manage quality execution\ - \ and delivery of the content. You will work closely with your counterparts,\ - \ the integrated marketing strategists, to drive business outcomes.\ - \ Your network will include product marketers, integrated marketers,\ - \ relationship marketers, sales, engineering, and agency partners\ - \ to develop and execute on your plan. Our team: The Lifecycle Programs\ - \ team is a fast-paced digital marketing organization. We put a\ - \ focus on getting things done, simplifying anything and everything,\ - \ and having fun while doing it. We all believe in connecting with\ - \ customers at scale, supporting them at each stage of the customer\ - \ journey, from early awareness and consideration, through onboarding\ - \ and post purchase engagement. You will be in the middle of it\ - \ all helping to identify the right content that delivers what customers\ - \ want\u2014where they want it, when they want it, and how they\ - \ want it. \n \n**_Responsibilities \n_**\n * Define content\ - \ journeys for Security and IT professionals across industries.\n\ - \ * Build the resulting content strategies designed to accelerate\ - \ the customer through the lifecycle.\n * Create a content plan\ - \ to address the insights in the customer journey and strategy,\ - \ ensuring the content is aligned to what the customer needs at\ - \ each stage.\n * Deliver the content through our internal Studio\ - \ or with select agency partners.\n * Be a customer advocate. Relentlessly\ - \ champion the customer and the experiences they have with the content\ - \ you create\u2014how they find it, how they consume it, how they\ - \ use it to make decisions.\n * Leverage data and market insights\ - \ for decision making including content optimization and new concept\ - \ development. \n\n\n**_Qualifications \n \n_** **Required/Minimum\ - \ Qualifications \n**\n * Bachelor's Degree in Business, Marketing,\ - \ Communications, Economics, Public Relations, or related field\ - \ AND 1+ year(s) integrated marketing (e.g., digital, relationship,\ - \ social media, campaign), event management, marketing strategy,\ - \ business planning, marketing operations, or related work experience\n\ - \ * OR equivalent experience. \n\n\n**_Additional Or Preferred\ - \ Qualifications \n_**\n * Bachelor's Degree in Business, Marketing,\ - \ Communications, Economics, Public Relations, or related field\ - \ AND 3+ years integrated marketing (e.g., digital, relationship,\ - \ social media, campaign), event management, marketing strategy,\ - \ business planning, marketing operations, or related work experience\n\ - \ * OR equivalent experience.\n * Strong customer centric mindset\ - \ and demonstrated ability to put the customer first.\n * Clear\ - \ and persuasive communication skills, both written and verbal.\n\ - \ * Experience with program performance tracking and communications.\n\ - \ * Recognized as a self-starter with a bias for action.\n * Creative\ - \ problem-solving skills, and a growth mindset approach\n * Experience\ - \ managing across highly matrixed organizations, often with competing\ - \ priorities.\n * A demonstrated track record of business impact\ - \ through content\n * Well-versed in digital marketing best practices,\ - \ including journey mapping.\n * Understanding of content disciplines,\ - \ including SEO, content strategy, and execution.\n * Preferred,\ - \ but not required: experience with commercial technology sales\ - \ process \n\n\nNarrative \n \nIntegrated Marketing IC3 - The\ - \ typical base pay range for this role across the U.S. is USD $80,900\ - \ - $162,200 per year. There is a different range applicable to\ - \ specific work locations, within the San Francisco Bay area and\ - \ New York City metropolitan area, and the base pay range for this\ - \ role in those locations is USD $105,300 - $176,900 per year. \ - \ \n \nMicrosoft has different base pay ranges for different work\ - \ locations within the United States, which allows us to pay employees\ - \ competitively and consistently in different geographic markets\ - \ (see below). The range above reflects the potential base pay across\ - \ the U.S. for this role (except as noted below); the applicable\ - \ base pay range will depend on what ultimately is determined to\ - \ be the candidate\u2019s primary work location. Individual base\ - \ pay depends on various factors, in addition to primary work location,\ - \ such as complexity and responsibility of role, job duties/requirements,\ - \ and relevant experience and skills. Base pay ranges are reviewed\ - \ and typically updated each year. Offers are made within the base\ - \ pay range applicable at the time. \n \nAt Microsoft certain\ - \ roles are eligible for additional rewards, including merit increases,\ - \ annual bonus and stock. These awards are allocated based on individual\ - \ performance. In addition, certain roles also have the opportunity\ - \ to earn sales incentives based on revenue or utilization, depending\ - \ on the terms of the plan and the employee\u2019s role. Benefits/perks\ - \ listed here may vary depending on the nature of employment with\ - \ Microsoft and the country work location. U.S.-based employees\ - \ have access to healthcare benefits, a 401(k) plan and company\ - \ match, short-term and long-term disability coverage, basic life\ - \ insurance, wellbeing benefits, paid vacation time, paid sick and\ - \ mental health time, and several paid holidays, among others. \ - \ \n \nOur commitment to pay equity \n \nWe are committed to\ - \ the principle of pay equity \u2013 paying employees equitably\ - \ for substantially similar work. To learn more about pay equity\ - \ and our other commitments to increase representation and strengthen\ - \ our culture of inclusion, check out our annual Diversity & Inclusion\ - \ Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report\ - \ ) \n \nUnderstanding roles at Microsoft \n \nThe top of\ - \ this page displays the role for which the base pay ranges apply\ - \ \u2013 Integrated Marketing IC3. The way we define roles includes\ - \ two things: discipline (the type of work) and career stage (scope\ - \ and complexity). The career stage has two parts \u2013 the first\ - \ identifies whether the role is a manager (M), an individual contributor\ - \ (IC), an admin-technician-retail (ATR) job, or an intern. The\ - \ second part identifies the relative seniority of the role \u2013\ - \ a higher number (or later letter alphabetically in the case of\ - \ ATR) indicates greater scope and complexity. \n \nMicrosoft\ - \ is an equal opportunity employer. All qualified applicants will\ - \ receive consideration for employment without regard to age, ancestry,\ - \ color, family or medical care leave, gender identity or expression,\ - \ genetic information, marital status, medical condition, national\ - \ origin, physical or mental disability, political affiliation,\ - \ protected veteran status, race, religion, sex (including pregnancy),\ - \ sexual orientation, or any other characteristic protected by applicable\ - \ laws, regulations and ordinances. We also consider qualified applicants\ - \ regardless of criminal histories, consistent with legal requirements.\ - \ If you need assistance and/or a reasonable accommodation due to\ - \ a disability during the application or the recruiting process,\ - \ please send a request via the Accommodation request form. \n\ - \ \nThe salary for this role in the state of Colorado is between\ - \ $108,200 and $162,200. \n \nAt Microsoft, certain roles are\ - \ eligible for additional rewards, including annual bonus and stock.\ - \ These awards are allocated based on individual performance. In\ - \ addition, certain roles also have the opportunity to earn sales\ - \ incentives based on revenue or utilization, depending on the terms\ - \ of the plan and the employee\u2019s role. Benefits/perks listed\ - \ below may vary depending on the nature of your employment with\ - \ Microsoft and the country where you work. \n" - apply_url: https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite - title: Content Strategist - location: - country: United States - region: Hawaii - city: null - postal_code: null - latitude: null - longitude: null - street: null - company: - name: Microsoft - url: https://www.linkedin.com/company/microsoft - logo: https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI - seniority_level: Mid-Senior level - industry: - - IT Services and IT Consulting, Computer Hardware Manufacturing, - and Software Development - employment_type: Full-time - job_functions: - - Marketing - total_applicants: 200 - description: Detailed job data - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Jobs API - operationId: Job Profile Endpoint - summary: Job Profile Endpoint - /api/followers: - get: - description: - 'Cost: 10 credits / result for users on an annual subscription - or Enterprise plan. - - Get a list of individual followers of a company.' - parameters: - - in: query - name: linkedin_company_profile_url - required: false - description: - "\n The LinkedIn Profile URL of the company from\ - \ which you want to get a list of followers of.\n\n URL should\ - \ be in the format of `https://www.linkedin.com/company/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://www.linkedin.com/company/henry-schein - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - "\n The Twitter/X Profile URL belonging to the\ - \ company that you want to get a list of followers of.\n\n \ - \ URL should be in the format of `https://x.com/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://x.com/henryschein - schema: - type: string - - in: query - name: page_size - required: false - description: - "\n Limit the maximum results of followers returned\ - \ per API call.\n\n The default value of this parameter is\ - \ 10.\n\n Accepted values for this parameter is an integer\ - \ ranging from 0 to 1000.\n " - example: '10' - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/FollowerList' - example: - followers: - - linkedin_profile_url: https://www.linkedin.com/in/agiliosoftware - twitter_profile_url: https://www.x.com/agilio_software - email: null - - linkedin_profile_url: https://www.linkedin.com/in/air-techniques - twitter_profile_url: https://www.x.com/airtechniques - email: null - next_page: null - description: A list of individual followers of the company - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Customer API `EXPERIMENTAL` - operationId: Follower Listing Endpoint `EXPERIMENTAL` - summary: Follower Listing Endpoint `EXPERIMENTAL` - /api/followers/count: - get: - description: - 'Cost: 1 credit / result for users on an annual subscription or - Enterprise plan. - - Get the count of followers of a company.' - parameters: - - in: query - name: linkedin_company_profile_url - required: false - description: - "\n The LinkedIn Profile URL of the company from\ - \ which you want to get a list of followers of.\n\n URL should\ - \ be in the format of `https://www.linkedin.com/company/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://www.linkedin.com/company/henry-schein - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - "\n The Twitter/X Profile URL belonging to the\ - \ company that you want to get a list of followers of.\n\n \ - \ URL should be in the format of `https://x.com/`\n\ - \ \n\n Yes (Include only one of: `linkedin_company_profile_url`\ - \ or `twitter_profile_url`)\n " - example: https://x.com/henryschein - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/FollowerListCount' - example: - follower_count: 74 - description: Count individuals of that company's followers - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Customer API `EXPERIMENTAL` - operationId: Follower Listing Count Endpoint `EXPERIMENTAL` - summary: Follower Listing Count Endpoint `EXPERIMENTAL` - /api/v2/search/company: - get: - description: - "Cost: 3 credits / result returned.\nSearch for companies that\ - \ meet a set of criteria within\n our exhaustive dataset of company profiles.\n\ - \n This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb),\ - \ our exhaustive dataset of company profiles.\n\n This API endpoint can\ - \ return at most of 10,000 results per search.\n\n Each search expression\ - \ for a parameter is limited to a maximum of 255 characters." - parameters: - - in: query - name: country - required: false - description: - "\n Filter companies with an office based in this\ - \ country.\n This parameter accepts a case-insensitive [Alpha-2\ - \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ - \ " - example: US - schema: - type: string - - in: query - name: region - required: false - description: - "\n Filter companies with an office based in this\ - \ country.\n This parameter accepts a case-insensitive [Alpha-2\ - \ ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ - \ " - example: United States - schema: - type: string - - in: query - name: city - required: false - description: - "\n Filter companies based in cities matching\ - \ the provided search expression.\n " - example: new AND york - schema: - type: string - - in: query - name: type - required: false - description: - "\n Filter companies of the provided LinkedIn\ - \ type.\n\n Possible values:\n\n * `EDUCATIONAL`:\ - \ Educational Institution\n * `GOVERNMENT_AGENCY`: Government\ - \ Agency\n * `NON_PROFIT` : Nonprofit\n *\ - \ `PARTNERSHIP` : Partnership\n * `PRIVATELY_HELD` : Privately\ - \ Held\n * `PUBLIC_COMPANY` : Public Company\n \ - \ * `SELF_EMPLOYED` : Self-Employed\n * `SELF_OWNED`\ - \ : Sole Proprietorship\n " - example: PRIVATELY_HELD - schema: - type: string - - in: query - name: follower_count_min - required: false - description: - "\n Filter companies with a LinkedIn follower\ - \ count **more than** this value.\n " - example: '1000' - schema: - type: string - - in: query - name: follower_count_max - required: false - description: - "\n Filter companies with a LinkedIn follower\ - \ count **less than** this value.\n " - example: '1000' - schema: - type: string - - in: query - name: name - required: false - description: - "\n Filter companies with a name matching the\ - \ provided search expression.\n " - example: google OR apple - schema: - type: string - - in: query - name: industry - required: false - description: - "\n Filter companies belonging to an `industry`\ - \ that matches the provided search expression. The `industry` attribute,\ - \ found in a LinkedIn Company profile, describes the industry in which the\ - \ company operates. The value of this attribute is an enumerator. [This\ - \ CSV file provides an exhaustive list of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n\ - \ " - example: technology - schema: - type: string - - in: query - name: employee_count_max - required: false - description: - "\n Filter companies with **at most** this many\ - \ employees.\n " - example: '1000' - schema: - type: string - - in: query - name: employee_count_min - required: false - description: - "\n Filter companies with **at least** this many\ - \ employees.\n " - example: '1000' - schema: - type: string - - in: query - name: description - required: false - description: - "\n Filter companies with a description matching\ - \ the provided search expression.\n " - example: medical device - schema: - type: string - - in: query - name: founded_after_year - required: false - description: - "\n Filter companies founded **after** this year.\n\ - \ " - example: '1999' - schema: - type: string - - in: query - name: founded_before_year - required: false - description: - "\n Filter companies founded **before** this year.\n\ - \ " - example: '1999' - schema: - type: string - - in: query - name: funding_amount_max - required: false - description: - "\n Filter companies that have raised **at most**\ - \ this much (USD) funding amount.\n " - example: '1000000' - schema: - type: string - - in: query - name: funding_amount_min - required: false - description: - "\n Filter companies that have raised **at least**\ - \ this much (USD) funding amount.\n " - example: '1000000' - schema: - type: string - - in: query - name: funding_raised_after - required: false - description: - "\n Filter companies that have raised funding\ - \ **after** this date.\n " - example: '2019-12-30' - schema: - type: string - - in: query - name: funding_raised_before - required: false - description: - "\n Filter companies that have raised funding\ - \ **before** this date.\n " - example: '2019-12-30' - schema: - type: string - - in: query - name: public_identifier_in_list - required: false - description: - "\n A list of public identifiers (the identifying\ - \ portion of the company\u2019s profile URL).\n The target\ - \ company\u2019s identifier must be a member of this list.\n \ - \ " - example: stripe,amazon - schema: - type: string - - in: query - name: public_identifier_not_in_list - required: false - description: - "\n A list of public identifiers (the identifying\ - \ portion of the company\u2019s profile URL).\n The target\ - \ company\u2019s identifier must **not** be a member of this list.\n \ - \ " - example: stripe,amazon - schema: - type: string - - in: query - name: page_size - required: false - description: - "\n Tune the maximum results returned per API\ - \ call.\n\n The default value of this parameter is 100.\n\ - \n Accepted values for this parameter is an integer ranging\ - \ from 1 to 100.\n\n When `enrich_profiles=enrich`, this\ - \ parameter accepts value ranging from `1` to `10`.\n " - example: '10' - schema: - type: string - - in: query - name: enrich_profiles - required: false - description: - "\n Get the company's complete profile data rather\ - \ than just the URLs to their LinkedIn profiles.\n\n Each\ - \ request respond with a streaming response of profiles.\n\n \ - \ The valid values are:\n\n - skip (default): lists company's\ - \ profile url\n - enrich: include company's profile data\ - \ in the list\n\n Calling this API endpoint with this parameter\ - \ would add 1 credit per result returned.\n " - example: enrich - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/CompanySearchResult' - example: - results: - - linkedin_profile_url: https://www.linkedin.com/company/apple/ - profile: - linkedin_internal_id: '1441' - description: - "A problem isn't truly solved until it's solved - for all. Googlers build products that help create opportunities - for everyone, whether down the street or across the globe. Bring - your insight, imagination and a healthy disregard for the impossible. - Bring everything that makes you unique. Together, we can build - for everyone. - - - Check out our career opportunities at careers.google.com." - website: https://goo.gle/3m1IN7m - industry: Software Development - company_size: - - 10001 - - null - company_size_on_linkedin: 319856 - hq: - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - company_type: PUBLIC_COMPANY - founded_year: null - specialities: - - search - - ads - locations: - - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - - country: US - city: New York - postal_code: '10011' - line_1: 111 8th Ave - is_hq: false - state: NY - name: Google - tagline: null - universal_name_id: google - profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca - background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 - search_id: '1441' - similar_companies: - - name: Amazon - link: https://www.linkedin.com/company/amazon - industry: Software Development - location: Seattle, WA - - name: Microsoft - link: https://www.linkedin.com/company/microsoft - industry: Software Development - location: Redmond, Washington - affiliated_companies: - - name: YouTube - link: https://www.linkedin.com/company/youtube - industry: Software Development - location: San Bruno, CA - - name: Google Cloud - link: https://www.linkedin.com/showcase/google-cloud - industry: Software Development - location: Mountain View, California - updates: - - article_link: null - image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE - posted_on: - day: 13 - month: 9 - year: 2022 - text: - "Want to kick start your #LifeAtGoogle but not sure where\ - \ to begin? Explore our Build Your Future site, where you\ - \ can learn about developmental programs, learn tips for future\ - \ interviews, sign up for informational events, and even hear\ - \ real stories from Googlers who\u2019ve been where you are\ - \ now. Get started \u2192 https://bit.ly/3SKPzQB" - total_likes: 4267 - - article_link: null - image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg - posted_on: null - text: - "Ariana, welcome to Google. Here\u2019s to a year full\ - \ of growth, learning, and experiences at #LifeAtGoogle! \U0001F389" - total_likes: 397 - follower_count: 27472792 - last_updated: '2023-10-26T11:34:30Z' - next_page: null - total_result_count: 1 - description: List of companies - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Search API - operationId: Company Search Endpoint - summary: Company Search Endpoint - /api/v2/search/person/: - get: - description: 'Cost: 3 credits / result returned. - - Search for people who meet a set of criteria within our exhaustive dataset - of people profiles. - - - This API endpoint is powered by [LinkDB](https://nubela.co/proxycurl/linkdb), - our exhaustive dataset of people and company profiles. - - - This API endpoint can return at most 10,000 results per search. - - - Each search expression for a parameter is limited to a maximum of 255 characters.' - parameters: - - in: query - name: country - required: true - description: - "\n Filter people located in this country.\n \ - \ This parameter accepts a case-insensitive [Alpha-2 ISO3166\ - \ country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n \ - \ " - example: US - schema: - type: string - - in: query - name: first_name - required: false - description: - "\n Filter people whose first names match the\ - \ provided search expression.\n " - example: Sarah - schema: - type: string - - in: query - name: last_name - required: false - description: - "\n Filter people whose last names match the provided\ - \ search expression.\n " - example: Jackson OR Johnson - schema: - type: string - - in: query - name: education_field_of_study - required: false - description: - "\n Filter people with a field of study matching\ - \ the provided search expression, based on education history.\n \ - \ " - example: computer science - schema: - type: string - - in: query - name: education_degree_name - required: false - description: - "\n Filter people who earned a degree matching\ - \ the provided search expression, based on education history.\n \ - \ " - example: MBA - schema: - type: string - - in: query - name: education_school_name - required: false - description: - "\n Filter people who have attended a school whose\ - \ name matches the provided search expression, based on education history.\n\ - \ " - example: Caltech OR Massachusetts Institute of Technology - schema: - type: string - - in: query - name: education_school_linkedin_profile_url - required: false - description: - "\n Filter people who have attended a school with\ - \ a specific LinkedIn profile URL, based on education history.\n \ - \ " - example: https://www.linkedin.com/school/national-university-of-singapore/ - schema: - type: string - - in: query - name: current_role_title - required: false - description: - "\n Filter people who are **currently** working\ - \ as a role whose title matches the provided search expression. You'll be\ - \ looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb) that\ - \ show a person's current job. However, keep in mind that some of these\ - \ profiles may not be up-to-date, which means you might sometimes see a\ - \ person's old job instead of their current job on LinkedIn.\n \ - \ " - example: founder - schema: - type: string - - in: query - name: past_role_title - required: false - description: - "\n Filter people who have **in the past** worked\ - \ as a role whose title matches the provided search expression.\n \ - \ " - example: founder - schema: - type: string - - in: query - name: current_role_before - required: false - description: - "\n Filter people who started their current role\ - \ **before** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb)\ - \ that show a person's current job. However, keep in mind that some of these\ - \ profiles may not be up-to-date, which means you might sometimes see a\ - \ person's old job instead of their current job on LinkedIn.\n\n \ - \ This parameter takes a ISO8601 date. Default value of this parameter\ - \ is `null`.\n " - example: '2019-12-30' - schema: - type: string - - in: query - name: current_role_after - required: false - description: - "\n Filter people who started their current role\ - \ **after** this date. You'll be looking for profiles on [LinkDB](https://nubela.co/proxycurl/linkdb)\ - \ that show a person's current job. However, keep in mind that some of these\ - \ profiles may not be up-to-date, which means you might sometimes see a\ - \ person's old job instead of their current job on LinkedIn.\n\n \ - \ This parameter takes a ISO8601 date. Default value of this parameter\ - \ is `null`.\n " - example: '2019-12-30' - schema: - type: string - - in: query - name: current_company_linkedin_profile_url - required: false - description: - "\n Filter people who are **currently** working\ - \ at a company represented by this LinkedIn Company Profile URL.\n\n \ - \ Default value of this parameter is `null`.\n \ - \ " - example: https://www.linkedin.com/company/apple - schema: - type: string - - in: query - name: past_company_linkedin_profile_url - required: false - description: - "\n Filter people who have **in the past** worked\ - \ at the company represented by this LinkedIn Company Profile URL.\n\n \ - \ This parameter takes a LinkedIn Company Profile URL. Default\ - \ value of this parameter is `null`.\n " - example: https://www.linkedin.com/company/apple - schema: - type: string - - in: query - name: current_job_description - required: false - description: - "\n Filter people with **current** job descriptions\ - \ matching the provided search expression.\n " - example: education - schema: - type: string - - in: query - name: past_job_description - required: false - description: - "\n Filter people with **past** job descriptions\ - \ matching the provided search expression.\n " - example: education - schema: - type: string - - in: query - name: current_company_name - required: false - description: - "\n Filter people who are **currently** working\ - \ at a company whose name matches the provided search expression.\n \ - \ " - example: Stripe OR Apple - schema: - type: string - - in: query - name: past_company_name - required: false - description: - "\n Filter people who **have previously** worked\ - \ at a company whose name matches the provided search expression.\n \ - \ " - example: Stripe OR Apple - schema: - type: string - - in: query - name: linkedin_groups - required: false - description: - "\n Filter people who are members of LinkedIn\ - \ groups whose names match the provided search expression.\n \ - \ " - example: haskell - schema: - type: string - - in: query - name: languages - required: false - description: - "\n Filter people who list a language matching\ - \ the provided search expression.\n " - example: Mandarin OR Chinese - schema: - type: string - - in: query - name: region - required: false - description: - "\n Filter people located in a region matching\ - \ the provided search expression.\n A \u201Cregion\u201D\ - \ in this context means \u201Cstate,\u201D \u201Cprovince,\u201D or similar\ - \ political division, depending on what country you\u2019re querying.\n\ - \ " - example: California - schema: - type: string - - in: query - name: city - required: false - description: - "\n Filter people located in a city matching the\ - \ provided search expression.\n " - example: Seattle OR Los Angeles - schema: - type: string - - in: query - name: headline - required: false - description: - "\n Filter people whose LinkedIn headline fields\ - \ match the provided search expression.\n " - example: founder - schema: - type: string - - in: query - name: summary - required: false - description: - "\n Filter people whose LinkedIn summary fields\ - \ match the provided search expression.\n " - example: founder - schema: - type: string - - in: query - name: industries - required: false - description: - "\n Person's inferred industry. May sometimes\ - \ exist when `current_company_industry` does not, but `current_company_industry`\ - \ should be preferred when it exists.\n " - example: automotive - schema: - type: string - - in: query - name: interests - required: false - description: - "\n Filter people whose Linkedin interest fields\ - \ match the provided search expression.\n " - example: technology - schema: - type: string - - in: query - name: skills - required: false - description: - "\n Filter people whose Linkedin skill fields\ - \ match the provided search expression.\n " - example: accounting - schema: - type: string - - in: query - name: current_company_country - required: false - description: - "\n Filter people who are currently working at\ - \ a company with an office based in this country.\n\n This\ - \ parameter accepts a case-insensitive [Alpha-2 ISO3166 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n\ - \ " - example: us - schema: - type: string - - in: query - name: current_company_region - required: false - description: - "\n Filter people who are currently working at\ - \ a company based in a region matching the provided search expression.\n\ - \ " - example: United States - schema: - type: string - - in: query - name: current_company_city - required: false - description: - "\n Filter people who are currently working at\ - \ a company based in a city matching the provided search expression.\n \ - \ " - example: Seattle OR Los Angeles - schema: - type: string - - in: query - name: current_company_type - required: false - description: - "\n Filter people who are currently working at\ - \ a company of the provided LinkedIn type.\n\n Possible values:\n\ - \n * `EDUCATIONAL`: Educational Institution\n \ - \ * `GOVERNMENT_AGENCY`: Government Agency\n * `NON_PROFIT`\ - \ : Nonprofit\n * `PARTNERSHIP` : Partnership\n \ - \ * `PRIVATELY_HELD` : Privately Held\n * `PUBLIC_COMPANY`\ - \ : Public Company\n * `SELF_EMPLOYED` : Self-Employed\n\ - \ * `SELF_OWNED` : Sole Proprietorship\n " - example: NON_PROFIT - schema: - type: string - - in: query - name: current_company_follower_count_min - required: false - description: - "\n Filter people who are currently working at\ - \ a company with a LinkedIn follower count **more than** this value.\n \ - \ " - example: '1000' - schema: - type: string - - in: query - name: current_company_follower_count_max - required: false - description: - "\n Filter people who are currently working at\ - \ a company with a LinkedIn follower count **less than** this value.\n \ - \ " - example: '1000' - schema: - type: string - - in: query - name: current_company_industry - required: false - description: - "\n Filter people who are currently working at\ - \ a company belonging to an `industry` that matches the provided search\ - \ expression. The `industry` attribute, found in a LinkedIn Company profile,\ - \ describes the industry in which the company operates. The value of this\ - \ attribute is an enumerator. [This CSV file provides an exhaustive list\ - \ of possible values for this attribute](https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link).\n\ - \ " - example: higher AND education - schema: - type: string - - in: query - name: current_company_employee_count_min - required: false - description: - "\n Filter people who are currently working at\ - \ a company with **at least** this many employees.\n " - example: '1000' - schema: - type: string - - in: query - name: current_company_employee_count_max - required: false - description: - "\n Filter people who are currently working at\ - \ a company with **at most** this many employees.\n " - example: '1000' - schema: - type: string - - in: query - name: current_company_description - required: false - description: - "\n Filter people who are currently working at\ - \ a company with a description matching the provided search expression.\n\ - \ " - example: medical device - schema: - type: string - - in: query - name: current_company_founded_after_year - required: false - description: - "\n Filter people who are currently working at\ - \ a company that was founded **after** this year.\n " - example: '1999' - schema: - type: string - - in: query - name: current_company_founded_before_year - required: false - description: - "\n Filter people who are currently working at\ - \ a company that was founded **before** this year.\n " - example: '1999' - schema: - type: string - - in: query - name: current_company_funding_amount_min - required: false - description: - "\n Filter people who are currently working at\ - \ a company that has raised **at least** this much (USD) funding amount.\n\ - \ " - example: '1000000' - schema: - type: string - - in: query - name: current_company_funding_amount_max - required: false - description: - "\n Filter people who are currently working at\ - \ a company that has raised **at most** this much (USD) funding amount.\n\ - \ " - example: '1000000' - schema: - type: string - - in: query - name: current_company_funding_raised_after - required: false - description: - "\n Filter people who are currently working at\ - \ a company that has raised funding **after** this date.\n \ - \ " - example: '2019-12-30' - schema: - type: string - - in: query - name: current_company_funding_raised_before - required: false - description: - "\n Filter people who are currently working at\ - \ a company that has raised funding **before** this date.\n \ - \ " - example: '2019-12-30' - schema: - type: string - - in: query - name: public_identifier_in_list - required: false - description: - "\n A list of public identifiers (the identifying\ - \ portion of the person\u2019s profile URL).\n The target\ - \ person\u2019s identifier must be a member of this list.\n \ - \ " - example: williamhgates,johnrmarty - schema: - type: string - - in: query - name: public_identifier_not_in_list - required: false - description: - "\n A list of public identifiers (the identifying\ - \ portion of the person\u2019s profile URL).\n The target\ - \ person\u2019s identifier must **not** be a member of this list.\n \ - \ " - example: williamhgates,johnrmarty - schema: - type: string - - in: query - name: page_size - required: false - description: - "\n Tune the maximum results returned per API\ - \ call.\n\n The default value of this parameter is `100`.\n\ - \n Accepted values for this parameter is an integer ranging\ - \ from `1` to `100`.\n\n When `enrich_profiles=enrich`, this\ - \ parameter accepts value ranging from `1` to `10`.\n " - example: '10' - schema: - type: string - - in: query - name: enrich_profiles - required: false - description: - "\n Get the person's complete profile data rather\ - \ than just the URLs to their LinkedIn profiles.\n\n Each\ - \ request respond with a streaming response of profiles.\n\n \ - \ The valid values are:\n\n * `skip` (default): lists\ - \ person's profile url only\n * `enrich`: include person's\ - \ profile data in the list\n\n Calling this API endpoint\ - \ with this parameter would add `1` credit per result returned.\n \ - \ " - example: enrich - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/PersonSearchResult' - example: - results: - - linkedin_profile_url: https://www.linkedin.com/in/johnrmarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: - Financial Freedom through Real Estate - LinkedIn Top - Voice - summary: - "Most people go through life lost, disengaged, and unhappy\ - \ at work and in their lives - I'm on a mission to solve that.\n\ - \nI spent 10 years as the founder of Axxis Audio, an electronics\ - \ company that grew to multi-million dollar sales, which I sold\ - \ in 2012. At that time, I funneled my earnings into the creation\ - \ of an Internet of Things company, but numerous factors lead\ - \ to its demise after 2 hard fought years. \n\nAt 31, I was\ - \ penny-less, had a baby on the way, and had zero job prospects\ - \ (despite applying to 150 companies). My desperate situation\ - \ led me to take a job at Best Buy for $12 an hour while reinventing\ - \ myself through the completion of an MBA at the University\ - \ of Colorado, and a 6-month software development boot camp.\ - \ \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because\ - \ of my LinkedIn profile). My journey has led to a deep sense\ - \ of perspective, humility, and purpose that I draw on to help\ - \ others find clarity, meaning, and happiness in their careers\ - \ and lives. \n\nCheck out my website for details on my Mindset\ - \ Reset Podcast, Public Speaking, Consulting, or my free 40\ - \ page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\n\ - FAQ's\n\nQ: Can you speak at my Company, University, event or\ - \ podcast?\nA: I'd love to! I've shared my message on the future\ - \ of employment, breaking into big tech, and my personal story\ - \ of reinventing myself and discovering my sense of purpose\ - \ (and how you can too!).\n\n\u2611\uFE0F YouTube Channel #1\ - \ (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers:\ - \ https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner,\ - \ and I just started learning to skateboard a half-pipe.\n\u2611\ - \uFE0F Into the Enneagram? - I'm a #3 (The Achiever)\n\nLETS\ - \ CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com (don't\ - \ forget that \"R\"....The other guy gets my emails all the\ - \ time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking - financial freedom long before the age of 65 with the ability - to invest in high yield, short-term real estate investments - that were only accessible in the past for a select few wealthy - individuals. Each of our single family rehab projects require - a minimum investment contribution of only $10K, we have simple - terms, no multi-year hold periods, and no fees. With our unique - model investors can log into our easy to use website, select - the projects that they want to invest in, and get realtime - updates on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s\ - \ foremost thought leaders and turn them into actionable insights\ - \ so that others can discover greater happiness, success,\ - \ and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, - api integration, Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: [] - accomplishment_publications: [] - accomplishment_honors_awards: [] - accomplishment_patents: [] - accomplishment_courses: [] - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the - Bootstrap HTML, CSS, and JavaScript framework. It uses a Websocket-Rails - integration to post a user's message content to the page in - real time, with no page refresh required. gMessenger also - includes custom authentication with three different permissions - levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app - utilizing Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: [] - volunteer_work: [] - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean - Practices in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: [] - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n\ - \ \n \n \n \n\ - \ \n\n \n John Marty is a genius at his craft.\ - \ He is skilled in the art of making people feel empowered to\ - \ seek out roles that they are qualified for, ask for salaries\ - \ that they deserve, and creates a kind of pay it forward lifestyle.\ - \ John helps you to get to places that you only thought were\ - \ possible for other people. Anyone that is fortunate enough\ - \ to learn from John should consider themselves extremely lucky.\ - \ I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n\ - \ \n John is so focused on helping guide you through\ - \ an interview process not just for Amazon but on interviewing\ - \ in general. I've generally done well at interviewing, my\ - \ skills are top notch now. John is so focused on on his clients\ - \ and really goes above and beyond. John is genuine, knowledgeable,\ - \ well spoken and non-judgemental. He is so encouraging, so\ - \ positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that\ - \ has a large 13K sq ft lot with two homes on it. After 5\ - \ minutes of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC\ - \ , Owner Marty\u2019s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: [] - groups: [] - last_updated: '2023-10-26T11:34:30Z' - next_page: null - total_result_count: 1 - description: LinkedIn (Person) Profile URL - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Search API - operationId: Person Search Endpoint - summary: Person Search Endpoint - /api/credit-balance: - get: - description: 'Cost: 0 credit / successful request. - - Get your current credit(s) balance' - parameters: [] - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/CreditBalance' - example: - credit_balance: 100000 - description: Balance of credits - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Meta API - operationId: View Credit Balance Endpoint - summary: View Credit Balance Endpoint - /api/disposable-email: - get: - description: 'Cost: 0 credit / successful request. - - Given an email address, checks if the email address belongs to a disposable - email service.' - parameters: - - in: query - name: email - required: true - description: Email address to check - example: steven@nubela.co - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/DisposableEmail' - example: - is_disposable_email: false - is_free_email: false - description: Disposable Email Check - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Contact API - operationId: Disposable Email Address Check Endpoint - summary: Disposable Email Address Check Endpoint - /api/contact-api/personal-contact: - get: - description: 'Cost: 1 credit / contact number returned. - - Find personal phone numbers associated with a given social media profile.' - parameters: - - in: query - name: page_size - required: false - description: - "\n This controls the maximum number of numbers returned per\ - \ API call.\n It's useful for limiting credit consumption as the number\ - \ of numbers\n per identity can vary. The default value is 0, meaning\ - \ there's no limit\n to the number of returned results.\n " - example: '0' - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - "\n The Twitter/X Profile URL from which you wish to extract\ - \ personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n\ - \ `twitter_profile_url`, or `facebook_profile_url`)\n " - example: https://x.com/proxycurl - schema: - type: string - - in: query - name: facebook_profile_url - required: false - description: - "\n The Facebook Profile URL from which you wish to extract\ - \ personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n\ - \ `twitter_profile_url`, or `facebook_profile_url`)\n " - example: https://www.facebook.com/zuck - schema: - type: string - - in: query - name: linkedin_profile_url - required: false - description: - "\n The LinkedIn Profile URL from which you wish to extract\ - \ personal\n contact numbers\n \n\n Yes (Include only one of: `linkedin_profile_url`,\n\ - \ `twitter_profile_url`, or `facebook_profile_url`)\n " - example: https://linkedin.com/in/steven-goh-6738131b - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/PersonalContactNumbers' - example: - numbers: - - '+1123123123' - description: List of Personal Contact Numbers - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Contact API - operationId: Personal Contact Number Lookup Endpoint - summary: Personal Contact Number Lookup Endpoint - /api/contact-api/personal-email: - get: - description: 'Cost: 1 credit / email returned. - - Find personal email addresses associated with a given social media profile.' - parameters: - - in: query - name: email_validation - required: false - description: - "\n How to validate each email.\n \n Takes the following\ - \ values:\n * `none` (default) - Do not perform email validation.\n\ - \ * `fast` - Perform fast email validation (does not cost extra credit).\n\ - \ * `precise` - Perform deliverability validation (costs 1 extra credit\ - \ per email found).\n\n For backward-compatibility these are also accepted:\n\ - \ * `include` - Equivalent to `precise`\n * `exclude` - Equivalent\ - \ to `none`\n " - example: include - schema: - type: string - - in: query - name: page_size - required: false - description: - This controls the maximum number of emails returned per API call. - It's useful for limiting credit consumption as the number of emails per - identity can vary. The default value is `0`, meaning there's no limit to - the number of returned results. - example: 0 - schema: - type: string - - in: query - name: twitter_profile_url - required: false - description: - 'The Twitter/X Profile URL from which you wish to extract personal - email addresses. - - yes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, - or `facebook_profile_url`)' - example: https://x.com/proxycurl - schema: - type: string - - in: query - name: facebook_profile_url - required: false - description: - 'The Facebook Profile URL from which you wish to extract personal - email addresses. - - yes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, - or `facebook_profile_url`)' - example: https://www.facebook.com/zuck - schema: - type: string - - in: query - name: linkedin_profile_url - required: false - description: - 'The LinkedIn Profile URL from which you wish to extract personal - email addresses. - - yes (Include only one of: `linkedin_profile_url`, `twitter_profile_url`, - or `facebook_profile_url`)' - example: https://linkedin.com/in/steven-goh-6738131b - schema: - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/PDLEmailResult' - example: - emails: - - random@gmail.com - - random2@yahoo.com - invalid_emails: - - random3@gmail.com - description: List of Personal Emails - '400': - description: - Invalid parameters provided. Refer to the documentation and - message body for more info - '401': - description: Invalid API key - '403': - description: You have run out of credits - '404': - description: - 'The requested resource (e.g: user profile, company) could - not be found' - '429': - description: Rate limited. Please retry - '500': - description: Internal Server Error - '503': - description: Enrichment failed, please retry. - tags: - - Contact API - operationId: Personal Email Lookup Endpoint - summary: Personal Email Lookup Endpoint -info: - title: Proxycurl API - version: 1.0.0 -openapi: 3.0.0 -components: - schemas: - CompanyLocation: - type: object - properties: - country: - type: string - nullable: true - city: - type: string - nullable: true - postal_code: - type: string - nullable: true - line_1: - type: string - nullable: true - is_hq: - type: boolean - state: - type: string - nullable: true - example: &id002 - country: SG - city: Singapore - postal_code: '119077' - line_1: 21 Lower Kent Ridge Road, Singapore - is_hq: true - state: null - CompanyType: - type: string - enum: - - EDUCATIONAL - - GOVERNMENT_AGENCY - - NON_PROFIT - - PARTNERSHIP - - PRIVATELY_HELD - - PUBLIC_COMPANY - - SELF_EMPLOYED - - SELF_OWNED - SimilarCompany: - type: object - properties: - name: - type: string - nullable: true - link: - type: string - nullable: true - industry: - type: string - nullable: true - location: - type: string - nullable: true - example: &id003 - name: NUS Business School - link: https://www.linkedin.com/school/nus-business-school/ - industry: Higher Education - location: null - AffiliatedCompany: - type: object - properties: - name: - type: string - nullable: true - link: - type: string - nullable: true - industry: - type: string - nullable: true - location: - type: string - nullable: true - example: &id004 - name: LinkedIn - link: https://www.linkedin.com/company/linkedin - industry: Internet - location: Sunnyvale, California - Date: - type: object - properties: - day: - type: integer - nullable: true - month: - type: integer - nullable: true - year: - type: integer - example: &id001 - day: 30 - month: 9 - year: 2021 - CompanyUpdate: - type: object - properties: - article_link: - type: string - nullable: true - description: The URL for which the post links out to - image: - type: string - nullable: true - description: The URL to the image to the post (if it exists) - posted_on: - $ref: '#/components/schemas/Date' - nullable: true - text: - type: string - nullable: true - description: The body of the update - total_likes: - type: integer - nullable: true - description: The total likes a post has received - example: &id005 - article_link: https://lnkd.in/gr7cb5by - image: https://media-exp1.licdn.com/dms/image/C5622AQEGh8idEAm14Q/feedshare-shrink_800/0/1633089889886?e=1637798400&v=beta&t=LtGtAUSJNrPYdHpVhTBLhGTWYqrHtFJ86PKSmTpou7c - posted_on: *id001 - text: Introducing Personal Email Lookup API https://lnkd.in/gr7cb5by - total_likes: 3 - LinkedinSchool: - type: object - properties: - linkedin_internal_id: - type: string - description: - "\n LinkedIn's Internal and immutable ID of this Company\ - \ profile.\n " - description: - type: string - nullable: true - description: A textual description of the company. - website: - type: string - nullable: true - description: The URL of the company's website. - industry: - type: string - nullable: true - description: - The `industry` attribute, found in a LinkedIn Company profile, - describes the industry in which the company operates. The value - of this attribute is an enumerator. [This CSV file provides - an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link). - company_size: - type: array - items: - oneOf: - - type: integer - nullable: true - - type: integer - nullable: true - minItems: 2 - maxItems: 2 - description: Sequenceed range of company head count - company_size_on_linkedin: - type: integer - nullable: true - description: The size of the company as indicated on LinkedIn. - hq: - $ref: '#/components/schemas/CompanyLocation' - nullable: true - company_type: - $ref: '#/components/schemas/CompanyType' - nullable: true - description: - "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\ - \n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT`\ - \ : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`:\ - \ Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n \ - \ `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" - founded_year: - type: integer - nullable: true - description: The year the company was founded. - specialities: - type: array - items: - type: string - description: "\n A list of specialities.\n " - locations: - type: array - items: - $ref: '#/components/schemas/CompanyLocation' - name: - type: string - nullable: true - description: The name of the company. - tagline: - type: string - nullable: true - description: - A short, catchy phrase that represents the company's - mission or brand. - universal_name_id: - type: string - nullable: true - description: - A unique numerical identifier for the company - used in the LinkedIn platform. - profile_pic_url: - type: string - nullable: true - description: The URL of the company's profile picture. - background_cover_image_url: - type: string - nullable: true - description: The URL of the company's background cover image. - search_id: - type: string - description: - "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n\ - \ " - similar_companies: - type: array - items: - $ref: '#/components/schemas/SimilarCompany' - affiliated_companies: - type: array - items: - $ref: '#/components/schemas/AffiliatedCompany' - updates: - type: array - items: - $ref: '#/components/schemas/CompanyUpdate' - description: - A list of post updates made by the company. This field is not - guaranteed to be returned. Do not rely on this attribute in production. - follower_count: - type: integer - nullable: true - description: The number of followers the company has on LinkedIn. - example: - linkedin_internal_id: '5524' - description: - "At NUS, we are shaping the future through our people and our\ - \ pursuit of new frontiers in knowledge. In a single century, we have become\ - \ a university of global influence and an Asian thought leader. Our location\ - \ at the crossroads of Asia informs our mission and gives us a tremendous\ - \ vantage point to help create opportunities and address the pressing issues\ - \ facing Singapore, Asia and the world.\r\rAt NUS, we believe in education,\ - \ research and service that change lives." - website: http://nus.edu.sg - industry: Higher Education - company_size: - - 5001 - - 10000 - company_size_on_linkedin: 16084 - hq: *id002 - company_type: EDUCATIONAL_INSTITUTION - founded_year: 1905 - specialities: - - education - - research - locations: - - country: SG - city: Singapore - postal_code: '119077' - line_1: 21 Lower Kent Ridge Road, Singapore - is_hq: true - state: null - name: National University of Singapore - tagline: Think Different - But Not Too Different - universal_name_id: national-university-of-singapore - profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=a66e032f168972bef4ea3821705194ea1c144415a1655bdb328f961ed30e2a24 - background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/national-university-of-singapore/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T071304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=551f456b6156e4610bc3e7be43e2f9b0e4b071db5f41f56cc0e408fc1b5a1140 - search_id: '5524' - similar_companies: - - *id003 - - name: NUS Faculty of Arts and Social Sciences - link: https://www.linkedin.com/school/nusfass/ - industry: Higher Education - location: null - affiliated_companies: - - *id004 - updates: - - *id005 - follower_count: 539321 - AcquiredCompany: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: - "\n LinkedIn Company Profile URL of company that was\ - \ involved\n " - crunchbase_profile_url: - type: string - nullable: true - description: Crunchbase Profile URL of company that was involved - announced_date: - $ref: '#/components/schemas/Date' - nullable: true - description: Date by which this event was announced - price: - type: integer - nullable: true - description: Price of acquisition - example: &id006 - linkedin_profile_url: https://www.linkedin.com/company/apple - crunchbase_profile_url: https://www.crunchbase.com/organization/apple - announced_date: - day: 1 - month: 4 - year: 1976 - price: 300000000 - Acquisitor: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: - "\n LinkedIn Company Profile URL of company that was\ - \ involved\n " - crunchbase_profile_url: - type: string - nullable: true - description: Crunchbase Profile URL of company that was involved - announced_date: - $ref: '#/components/schemas/Date' - nullable: true - description: Date by which this event was announced - price: - type: integer - nullable: true - description: Price of acquisition - example: &id007 - linkedin_profile_url: https://www.linkedin.com/company/nvidia - crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia - announced_date: - day: 6 - month: 3 - year: 2020 - price: 10000 - Acquisition: - type: object - properties: - acquired: - type: array - items: - $ref: '#/components/schemas/AcquiredCompany' - acquired_by: - $ref: '#/components/schemas/Acquisitor' - nullable: true - example: &id009 - acquired: - - *id006 - acquired_by: *id007 - Exit: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: LinkedIn Profile URL of the company that has exited - crunchbase_profile_url: - type: string - nullable: true - description: Crunchbase Profile URL of the company that has exited - name: - type: string - nullable: true - description: Name of the company - example: &id010 - linkedin_profile_url: https://www.linkedin.com/company/motiondsp - crunchbase_profile_url: https://www.crunchbase.com/organization/motiondsp - name: MotionDSP - CompanyDetails: - type: object - properties: - crunchbase_profile_url: - type: string - nullable: true - description: Crunchbase Profile URL of the company - ipo_status: - type: string - nullable: true - description: IPO status of the company - crunchbase_rank: - type: integer - nullable: true - description: A measure of prominence of this company by Crunchbase - founding_date: - $ref: '#/components/schemas/Date' - nullable: true - description: Date of founding - operating_status: - type: string - nullable: true - description: Status of the company's operational status - company_type: - type: string - nullable: true - description: Type of company - contact_email: - type: string - nullable: true - description: General contact email of the company - phone_number: - type: string - nullable: true - description: General contact number of the company - facebook_id: - type: string - nullable: true - description: ID of the company's official Facebook account - twitter_id: - type: string - nullable: true - description: ID of the company's official Twitter account - number_of_funding_rounds: - type: integer - nullable: true - description: Total rounds of funding that this company has raised - total_funding_amount: - type: integer - nullable: true - description: Total venture capital raised by this company - stock_symbol: - type: string - nullable: true - description: Stock symbol of this public company - ipo_date: - $ref: '#/components/schemas/Date' - nullable: true - description: The date by which this public company went public - number_of_lead_investors: - type: integer - nullable: true - description: Total lead investors - number_of_investors: - type: integer - nullable: true - description: Total investors - total_fund_raised: - type: integer - nullable: true - description: - "\n The total amount of funds raised (by this VC firm)\ - \ to be deployed as\n subsidiary investments (applicable only for\ - \ VC firms)\n " - number_of_investments: - type: integer - nullable: true - description: - "\n Total investments made by this VC firm (applicable\ - \ only for VC firms)\n " - number_of_lead_investments: - type: integer - nullable: true - description: - "\n Total investments that was led by this VC firm\n\ - \ (applicable only for VC firms)\n " - number_of_exits: - type: integer - nullable: true - description: Total exits by this VC (applicable only for VC firms) - number_of_acquisitions: - type: integer - nullable: true - description: Total companies acquired by this company - example: &id011 - crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia - ipo_status: Public - crunchbase_rank: 13 - founding_date: - day: 1 - month: 1 - year: 2000 - operating_status: Active - company_type: For Profit - contact_email: info@nvidia.com - phone_number: (140) 848-6200 - facebook_id: NVIDIA.IN - twitter_id: nvidia - number_of_funding_rounds: 3 - total_funding_amount: 4000000 - stock_symbol: NASDAQ:NVDA - ipo_date: - day: 1 - month: 1 - year: 2000 - number_of_lead_investors: 3 - number_of_investors: 4 - total_fund_raised: 1000 - number_of_investments: 50 - number_of_lead_investments: 3 - number_of_exits: 7 - number_of_acquisitions: 2 - Investor: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: LinkedIn Profile URL of investor - name: - type: string - nullable: true - description: Name of investor - type: - type: string - nullable: true - description: Type of investor - example: &id008 - linkedin_profile_url: https://linkedin.com/company/darpa - name: DARPA - type: organization - Funding: - type: object - properties: - funding_type: - type: string - nullable: true - description: Type of funding - money_raised: - type: integer - nullable: true - description: Amount of money raised - announced_date: - $ref: '#/components/schemas/Date' - nullable: true - description: Date of announcement - number_of_investor: - type: integer - nullable: true - description: Number of investors in this round - investor_list: - type: array - items: - $ref: '#/components/schemas/Investor' - nullable: true - example: &id012 - funding_type: Grant - money_raised: 25000000 - announced_date: - day: 1 - month: 1 - year: 2001 - number_of_investor: 1 - investor_list: - - *id008 - LinkedinCompany: - type: object - properties: - linkedin_internal_id: - type: string - description: - "\n LinkedIn's Internal and immutable ID of this Company\ - \ profile.\n " - description: - type: string - nullable: true - description: A textual description of the company. - website: - type: string - nullable: true - description: The URL of the company's website. - industry: - type: string - nullable: true - description: - The `industry` attribute, found in a LinkedIn Company profile, - describes the industry in which the company operates. The value - of this attribute is an enumerator. [This CSV file provides - an exhaustive list of possible values for this attribute] (https://drive.google.com/file/d/12yvYLuru7CRv3wKOIkHs5Ldocz31gJSS/view?usp=share_link). - company_size: - type: array - items: - oneOf: - - type: integer - nullable: true - - type: integer - nullable: true - minItems: 2 - maxItems: 2 - description: Sequenceed range of company head count - company_size_on_linkedin: - type: integer - nullable: true - description: The size of the company as indicated on LinkedIn. - hq: - $ref: '#/components/schemas/CompanyLocation' - nullable: true - company_type: - $ref: '#/components/schemas/CompanyType' - nullable: true - description: - "Possible values:\n\n `EDUCATIONAL`: Educational Institution\n\ - \n `GOVERNMENT_AGENCY`: Government Agency\n\n `NON_PROFIT`\ - \ : Nonprofit\n\n `PARTNERSHIP` : Partnership\n\n `PRIVATELY_HELD`:\ - \ Privately Held\n\n `PUBLIC_COMPANY`: Public Company\n\n \ - \ `SELF_EMPLOYED`: Self-Employed\n\n `SELF_OWNED`: Sole Proprietorship" - founded_year: - type: integer - nullable: true - description: The year the company was founded. - specialities: - type: array - items: - type: string - description: "\n A list of specialities.\n " - locations: - type: array - items: - $ref: '#/components/schemas/CompanyLocation' - name: - type: string - nullable: true - description: The name of the company. - tagline: - type: string - nullable: true - description: - A short, catchy phrase that represents the company's - mission or brand. - universal_name_id: - type: string - nullable: true - description: - A unique numerical identifier for the company - used in the LinkedIn platform. - profile_pic_url: - type: string - nullable: true - description: The URL of the company's profile picture. - background_cover_image_url: - type: string - nullable: true - description: The URL of the company's background cover image. - search_id: - type: string - description: - "\n Useable with [Job listing endpoint](#jobs-api-jobs-listing-endpoint)\n\ - \ " - similar_companies: - type: array - items: - $ref: '#/components/schemas/SimilarCompany' - affiliated_companies: - type: array - items: - $ref: '#/components/schemas/AffiliatedCompany' - updates: - type: array - items: - $ref: '#/components/schemas/CompanyUpdate' - description: - A list of post updates made by the company. This field is not - guaranteed to be returned. Do not rely on this attribute in production. - follower_count: - type: integer - nullable: true - description: The number of followers the company has on LinkedIn. - acquisitions: - $ref: '#/components/schemas/Acquisition' - nullable: true - exit_data: - type: array - items: - $ref: '#/components/schemas/Exit' - nullable: true - extra: - $ref: '#/components/schemas/CompanyDetails' - nullable: true - description: Company extra when `extra=include` - funding_data: - type: array - items: - $ref: '#/components/schemas/Funding' - description: Company Funding data when `funding_data=include` - categories: - type: array - items: - type: string - nullable: true - description: - The `categories` attribute is fetched from the company's - Crunchbase profile. Values for this attribute are free-form - text, and there is no exhaustive list of categories. Consider - the categories attribute as "hints" regarding the products - or services offered by the company. - customer_list: - type: array - items: - type: string - nullable: true - example: - linkedin_internal_id: '1441' - description: - "A problem isn't truly solved until it's solved for all. Googlers - build products that help create opportunities for everyone, whether down - the street or across the globe. Bring your insight, imagination and a healthy - disregard for the impossible. Bring everything that makes you unique. Together, - we can build for everyone. - - - Check out our career opportunities at careers.google.com." - website: https://goo.gle/3m1IN7m - industry: Software Development - company_size: - - 10001 - - null - company_size_on_linkedin: 319856 - hq: - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - company_type: PUBLIC_COMPANY - founded_year: null - specialities: - - search - - ads - locations: - - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - - country: US - city: New York - postal_code: '10011' - line_1: 111 8th Ave - is_hq: null - state: NY - name: Google - tagline: Think Different - But Not Too Different - universal_name_id: google - profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca - background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 - search_id: '1441' - similar_companies: - - name: Amazon - link: https://www.linkedin.com/company/amazon - industry: Software Development - location: Seattle, WA - - name: Microsoft - link: https://www.linkedin.com/company/microsoft - industry: Software Development - location: Redmond, Washington - affiliated_companies: - - name: YouTube - link: https://www.linkedin.com/company/youtube - industry: Software Development - location: San Bruno, CA - - name: Google Cloud - link: https://www.linkedin.com/showcase/google-cloud - industry: Software Development - location: Mountain View, California - updates: - - article_link: null - image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE - posted_on: - day: 13 - month: 9 - year: 2022 - text: - "Want to kick start your #LifeAtGoogle but not sure where to begin?\ - \ Explore our Build Your Future site, where you can learn about developmental\ - \ programs, learn tips for future interviews, sign up for informational\ - \ events, and even hear real stories from Googlers who\u2019ve been where\ - \ you are now. Get started \u2192 https://bit.ly/3SKPzQB" - total_likes: 4267 - - article_link: null - image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg - posted_on: null - text: - "Ariana, welcome to Google. Here\u2019s to a year full of growth,\ - \ learning, and experiences at #LifeAtGoogle! \U0001F389" - total_likes: 397 - follower_count: 27472792 - acquisitions: *id009 - exit_data: - - *id010 - extra: *id011 - funding_data: - - *id012 - categories: - - artificial-intelligence - - virtual-reality - Experience: - type: object - properties: - starts_at: - $ref: '#/components/schemas/Date' - nullable: true - ends_at: - $ref: '#/components/schemas/Date' - nullable: true - company: - type: string - nullable: true - description: The company's display name. - company_linkedin_profile_url: - type: string - nullable: true - description: - "\n The company's profile URL on Linkedin.\n \ - \ If present, could be used with \n [Company Profile\ - \ Endpoint](#company-api-company-profile-endpoint) for more info.\n \ - \ " - company_facebook_profile_url: - type: string - nullable: true - description: - "\n The company's profile URL on Facebook.\n \ - \ " - title: - type: string - nullable: true - description: - type: string - nullable: true - location: - type: string - nullable: true - logo_url: - type: string - nullable: true - description: URL of the logo of the organisation. - example: &id013 - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking financial - freedom long before the age of 65 with the ability to invest in high yield, - short-term real estate investments that were only accessible in the past - for a select few wealthy individuals. Each of our single family rehab projects - require a minimum investment contribution of only $10K, we have simple terms, - no multi-year hold periods, and no fees. With our unique model investors - can log into our easy to use website, select the projects that they want - to invest in, and get realtime updates on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - Education: - type: object - properties: - starts_at: - $ref: '#/components/schemas/Date' - nullable: true - ends_at: - $ref: '#/components/schemas/Date' - nullable: true - field_of_study: - type: string - nullable: true - degree_name: - type: string - nullable: true - school: - type: string - nullable: true - school_linkedin_profile_url: - type: string - nullable: true - school_facebook_profile_url: - type: string - nullable: true - description: - "\n The school's profile URL on Facebook.\n \ - \ " - description: - type: string - nullable: true - logo_url: - type: string - nullable: true - grade: - type: string - activities_and_societies: - type: string - example: &id014 - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - AccomplishmentOrg: - type: object - properties: - starts_at: - $ref: '#/components/schemas/Date' - nullable: true - ends_at: - $ref: '#/components/schemas/Date' - nullable: true - org_name: - type: string - nullable: true - title: - type: string - nullable: true - description: - type: string - nullable: true - example: &id015 - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - Publication: - type: object - properties: - name: - type: string - nullable: true - description: Name of the publication. - publisher: - type: string - nullable: true - description: The publishing organisation body. - published_on: - $ref: '#/components/schemas/Date' - nullable: true - description: Date of publication. - description: - type: string - nullable: true - description: Description of the publication. - url: - type: string - nullable: true - description: URL of the publication. - example: &id016 - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - HonourAward: - type: object - properties: - title: - type: string - nullable: true - description: Title of the honour/award. - issuer: - type: string - nullable: true - description: The organisation body issuing this honour/award. - issued_on: - $ref: '#/components/schemas/Date' - nullable: true - description: Date that this honour/awared was issued. - description: - type: string - nullable: true - description: Description of the honour/award. - example: &id017 - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - Patent: - type: object - properties: - title: - type: string - nullable: true - description: Title of the patent. - issuer: - type: string - nullable: true - description: The organisation body that issued the patent. - issued_on: - $ref: '#/components/schemas/Date' - nullable: true - description: Date of patent issuance. - description: - type: string - nullable: true - description: Description of the patent. - application_number: - type: string - nullable: true - description: Numerical representation that identifies the patent. - patent_number: - type: string - nullable: true - description: Application number of the patent. - url: - type: string - nullable: true - example: &id018 - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - Course: - type: object - properties: - name: - type: string - nullable: true - description: Name of the course - number: - type: string - nullable: true - description: The numerical representation of the course - example: &id019 - name: The course about ABCs - number: '123' - Project: - type: object - properties: - starts_at: - $ref: '#/components/schemas/Date' - nullable: true - ends_at: - $ref: '#/components/schemas/Date' - nullable: true - title: - type: string - nullable: true - description: - "\n Name of the project that has been or is\ - \ currently being worked on.\n " - description: - type: string - nullable: true - description: Description of the project. - url: - type: string - nullable: true - description: A web location related to the project. - example: &id020 - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap HTML, - CSS, and JavaScript framework. It uses a Websocket-Rails integration to - post a user's message content to the page in real time, with no page refresh - required. gMessenger also includes custom authentication with three different - permissions levels. - url: http://gmessenger.herokuapp.com/ - TestScore: - type: object - properties: - name: - type: string - nullable: true - description: - "\n Title of the course for which test score\ - \ was derived from.\n " - score: - type: string - nullable: true - description: Test score - date_on: - $ref: '#/components/schemas/Date' - nullable: true - description: Date of test was assesed. - description: - type: string - nullable: true - description: Description of the test score. - example: &id021 - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - VolunteeringExperience: - type: object - properties: - starts_at: - $ref: '#/components/schemas/Date' - nullable: true - ends_at: - $ref: '#/components/schemas/Date' - nullable: true - title: - type: string - nullable: true - description: Name of volunteer activity. - cause: - type: string - nullable: true - company: - type: string - nullable: true - description: The company's display name. - company_linkedin_profile_url: - type: string - nullable: true - description: - "\n The company's profile URL.\n If present,\ - \ could be used with \n [Company Profile Endpoint](#company-api-company-profile-endpoint)\ - \ for more info.\n " - description: - type: string - nullable: true - logo_url: - type: string - nullable: true - description: URL of the logo of the organisation. - example: &id022 - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - Certification: - type: object - properties: - starts_at: - $ref: '#/components/schemas/Date' - nullable: true - ends_at: - $ref: '#/components/schemas/Date' - nullable: true - name: - type: string - nullable: true - description: Name of the course or program. - license_number: - type: string - nullable: true - display_source: - type: string - nullable: true - authority: - type: string - nullable: true - description: The organisation body issuing this certificate. - url: - type: string - nullable: true - example: &id023 - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices - in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - PeopleAlsoViewed: - type: object - properties: - link: - type: string - nullable: true - description: - "\n URL of the profile.\n Useable with\ - \ [Person profile endpoint](#people-api-person-profile-endpoint)\n \ - \ " - name: - type: string - nullable: true - summary: - type: string - nullable: true - location: - type: string - nullable: true - example: &id024 - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - Activity: - type: object - properties: - title: - type: string - nullable: true - link: - type: string - nullable: true - activity_status: - type: string - nullable: true - example: &id025 - title: - "Yesterday I toured a $1.2M property in California that has a large\ - \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - SimilarProfile: - type: object - properties: - name: - type: string - nullable: true - link: - type: string - nullable: true - summary: - type: string - nullable: true - location: - type: string - nullable: true - example: &id026 - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ - s Hardwood Works" - location: San Antonio, TX - Article: - type: object - properties: - title: - type: string - nullable: true - link: - type: string - nullable: true - published_date: - $ref: '#/components/schemas/Date' - nullable: true - author: - type: string - nullable: true - image_url: - type: string - nullable: true - example: &id027 - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - PersonGroup: - type: object - properties: - profile_pic_url: - type: string - nullable: true - description: The URL to the profile picture of this LinkedIn Group - name: - type: string - nullable: true - description: Name of LinkedIn group for which this user is in - url: - type: string - nullable: true - description: URL to the LinkedIn Group - example: &id028 - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - InferredSalary: - type: object - properties: - min: - type: number - nullable: true - max: - type: number - nullable: true - example: &id029 - min: 35000 - max: 45000 - PersonExtra: - type: object - properties: - github_profile_id: - type: string - nullable: true - description: This profile's Github account. - facebook_profile_id: - type: string - nullable: true - description: This profile's Facebook account. - twitter_profile_id: - type: string - nullable: true - description: This profile's twitter account. - website: - type: string - nullable: true - description: This account's website listed on his profile. - example: &id030 - github_profile_id: github-username - facebook_profile_id: facebook-username - twitter_profile_id: twitter-username - website: https://proxycurl.com - PersonEndpointResponse: - type: object - properties: - public_identifier: - type: string - nullable: true - description: - "\n The vanity identifier of the public LinkedIn\ - \ profile.\n The vanity identifier comes after the `/in/`\ - \ part of the LinkedIn Profile URL\n in the following format:\ - \ `https://www.linkedin.com/in/`\n " - profile_pic_url: - type: string - description: - "\n A temporary link to the user's profile picture\ - \ that is valid for 30 minutes. \n The temporal nature\ - \ of the link is by design to prevent having Proxycurl be the mirror for\ - \ the images.\n The developer is expected to handle these\ - \ images by downloading the image and re-hosting the image.\n \ - \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ - \ for context.\n Some profile pictures might be of the\ - \ standard LinkedIn's profile picture placeholder. It is so because. See\ - \ [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/)\ - \ for context.\n " - background_cover_image_url: - type: string - nullable: true - description: - "\n A temporary link to the user's background\ - \ cover picture\n that is valid for 30 minutes.\n \ - \ The temporal nature of the link is by design to prevent\n\ - \ having Proxycurl be the mirror for the images.\n \ - \ The developer is expected to handle these images \n \ - \ by downloading the image and re-hosting the image. \n \ - \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ - \ for context.\n " - first_name: - type: string - nullable: true - description: First name of the user. - last_name: - type: string - nullable: true - description: Last name of the user. - full_name: - type: string - nullable: true - description: - "\n Full name of the user (`first_name` + `last_name`)\n\ - \ " - follower_count: - type: integer - description: Follower count for this profile - occupation: - type: string - nullable: true - description: - "\n The title and company name of the user's\ - \ current employment.\n " - headline: - type: string - nullable: true - description: - "\n The tagline written by the user for his\ - \ profile.\n " - summary: - type: string - nullable: true - description: - "\n A blurb (longer than the tagline) written\ - \ by the user for his profile.\n " - country: - type: string - nullable: true - description: - "\n The user's country of residence depicted\ - \ by\n a 2-letter country code (ISO 3166-1 alpha-2).\n\ - \ " - country_full_name: - type: string - nullable: true - description: The user's country of residence, in English words. - city: - type: string - nullable: true - description: The city that the user is living at. - state: - type: string - nullable: true - description: The state that the user is living at. - experiences: - type: array - items: - $ref: '#/components/schemas/Experience' - description: The user's list of historic work experiences. - education: - type: array - items: - $ref: '#/components/schemas/Education' - description: The user's list of education background. - languages: - type: array - items: - type: string - description: - "\n A list of languages that the user claims\ - \ to be familiar with,\n and has added to his/her profile.\n\ - \ Do note that we do not have the proficiency level as\n\ - \ that data point is not available on a public LinkedIn\ - \ profile.\n " - accomplishment_organisations: - type: array - items: - $ref: '#/components/schemas/AccomplishmentOrg' - description: - "\n List of noteworthy organizations that this\ - \ user is part of.\n " - accomplishment_publications: - type: array - items: - $ref: '#/components/schemas/Publication' - description: - "\n List of noteworthy publications that this\ - \ user has partook in.\n " - accomplishment_honors_awards: - type: array - items: - $ref: '#/components/schemas/HonourAward' - description: - "\n List of noteworthy honours and awards that\ - \ this user has won.\n " - accomplishment_patents: - type: array - items: - $ref: '#/components/schemas/Patent' - description: List of noteworthy patents won by this user. - accomplishment_courses: - type: array - items: - $ref: '#/components/schemas/Course' - description: List of noteworthy courses partook by this user. - accomplishment_projects: - type: array - items: - $ref: '#/components/schemas/Project' - description: - "\n List of noteworthy projects undertaken by\ - \ this user.\n " - accomplishment_test_scores: - type: array - items: - $ref: '#/components/schemas/TestScore' - description: - "\n List of noteworthy test scores accomplished\ - \ by this user.\n " - volunteer_work: - type: array - items: - $ref: '#/components/schemas/VolunteeringExperience' - description: List of historic volunteer work experiences. - certifications: - type: array - items: - $ref: '#/components/schemas/Certification' - description: - "\n List of noteworthy certifications accomplished\ - \ by this user.\n " - connections: - type: integer - nullable: true - description: Total *count* of LinkedIn connections. - people_also_viewed: - type: array - items: - $ref: '#/components/schemas/PeopleAlsoViewed' - description: - "\n A list of other LinkedIn profiles closely\ - \ related to this user.\n " - recommendations: - type: array - items: - type: string - description: - "\n List of recommendations made by other users\ - \ about this profile.\n " - activities: - type: array - items: - $ref: '#/components/schemas/Activity' - description: - A list of LinkedIn status activities. This field is not guaranteed - to be returned. Do not rely on this attribute in production. - similarly_named_profiles: - type: array - items: - $ref: '#/components/schemas/SimilarProfile' - description: - "\n A list of other LinkedIn profiles with similar\ - \ names.\n " - articles: - type: array - items: - $ref: '#/components/schemas/Article' - description: - "\n A list of content-based articles posted\ - \ by this user. This field is not guaranteed to be returned. Do not rely\ - \ on this attribute in production.\n " - groups: - type: array - items: - $ref: '#/components/schemas/PersonGroup' - description: - "\n A list of LinkedIn groups that this user\ - \ is a part of.\",\n " - skills: - type: array - items: - type: string - description: - A list of keyword-based skills that this user boasts of on - his LinkedIn profile. - inferred_salary: - $ref: '#/components/schemas/InferredSalary' - nullable: true - description: - A salary range inferred from the user's current job title and - company. - gender: - type: string - nullable: true - description: Gender of the user. - birth_date: - $ref: '#/components/schemas/Date' - nullable: true - description: Birth date of the user. - industry: - type: string - nullable: true - description: Industry that the user works in. - extra: - $ref: '#/components/schemas/PersonExtra' - nullable: true - description: A bundle of extra data on this user. - interests: - type: array - items: - type: string - description: A list of interests that the user has. - personal_emails: - type: array - items: - type: string - description: A list of personal emails associated with this user. - personal_numbers: - type: array - items: - type: string - description: - A list of personal mobile phone numbers associated with this - user. - example: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy at work\ - \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ - \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ - \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ - \ into the creation of an Internet of Things company, but numerous factors\ - \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying to\ - \ 150 companies). My desperate situation led me to take a job at Best Buy\ - \ for $12 an hour while reinventing myself through the completion of an\ - \ MBA at the University of Colorado, and a 6-month software development\ - \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because of my\ - \ LinkedIn profile). My journey has led to a deep sense of perspective,\ - \ humility, and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website for\ - \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or my\ - \ free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\nFAQ's\n\ - \nQ: Can you speak at my Company, University, event or podcast?\nA: I'd\ - \ love to! I've shared my message on the future of employment, breaking\ - \ into big tech, and my personal story of reinventing myself and discovering\ - \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube Channel\ - \ #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\u2611\uFE0F\ - \ YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just started\ - \ learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ - \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ - \ (don't forget that \"R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - *id013 - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost thought\ - \ leaders and turn them into actionable insights so that others can discover\ - \ greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - *id014 - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, api integration, - Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: - - *id015 - accomplishment_publications: - - *id016 - accomplishment_honors_awards: - - *id017 - accomplishment_patents: - - *id018 - accomplishment_courses: - - *id019 - accomplishment_projects: - - *id020 - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: - - *id021 - volunteer_work: - - *id022 - certifications: - - *id023 - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: - - *id024 - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n \ - \ John Marty is a genius at his craft. He is skilled in the art of making\ - \ people feel empowered to seek out roles that they are qualified for, ask\ - \ for salaries that they deserve, and creates a kind of pay it forward lifestyle.\ - \ John helps you to get to places that you only thought were possible for\ - \ other people. Anyone that is fortunate enough to learn from John should\ - \ consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \n \ - \ \n \n \n \n\n \n John\ - \ is so focused on helping guide you through an interview process not just\ - \ for Amazon but on interviewing in general. I've generally done well at\ - \ interviewing, my skills are top notch now. John is so focused on on his\ - \ clients and really goes above and beyond. John is genuine, knowledgeable,\ - \ well spoken and non-judgemental. He is so encouraging, so positive and\ - \ really easy to talk to. Thank you John!" - activities: - - *id025 - similarly_named_profiles: - - *id026 - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: - - *id027 - groups: - - *id028 - inferred_salary: *id029 - gender: male - birth_date: - day: 1 - month: 1 - year: 1990 - industry: government administration - extra: *id030 - interests: - - education - - health - - human rights - personal_emails: - - abc@gmail.com - - bcd@gmail.com - - cde@@outlook.com - personal_numbers: - - '+6512345678' - - '+6285123450953' - - '+6502300340' - CompanyCustomer: - type: object - properties: - linkedin_company_profile_url: - type: string - description: LinkedIn Company Profile URL of a probable customer - twitter_profile_url: - type: string - nullable: true - description: Twitter Profile URL of a probable customer - email: - type: string - nullable: true - description: General Email address of company (if any) - example: &id031 - linkedin_company_profile_url: https://www.linkedin.com/company/spire-solicitors-llp - twitter_profile_url: https://twitter.com/spirellp - email: info@spiresolicitors.co.uk - CustomerList: - type: object - properties: - companies: - type: array - items: - $ref: '#/components/schemas/CompanyCustomer' - description: A list of companies that are probable customers. - next_page: - type: string - nullable: true - description: - "\n The API URI that will lead to the next page of results.\ - \ This will be null for the final page.\n " - example: - companies: - - *id031 - - linkedin_company_profile_url: https://www.linkedin.com/company/mall-wood-insurance-services-ltd - twitter_profile_url: https://twitter.com/draytonins - email: hello@example.com - next_page: null - CustomerCount: - type: object - properties: - company_count: - type: integer - nullable: true - description: A count of of companies that are probable customers. - example: - company_count: 125 - PublicPerson: - type: object - properties: - public_identifier: - type: string - nullable: true - description: - "\n The vanity identifier of the public LinkedIn\ - \ profile.\n The vanity identifier comes after the `/in/`\ - \ part of the LinkedIn Profile URL\n in the following format:\ - \ `https://www.linkedin.com/in/`\n " - profile_pic_url: - type: string - description: - "\n A temporary link to the user's profile picture\ - \ that is valid for 30 minutes. \n The temporal nature\ - \ of the link is by design to prevent having Proxycurl be the mirror for\ - \ the images.\n The developer is expected to handle these\ - \ images by downloading the image and re-hosting the image.\n \ - \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ - \ for context.\n Some profile pictures might be of the\ - \ standard LinkedIn's profile picture placeholder. It is so because. See\ - \ [this post](https://nubela.co/blog/why-do-most-linkedin-profiles-fetched-via-the-person-profile-endpoint-return-a-placeholder-profile-picture/)\ - \ for context.\n " - background_cover_image_url: - type: string - nullable: true - description: - "\n A temporary link to the user's background\ - \ cover picture\n that is valid for 30 minutes.\n \ - \ The temporal nature of the link is by design to prevent\n\ - \ having Proxycurl be the mirror for the images.\n \ - \ The developer is expected to handle these images \n \ - \ by downloading the image and re-hosting the image. \n \ - \ See [this post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ - \ for context.\n " - first_name: - type: string - nullable: true - description: First name of the user. - last_name: - type: string - nullable: true - description: Last name of the user. - full_name: - type: string - nullable: true - description: - "\n Full name of the user (`first_name` + `last_name`)\n\ - \ " - follower_count: - type: integer - description: Follower count for this profile - occupation: - type: string - nullable: true - description: - "\n The title and company name of the user's\ - \ current employment.\n " - headline: - type: string - nullable: true - description: - "\n The tagline written by the user for his\ - \ profile.\n " - summary: - type: string - nullable: true - description: - "\n A blurb (longer than the tagline) written\ - \ by the user for his profile.\n " - country: - type: string - nullable: true - description: - "\n The user's country of residence depicted\ - \ by\n a 2-letter country code (ISO 3166-1 alpha-2).\n\ - \ " - country_full_name: - type: string - nullable: true - description: The user's country of residence, in English words. - city: - type: string - nullable: true - description: The city that the user is living at. - state: - type: string - nullable: true - description: The state that the user is living at. - experiences: - type: array - items: - $ref: '#/components/schemas/Experience' - description: The user's list of historic work experiences. - education: - type: array - items: - $ref: '#/components/schemas/Education' - description: The user's list of education background. - languages: - type: array - items: - type: string - description: - "\n A list of languages that the user claims\ - \ to be familiar with,\n and has added to his/her profile.\n\ - \ Do note that we do not have the proficiency level as\n\ - \ that data point is not available on a public LinkedIn\ - \ profile.\n " - accomplishment_organisations: - type: array - items: - $ref: '#/components/schemas/AccomplishmentOrg' - description: - "\n List of noteworthy organizations that this\ - \ user is part of.\n " - accomplishment_publications: - type: array - items: - $ref: '#/components/schemas/Publication' - description: - "\n List of noteworthy publications that this\ - \ user has partook in.\n " - accomplishment_honors_awards: - type: array - items: - $ref: '#/components/schemas/HonourAward' - description: - "\n List of noteworthy honours and awards that\ - \ this user has won.\n " - accomplishment_patents: - type: array - items: - $ref: '#/components/schemas/Patent' - description: List of noteworthy patents won by this user. - accomplishment_courses: - type: array - items: - $ref: '#/components/schemas/Course' - description: List of noteworthy courses partook by this user. - accomplishment_projects: - type: array - items: - $ref: '#/components/schemas/Project' - description: - "\n List of noteworthy projects undertaken by\ - \ this user.\n " - accomplishment_test_scores: - type: array - items: - $ref: '#/components/schemas/TestScore' - description: - "\n List of noteworthy test scores accomplished\ - \ by this user.\n " - volunteer_work: - type: array - items: - $ref: '#/components/schemas/VolunteeringExperience' - description: List of historic volunteer work experiences. - certifications: - type: array - items: - $ref: '#/components/schemas/Certification' - description: - "\n List of noteworthy certifications accomplished\ - \ by this user.\n " - connections: - type: integer - nullable: true - description: Total *count* of LinkedIn connections. - people_also_viewed: - type: array - items: - $ref: '#/components/schemas/PeopleAlsoViewed' - description: - "\n A list of other LinkedIn profiles closely\ - \ related to this user.\n " - recommendations: - type: array - items: - type: string - description: - "\n List of recommendations made by other users\ - \ about this profile.\n " - activities: - type: array - items: - $ref: '#/components/schemas/Activity' - description: - A list of LinkedIn status activities. This field is not guaranteed - to be returned. Do not rely on this attribute in production. - similarly_named_profiles: - type: array - items: - $ref: '#/components/schemas/SimilarProfile' - description: - "\n A list of other LinkedIn profiles with similar\ - \ names.\n " - articles: - type: array - items: - $ref: '#/components/schemas/Article' - description: - "\n A list of content-based articles posted\ - \ by this user. This field is not guaranteed to be returned. Do not rely\ - \ on this attribute in production.\n " - groups: - type: array - items: - $ref: '#/components/schemas/PersonGroup' - description: - "\n A list of LinkedIn groups that this user\ - \ is a part of.\",\n " - skills: - type: array - items: - type: string - description: - A list of keyword-based skills that this user boasts of on - his LinkedIn profile. - example: &id032 - public_identifier: williamhgates - profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - background_cover_image_url: null - first_name: Bill - last_name: Gates - full_name: Bill Gates - follower_count: null - occupation: Co-chair at Bill & Melinda Gates Foundation - headline: Co-chair, Bill & Melinda Gates Foundation - summary: - Co-chair of the Bill & Melinda Gates Foundation. Founder of Breakthrough - Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active - blogger. - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - company: 'Breakthrough Energy ' - company_linkedin_profile_url: https://www.linkedin.com/company/breakthrough-energy/ - company_facebook_profile_url: null - title: Founder - description: null - location: null - logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQGwD9vNu044FA/company-logo_400_400/0/1601560874941?e=1672876800&v=beta&t=VKb6OAHEwlnazKYKm4fc9go-y4zkUv2BT6tosOdQ54Y - - starts_at: - day: 1 - month: 1 - year: 2000 - ends_at: null - company: Bill & Melinda Gates Foundation - company_linkedin_profile_url: https://www.linkedin.com/company/bill-&-melinda-gates-foundation/ - company_facebook_profile_url: null - title: Co-chair - description: null - location: null - logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQE7Na_mKQhIJg/company-logo_400_400/0/1633731810932?e=1672876800&v=beta&t=Mz_ntwD4meCMcgo1L3JqDxBQRabFLIesd0Yz2ciAXNs - education: - - starts_at: - day: 1 - month: 1 - year: 1973 - ends_at: - day: 31 - month: 12 - year: 1975 - field_of_study: null - degree_name: null - school: Harvard University - school_linkedin_profile_url: null - school_facebook_profile_url: null - description: null - logo_url: https://media-exp1.licdn.com/dms/image/C4E0BAQF5t62bcL0e9g/company-logo_400_400/0/1519855919126?e=1672876800&v=beta&t=9twXof1JlnNHfFprrDMi-C1Kp55HTT4ahINKHRflUHw - grade: null - activities_and_societies: null - - starts_at: null - ends_at: null - field_of_study: null - degree_name: null - school: Lakeside School - school_linkedin_profile_url: null - school_facebook_profile_url: null - description: null - logo_url: https://media-exp1.licdn.com/dms/image/C4D0BAQENlfOPKBEk3Q/company-logo_400_400/0/1519856497259?e=1672876800&v=beta&t=v7nJTPaJMfH7WOBjb22dyvNKxAgdPdVd8uLCUkMB1LQ - grade: null - activities_and_societies: null - languages: - - English - - Chinese - - Japanese - accomplishment_organisations: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - accomplishment_publications: - - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - accomplishment_honors_awards: - - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - accomplishment_patents: - - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - accomplishment_courses: - - name: The course about ABCs - number: '123' - accomplishment_projects: [] - accomplishment_test_scores: - - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - volunteer_work: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - certifications: [] - connections: null - people_also_viewed: - - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - recommendations: - - Professional and dedicated approach towards clients and collegues. - activities: - - title: I am hiring! - link: https://www.linkedin.com/feed/update/urn:li:activity:666 - activity_status: posted - similarly_named_profiles: null - articles: - - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - groups: - - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - Employee: - type: object - properties: - profile_url: - type: string - description: "\n LinkedIn Profile URL of the employee.\n " - profile: - $ref: '#/components/schemas/PublicPerson' - nullable: true - description: - "\n Enriched profile data of the employee.\n \ - \ " - last_updated: - type: string - nullable: true - description: - "\n ISO 8601 timestamp since the enriched profile\ - \ was last scraped.\n " - example: &id033 - profile_url: https://www.linkedin.com/in/williamhgates - profile: *id032 - last_updated: '2023-10-26T11:34:30Z' - EmployeeList: - type: object - properties: - employees: - type: array - items: - $ref: '#/components/schemas/Employee' - description: - "\n A list of employee profiles (if enriched) and their\ - \ associated profile URL.\n " - next_page: - type: string - nullable: true - description: - "\n The API URI that will lead to the next page of results.\ - \ This will be null for the final page.\n " - example: - employees: - - *id033 - next_page: null - EmployeeCount: - type: object - properties: - total_employee: - type: integer - linkedin_employee_count: - type: integer - nullable: true - description: - The scraped value of employee count of this company from it's - LinkedIn profile. This value does not respect `employement_status` parameter. - It will always return the curent employee count of this company from LinkedIn. - linkdb_employee_count: - type: integer - description: - The total number of employees found in LinkDB for this company. - This value is limited by pre-crawled LinkedIn profiles stored in [LinkDB](https://nubela.co/proxycurl/linkdb) - regression_notice: - type: string - example: - linkedin_employee_count: 529274 - linkdb_employee_count: 3 - ProfilePicture: - type: object - properties: - tmp_profile_pic_url: - type: string - description: - "\n Temporary URL to the profile picture (valid\ - \ for just 30 minutes).\n See this [blog post](https://nubela.co/blog/why-is-the-api-returning-s3-links-for-profile-pictures-scraped-from-linkedin-profiles/)\ - \ for more information." - example: - tmp_profile_pic_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - PersonLookupUrlEnrichResult: - type: object - properties: - url: - type: string - nullable: true - description: The LinkedIn profile URL - name_similarity_score: - type: number - nullable: true - description: - A measure of how similar the input name is to the name in the - returned profile. Values can range from `0` to `1` , with `0` indicating - no similarity and `1` implying high similarity. In cases where a current - profile for comparison is not available in our dataset, the result may - be `null`. - company_similarity_score: - type: number - nullable: true - description: - A measure of how similar the input company name/domain is to - the name/domain of past or present companies in the returned profile. - The score ranges from `0` to `1` , with `0` signifying no similarity and - `1` denoting high similarity. If a relevant profile is unavailable in - our dataset for comparison, a `null` score may be returned. - title_similarity_score: - type: number - nullable: true - description: - A measure of how similar the input title is to the returned - profile's past or present titles. Scores vary from `0` to `1` , where - `0` means no similarity and `1` indicates high similarity. If a relevant - profile for comparison isn't available in our dataset, a `null` result - may occur. - location_similarity_score: - type: number - nullable: true - description: - "A measure of how similar the input location is to the returned - profile's current location. The range is from `0` to `1` , with `0` representing - no similarity and `1` signifying high similarity. If there isn't a relevant - profile in our dataset for comparison, the score might be `null`. " - profile: - $ref: '#/components/schemas/PersonEndpointResponse' - last_updated: - type: string - nullable: true - description: ISO 8601 timestamp since the enriched profile was last scraped. - example: - url: https://www.linkedin.com/in/senatormarty - name_similarity_score: 0.5 - company_similarity_score: 0.5 - title_similarity_score: 0.5 - location_similarity_score: 0.5 - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy at work\ - \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ - \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ - \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ - \ into the creation of an Internet of Things company, but numerous factors\ - \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job at Best\ - \ Buy for $12 an hour while reinventing myself through the completion\ - \ of an MBA at the University of Colorado, and a 6-month software development\ - \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because of my\ - \ LinkedIn profile). My journey has led to a deep sense of perspective,\ - \ humility, and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website for\ - \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ - \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ - A: I'd love to! I've shared my message on the future of employment, breaking\ - \ into big tech, and my personal story of reinventing myself and discovering\ - \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ - \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ - \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ - \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ - \ (don't forget that \"R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking financial - freedom long before the age of 65 with the ability to invest in high - yield, short-term real estate investments that were only accessible - in the past for a select few wealthy individuals. Each of our single - family rehab projects require a minimum investment contribution of only - $10K, we have simple terms, no multi-year hold periods, and no fees. - With our unique model investors can log into our easy to use website, - select the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost thought\ - \ leaders and turn them into actionable insights so that others can\ - \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, api integration, - Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - accomplishment_publications: - - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - accomplishment_honors_awards: - - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - accomplishment_patents: - - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - accomplishment_courses: - - name: The course about ABCs - number: '123' - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap - HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration - to post a user's message content to the page in real time, with no page - refresh required. gMessenger also includes custom authentication with - three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: - - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - volunteer_work: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices - in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: - - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n \ - \ John Marty is a genius at his craft. He is skilled in the art of\ - \ making people feel empowered to seek out roles that they are qualified\ - \ for, ask for salaries that they deserve, and creates a kind of pay it\ - \ forward lifestyle. John helps you to get to places that you only thought\ - \ were possible for other people. Anyone that is fortunate enough to learn\ - \ from John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ - \ \n \n \n \n\n \n John\ - \ is so focused on helping guide you through an interview process not\ - \ just for Amazon but on interviewing in general. I've generally done\ - \ well at interviewing, my skills are top notch now. John is so focused\ - \ on on his clients and really goes above and beyond. John is genuine,\ - \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ - \ so positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that has a large\ - \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ - \ I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ - s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: - - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - groups: - - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - inferred_salary: - min: 35000 - max: 45000 - gender: male - birth_date: - day: 1 - month: 1 - year: 1990 - industry: government administration - extra: - github_profile_id: github-username - facebook_profile_id: facebook-username - twitter_profile_id: twitter-username - website: https://proxycurl.com - interests: - - education - - health - - human rights - personal_emails: - - abc@gmail.com - - bcd@gmail.com - - cde@@outlook.com - personal_numbers: - - '+6512345678' - - '+6285123450953' - - '+6502300340' - last_updated: '2023-10-26T11:34:30Z' - JobListEntry: - type: object - properties: - company: - type: string - nullable: true - description: - "\n The name of the company that posted this job.\n\ - \ " - company_url: - type: string - nullable: true - description: - "\n The LinkedIn Company Profile URL that posted this\ - \ job.\n " - job_title: - type: string - nullable: true - description: "\n Job title of the posted job.\n " - job_url: - type: string - nullable: true - description: - "\n Job Profile URL. You can fetch details about this\ - \ job using this URL via the [Job Profile API Endpoint](https://nubela.co/proxycurl/docs#jobs-api-job-profile-endpoint).\n\ - \ " - list_date: - type: string - nullable: true - description: "\n The date that this job was listed.\n " - location: - type: string - nullable: true - description: "\n The job location.\n " - example: &id034 - company: Microsoft - company_url: https://www.linkedin.com/company/microsoft - job_title: 'Product Management: Intern Opportunities for University Students' - job_url: https://www.linkedin.com/jobs/view/product-management-intern-opportunities-for-university-students-at-microsoft-3203330682 - list_date: '2022-10-09' - location: New York, NY - JobListPage: - type: object - properties: - job: - type: array - items: - $ref: '#/components/schemas/JobListEntry' - next_page_no: - type: integer - nullable: true - next_page_api_url: - type: string - nullable: true - description: - "\n The URL to the next page of results. This will\ - \ be null for the final page.\n " - previous_page_no: - type: integer - nullable: true - previous_page_api_url: - type: string - nullable: true - description: - "\n The URL to the previous page of results. This\ - \ will be null for the first page.\n " - example: - job: - - *id034 - - company: Microsoft - company_url: https://www.linkedin.com/company/microsoft - job_title: Content Strategist - job_url: https://www.linkedin.com/jobs/view/content-strategist-at-microsoft-3257692764 - list_date: '2022-10-21' - location: United States - next_page_no: 1 - next_page_api_url: http://nubela.co/proxycurl/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035 - previous_page_no: null - previous_page_api_url: https://nubela.co/proxycurl/api/v2/linkedin/company/job?pagination=eyJwYWdlIjogMX0&search_id=1035 - JobListCount: - type: object - properties: - count: - type: integer - example: - count: 887622 - RoleSearchEnrichedResult: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: - LinkedIn Profile URL of the person that most closely matches - the role - profile: - $ref: '#/components/schemas/PersonEndpointResponse' - last_updated: - type: string - nullable: true - description: ISO 8601 timestamp since the enriched profile was last scraped. - example: - linkedin_profile_url: https://www.linkedin.com/in/senatormarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy at work\ - \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ - \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ - \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ - \ into the creation of an Internet of Things company, but numerous factors\ - \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job at Best\ - \ Buy for $12 an hour while reinventing myself through the completion\ - \ of an MBA at the University of Colorado, and a 6-month software development\ - \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because of my\ - \ LinkedIn profile). My journey has led to a deep sense of perspective,\ - \ humility, and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website for\ - \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ - \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ - A: I'd love to! I've shared my message on the future of employment, breaking\ - \ into big tech, and my personal story of reinventing myself and discovering\ - \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ - \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ - \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ - \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ - \ (don't forget that \"R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking financial - freedom long before the age of 65 with the ability to invest in high - yield, short-term real estate investments that were only accessible - in the past for a select few wealthy individuals. Each of our single - family rehab projects require a minimum investment contribution of only - $10K, we have simple terms, no multi-year hold periods, and no fees. - With our unique model investors can log into our easy to use website, - select the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost thought\ - \ leaders and turn them into actionable insights so that others can\ - \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, api integration, - Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - accomplishment_publications: - - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - accomplishment_honors_awards: - - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - accomplishment_patents: - - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - accomplishment_courses: - - name: The course about ABCs - number: '123' - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap - HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration - to post a user's message content to the page in real time, with no page - refresh required. gMessenger also includes custom authentication with - three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: - - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - volunteer_work: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices - in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: - - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n \ - \ John Marty is a genius at his craft. He is skilled in the art of\ - \ making people feel empowered to seek out roles that they are qualified\ - \ for, ask for salaries that they deserve, and creates a kind of pay it\ - \ forward lifestyle. John helps you to get to places that you only thought\ - \ were possible for other people. Anyone that is fortunate enough to learn\ - \ from John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ - \ \n \n \n \n\n \n John\ - \ is so focused on helping guide you through an interview process not\ - \ just for Amazon but on interviewing in general. I've generally done\ - \ well at interviewing, my skills are top notch now. John is so focused\ - \ on on his clients and really goes above and beyond. John is genuine,\ - \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ - \ so positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that has a large\ - \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ - \ I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ - s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: - - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - groups: - - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - inferred_salary: - min: 35000 - max: 45000 - gender: male - birth_date: - day: 1 - month: 1 - year: 1990 - industry: government administration - extra: - github_profile_id: github-username - facebook_profile_id: facebook-username - twitter_profile_id: twitter-username - website: https://proxycurl.com - interests: - - education - - health - - human rights - personal_emails: - - abc@gmail.com - - bcd@gmail.com - - cde@@outlook.com - personal_numbers: - - '+6512345678' - - '+6285123450953' - - '+6502300340' - last_updated: '2023-10-26T11:34:30Z' - CompanyUrlEnrichResult: - type: object - properties: - url: - type: string - nullable: true - description: The LinkedIn profile URL - profile: - $ref: '#/components/schemas/LinkedinCompany' - last_updated: - type: string - nullable: true - description: ISO 8601 timestamp since the enriched profile was last scraped. - example: - url: https://www.linkedin.com/company/accenture - profile: - linkedin_internal_id: '1033' - description: - "Accenture is a global professional services company with leading\ - \ capabilities in digital, cloud, and security. Combining unmatched experience\ - \ and specialized skills across more than 40 industries, we offer Strategy\ - \ and Consulting, Technology and Operations Services, and Accenture Song\u2014\ - all powered by the world\u2019s largest network of Advanced Technology\ - \ and Intelligent Operations centers. \n\nOur people deliver on the promise\ - \ of technology and human ingenuity every day, serving clients in more\ - \ than 120 countries. We embrace the power of change to create value and\ - \ shared success for our clients, people, shareholders, partners, and\ - \ communities. \n\nVisit us at accenture.com." - website: http://www.accenture.com - industry: Business Consulting and Services - company_size: - - 10001 - - null - company_size_on_linkedin: 541251 - hq: - country: IE - city: Dublin 2 - postal_code: null - line_1: Grand Canal Harbour - is_hq: true - state: null - company_type: PUBLIC_COMPANY - founded_year: null - specialities: - - Management Consulting - - Systems Integration and Technology - locations: - - country: IE - city: Dublin 2 - postal_code: null - line_1: Grand Canal Harbour - is_hq: true - state: null - - country: US - city: San Francisco - postal_code: '94105' - line_1: 415 Mission Street Floor 31-34 - is_hq: null - state: California - name: Accenture - tagline: Think Different - But Not Too Different - universal_name_id: accenture - profile_pic_url: https://media.licdn.com/dms/image/D4E0BAQGTUswcRlgg9A/company-logo_200_200/0/1689352303421/accenture_logo?e=2147483647&v=beta&t=cjQy2p9bf0c2mJqCNVzaiLqdByE0zboCX3vY5m4gRuY - background_cover_image_url: https://media.licdn.com/dms/image/D4E3DAQEJ2lIxxNO81Q/image-scale_191_1128/0/1689359170613/accenture_cover?e=1698901200&v=beta&t=8ygpwsa5GjMoubooCGg1MqfGomnBaU9WHwnI3_Ek0_0 - search_id: '1033' - similar_companies: - - name: Deloitte - link: https://www.linkedin.com/company/deloitte - industry: Business Consulting and Services - location: null - - name: Tata Consultancy Services - link: https://in.linkedin.com/company/tata-consultancy-services - industry: IT Services and IT Consulting - location: Mumbai, Maharashtra - affiliated_companies: - - name: Accenture in India - link: https://in.linkedin.com/company/accentureindia - industry: IT Services and IT Consulting - location: Bengaluru, Karnatka - - name: Accenture Brasil - link: https://br.linkedin.com/company/accenturebrasil - industry: IT Services and IT Consulting - location: "S\xE3o Paulo, S\xE3o Paulo" - updates: - - article_link: null - image: null - posted_on: - day: 25 - month: 10 - year: 2023 - text: 'Explore #AccentureLifeTrends 2024 to learn more: https://accntu.re/3MfdMg4' - total_likes: 325 - - article_link: null - image: https://media.licdn.com/dms/image/D5610AQEMoO_uNVz5BQ/ads-video-thumbnail_720_1280/0/1698154984087?e=1698901200&v=beta&t=WTxhLNSbSM-UBnFIcqYX4bdVhVUD6OoOoffR0xQnlDA - posted_on: - day: 25 - month: 10 - year: 2023 - text: - "The ability to learn new things, without forgetting those that\ - \ came before, is a huge differentiator between the #AI we're familiar\ - \ with, and the #GenerativeAI powered by foundation models that we're\ - \ seeing now.\n \nDiscover the trends shaping the next decade: https://accntu.re/474YxOH\n\ - \ \n#TechVision2023" - total_likes: 541 - follower_count: 11125167 - acquisitions: - acquired: - - linkedin_profile_url: https://www.linkedin.com/company/apple - crunchbase_profile_url: https://www.crunchbase.com/organization/apple - announced_date: - day: 1 - month: 4 - year: 1976 - price: 300000000 - acquired_by: - linkedin_profile_url: https://www.linkedin.com/company/nvidia - crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia - announced_date: - day: 6 - month: 3 - year: 2020 - price: 10000 - exit_data: - - linkedin_profile_url: https://www.linkedin.com/company/motiondsp - crunchbase_profile_url: https://www.crunchbase.com/organization/motiondsp - name: MotionDSP - extra: - crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia - ipo_status: Public - crunchbase_rank: 13 - founding_date: - day: 1 - month: 1 - year: 2000 - operating_status: Active - company_type: For Profit - contact_email: info@nvidia.com - phone_number: (140) 848-6200 - facebook_id: NVIDIA.IN - twitter_id: nvidia - number_of_funding_rounds: 3 - total_funding_amount: 4000000 - stock_symbol: NASDAQ:NVDA - ipo_date: - day: 1 - month: 1 - year: 2000 - number_of_lead_investors: 3 - number_of_investors: 4 - total_fund_raised: 1000 - number_of_investments: 50 - number_of_lead_investments: 3 - number_of_exits: 7 - number_of_acquisitions: 2 - funding_data: - - funding_type: Grant - money_raised: 25000000 - announced_date: - day: 1 - month: 1 - year: 2001 - number_of_investor: 1 - investor_list: - - linkedin_profile_url: https://linkedin.com/company/darpa - name: DARPA - type: organization - categories: - - artificial-intelligence - - virtual-reality - last_updated: '2023-10-26T11:33:24Z' - Student: - type: object - properties: - profile_url: - type: string - profile: - $ref: '#/components/schemas/PublicPerson' - nullable: true - last_updated: - type: string - nullable: true - description: - "\n ISO 8601 timestamp since the enriched profile\ - \ was last scraped.\n " - example: &id035 - profile_url: https://www.linkedin.com/in/johnrmarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy at work\ - \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ - \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ - \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ - \ into the creation of an Internet of Things company, but numerous factors\ - \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job at Best\ - \ Buy for $12 an hour while reinventing myself through the completion\ - \ of an MBA at the University of Colorado, and a 6-month software development\ - \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because of my\ - \ LinkedIn profile). My journey has led to a deep sense of perspective,\ - \ humility, and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website for\ - \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ - \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ - A: I'd love to! I've shared my message on the future of employment, breaking\ - \ into big tech, and my personal story of reinventing myself and discovering\ - \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ - \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ - \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ - \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ - \ (don't forget that \"R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking financial - freedom long before the age of 65 with the ability to invest in high - yield, short-term real estate investments that were only accessible - in the past for a select few wealthy individuals. Each of our single - family rehab projects require a minimum investment contribution of only - $10K, we have simple terms, no multi-year hold periods, and no fees. - With our unique model investors can log into our easy to use website, - select the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost thought\ - \ leaders and turn them into actionable insights so that others can\ - \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, api integration, - Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - accomplishment_publications: - - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - accomplishment_honors_awards: - - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - accomplishment_patents: - - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - accomplishment_courses: - - name: The course about ABCs - number: '123' - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap - HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration - to post a user's message content to the page in real time, with no page - refresh required. gMessenger also includes custom authentication with - three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: - - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - volunteer_work: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices - in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: - - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n \ - \ John Marty is a genius at his craft. He is skilled in the art of\ - \ making people feel empowered to seek out roles that they are qualified\ - \ for, ask for salaries that they deserve, and creates a kind of pay it\ - \ forward lifestyle. John helps you to get to places that you only thought\ - \ were possible for other people. Anyone that is fortunate enough to learn\ - \ from John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ - \ \n \n \n \n\n \n John\ - \ is so focused on helping guide you through an interview process not\ - \ just for Amazon but on interviewing in general. I've generally done\ - \ well at interviewing, my skills are top notch now. John is so focused\ - \ on on his clients and really goes above and beyond. John is genuine,\ - \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ - \ so positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that has a large\ - \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ - \ I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ - s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: - - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - groups: - - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - last_updated: '2023-10-26T11:34:30Z' - StudentList: - type: object - properties: - students: - type: array - items: - $ref: '#/components/schemas/Student' - description: - "\n A list of student profiles (if enriched) and their\ - \ associated profile URL.\n " - next_page: - type: string - nullable: true - description: - "\n The API URI that will lead to the next page of results.\ - \ This will be null for the final page.\n " - example: - students: - - *id035 - next_page: null - ReverseEmailUrlEnrichResult: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: - Returns the closest match of the LinkedIn profile that belongs - to this email address. - twitter_profile_url: - type: string - nullable: true - description: - Returns the Twitter Profile URL that belongs to this email - address. - facebook_profile_url: - type: string - nullable: true - description: - Returns the Facebook Profile URL that belongs to this email - address. - url: - type: string - nullable: true - similarity_score: - type: number - nullable: true - description: - This metric quantifies the degree of resemblance between the - queried profile and the retrieved one. Scores range from `0` (no similarity) - to `1` (high similarity). In the event that our dataset lacks a pertinent - profile for comparison, the assigned score might be `null`. - backwards_compatibility_notes: - type: string - nullable: true - profile: - $ref: '#/components/schemas/PersonEndpointResponse' - nullable: true - last_updated: - type: string - nullable: true - description: ISO 8601 timestamp since the enriched profile was last scraped. - example: - linkedin_profile_url: https://www.linkedin.com/in/senatormarty - twitter_profile_url: https://www.twitter.com/proxycurl - facebook_profile_url: https://www.facebook.com/zuck - similarity_score: 0.82 - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy at work\ - \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ - \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ - \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ - \ into the creation of an Internet of Things company, but numerous factors\ - \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job at Best\ - \ Buy for $12 an hour while reinventing myself through the completion\ - \ of an MBA at the University of Colorado, and a 6-month software development\ - \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because of my\ - \ LinkedIn profile). My journey has led to a deep sense of perspective,\ - \ humility, and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website for\ - \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ - \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ - A: I'd love to! I've shared my message on the future of employment, breaking\ - \ into big tech, and my personal story of reinventing myself and discovering\ - \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ - \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ - \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ - \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ - \ (don't forget that \"R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking financial - freedom long before the age of 65 with the ability to invest in high - yield, short-term real estate investments that were only accessible - in the past for a select few wealthy individuals. Each of our single - family rehab projects require a minimum investment contribution of only - $10K, we have simple terms, no multi-year hold periods, and no fees. - With our unique model investors can log into our easy to use website, - select the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost thought\ - \ leaders and turn them into actionable insights so that others can\ - \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, api integration, - Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - accomplishment_publications: - - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - accomplishment_honors_awards: - - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - accomplishment_patents: - - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - accomplishment_courses: - - name: The course about ABCs - number: '123' - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap - HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration - to post a user's message content to the page in real time, with no page - refresh required. gMessenger also includes custom authentication with - three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: - - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - volunteer_work: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices - in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: - - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n \ - \ John Marty is a genius at his craft. He is skilled in the art of\ - \ making people feel empowered to seek out roles that they are qualified\ - \ for, ask for salaries that they deserve, and creates a kind of pay it\ - \ forward lifestyle. John helps you to get to places that you only thought\ - \ were possible for other people. Anyone that is fortunate enough to learn\ - \ from John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ - \ \n \n \n \n\n \n John\ - \ is so focused on helping guide you through an interview process not\ - \ just for Amazon but on interviewing in general. I've generally done\ - \ well at interviewing, my skills are top notch now. John is so focused\ - \ on on his clients and really goes above and beyond. John is genuine,\ - \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ - \ so positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that has a large\ - \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ - \ I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ - s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: - - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - groups: - - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - inferred_salary: - min: 35000 - max: 45000 - gender: male - birth_date: - day: 1 - month: 1 - year: 1990 - industry: government administration - extra: - github_profile_id: github-username - facebook_profile_id: facebook-username - twitter_profile_id: twitter-username - website: https://proxycurl.com - interests: - - education - - health - - human rights - personal_emails: - - abc@gmail.com - - bcd@gmail.com - - cde@@outlook.com - personal_numbers: - - '+6512345678' - - '+6285123450953' - - '+6502300340' - last_updated: '2023-10-26T11:34:30Z' - ReverseContactNumberResult: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - description: - Returns the closest match of the LinkedIn profile that belongs - to this phone number. - twitter_profile_url: - type: string - nullable: true - description: - Returns the Twitter Profile URL that belongs to this phone - number. - facebook_profile_url: - type: string - nullable: true - description: - Returns the Facebook Profile URL that belongs to this phone - number. - example: - linkedin_profile_url: https://www.linkedin.com/in/senatormarty - twitter_profile_url: https://www.twitter.com/proxycurl - facebook_profile_url: https://www.facebook.com/zuck - ExtractionEmailResult: - type: object - properties: - email_queue_count: - type: integer - description: Total queue in the email extraction process - example: - email_queue_count: null - JobLocation: - type: object - properties: - country: - type: string - nullable: true - description: "\n Full country name.\n " - region: - type: string - nullable: true - description: "\n Region.\n " - city: - type: string - nullable: true - description: "\n The city for the job.\n " - postal_code: - type: string - nullable: true - description: - "\n Postal code of the business location for the job.\n\ - \ " - latitude: - type: number - nullable: true - description: - "\n Latitude coordinates of the business location for\ - \ the job.\n " - longitude: - type: number - nullable: true - description: - "\n Longitude coordinates of the business location for\ - \ the job.\n " - street: - type: string - nullable: true - description: - "\n Street address of the business location for the\ - \ job.\n " - example: &id036 - country: United States - region: Hawaii - city: null - postal_code: null - latitude: null - longitude: null - street: null - JobCompany: - type: object - properties: - name: - type: string - nullable: true - description: "\n The name of the company.\n " - url: - type: string - nullable: true - description: - "\n The LinkedIn Company Profile URL of the job posting\ - \ company.\n " - logo: - type: string - nullable: true - description: "\n The URL to the logo of this company.\n " - example: &id037 - name: Microsoft - url: https://www.linkedin.com/company/microsoft - logo: https://media.licdn.com/dms/image/C560BAQE88xCsONDULQ/company-logo_100_100/0/1618231291419?e=2147483647&v=beta&t=rffql7GLHsSqWXKbdP2LJMMv7CMTqu7-Ms9d9tophKI - JobProfile: - type: object - properties: - linkedin_internal_id: - type: string - nullable: true - description: - "\n The internal ID representation of this job that\ - \ LinkedIn has for this job.\n " - job_description: - type: string - nullable: true - description: "\n Description of the posted job.\n " - apply_url: - type: string - nullable: true - description: "\n The URL to apply for this job.\n " - title: - type: string - nullable: true - description: "\n Title of the posted job.\n " - location: - $ref: '#/components/schemas/JobLocation' - company: - $ref: '#/components/schemas/JobCompany' - seniority_level: - type: string - nullable: true - description: "\n The seniority level for this role.\n " - industry: - type: array - items: - type: string - description: - "\n A list of industries that the company which posted\ - \ this job lies in.\n " - employment_type: - type: string - nullable: true - description: "\n Type of employment.\n " - job_functions: - type: array - items: - type: string - description: - "\n A list of job functions that this role is expected\ - \ to cover.\n " - total_applicants: - type: integer - nullable: true - description: "\n Total applicants for this job so far.\n " - example: - linkedin_internal_id: content-strategist-at-microsoft-3257696537 - job_description: - "The Global Demand Center (GDC) within the Cloud Marketing\ - \ group is leading the marketing transformation of Microsoft\u2019s largest\ - \ and fastest growing commercial businesses. Our always-on integrated marketing\ - \ programs work to nurture and acquire new customers across segments, targeting\ - \ business and technical audiences across our commercial cloud portfolio,\ - \ with programs available in 42 markets and 30 languages. The GDC team is\ - \ modernizing and integrating these channels through advanced analytics,\ - \ marketing automation, and digital marketing. We are on a mission to drive\ - \ market share, consumption, and consistent double-digit+ revenue growth.\ - \ Content is the fuel that drives the digitally connected customer journeys\ - \ at the core of the GDC engine, and we\u2019re looking for a skilled, self-motivated,\ - \ data-driven content strategist to build the content that motivates customers\ - \ to take action. The Content Strategist will develop and execute content\ - \ strategies for the ever-critical security space. You will be accountable\ - \ for understanding the business priorities, getting close to our target\ - \ audiences, defining the content journeys that attract, nurture, inspire,\ - \ and retain customers, and manage quality execution and delivery of the\ - \ content. You will work closely with your counterparts, the integrated\ - \ marketing strategists, to drive business outcomes. Your network will include\ - \ product marketers, integrated marketers, relationship marketers, sales,\ - \ engineering, and agency partners to develop and execute on your plan.\ - \ Our team: The Lifecycle Programs team is a fast-paced digital marketing\ - \ organization. We put a focus on getting things done, simplifying anything\ - \ and everything, and having fun while doing it. We all believe in connecting\ - \ with customers at scale, supporting them at each stage of the customer\ - \ journey, from early awareness and consideration, through onboarding and\ - \ post purchase engagement. You will be in the middle of it all helping\ - \ to identify the right content that delivers what customers want\u2014\ - where they want it, when they want it, and how they want it. \n \n**_Responsibilities\ - \ \n_**\n * Define content journeys for Security and IT professionals\ - \ across industries.\n * Build the resulting content strategies designed\ - \ to accelerate the customer through the lifecycle.\n * Create a content\ - \ plan to address the insights in the customer journey and strategy, ensuring\ - \ the content is aligned to what the customer needs at each stage.\n *\ - \ Deliver the content through our internal Studio or with select agency\ - \ partners.\n * Be a customer advocate. Relentlessly champion the customer\ - \ and the experiences they have with the content you create\u2014how they\ - \ find it, how they consume it, how they use it to make decisions.\n *\ - \ Leverage data and market insights for decision making including content\ - \ optimization and new concept development. \n\n\n**_Qualifications \n\ - \ \n_** **Required/Minimum Qualifications \n**\n * Bachelor's Degree\ - \ in Business, Marketing, Communications, Economics, Public Relations, or\ - \ related field AND 1+ year(s) integrated marketing (e.g., digital, relationship,\ - \ social media, campaign), event management, marketing strategy, business\ - \ planning, marketing operations, or related work experience\n * OR equivalent\ - \ experience. \n\n\n**_Additional Or Preferred Qualifications \n_**\n\ - \ * Bachelor's Degree in Business, Marketing, Communications, Economics,\ - \ Public Relations, or related field AND 3+ years integrated marketing (e.g.,\ - \ digital, relationship, social media, campaign), event management, marketing\ - \ strategy, business planning, marketing operations, or related work experience\n\ - \ * OR equivalent experience.\n * Strong customer centric mindset and\ - \ demonstrated ability to put the customer first.\n * Clear and persuasive\ - \ communication skills, both written and verbal.\n * Experience with program\ - \ performance tracking and communications.\n * Recognized as a self-starter\ - \ with a bias for action.\n * Creative problem-solving skills, and a growth\ - \ mindset approach\n * Experience managing across highly matrixed organizations,\ - \ often with competing priorities.\n * A demonstrated track record of business\ - \ impact through content\n * Well-versed in digital marketing best practices,\ - \ including journey mapping.\n * Understanding of content disciplines,\ - \ including SEO, content strategy, and execution.\n * Preferred, but not\ - \ required: experience with commercial technology sales process \n\n\n\ - Narrative \n \nIntegrated Marketing IC3 - The typical base pay range\ - \ for this role across the U.S. is USD $80,900 - $162,200 per year. There\ - \ is a different range applicable to specific work locations, within the\ - \ San Francisco Bay area and New York City metropolitan area, and the base\ - \ pay range for this role in those locations is USD $105,300 - $176,900\ - \ per year. \n \nMicrosoft has different base pay ranges for different\ - \ work locations within the United States, which allows us to pay employees\ - \ competitively and consistently in different geographic markets (see below).\ - \ The range above reflects the potential base pay across the U.S. for this\ - \ role (except as noted below); the applicable base pay range will depend\ - \ on what ultimately is determined to be the candidate\u2019s primary work\ - \ location. Individual base pay depends on various factors, in addition\ - \ to primary work location, such as complexity and responsibility of role,\ - \ job duties/requirements, and relevant experience and skills. Base pay\ - \ ranges are reviewed and typically updated each year. Offers are made within\ - \ the base pay range applicable at the time. \n \nAt Microsoft certain\ - \ roles are eligible for additional rewards, including merit increases,\ - \ annual bonus and stock. These awards are allocated based on individual\ - \ performance. In addition, certain roles also have the opportunity to earn\ - \ sales incentives based on revenue or utilization, depending on the terms\ - \ of the plan and the employee\u2019s role. Benefits/perks listed here may\ - \ vary depending on the nature of employment with Microsoft and the country\ - \ work location. U.S.-based employees have access to healthcare benefits,\ - \ a 401(k) plan and company match, short-term and long-term disability coverage,\ - \ basic life insurance, wellbeing benefits, paid vacation time, paid sick\ - \ and mental health time, and several paid holidays, among others. \n\ - \ \nOur commitment to pay equity \n \nWe are committed to the principle\ - \ of pay equity \u2013 paying employees equitably for substantially similar\ - \ work. To learn more about pay equity and our other commitments to increase\ - \ representation and strengthen our culture of inclusion, check out our\ - \ annual Diversity & Inclusion Report. ( https://www.microsoft.com/en-us/diversity/inside-microsoft/annual-report\ - \ ) \n \nUnderstanding roles at Microsoft \n \nThe top of this page\ - \ displays the role for which the base pay ranges apply \u2013 Integrated\ - \ Marketing IC3. The way we define roles includes two things: discipline\ - \ (the type of work) and career stage (scope and complexity). The career\ - \ stage has two parts \u2013 the first identifies whether the role is a\ - \ manager (M), an individual contributor (IC), an admin-technician-retail\ - \ (ATR) job, or an intern. The second part identifies the relative seniority\ - \ of the role \u2013 a higher number (or later letter alphabetically in\ - \ the case of ATR) indicates greater scope and complexity. \n \nMicrosoft\ - \ is an equal opportunity employer. All qualified applicants will receive\ - \ consideration for employment without regard to age, ancestry, color, family\ - \ or medical care leave, gender identity or expression, genetic information,\ - \ marital status, medical condition, national origin, physical or mental\ - \ disability, political affiliation, protected veteran status, race, religion,\ - \ sex (including pregnancy), sexual orientation, or any other characteristic\ - \ protected by applicable laws, regulations and ordinances. We also consider\ - \ qualified applicants regardless of criminal histories, consistent with\ - \ legal requirements. If you need assistance and/or a reasonable accommodation\ - \ due to a disability during the application or the recruiting process,\ - \ please send a request via the Accommodation request form. \n \nThe\ - \ salary for this role in the state of Colorado is between $108,200 and\ - \ $162,200. \n \nAt Microsoft, certain roles are eligible for additional\ - \ rewards, including annual bonus and stock. These awards are allocated\ - \ based on individual performance. In addition, certain roles also have\ - \ the opportunity to earn sales incentives based on revenue or utilization,\ - \ depending on the terms of the plan and the employee\u2019s role. Benefits/perks\ - \ listed below may vary depending on the nature of your employment with\ - \ Microsoft and the country where you work. \n" - apply_url: https://sg.linkedin.com/jobs/view/externalApply/3257696537?url=https%3A%2F%2Fcareers%2Emicrosoft%2Ecom%2Fus%2Fen%2Fjob%2F1451110%2FContent-Strategist%3Fjobsource%3Dlinkedin%26utm_source%3Dlinkedin%26utm_medium%3Dlinkedin%26utm_campaign%3Dlinkedin-feed&urlHash=I9BQ&trk=public_jobs_apply-link-offsite - title: Content Strategist - location: *id036 - company: *id037 - seniority_level: Mid-Senior level - industry: - - IT Services and IT Consulting, Computer Hardware Manufacturing, and Software - Development - employment_type: Full-time - job_functions: - - Marketing - total_applicants: 200 - Follower: - type: object - properties: - linkedin_profile_url: - type: string - nullable: true - twitter_profile_url: - type: string - email: - type: string - nullable: true - example: &id038 - linkedin_profile_url: https://www.linkedin.com/in/agiliosoftware - twitter_profile_url: https://www.x.com/agilio_software - email: null - FollowerList: - type: object - properties: - followers: - type: array - items: - $ref: '#/components/schemas/Follower' - description: - "\n A list of individual followers of a company.\n \ - \ " - next_page: - type: string - nullable: true - description: - "\n The API URI that will lead to the next page of results.\ - \ This will be null for the final page.\n " - example: - followers: - - *id038 - - linkedin_profile_url: https://www.linkedin.com/in/air-techniques - twitter_profile_url: https://www.x.com/airtechniques - email: null - next_page: null - FollowerListCount: - type: object - properties: - follower_count: - type: integer - description: A count of all individuals that are probable customers or followers. - example: - follower_count: 74 - CSearchResult: - type: object - properties: - linkedin_profile_url: - type: string - description: - "\n The LinkedIn Profile URL of the company\n \ - \ " - profile: - $ref: '#/components/schemas/LinkedinCompany' - nullable: true - description: - "\n If `enrich_profiles=enrich` is specified, the company's\ - \ entire profile\n is returned. Otherwise this field will return\ - \ `null`.\n " - last_updated: - type: string - nullable: true - description: - "\n ISO 8601 timestamp since the enriched profile was\ - \ last scraped.\n " - example: &id039 - linkedin_profile_url: https://www.linkedin.com/company/apple/ - profile: - linkedin_internal_id: '1441' - description: "A problem isn't truly solved until it's solved for all. - Googlers build products that help create opportunities for everyone, whether - down the street or across the globe. Bring your insight, imagination and - a healthy disregard for the impossible. Bring everything that makes you - unique. Together, we can build for everyone. - - - Check out our career opportunities at careers.google.com." - website: https://goo.gle/3m1IN7m - industry: Software Development - company_size: - - 10001 - - null - company_size_on_linkedin: 319856 - hq: - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - company_type: PUBLIC_COMPANY - founded_year: null - specialities: - - search - - ads - locations: - - country: US - city: Mountain View - postal_code: '94043' - line_1: 1600 Amphitheatre Parkway - is_hq: true - state: CA - - country: US - city: New York - postal_code: '10011' - line_1: 111 8th Ave - is_hq: null - state: NY - name: Google - tagline: Think Different - But Not Too Different - universal_name_id: google - profile_pic_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=0d3500b39da8db1d2d8f5727a9ac39a7c4a88b4632ed68209dee12f06bc79aca - background_cover_image_url: https://s3.us-west-000.backblazeb2.com/proxycurl/company/google/cover?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230119%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230119T060024Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=abb7a4b87583cffda8db24d58d906c644998fae8cbb99e98c69a35720fcd0050 - search_id: '1441' - similar_companies: - - name: Amazon - link: https://www.linkedin.com/company/amazon - industry: Software Development - location: Seattle, WA - - name: Microsoft - link: https://www.linkedin.com/company/microsoft - industry: Software Development - location: Redmond, Washington - affiliated_companies: - - name: YouTube - link: https://www.linkedin.com/company/youtube - industry: Software Development - location: San Bruno, CA - - name: Google Cloud - link: https://www.linkedin.com/showcase/google-cloud - industry: Software Development - location: Mountain View, California - updates: - - article_link: null - image: https://media.licdn.com/dms/image/C5605AQFthnjiTD6Mvg/videocover-high/0/1660754102856?e=2147483647&v=beta&t=PPOsA9J3vCTXWhuZclqSBQl7DLSDLvy5hKWlkHI85YE - posted_on: - day: 13 - month: 9 - year: 2022 - text: - "Want to kick start your #LifeAtGoogle but not sure where to begin?\ - \ Explore our Build Your Future site, where you can learn about developmental\ - \ programs, learn tips for future interviews, sign up for informational\ - \ events, and even hear real stories from Googlers who\u2019ve been\ - \ where you are now. Get started \u2192 https://bit.ly/3SKPzQB" - total_likes: 4267 - - article_link: null - image: https://media.licdn.com/dms/image/C4D22AQGcvTlKRR3qvQ/feedshare-shrink_2048_1536/0/1672854668558?e=1676505600&v=beta&t=whRRx9ULPEuyw_FgUg4Z3N3O9iksyJW7ewCGZA6ujdg - posted_on: null - text: - "Ariana, welcome to Google. Here\u2019s to a year full of growth,\ - \ learning, and experiences at #LifeAtGoogle! \U0001F389" - total_likes: 397 - follower_count: 27472792 - acquisitions: - acquired: - - linkedin_profile_url: https://www.linkedin.com/company/apple - crunchbase_profile_url: https://www.crunchbase.com/organization/apple - announced_date: - day: 1 - month: 4 - year: 1976 - price: 300000000 - acquired_by: - linkedin_profile_url: https://www.linkedin.com/company/nvidia - crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia - announced_date: - day: 6 - month: 3 - year: 2020 - price: 10000 - exit_data: - - linkedin_profile_url: https://www.linkedin.com/company/motiondsp - crunchbase_profile_url: https://www.crunchbase.com/organization/motiondsp - name: MotionDSP - extra: - crunchbase_profile_url: https://www.crunchbase.com/organization/nvidia - ipo_status: Public - crunchbase_rank: 13 - founding_date: - day: 1 - month: 1 - year: 2000 - operating_status: Active - company_type: For Profit - contact_email: info@nvidia.com - phone_number: (140) 848-6200 - facebook_id: NVIDIA.IN - twitter_id: nvidia - number_of_funding_rounds: 3 - total_funding_amount: 4000000 - stock_symbol: NASDAQ:NVDA - ipo_date: - day: 1 - month: 1 - year: 2000 - number_of_lead_investors: 3 - number_of_investors: 4 - total_fund_raised: 1000 - number_of_investments: 50 - number_of_lead_investments: 3 - number_of_exits: 7 - number_of_acquisitions: 2 - funding_data: - - funding_type: Grant - money_raised: 25000000 - announced_date: - day: 1 - month: 1 - year: 2001 - number_of_investor: 1 - investor_list: - - linkedin_profile_url: https://linkedin.com/company/darpa - name: DARPA - type: organization - categories: - - artificial-intelligence - - virtual-reality - last_updated: '2023-10-26T11:34:30Z' - CompanySearchResult: - type: object - properties: - results: - type: array - items: - $ref: '#/components/schemas/CSearchResult' - description: "\n A list of SearchResult objects.\n " - next_page: - type: string - nullable: true - description: - "\n The URL to the next page of search results. This\ - \ will be null for the final page.\n " - total_result_count: - type: integer - description: Total results found. - example: - results: - - *id039 - next_page: null - total_result_count: 1 - SearchResult: - type: object - properties: - linkedin_profile_url: - type: string - description: "\n The LinkedIn Profile URL of the person\n " - profile: - $ref: '#/components/schemas/PublicPerson' - nullable: true - description: - "\n If `enrich_profiles=enrich` is specified, the person's\ - \ entire profile\n is returned. Otherwise this field will return\ - \ `null`.\n " - last_updated: - type: string - nullable: true - description: - "\n ISO 8601 timestamp since the enriched profile was\ - \ last scraped.\n " - example: &id040 - linkedin_profile_url: https://www.linkedin.com/in/johnrmarty - profile: - public_identifier: johnrmarty - profile_pic_url: https://media.licdn.com/dms/image/C5603AQHaJSx0CBAUIA/profile-displayphoto-shrink_800_800/0/1558325759208?e=2147483647&v=beta&t=BluXpPg88xFnU2wMGLjuCUykSk_wKNdh8x3PI9wm6MI - background_cover_image_url: https://media.licdn.com/dms/image/C5616AQH9tkBTUhHfng/profile-displaybackgroundimage-shrink_200_800/0/1614530499015?e=2147483647&v=beta&t=VEoCyedtZulnAVYWT9BXfKHi5OFp8avElNjiz8kjSTU - first_name: John - last_name: Marty - full_name: John Marty - follower_count: null - occupation: Co-Founder at Freedom Fund Real Estate - headline: Financial Freedom through Real Estate - LinkedIn Top Voice - summary: - "Most people go through life lost, disengaged, and unhappy at work\ - \ and in their lives - I'm on a mission to solve that.\n\nI spent 10 years\ - \ as the founder of Axxis Audio, an electronics company that grew to multi-million\ - \ dollar sales, which I sold in 2012. At that time, I funneled my earnings\ - \ into the creation of an Internet of Things company, but numerous factors\ - \ lead to its demise after 2 hard fought years. \n\nAt 31, I was penny-less,\ - \ had a baby on the way, and had zero job prospects (despite applying\ - \ to 150 companies). My desperate situation led me to take a job at Best\ - \ Buy for $12 an hour while reinventing myself through the completion\ - \ of an MBA at the University of Colorado, and a 6-month software development\ - \ boot camp. \n\nAfter graduation, I landed at American Express as a Senior\ - \ Product Manager and then got poached by Amazon in 2017 (because of my\ - \ LinkedIn profile). My journey has led to a deep sense of perspective,\ - \ humility, and purpose that I draw on to help others find clarity, meaning,\ - \ and happiness in their careers and lives. \n\nCheck out my website for\ - \ details on my Mindset Reset Podcast, Public Speaking, Consulting, or\ - \ my free 40 page LinkedIn guide\n\nhttp://www.johnraphaelmarty.com/\n\ - \nFAQ's\n\nQ: Can you speak at my Company, University, event or podcast?\n\ - A: I'd love to! I've shared my message on the future of employment, breaking\ - \ into big tech, and my personal story of reinventing myself and discovering\ - \ my sense of purpose (and how you can too!).\n\n\u2611\uFE0F YouTube\ - \ Channel #1 (John Marty) : http://www.youtube.com/c/JohnMarty-uncommon\n\ - \u2611\uFE0F YouTube Channel #2 (Tech Careers for non-engineers: https://www.youtube.com/channel/UC900gMMPLwRGGXSTW1gdZHA\n\ - \nFUN FACTS:\n\u2611\uFE0F I am an Avid cyclist and runner, and I just\ - \ started learning to skateboard a half-pipe.\n\u2611\uFE0F Into the Enneagram?\ - \ - I'm a #3 (The Achiever)\n\nLETS CONNECT:\n\u2611\uFE0F Email: JohnRmarty@gmail.com\ - \ (don't forget that \"R\"....The other guy gets my emails all the time)" - country: US - country_full_name: United States of America - city: Seattle - state: Washington - experiences: - - starts_at: - day: 1 - month: 8 - year: 2021 - ends_at: null - company: Freedom Fund Real Estate - company_linkedin_profile_url: https://www.linkedin.com/company/freedomfund - company_facebook_profile_url: null - title: Co-Founder - description: - 'Our mission is to provide everyday people seeking financial - freedom long before the age of 65 with the ability to invest in high - yield, short-term real estate investments that were only accessible - in the past for a select few wealthy individuals. Each of our single - family rehab projects require a minimum investment contribution of only - $10K, we have simple terms, no multi-year hold periods, and no fees. - With our unique model investors can log into our easy to use website, - select the projects that they want to invest in, and get realtime updates - on the status of their investments. - - - Website: https://www.freedomfundinvestments.com/home' - location: null - logo_url: https://media.licdn.com/dms/image/C560BAQEYxazZM_hXgQ/company-logo_100_100/0/1634934418976?e=2147483647&v=beta&t=wI0YdMmxIctkzvnKxRfuAbT8h5eok_DlUqEph68J37s - - starts_at: - day: 1 - month: 1 - year: 2021 - ends_at: null - company: Mindset Reset Podcast - company_linkedin_profile_url: https://www.linkedin.com/company/mindset-reset-podcast - company_facebook_profile_url: null - title: Founder - description: - "We dive into the mindsets of the world\u2019s foremost thought\ - \ leaders and turn them into actionable insights so that others can\ - \ discover greater happiness, success, and fulfillment.\n\nhttps://podcasts.apple.com/us/podcast/mindset-reset/id1553212607" - location: Denver, Colorado, United States - logo_url: https://media.licdn.com/dms/image/C560BAQF9QJVQm3SOvA/company-logo_100_100/0/1614527476576?e=2147483647&v=beta&t=m3tx83nMN-E3XQFoJG0Wmch8U4qKnJ9i--5NSAfffC0 - education: - - starts_at: - day: 1 - month: 1 - year: 2013 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: Finance + Economics - degree_name: Master of Business Administration (MBA) - school: University of Colorado Denver - school_linkedin_profile_url: https://www.linkedin.com/school/university-of-colorado-denver/ - school_facebook_profile_url: null - description: null - logo_url: https://media.licdn.com/dms/image/C560BAQGVi9eAHgWxFw/company-logo_100_100/0/1673448029676?e=2147483647&v=beta&t=NG6ttckXvnS2DX3abTfVACRY2E9Q1EcryNaJLRbE9OE - grade: null - activities_and_societies: null - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: - day: 31 - month: 12 - year: 2015 - field_of_study: School of Software Development - degree_name: null - school: Galvanize Inc - school_linkedin_profile_url: https://www.linkedin.com/school/galvanize-it/ - school_facebook_profile_url: null - description: - rails, ruby, rspec, capybara, bootstrap, css, html, api integration, - Jquery, Javascript - logo_url: https://media.licdn.com/dms/image/C560BAQFKNxOZ4X0g8Q/company-logo_100_100/0/1670610916338?e=2147483647&v=beta&t=t7ImfhmsuIJ7HJGHEbPJ2suxdslKhzp9v-5h9_G4sWE - grade: null - activities_and_societies: null - languages: - - English - - Spanish - accomplishment_organisations: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - org_name: Microsoft - title: Software Developer - description: null - accomplishment_publications: - - name: Nobel Peace Prize - publisher: Acme Corp - published_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - url: https://example.com - accomplishment_honors_awards: - - title: Nobel Peace Prize - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - accomplishment_patents: - - title: The art of war - issuer: Acme Corp - issued_on: - day: 1 - month: 1 - year: 1970 - description: - "\n Lorem ipsum dolor sit amet, consectetur\ - \ adipiscing elit\n " - application_number: '123' - patent_number: '123' - url: null - accomplishment_courses: - - name: The course about ABCs - number: '123' - accomplishment_projects: - - starts_at: - day: 1 - month: 3 - year: 2015 - ends_at: null - title: gMessenger - description: - gMessenger was built using Ruby on Rails, and the Bootstrap - HTML, CSS, and JavaScript framework. It uses a Websocket-Rails integration - to post a user's message content to the page in real time, with no page - refresh required. gMessenger also includes custom authentication with - three different permissions levels. - url: http://gmessenger.herokuapp.com/ - - starts_at: - day: 1 - month: 1 - year: 2015 - ends_at: null - title: Taskly - description: - A task and project management responsive web app utilizing - Ruby on Rails - CSS and HTML - url: https://hidden-coast-7204.herokuapp.com/ - accomplishment_test_scores: - - name: CS1101S - score: A - date_on: - day: 1 - month: 1 - year: 2010 - description: Nailed it without studying. - volunteer_work: - - starts_at: - day: 1 - month: 1 - year: 2012 - ends_at: - day: 1 - month: 8 - year: 2016 - title: Surveyor - cause: To help the world - company: Microsoft - company_linkedin_profile_url: https://www.linkedin.com/company/microsoft - description: null - logo_url: null - certifications: - - starts_at: null - ends_at: null - name: - SAFe Agile Framework Practitioner - ( Scrum, XP, and Lean Practices - in the SAFe Enterprise) - license_number: null - display_source: null - authority: Scaled Agile, Inc. - url: null - - starts_at: null - ends_at: null - name: SCRUM Alliance Certified Product Owner - license_number: null - display_source: null - authority: Scrum Alliance - url: null - connections: 500 - people_also_viewed: - - link: https://www.linkedin.com/in/johndoe - name: John Doe - summary: Software Engineer at Google - location: Singapore - recommendations: - - "Rebecca Canfield\n\n \n \n \n\n\n\n \ - \ \n \n \n \n \n\n \n \ - \ John Marty is a genius at his craft. He is skilled in the art of\ - \ making people feel empowered to seek out roles that they are qualified\ - \ for, ask for salaries that they deserve, and creates a kind of pay it\ - \ forward lifestyle. John helps you to get to places that you only thought\ - \ were possible for other people. Anyone that is fortunate enough to learn\ - \ from John should consider themselves extremely lucky. I know I do. " - - "Zoe Sanoff\n\n \n \n \n\n\n\n \n\ - \ \n \n \n \n\n \n John\ - \ is so focused on helping guide you through an interview process not\ - \ just for Amazon but on interviewing in general. I've generally done\ - \ well at interviewing, my skills are top notch now. John is so focused\ - \ on on his clients and really goes above and beyond. John is genuine,\ - \ knowledgeable, well spoken and non-judgemental. He is so encouraging,\ - \ so positive and really easy to talk to. Thank you John!" - activities: - - title: - "Yesterday I toured a $1.2M property in California that has a large\ - \ 13K sq ft lot with two homes on it. After 5 minutes of being on-site\ - \ I\u2026" - link: https://www.linkedin.com/posts/johnrmarty_financialfreedom-realestate-technology-activity-6940294635743301632-rsLo - activity_status: Shared by John Marty - similarly_named_profiles: - - name: John Martinez - link: https://www.linkedin.com/in/john-martinez-90384a229 - summary: - "Owner of Fight or Flight Medical Consultants, LLC , Owner Marty\u2019\ - s Hardwood Works" - location: San Antonio, TX - - name: John Marty - link: https://www.linkedin.com/in/senatormarty - summary: null - location: St Paul, MN - articles: - - title: Manufacturing opportunity - link: https://www.linkedin.com/pulse/manufacturing-opportunity-bill-gates/ - published_date: - day: 27 - month: 11 - year: 2019 - author: Bill Gates - image_url: https://media-exp1.licdn.com/dms/image/C4E12AQFftuPi0UiqWA/article-cover_image-shrink_720_1280/0/1574801149114?e=1640822400&v=beta&t=ZAe3ERmQCM8QHGmRPS2LJ-C76GD5PR7FBHMVL4Z6iVg - groups: - - profile_pic_url: https://media-exp1.licdn.com/dms/image/C4D07AQG9IK9V0pk3mQ/group-logo_image-shrink_92x92/0/1631371531293?e=1642060800&v=beta&t=UK1tfIppWa-Nx7k9whmm5f9XdZoBdJhApf9N3ke3204 - name: Hadoop Users - url: https://www.linkedin.com/groups/988957 - last_updated: '2023-10-26T11:34:30Z' - PersonSearchResult: - type: object - properties: - results: - type: array - items: - $ref: '#/components/schemas/SearchResult' - description: "\n A list of SearchResult objects\n " - next_page: - type: string - nullable: true - description: - "\n The URL to the next page of search results. This\ - \ will be null for the final page.\n " - total_result_count: - type: integer - description: Total results found. - example: - results: - - *id040 - next_page: null - total_result_count: 1 - CreditBalance: - type: object - properties: - credit_balance: - type: integer - description: Your current credit(s) - example: - credit_balance: 100000 - DisposableEmail: - type: object - properties: - is_disposable_email: - type: boolean - description: - Returns a boolean value of the disposable nature of the given - email address - is_free_email: - type: boolean - description: - Returns a boolean value of the free status of the given email - address - example: - is_disposable_email: null - is_free_email: null - PersonalContactNumbers: - type: object - properties: - numbers: - type: array - items: - type: string - description: A list of contact numbers - example: - numbers: - - '+1123123123' - PDLEmailResult: - type: object - properties: - emails: - type: array - items: - type: string - description: A list of personal emails - invalid_emails: - type: array - items: - type: string - description: A list of invalid personal emails - example: - emails: - - random@gmail.com - - random2@yahoo.com - invalid_emails: - - random3@gmail.com - securitySchemes: - BearerAuth: - type: http - scheme: bearer diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index 580ac8abb..6dfdf20cd 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -15,7 +15,7 @@ export class AIFunctionSet implements Iterable { } add(fn: types.AIFunction): this { - this._map.set(fn.name, fn) + this._map.set(fn.spec.name, fn) return this } @@ -54,6 +54,10 @@ export class AIFunctionSet implements Iterable { ) } + map(fn: (fn: types.AIFunction) => T): T[] { + return [...this.entries].map(fn) + } + get entries(): IterableIterator { return this._map.values() } diff --git a/src/ai-tool-set.ts b/src/ai-tool-set.ts index ddc5245d6..0748aa2a3 100644 --- a/src/ai-tool-set.ts +++ b/src/ai-tool-set.ts @@ -58,6 +58,10 @@ export class AIToolSet implements Iterable { ) } + map(fn: (fn: types.AITool) => T): T[] { + return [...this.entries].map(fn) + } + get entries(): IterableIterator { return this._map.values() } diff --git a/src/fns.ts b/src/fns.ts index 75eb0ab16..2e1f7cef5 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -8,6 +8,13 @@ import { AIFunctionSet } from './ai-function-set.js' import { AIToolSet } from './ai-tool-set.js' import { assert } from './utils.js' +export interface Invocable { + name: string + description?: string + inputSchema: z.AnyZodObject + methodName: string +} + export abstract class AIToolsProvider { private _tools?: AIToolSet private _functions?: AIFunctionSet @@ -25,7 +32,7 @@ export abstract class AIToolsProvider { const metadata = this.constructor[Symbol.metadata] assert(metadata) const invocables = (metadata?.invocables as Invocable[]) ?? [] - console.log({ metadata, invocables }) + // console.log({ metadata, invocables }) const aiFunctions = invocables.map((invocable) => { const impl = (this as any)[invocable.methodName]?.bind(this) @@ -41,13 +48,6 @@ export abstract class AIToolsProvider { } } -export interface Invocable { - name: string - description?: string - inputSchema: z.AnyZodObject - methodName: string -} - export function aiFunction< This, InputSchema extends z.SomeZodObject, @@ -87,11 +87,11 @@ export function aiFunction< inputSchema, methodName }) - console.log({ - name, - methodName, - context - }) + // console.log({ + // name, + // methodName, + // context + // }) // context.addInitializer(function () { // ;(this as any)[methodName] = (this as any)[methodName].bind(this) diff --git a/src/sdks/ai-sdk.ts b/src/sdks/ai-sdk.ts new file mode 100644 index 000000000..156419f6c --- /dev/null +++ b/src/sdks/ai-sdk.ts @@ -0,0 +1,19 @@ +import { tool } from 'ai' + +import type { AIFunctionSet } from '../ai-function-set.js' +import { AIToolsProvider } from '../fns.js' + +export function tools(tools: AIToolsProvider | AIFunctionSet) { + const fns = tools instanceof AIToolsProvider ? tools.functions : tools + + return Object.fromEntries( + [...fns].map((fn) => [ + fn.spec.name, + tool({ + description: fn.spec.description, + parameters: fn.inputSchema, + execute: fn.impl + }) + ]) + ) +} diff --git a/src/sdks/dexter.ts b/src/sdks/dexter.ts new file mode 100644 index 000000000..fbbebdacd --- /dev/null +++ b/src/sdks/dexter.ts @@ -0,0 +1,19 @@ +import { createAIFunction } from '@dexaai/dexter' + +import type { AIFunctionSet } from '../ai-function-set.js' +import { AIToolsProvider } from '../fns.js' + +export function functions(input: AIToolsProvider | AIFunctionSet) { + const fns = input instanceof AIToolsProvider ? input.functions : input + + return fns.map((fn) => + createAIFunction( + { + name: fn.spec.name, + description: fn.spec.description, + argsSchema: fn.inputSchema + }, + fn.impl + ) + ) +} diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index e5adec74f..1ca8b9155 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -1,5 +1,5 @@ import defaultKy, { type KyInstance } from 'ky' -import * as z from 'zod' +import { z } from 'zod' import { assert, getEnv } from '../utils.js' diff --git a/src/services/weather-client.ts b/src/services/weather-client.ts index 91dea80e7..4f032352c 100644 --- a/src/services/weather-client.ts +++ b/src/services/weather-client.ts @@ -126,18 +126,4 @@ export class WeatherClient extends AIToolsProvider { }) .json() } - - async ipInfo(ipOrOptions: string | { q: string }) { - const options = - typeof ipOrOptions === 'string' ? { q: ipOrOptions } : ipOrOptions - - return this.ky - .get('ip.json', { - searchParams: { - key: this.apiKey, - ...options - } - }) - .json() - } } diff --git a/src/types.ts b/src/types.ts index c26377d30..ef3517374 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,16 +22,19 @@ export interface AIToolSpec { function: AIFunctionSpec } +/** The implementation of the function, with arg parsing and validation. */ +export type AIFunctionImpl = Omit< + (input: string | Msg) => MaybePromise, + 'name' | 'toString' | 'arguments' | 'caller' | 'prototype' | 'length' +> + /** * A function meant to be used with LLM function calling. */ export interface AIFunction< InputSchema extends z.ZodObject = z.ZodObject, Return = any -> { - /** The implementation of the function, with arg parsing and validation. */ - (input: string | Msg): MaybePromise - +> extends AIFunctionImpl { /** The Zod schema for the arguments string. */ inputSchema: InputSchema @@ -41,6 +44,7 @@ export interface AIFunction< /** The function spec for the OpenAI API `functions` property. */ spec: AIFunctionSpec + /** The underlying function implementation without any arg parsing or validation. */ impl: (params: z.infer) => MaybePromise } diff --git a/tsconfig.json b/tsconfig.json index 2c566bf40..4f2456ed3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,5 +25,5 @@ "outDir": "dist", "sourceMap": true }, - "include": ["src", "bin"] + "include": ["src"] } diff --git a/tsup.config.ts b/tsup.config.ts index bbb2d78b9..6489fe1c3 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'tsup' export default defineConfig([ { - entry: ['src/index.ts'], + entry: ['src/index.ts', 'src/sdks/ai-sdk.ts'], outDir: 'dist', target: 'node18', platform: 'node', From 1d953a0ed22ecb3b7ebc097fbfef0ea943681d20 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sat, 1 Jun 2024 21:11:07 -0500 Subject: [PATCH 21/81] =?UTF-8?q?=F0=9F=8E=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 24 +++++++++++++++++------- src/errors.ts | 2 -- src/fns.ts | 2 +- src/services/diffbot-client.ts | 12 ------------ tsup.config.ts | 2 +- 5 files changed, 19 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 6ab2c3109..204d9259e 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,11 @@ "types": "./dist/sdks/ai-sdk.d.ts", "import": "./dist/sdks/ai-sdk.js", "default": "./dist/sdks/ai-sdk.js" + }, + "./dexter": { + "types": "./dist/sdks/dexter.d.ts", + "import": "./dist/sdks/dexter.js", + "default": "./dist/sdks/dexter.js" } }, "files": [ @@ -50,16 +55,10 @@ }, "dependencies": { "@nangohq/node": "^0.39.32", - "chalk": "^5.3.0", "delay": "^6.0.0", - "dotenv": "^16.4.5", - "exit-hook": "^4.0.0", "jsonrepair": "^3.6.1", "ky": "^1.2.4", - "p-map": "^7.0.2", - "p-retry": "^6.2.0", "p-throttle": "^6.1.0", - "restore-cursor": "^5.0.0", "tiny-invariant": "^1.3.3", "twitter-api-sdk": "^1.2.1", "type-fest": "^4.18.3", @@ -73,23 +72,34 @@ "@types/node": "^20.12.7", "ai": "^3.1.22", "del-cli": "^5.1.0", + "dotenv": "^16.4.5", "eslint": "^8.57.0", + "exit-hook": "^4.0.0", "husky": "^9.0.11", "lint-staged": "^15.2.5", "np": "^10.0.5", "npm-run-all2": "^6.2.0", "only-allow": "^1.2.1", "prettier": "^3.2.5", + "restore-cursor": "^5.0.0", "ts-node": "^10.9.2", "tsup": "^8.0.2", "tsx": "^4.11.0", "typescript": "^5.4.5", "vitest": "2.0.0-beta.3" }, - "optionalDependencies": { + "peerDependencies": { "@dexaai/dexter": "^2.0.3", "ai": "^3.1.22" }, + "peerDependenciesMeta": { + "@dexaai/dexter": { + "optional": true + }, + "ai": { + "optional": true + } + }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix", diff --git a/src/errors.ts b/src/errors.ts index 555bc0949..d3bdd21d1 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,5 +1,3 @@ -export { AbortError, type FailedAttemptError } from 'p-retry' - export class RetryableError extends Error {} export class ParseError extends RetryableError {} diff --git a/src/fns.ts b/src/fns.ts index 2e1f7cef5..ea6b42008 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -1,6 +1,6 @@ import './symbol-polyfill.js' -import type * as z from 'zod' +import type { z } from 'zod' import type * as types from './types.js' import { createAIFunction } from './ai-function.js' diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 8e4b70ee7..9f6780b7e 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -1,5 +1,4 @@ import defaultKy, { type KyInstance } from 'ky' -import { AbortError } from 'p-retry' import pThrottle from 'p-throttle' import { assert, getEnv, throttleKy } from '../utils.js' @@ -391,17 +390,6 @@ export class DiffbotClient { } } - // TODO - const { url } = searchParams - if (url) { - const parsedUrl = new URL(url) - if (parsedUrl.hostname.includes('theguardian.com')) { - throw new AbortError( - `Diffbot does not support URLs from domain "${parsedUrl.hostname}"` - ) - } - } - // console.log(`DiffbotClient._extract: ${endpoint}`, searchParams) return this.ky diff --git a/tsup.config.ts b/tsup.config.ts index 6489fe1c3..396849b5e 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'tsup' export default defineConfig([ { - entry: ['src/index.ts', 'src/sdks/ai-sdk.ts'], + entry: ['src/index.ts', 'src/sdks/ai-sdk.ts', 'src/sdks/dexter.ts'], outDir: 'dist', target: 'node18', platform: 'node', From e6263fbeac7a12a9be8948daac0419cf1406fb7f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 02:30:50 -0500 Subject: [PATCH 22/81] feat: add genkit --- examples/genkit/weather.ts | 37 + examples/package.json | 5 +- package.json | 6 + pnpm-lock.yaml | 1211 +++++++++++++++++++++++++-- readme.md | 6 + src/fns.ts | 4 +- src/sdks/ai-sdk.ts | 4 + src/sdks/dexter.ts | 4 + src/sdks/genkit.ts | 25 + src/services/weather-client.test.ts | 5 +- src/types.ts | 2 +- tsup.config.ts | 7 +- 12 files changed, 1257 insertions(+), 59 deletions(-) create mode 100644 examples/genkit/weather.ts create mode 100644 src/sdks/genkit.ts diff --git a/examples/genkit/weather.ts b/examples/genkit/weather.ts new file mode 100644 index 000000000..a0a9f9361 --- /dev/null +++ b/examples/genkit/weather.ts @@ -0,0 +1,37 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { generate } from '@genkit-ai/ai' +import { configureGenkit } from '@genkit-ai/core' +import { gpt4o, openAI } from 'genkitx-openai' + +import { WeatherClient } from '../../src/index.js' +import { tools } from '../../src/sdks/genkit.js' + +async function main() { + const weather = new WeatherClient() + + configureGenkit({ + plugins: [openAI()] + }) + + const result = await generate({ + model: gpt4o, + tools: tools(weather), + history: [ + { + role: 'system', + content: [ + { + text: 'You are a weather assistant. Be as concise as possible.' + } + ] + } + ], + prompt: [{ text: 'What is the weather in San Francisco?' }] + }) + + console.log(result) +} + +await main() diff --git a/examples/package.json b/examples/package.json index ef73f3329..a08d2cea6 100644 --- a/examples/package.json +++ b/examples/package.json @@ -24,10 +24,13 @@ "test:typecheck": "tsc --noEmit" }, "dependencies": { - "ai": "^3.1.22", "@ai-sdk/openai": "^0.0.18", "@dexaai/dexter": "^2.0.3", + "@genkit-ai/ai": "^0.5.2", + "@genkit-ai/core": "^0.5.2", + "ai": "^3.1.22", "dotenv": "^16.4.5", + "genkitx-openai": "^0.9.0", "zod": "^3.23.3" } } diff --git a/package.json b/package.json index 204d9259e..eb429200b 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,11 @@ "types": "./dist/sdks/dexter.d.ts", "import": "./dist/sdks/dexter.js", "default": "./dist/sdks/dexter.js" + }, + "./genkit": { + "types": "./dist/sdks/genkit.d.ts", + "import": "./dist/sdks/genkit.js", + "default": "./dist/sdks/genkit.js" } }, "files": [ @@ -68,6 +73,7 @@ "devDependencies": { "@dexaai/dexter": "^2.0.3", "@fisch0920/eslint-config": "^1.3.1", + "@genkit-ai/ai": "^0.5.2", "@total-typescript/ts-reset": "^0.5.1", "@types/node": "^20.12.7", "ai": "^3.1.22", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69687d8ab..85b1e2857 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,36 +14,18 @@ importers: '@nangohq/node': specifier: ^0.39.32 version: 0.39.32 - chalk: - specifier: ^5.3.0 - version: 5.3.0 delay: specifier: ^6.0.0 version: 6.0.0 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - exit-hook: - specifier: ^4.0.0 - version: 4.0.0 jsonrepair: specifier: ^3.6.1 version: 3.8.0 ky: specifier: ^1.2.4 version: 1.3.0 - p-map: - specifier: ^7.0.2 - version: 7.0.2 - p-retry: - specifier: ^6.2.0 - version: 6.2.0 p-throttle: specifier: ^6.1.0 version: 6.1.0 - restore-cursor: - specifier: ^5.0.0 - version: 5.0.0 tiny-invariant: specifier: ^1.3.3 version: 1.3.3 @@ -59,29 +41,37 @@ importers: zod-to-json-schema: specifier: ^3.23.0 version: 3.23.0(zod@3.23.8) - optionalDependencies: + devDependencies: '@dexaai/dexter': specifier: ^2.0.3 version: 2.1.0 - ai: - specifier: ^3.1.22 - version: 3.1.22(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) - devDependencies: '@fisch0920/eslint-config': specifier: ^1.3.1 version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) + '@genkit-ai/ai': + specifier: ^0.5.2 + version: 0.5.2 '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 '@types/node': specifier: ^20.12.7 version: 20.13.0 + ai: + specifier: ^3.1.22 + version: 3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) del-cli: specifier: ^5.1.0 version: 5.1.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 eslint: specifier: ^8.57.0 version: 8.57.0 + exit-hook: + specifier: ^4.0.0 + version: 4.0.0 husky: specifier: ^9.0.11 version: 9.0.11 @@ -100,6 +90,9 @@ importers: prettier: specifier: ^3.2.5 version: 3.3.0 + restore-cursor: + specifier: ^5.0.0 + version: 5.0.0 ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.13.0)(typescript@5.4.5) @@ -124,12 +117,21 @@ importers: '@dexaai/dexter': specifier: ^2.0.3 version: 2.1.0 + '@genkit-ai/ai': + specifier: ^0.5.2 + version: 0.5.2 + '@genkit-ai/core': + specifier: ^0.5.2 + version: 0.5.2 ai: specifier: ^3.1.22 - version: 3.1.22(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + version: 3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) dotenv: specifier: ^16.4.5 version: 16.4.5 + genkitx-openai: + specifier: ^0.9.0 + version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2) zod: specifier: ^3.23.3 version: 3.23.8 @@ -361,6 +363,21 @@ packages: peerDependencies: typescript: ^5.0.0 + '@genkit-ai/ai@0.5.2': + resolution: {integrity: sha512-VuXSTlNGhUSjU0SrFq5sREj99LRFInxPqMWOUMdaM48Y1RKtZLs+TuimW7Y5NJ2/SS0u1fq3cbD3YE0j+GAk/g==} + + '@genkit-ai/core@0.5.2': + resolution: {integrity: sha512-feAhel5qEdbfPTnBxCVHzfHLCV6WWVN0J5x2Av4AJMl3M04fQYhXmmPqdgTaiaEZ0nUZ1jSxpnn5aTk2U4VV/Q==} + + '@grpc/grpc-js@1.10.8': + resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -405,6 +422,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@ljharb/through@2.3.13': resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} @@ -425,6 +445,167 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api-logs@0.49.1': + resolution: {integrity: sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@1.22.0': + resolution: {integrity: sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/context-async-hooks@1.24.1': + resolution: {integrity: sha512-R5r6DO4kgEOVBxFXhXjwospLQkv+sYxwCfjvoZBe7Zm6KKXAV9kDSJhi/D1BweowdZmO+sdbENLs374gER8hpQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/core@1.22.0': + resolution: {integrity: sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/core@1.24.1': + resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/exporter-trace-otlp-grpc@0.49.1': + resolution: {integrity: sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-http@0.49.1': + resolution: {integrity: sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.49.1': + resolution: {integrity: sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-zipkin@1.22.0': + resolution: {integrity: sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation@0.49.1': + resolution: {integrity: sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.49.1': + resolution: {integrity: sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.49.1': + resolution: {integrity: sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-proto-exporter-base@0.49.1': + resolution: {integrity: sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.49.1': + resolution: {integrity: sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/propagator-b3@1.22.0': + resolution: {integrity: sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/propagator-jaeger@1.22.0': + resolution: {integrity: sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/resources@1.22.0': + resolution: {integrity: sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/resources@1.24.1': + resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/sdk-logs@0.49.1': + resolution: {integrity: sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.9.0' + '@opentelemetry/api-logs': '>=0.39.1' + + '@opentelemetry/sdk-metrics@1.22.0': + resolution: {integrity: sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/sdk-metrics@1.24.1': + resolution: {integrity: sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/sdk-node@0.49.1': + resolution: {integrity: sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/sdk-trace-base@1.22.0': + resolution: {integrity: sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/sdk-trace-base@1.24.1': + resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/sdk-trace-node@1.22.0': + resolution: {integrity: sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/semantic-conventions@1.22.0': + resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.24.1': + resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -441,6 +622,36 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] @@ -577,14 +788,20 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + '@types/node@20.13.0': resolution: {integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/shimmer@1.0.5': + resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} '@typescript-eslint/eslint-plugin@7.11.0': resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} @@ -695,6 +912,15 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -709,6 +935,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + aggregate-error@4.0.1: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} @@ -737,9 +967,20 @@ packages: zod: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.14.0: + resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -831,6 +1072,9 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -876,6 +1120,9 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -909,6 +1156,10 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -945,6 +1196,10 @@ packages: peerDependencies: esbuild: ~0.21.4 + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1019,6 +1274,9 @@ packages: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -1066,6 +1324,10 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -1115,6 +1377,21 @@ packages: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} @@ -1148,6 +1425,10 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -1163,6 +1444,14 @@ packages: date-fns@1.30.1: resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1263,10 +1552,18 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} @@ -1301,6 +1598,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-to-chromium@1.4.788: resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} @@ -1317,6 +1617,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + enhanced-resolve@5.16.1: resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} @@ -1372,6 +1676,9 @@ packages: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1525,6 +1832,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -1548,6 +1859,10 @@ packages: resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} engines: {node: '>=18'} + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -1568,6 +1883,10 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + figures@1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} engines: {node: '>=0.10.0'} @@ -1588,6 +1907,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + find-up-simple@1.0.0: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} engines: {node: '>=18'} @@ -1623,6 +1946,9 @@ packages: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -1631,6 +1957,22 @@ packages: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1649,6 +1991,16 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + genkitx-openai@0.9.0: + resolution: {integrity: sha512-LyjegcPnq2gaW2Q2SAL6MH3nsujy9eNe+tNMlWPadAIDci+ec5ZzLe1HL/Tk+TK04Uxv+jlndsTPJxCc6o0G5g==} + peerDependencies: + '@genkit-ai/ai': ^0.5.0 + '@genkit-ai/core': ^0.5.0 + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} @@ -1791,6 +2143,10 @@ packages: http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -1803,6 +2159,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + husky@9.0.11: resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} engines: {node: '>=18'} @@ -1827,6 +2186,9 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-in-the-middle@1.7.1: + resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -1893,6 +2255,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -2008,10 +2374,6 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} - is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2182,6 +2544,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -2192,6 +2557,11 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsondiffpatch@0.6.0: resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2284,6 +2654,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -2316,6 +2689,9 @@ packages: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2352,6 +2728,10 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -2364,6 +2744,9 @@ packages: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2371,6 +2754,10 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + micromatch@4.0.7: resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} @@ -2383,6 +2770,11 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -2429,6 +2821,12 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -2461,10 +2859,18 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + new-github-release-url@2.0.0: resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2474,6 +2880,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -2561,6 +2971,10 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2592,6 +3006,10 @@ packages: resolution: {integrity: sha512-3Kv2lRgld3MYj+TaSgDBb8YnYEVdn601U+I1y0oZs4bCaPINEZXgcQAQAUGFmFVFpG4vU2Jr6ZAKiF5ZlmM5Fg==} engines: {node: '>=18'} + openai@4.47.3: + resolution: {integrity: sha512-470d4ibH5kizXflCzgur22GpM4nOjrg7WQ9jTOa3dNKEn248oBy4+pjOyfcFR4V4YUn/YlDNjp6h83PbviCCKQ==} + hasBin: true + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2648,10 +3066,6 @@ packages: resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} engines: {node: '>=14.16'} - p-retry@6.2.0: - resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} - engines: {node: '>=16.17'} - p-throttle@6.1.0: resolution: {integrity: sha512-eQMdGTxk2+047La67wefUtt0tEHh7D+C8Jl7QXoFCuIiNYeQ9zWs2AZiJdIAs72rSXZ06t11me2bgalRNdy3SQ==} engines: {node: '>=18'} @@ -2680,6 +3094,10 @@ packages: resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} engines: {node: '>=18'} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2707,6 +3125,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -2792,6 +3213,14 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.3.0: + resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -2803,6 +3232,10 @@ packages: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2810,6 +3243,14 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -2891,6 +3332,18 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.3.0: + resolution: {integrity: sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==} + engines: {node: '>=8.6.0'} + requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -2941,10 +3394,6 @@ packages: resolution: {integrity: sha512-Hp93f349DvdEqJFHiPyzNzVjT7lDDFtQJWRotQVQNl3CHr4j7oMHStQB9UH/CJSHTrevAZXFvomgzy8lXjrK0w==} engines: {node: '>=18'} - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3025,6 +3474,10 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + seroval-plugins@1.0.7: resolution: {integrity: sha512-GO7TkWvodGp6buMEX9p7tNyIkbwlyuAWbI6G9Ec5bhcm7mQdu3JOK1IXbEUwb3FVzSc363GraG/wLW23NSavIw==} engines: {node: '>=10'} @@ -3035,6 +3488,10 @@ packages: resolution: {integrity: sha512-n6ZMQX5q0Vn19Zq7CIKNIo7E75gPkGCFUEqDpa8jgwpYr/vScjqnQ6H09t1uIiZ0ZSK0ypEGvrYK2bhBGWsGdw==} engines: {node: '>=10'} + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3043,6 +3500,9 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3054,6 +3514,9 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -3130,6 +3593,10 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -3327,6 +3794,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -3437,6 +3908,10 @@ packages: resolution: {integrity: sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==} engines: {node: '>=16'} + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -3475,6 +3950,10 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + update-browserslist-db@1.0.16: resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true @@ -3496,6 +3975,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -3506,6 +3989,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@2.0.0-beta.3: resolution: {integrity: sha512-oOO88OkozvBCyy640b4JFo+g1FAPcYrJcC7JgcuJD3SlgAnGrhD9CvE2ujiG6pxgeSL5U/9wWshGVbBuWsVjxg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3575,6 +4062,14 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -3654,6 +4149,10 @@ packages: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -3666,6 +4165,14 @@ packages: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -3896,6 +4403,47 @@ snapshots: - jest - supports-color + '@genkit-ai/ai@0.5.2': + dependencies: + '@genkit-ai/core': 0.5.2 + '@opentelemetry/api': 1.8.0 + '@types/node': 20.13.0 + json5: 2.2.3 + node-fetch: 3.3.2 + zod: 3.23.8 + transitivePeerDependencies: + - supports-color + + '@genkit-ai/core@0.5.2': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/context-async-hooks': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-metrics': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-node': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.8.0) + ajv: 8.14.0 + ajv-formats: 3.0.1(ajv@8.14.0) + async-mutex: 0.5.0 + express: 4.19.2 + json-schema: 0.4.0 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + transitivePeerDependencies: + - supports-color + + '@grpc/grpc-js@1.10.8': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.3.0 + yargs: 17.7.2 + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -3945,6 +4493,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@js-sdsl/ordered-map@4.4.2': {} + '@ljharb/through@2.3.13': dependencies: call-bind: 1.0.7 @@ -3967,6 +4517,199 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@opentelemetry/api-logs@0.49.1': + dependencies: + '@opentelemetry/api': 1.8.0 + + '@opentelemetry/api@1.8.0': {} + + '@opentelemetry/context-async-hooks@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + + '@opentelemetry/context-async-hooks@1.24.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + + '@opentelemetry/core@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/semantic-conventions': 1.22.0 + + '@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/semantic-conventions': 1.24.1 + + '@opentelemetry/exporter-trace-otlp-grpc@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@grpc/grpc-js': 1.10.8 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/exporter-trace-otlp-http@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-proto-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/exporter-zipkin@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.22.0 + + '@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/api-logs': 0.49.1 + '@types/shimmer': 1.0.5 + import-in-the-middle: 1.7.1 + require-in-the-middle: 7.3.0 + semver: 7.6.2 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@grpc/grpc-js': 1.10.8 + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + protobufjs: 7.3.0 + + '@opentelemetry/otlp-proto-exporter-base@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + protobufjs: 7.3.0 + + '@opentelemetry/otlp-transformer@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/propagator-b3@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/propagator-jaeger@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/resources@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.22.0 + + '@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + + '@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + + '@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + lodash.merge: 4.6.2 + + '@opentelemetry/sdk-metrics@1.24.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) + lodash.merge: 4.6.2 + + '@opentelemetry/sdk-node@0.49.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/api-logs': 0.49.1 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/exporter-trace-otlp-http': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/exporter-zipkin': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-node': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.22.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.22.0 + + '@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/semantic-conventions': 1.24.1 + + '@opentelemetry/sdk-trace-node@1.22.0(@opentelemetry/api@1.8.0)': + dependencies: + '@opentelemetry/api': 1.8.0 + '@opentelemetry/context-async-hooks': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/propagator-b3': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/propagator-jaeger': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + semver: 7.6.2 + + '@opentelemetry/semantic-conventions@1.22.0': {} + + '@opentelemetry/semantic-conventions@1.24.1': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -3982,6 +4725,29 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@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': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 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': {} + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true @@ -4068,13 +4834,22 @@ snapshots: '@types/minimist@1.2.5': {} + '@types/node-fetch@2.6.11': + dependencies: + '@types/node': 20.13.0 + form-data: 4.0.0 + + '@types/node@18.19.33': + dependencies: + undici-types: 5.26.5 + '@types/node@20.13.0': dependencies: undici-types: 5.26.5 '@types/normalize-package-data@2.4.4': {} - '@types/retry@0.12.2': {} + '@types/shimmer@1.0.5': {} '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: @@ -4245,6 +5020,15 @@ snapshots: dependencies: event-target-shim: 5.0.1 + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-assertions@1.9.0(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 @@ -4253,12 +5037,16 @@ snapshots: acorn@8.11.3: {} + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + aggregate-error@4.0.1: dependencies: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@3.1.22(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): + ai@3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.8 '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) @@ -4274,12 +5062,17 @@ snapshots: swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) zod-to-json-schema: 3.22.5(zod@3.23.8) optionalDependencies: + openai: 4.47.3 react: 18.3.1 solid-js: 1.8.17 svelte: 4.2.17 vue: 3.4.27(typescript@5.4.5) zod: 3.23.8 + ajv-formats@3.0.1(ajv@8.14.0): + optionalDependencies: + ajv: 8.14.0 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4287,6 +5080,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.14.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -4351,6 +5151,8 @@ snapshots: call-bind: 1.0.7 is-array-buffer: 3.0.4 + array-flatten@1.1.1: {} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 @@ -4426,6 +5228,10 @@ snapshots: ast-types-flow@0.0.8: {} + async-mutex@0.5.0: + dependencies: + tslib: 2.6.2 + asynckit@0.4.0: {} available-typed-arrays@1.0.7: @@ -4462,6 +5268,23 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + boxen@7.1.1: dependencies: ansi-align: 3.0.1 @@ -4509,6 +5332,8 @@ snapshots: esbuild: 0.21.4 load-tsconfig: 0.2.5 + bytes@3.1.2: {} + cac@6.7.14: {} cacheable-lookup@7.0.0: {} @@ -4597,6 +5422,8 @@ snapshots: ci-info@4.0.0: {} + cjs-module-lexer@1.3.1: {} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -4637,6 +5464,12 @@ snapshots: cli-width@4.1.0: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clone@1.0.4: {} code-point-at@1.1.0: {} @@ -4686,6 +5519,16 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + core-js-compat@3.37.1: dependencies: browserslist: 4.23.0 @@ -4720,6 +5563,8 @@ snapshots: damerau-levenshtein@1.0.8: {} + data-uri-to-buffer@4.0.1: {} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -4740,6 +5585,10 @@ snapshots: date-fns@1.30.1: {} + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -4818,8 +5667,12 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} + diff-match-patch@1.0.5: {} diff-sequences@29.6.3: {} @@ -4846,6 +5699,8 @@ snapshots: eastasianwidth@0.2.0: {} + ee-first@1.1.1: {} + electron-to-chromium@1.4.788: {} elegant-spinner@1.0.1: {} @@ -4856,6 +5711,8 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@1.0.2: {} + enhanced-resolve@5.16.1: dependencies: graceful-fs: 4.2.11 @@ -4989,6 +5846,8 @@ snapshots: escape-goat@4.0.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -5228,6 +6087,8 @@ snapshots: esutils@2.0.3: {} + etag@1.8.1: {} + event-target-shim@5.0.1: {} eventemitter3@5.0.1: {} @@ -5260,6 +6121,42 @@ snapshots: exit-hook@4.0.0: {} + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -5284,6 +6181,11 @@ snapshots: dependencies: reusify: 1.0.4 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + figures@1.7.0: dependencies: escape-string-regexp: 1.0.5 @@ -5305,6 +6207,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + find-up-simple@1.0.0: {} find-up@4.1.0: @@ -5336,6 +6250,8 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + form-data-encoder@1.7.2: {} + form-data-encoder@2.1.4: {} form-data@4.0.0: @@ -5344,6 +6260,19 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -5360,6 +6289,17 @@ snapshots: functions-have-names@1.2.3: {} + genkitx-openai@0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2): + dependencies: + '@genkit-ai/ai': 0.5.2 + '@genkit-ai/core': 0.5.2 + openai: 4.47.3 + zod: 3.23.8 + transitivePeerDependencies: + - encoding + + get-caller-file@2.0.5: {} + get-east-asian-width@1.2.0: {} get-func-name@2.0.2: {} @@ -5518,6 +6458,14 @@ snapshots: http-cache-semantics@4.1.1: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -5527,6 +6475,10 @@ snapshots: human-signals@5.0.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + husky@9.0.11: {} iconv-lite@0.4.24: @@ -5546,6 +6498,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@1.7.1: + dependencies: + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + cjs-module-lexer: 1.3.1 + module-details-from-path: 1.0.3 + import-lazy@4.0.0: {} import-local@3.1.0: @@ -5638,6 +6597,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + ipaddr.js@1.9.1: {} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -5734,8 +6695,6 @@ snapshots: is-negative-zero@2.0.3: {} - is-network-error@1.1.0: {} - is-npm@6.0.0: {} is-number-object@1.0.7: @@ -5864,6 +6823,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -5872,6 +6833,8 @@ snapshots: dependencies: minimist: 1.2.8 + json5@2.2.3: {} + jsondiffpatch@0.6.0: dependencies: '@types/diff-match-patch': 1.0.36 @@ -5993,6 +6956,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.merge@4.6.2: {} lodash.sortby@4.7.0: {} @@ -6029,6 +6994,8 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + long@5.2.3: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6057,6 +7024,8 @@ snapshots: mdn-data@2.0.30: {} + media-typer@0.3.0: {} + memorystream@0.3.1: {} meow@10.1.5: @@ -6076,10 +7045,14 @@ snapshots: meow@13.2.0: {} + merge-descriptors@1.0.1: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} + methods@1.1.2: {} + micromatch@4.0.7: dependencies: braces: 3.0.3 @@ -6091,6 +7064,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@1.6.0: {} + mimic-fn@1.2.0: {} mimic-fn@2.1.0: {} @@ -6123,6 +7098,10 @@ snapshots: minipass@7.1.2: {} + module-details-from-path@1.0.3: {} + + ms@2.0.0: {} + ms@2.1.2: {} ms@2.1.3: {} @@ -6145,14 +7124,24 @@ snapshots: natural-compare@1.4.0: {} + negotiator@0.6.3: {} + new-github-release-url@2.0.0: dependencies: type-fest: 2.19.0 + node-domexception@1.0.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-releases@2.0.14: {} normalize-package-data@2.5.0: @@ -6301,6 +7290,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -6336,6 +7329,19 @@ snapshots: dependencies: ky: 1.3.0 + openai@4.47.3: + dependencies: + '@types/node': 18.19.33 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -6396,12 +7402,6 @@ snapshots: mimic-fn: 4.0.0 type-fest: 3.13.1 - p-retry@6.2.0: - dependencies: - '@types/retry': 0.12.2 - is-network-error: 1.1.0 - retry: 0.13.1 - p-throttle@6.1.0: {} p-timeout@6.1.2: {} @@ -6432,6 +7432,8 @@ snapshots: index-to-position: 0.1.2 type-fest: 4.18.3 + parseurl@1.3.3: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -6449,6 +7451,8 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.2 + path-to-regexp@0.1.7: {} + path-type@4.0.0: {} pathe@1.1.2: {} @@ -6517,6 +7521,26 @@ snapshots: proto-list@1.2.4: {} + protobufjs@7.3.0: + 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': 20.13.0 + long: 5.2.3 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} punycode@2.3.1: {} @@ -6525,10 +7549,23 @@ snapshots: dependencies: escape-goat: 4.0.0 + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -6637,6 +7674,18 @@ snapshots: dependencies: jsesc: 0.5.0 + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-in-the-middle@7.3.0: + dependencies: + debug: 4.3.5 + module-details-from-path: 1.0.3 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + requireindex@1.2.0: {} resolve-alpn@1.2.1: {} @@ -6687,8 +7736,6 @@ snapshots: onetime: 6.0.0 signal-exit: 4.1.0 - retry@0.13.1: {} - reusify@1.0.4: {} rfdc@1.3.1: {} @@ -6772,12 +7819,39 @@ snapshots: semver@7.6.2: {} + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + seroval-plugins@1.0.7(seroval@1.0.7): dependencies: seroval: 1.0.7 seroval@1.0.7: {} + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -6794,6 +7868,8 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -6802,6 +7878,8 @@ snapshots: shell-quote@1.8.1: {} + shimmer@1.2.1: {} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -6873,6 +7951,8 @@ snapshots: stackback@0.0.2: {} + statuses@2.0.1: {} + std-env@3.7.0: {} string-argv@0.3.2: {} @@ -7084,6 +8164,8 @@ snapshots: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + tr46@0.0.3: {} tr46@1.0.1: @@ -7186,6 +8268,11 @@ snapshots: type-fest@4.18.3: {} + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -7239,6 +8326,8 @@ snapshots: dependencies: crypto-random-string: 4.0.0 + unpipe@1.0.0: {} + update-browserslist-db@1.0.16(browserslist@4.23.0): dependencies: browserslist: 4.23.0 @@ -7270,6 +8359,8 @@ snapshots: util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -7279,6 +8370,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + vary@1.1.2: {} + vite-node@2.0.0-beta.3(@types/node@20.13.0): dependencies: cac: 6.7.14 @@ -7349,6 +8442,10 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@3.3.3: {} + + web-streams-polyfill@4.0.0-beta.3: {} + webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} @@ -7459,12 +8556,26 @@ snapshots: xdg-basedir@5.1.0: {} + y18n@5.0.8: {} + yallist@4.0.0: {} yaml@2.4.2: {} yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/readme.md b/readme.md index ee4e9d54a..f6dc04250 100644 --- a/readme.md +++ b/readme.md @@ -44,6 +44,12 @@ - move out to a separate project - agentic - walter +- sdks + - ai sdk + - dexter + - genkit + - langchain + - instructor-js - services - wolfram alpha - midjourney diff --git a/src/fns.ts b/src/fns.ts index ea6b42008..dbea51a09 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -10,7 +10,7 @@ import { assert } from './utils.js' export interface Invocable { name: string - description?: string + description: string inputSchema: z.AnyZodObject methodName: string } @@ -59,7 +59,7 @@ export function aiFunction< inputSchema }: { name?: string - description?: string + description: string inputSchema: InputSchema }) { return ( diff --git a/src/sdks/ai-sdk.ts b/src/sdks/ai-sdk.ts index 156419f6c..aea60da30 100644 --- a/src/sdks/ai-sdk.ts +++ b/src/sdks/ai-sdk.ts @@ -3,6 +3,10 @@ import { tool } from 'ai' import type { AIFunctionSet } from '../ai-function-set.js' import { AIToolsProvider } from '../fns.js' +/** + * Converts a set of Agentic stdlib AI functions to an object compatible with + * the Vercel AI SDK's `tools` parameter. + */ export function tools(tools: AIToolsProvider | AIFunctionSet) { const fns = tools instanceof AIToolsProvider ? tools.functions : tools diff --git a/src/sdks/dexter.ts b/src/sdks/dexter.ts index fbbebdacd..9154b9e65 100644 --- a/src/sdks/dexter.ts +++ b/src/sdks/dexter.ts @@ -3,6 +3,10 @@ import { createAIFunction } from '@dexaai/dexter' import type { AIFunctionSet } from '../ai-function-set.js' import { AIToolsProvider } from '../fns.js' +/** + * Converts a set of Agentic stdlib AI functions to an array of Dexter- + * compatible AI functions. + */ export function functions(input: AIToolsProvider | AIFunctionSet) { const fns = input instanceof AIToolsProvider ? input.functions : input diff --git a/src/sdks/genkit.ts b/src/sdks/genkit.ts new file mode 100644 index 000000000..03aaf4d2a --- /dev/null +++ b/src/sdks/genkit.ts @@ -0,0 +1,25 @@ +import { defineTool } from '@genkit-ai/ai' +import { z } from 'zod' + +import type { AIFunctionSet } from '../ai-function-set.js' +import { AIToolsProvider } from '../fns.js' + +/** + * Converts a set of Agentic stdlib AI functions to an array of Genkit- + * compatible tools. + */ +export function tools(input: AIToolsProvider | AIFunctionSet) { + const fns = input instanceof AIToolsProvider ? input.functions : input + + return fns.map((fn) => + defineTool( + { + name: fn.spec.name, + description: fn.spec.description, + inputSchema: fn.inputSchema, + outputSchema: z.any() + }, + fn.impl + ) + ) +} diff --git a/src/services/weather-client.test.ts b/src/services/weather-client.test.ts index e351f40a8..53ad2d1dc 100644 --- a/src/services/weather-client.test.ts +++ b/src/services/weather-client.test.ts @@ -7,8 +7,5 @@ test('WeatherClient.functions', () => { apiKey: 'sk-test' }) - const fns = [...weather.functions] - console.log(fns) - - expect(weather.functions.get('getCurrentWeather')).toBeTruthy() + expect(weather.functions.get('get_current_weather')).toBeTruthy() }) diff --git a/src/types.ts b/src/types.ts index ef3517374..49becdef2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,7 +13,7 @@ export type RelaxedJsonifiable = Jsonifiable | Record export interface AIFunctionSpec { name: string - description?: string + description: string parameters: Record } diff --git a/tsup.config.ts b/tsup.config.ts index 396849b5e..65b2015c9 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,7 +2,12 @@ import { defineConfig } from 'tsup' export default defineConfig([ { - entry: ['src/index.ts', 'src/sdks/ai-sdk.ts', 'src/sdks/dexter.ts'], + entry: [ + 'src/index.ts', + 'src/sdks/ai-sdk.ts', + 'src/sdks/dexter.ts', + 'src/sdks/genkit.ts' + ], outDir: 'dist', target: 'node18', platform: 'node', From 83cf65f9d0f3fee7aa9dd62b710065052707ebfe Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 03:06:45 -0500 Subject: [PATCH 23/81] feat: add langchain --- examples/ai-sdk/weather.ts | 4 +- examples/dexter/weather.ts | 4 +- examples/genkit/weather.ts | 6 +- examples/langchain/weather.ts | 39 +++ examples/package.json | 3 + package.json | 9 + pnpm-lock.yaml | 488 ++++++++++++++++++++++++++++++++++ readme.md | 12 +- src/sdks/ai-sdk.ts | 2 +- src/sdks/dexter.ts | 2 +- src/sdks/genkit.ts | 2 +- src/sdks/langchain.ts | 27 ++ 12 files changed, 584 insertions(+), 14 deletions(-) create mode 100644 examples/langchain/weather.ts create mode 100644 src/sdks/langchain.ts diff --git a/examples/ai-sdk/weather.ts b/examples/ai-sdk/weather.ts index d9e03f3cc..9c380eabe 100644 --- a/examples/ai-sdk/weather.ts +++ b/examples/ai-sdk/weather.ts @@ -5,14 +5,14 @@ import { openai } from '@ai-sdk/openai' import { generateText } from 'ai' import { WeatherClient } from '../../src/index.js' -import { tools } from '../../src/sdks/ai-sdk.js' +import { createAISDKTools } from '../../src/sdks/ai-sdk.js' async function main() { const weather = new WeatherClient() const result = await generateText({ model: openai('gpt-4-turbo'), - tools: tools(weather), + tools: createAISDKTools(weather), toolChoice: 'required', prompt: 'What is the weather in San Francisco and what attractions should I visit?' diff --git a/examples/dexter/weather.ts b/examples/dexter/weather.ts index 7e12d3146..c9c41f1ea 100644 --- a/examples/dexter/weather.ts +++ b/examples/dexter/weather.ts @@ -10,7 +10,7 @@ import { import { z } from 'zod' import { WeatherClient } from '../../src/index.js' -import { functions } from '../../src/sdks/dexter.js' +import { createDexterFunctions } from '../../src/sdks/dexter.js' /** Get the capital city for a given state. */ const getCapitalCity = createAIFunction( @@ -48,7 +48,7 @@ const weather = new WeatherClient() /** A runner that uses the weather and capital city functions. */ const weatherCapitalRunner = createAIRunner({ chatModel: new ChatModel({ params: { model: 'gpt-4-1106-preview' } }), - functions: [...functions(weather), getCapitalCity], + functions: [...createDexterFunctions(weather), getCapitalCity], systemMessage: `You use functions to answer questions about the weather and capital cities.` }) diff --git a/examples/genkit/weather.ts b/examples/genkit/weather.ts index a0a9f9361..637159274 100644 --- a/examples/genkit/weather.ts +++ b/examples/genkit/weather.ts @@ -6,7 +6,7 @@ import { configureGenkit } from '@genkit-ai/core' import { gpt4o, openAI } from 'genkitx-openai' import { WeatherClient } from '../../src/index.js' -import { tools } from '../../src/sdks/genkit.js' +import { createGenkitTools } from '../../src/sdks/genkit.js' async function main() { const weather = new WeatherClient() @@ -17,7 +17,7 @@ async function main() { const result = await generate({ model: gpt4o, - tools: tools(weather), + tools: createGenkitTools(weather), history: [ { role: 'system', @@ -28,7 +28,7 @@ async function main() { ] } ], - prompt: [{ text: 'What is the weather in San Francisco?' }] + prompt: 'What is the weather in San Francisco?' }) console.log(result) diff --git a/examples/langchain/weather.ts b/examples/langchain/weather.ts new file mode 100644 index 000000000..da16211f8 --- /dev/null +++ b/examples/langchain/weather.ts @@ -0,0 +1,39 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { ChatPromptTemplate } from '@langchain/core/prompts' +import { ChatOpenAI } from '@langchain/openai' +import { AgentExecutor, createToolCallingAgent } from 'langchain/agents' + +import { WeatherClient } from '../../src/index.js' +import { createLangChainTools } from '../../src/sdks/langchain.js' + +async function main() { + const weather = new WeatherClient() + + const tools = createLangChainTools(weather) + const agent = createToolCallingAgent({ + llm: new ChatOpenAI({ temperature: 0 }), + tools, + prompt: ChatPromptTemplate.fromMessages([ + ['system', 'You are a weather assistant. Be as concise as possible.'], + ['placeholder', '{chat_history}'], + ['human', '{input}'], + ['placeholder', '{agent_scratchpad}'] + ]) + }) + + const agentExecutor = new AgentExecutor({ + agent, + tools, + verbose: true + }) + + const result = await agentExecutor.invoke({ + input: 'What is the weather in San Francisco?' + }) + + console.log(result.output) +} + +await main() diff --git a/examples/package.json b/examples/package.json index a08d2cea6..89b28cff9 100644 --- a/examples/package.json +++ b/examples/package.json @@ -28,9 +28,12 @@ "@dexaai/dexter": "^2.0.3", "@genkit-ai/ai": "^0.5.2", "@genkit-ai/core": "^0.5.2", + "@langchain/core": "^0.2.5", + "@langchain/openai": "^0.1.1", "ai": "^3.1.22", "dotenv": "^16.4.5", "genkitx-openai": "^0.9.0", + "langchain": "^0.2.4", "zod": "^3.23.3" } } diff --git a/package.json b/package.json index eb429200b..5c38bb568 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "@dexaai/dexter": "^2.0.3", "@fisch0920/eslint-config": "^1.3.1", "@genkit-ai/ai": "^0.5.2", + "@langchain/core": "^0.2.5", "@total-typescript/ts-reset": "^0.5.1", "@types/node": "^20.12.7", "ai": "^3.1.22", @@ -96,12 +97,20 @@ }, "peerDependencies": { "@dexaai/dexter": "^2.0.3", + "@genkit-ai/ai": "^0.5.2", + "@langchain/core": "^0.2.5", "ai": "^3.1.22" }, "peerDependenciesMeta": { "@dexaai/dexter": { "optional": true }, + "@genkit-ai/ai": { + "optional": true + }, + "@langchain/core": { + "optional": true + }, "ai": { "optional": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85b1e2857..f199db354 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: '@genkit-ai/ai': specifier: ^0.5.2 version: 0.5.2 + '@langchain/core': + specifier: ^0.2.5 + version: 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 @@ -123,6 +126,12 @@ importers: '@genkit-ai/core': specifier: ^0.5.2 version: 0.5.2 + '@langchain/core': + specifier: ^0.2.5 + version: 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + '@langchain/openai': + specifier: ^0.1.1 + version: 0.1.1(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3)) ai: specifier: ^3.1.22 version: 3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) @@ -132,6 +141,9 @@ importers: genkitx-openai: specifier: ^0.9.0 version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2) + langchain: + specifier: ^0.2.4 + version: 0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3) zod: specifier: ^3.23.3 version: 3.23.8 @@ -425,6 +437,18 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@langchain/core@0.2.5': + resolution: {integrity: sha512-tMaKRFVewFn8crQwlbXGjT7hlMdX1yXHap1ebBx7Bb2C3C9AeZ+sXbX11m27yamypNlVVegwUcisw3YCaDkZJA==} + engines: {node: '>=18'} + + '@langchain/openai@0.1.1': + resolution: {integrity: sha512-0M7GOA7+dPMQATn8UrYBUp0tWxBJjsJEdRPf+MhDD4jdK70qfC6tBbB/lrT0HchVnz5GFE7az4EUtSh8LiUgzA==} + engines: {node: '>=18'} + + '@langchain/textsplitters@0.0.2': + resolution: {integrity: sha512-6bQOuYHTGYlkgPY/8M5WPq4nnXZpEysGzRopQCYjg2WLcEoIPUMMrXsAaNNdvU3BOeMrhin8izvpDPD165hX6Q==} + engines: {node: '>=18'} + '@ljharb/through@2.3.13': resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} @@ -800,9 +824,15 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/shimmer@1.0.5': resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@typescript-eslint/eslint-plugin@7.11.0': resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -1153,6 +1183,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1359,6 +1392,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -1840,6 +1877,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -2259,6 +2299,9 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-any-array@2.0.1: + resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -2515,6 +2558,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-tiktoken@1.0.12: + resolution: {integrity: sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2567,6 +2613,10 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonrepair@3.8.0: resolution: {integrity: sha512-89lrxpwp+IEcJ6kwglF0HH3Tl17J08JEpYfXnvvjdp4zV4rjSoGu2NdQHxBs7yTOk3ETjTn9du48pBy8iBqj1w==} hasBin: true @@ -2586,6 +2636,179 @@ packages: resolution: {integrity: sha512-QUViPXlgP6NKA57IAPff/aZSmRA6qs9wKxlEpayBorwRZG+x2LG7jD4kXh8lnH3q/gkUr64NyZ7kwErUEZJmlw==} engines: {node: '>=18'} + langchain@0.2.4: + resolution: {integrity: sha512-zBsBuNREn/3IlWvIQqhQ2iqf6JJhyjjsB1Db/keDkcgThPI3EcblC1pqAXU2BIKHmpNUkHBR2bAUok5+xtgOcw==} + engines: {node: '>=18'} + peerDependencies: + '@aws-sdk/client-s3': ^3.310.0 + '@aws-sdk/client-sagemaker-runtime': ^3.310.0 + '@aws-sdk/client-sfn': ^3.310.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@gomomento/sdk-web': ^1.51.1 + '@mendable/firecrawl-js': ^0.0.13 + '@notionhq/client': ^2.2.10 + '@pinecone-database/pinecone': '*' + '@supabase/supabase-js': ^2.10.0 + '@vercel/kv': ^0.2.3 + '@xata.io/client': ^0.28.0 + apify-client: ^2.7.1 + assemblyai: ^4.0.0 + axios: '*' + cheerio: ^1.0.0-rc.12 + chromadb: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + d3-dsv: ^2.0.0 + epub2: ^3.0.1 + faiss-node: '*' + fast-xml-parser: '*' + handlebars: ^4.7.8 + html-to-text: ^9.0.5 + ignore: ^5.2.0 + ioredis: ^5.3.2 + jsdom: '*' + mammoth: ^1.6.0 + mongodb: '>=5.2.0' + node-llama-cpp: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + pdf-parse: 1.1.1 + peggy: ^3.0.2 + playwright: ^1.32.1 + puppeteer: ^19.7.2 + pyodide: ^0.24.1 + redis: ^4.6.4 + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.12 + weaviate-ts-client: '*' + web-auth-library: ^1.0.3 + ws: ^8.14.2 + youtube-transcript: ^1.0.6 + youtubei.js: ^9.1.0 + peerDependenciesMeta: + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@gomomento/sdk-web': + optional: true + '@mendable/firecrawl-js': + optional: true + '@notionhq/client': + optional: true + '@pinecone-database/pinecone': + optional: true + '@supabase/supabase-js': + optional: true + '@vercel/kv': + optional: true + '@xata.io/client': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + axios: + optional: true + cheerio: + optional: true + chromadb: + optional: true + convex: + optional: true + couchbase: + optional: true + d3-dsv: + optional: true + epub2: + optional: true + faiss-node: + optional: true + fast-xml-parser: + optional: true + handlebars: + optional: true + html-to-text: + optional: true + ignore: + optional: true + ioredis: + optional: true + jsdom: + optional: true + mammoth: + optional: true + mongodb: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + peggy: + optional: true + playwright: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + youtube-transcript: + optional: true + youtubei.js: + optional: true + + langchainhub@0.0.11: + resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} + + langsmith@0.1.30: + resolution: {integrity: sha512-g8f10H1iiRjCweXJjgM3Y9xl6ApCa1OThDvc0BlSDLVrGVPy1on9wT39vAzYkeadC7oG48p7gfpGlYH3kLkJ9Q==} + peerDependencies: + '@langchain/core': '*' + langchain: '*' + openai: '*' + peerDependenciesMeta: + '@langchain/core': + optional: true + langchain: + optional: true + openai: + optional: true + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -2821,6 +3044,21 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + ml-array-mean@1.1.6: + resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} + + ml-array-sum@1.1.6: + resolution: {integrity: sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==} + + ml-distance-euclidean@2.0.0: + resolution: {integrity: sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==} + + ml-distance@4.0.1: + resolution: {integrity: sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==} + + ml-tree-similarity@1.0.0: + resolution: {integrity: sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==} + module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} @@ -2833,6 +3071,10 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} @@ -2932,6 +3174,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + num-sort@2.1.0: + resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} + engines: {node: '>=8'} + number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} @@ -3010,6 +3256,9 @@ packages: resolution: {integrity: sha512-470d4ibH5kizXflCzgur22GpM4nOjrg7WQ9jTOa3dNKEn248oBy4+pjOyfcFR4V4YUn/YlDNjp6h83PbviCCKQ==} hasBin: true + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3030,6 +3279,10 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3066,10 +3319,22 @@ packages: resolution: {integrity: sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==} engines: {node: '>=14.16'} + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + p-throttle@6.1.0: resolution: {integrity: sha512-eQMdGTxk2+047La67wefUtt0tEHh7D+C8Jl7QXoFCuIiNYeQ9zWs2AZiJdIAs72rSXZ06t11me2bgalRNdy3SQ==} engines: {node: '>=18'} + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + p-timeout@6.1.2: resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} engines: {node: '>=14.16'} @@ -3394,6 +3659,10 @@ packages: resolution: {integrity: sha512-Hp93f349DvdEqJFHiPyzNzVjT7lDDFtQJWRotQVQNl3CHr4j7oMHStQB9UH/CJSHTrevAZXFvomgzy8lXjrK0w==} engines: {node: '>=18'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3979,6 +4248,10 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -4495,6 +4768,82 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} + '@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3)': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.12 + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + + '@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3)': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.12 + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + transitivePeerDependencies: + - langchain + - openai + + '@langchain/openai@0.1.1(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))': + dependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + js-tiktoken: 1.0.12 + openai: 4.47.3 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + + '@langchain/openai@0.1.1(langchain@0.2.4(openai@4.47.3))': + dependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + js-tiktoken: 1.0.12 + openai: 4.47.3 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + transitivePeerDependencies: + - encoding + - langchain + optional: true + + '@langchain/textsplitters@0.0.2(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3)': + dependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + js-tiktoken: 1.0.12 + transitivePeerDependencies: + - langchain + - openai + + '@langchain/textsplitters@0.0.2(langchain@0.2.4(openai@4.47.3))(openai@4.47.3)': + dependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + js-tiktoken: 1.0.12 + transitivePeerDependencies: + - langchain + - openai + optional: true + '@ljharb/through@2.3.13': dependencies: call-bind: 1.0.7 @@ -4849,8 +5198,12 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/retry@0.12.0': {} + '@types/shimmer@1.0.5': {} + '@types/uuid@9.0.8': {} + '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 @@ -5262,6 +5615,8 @@ snapshots: binary-extensions@2.3.0: {} + binary-search@1.3.6: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -5500,6 +5855,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@10.0.1: {} + commander@12.1.0: {} commander@4.1.1: {} @@ -6091,6 +6448,8 @@ snapshots: event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} eventsource-parser@1.1.2: {} @@ -6599,6 +6958,8 @@ snapshots: ipaddr.js@1.9.1: {} + is-any-array@2.0.1: {} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -6805,6 +7166,10 @@ snapshots: joycon@3.1.1: {} + js-tiktoken@1.0.12: + dependencies: + base64-js: 1.5.1 + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -6841,6 +7206,8 @@ snapshots: chalk: 5.3.0 diff-match-patch: 1.0.5 + jsonpointer@5.0.1: {} + jsonrepair@3.8.0: {} jsx-ast-utils@3.3.5: @@ -6858,6 +7225,80 @@ snapshots: ky@1.3.0: {} + langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3): + dependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + '@langchain/openai': 0.1.1(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3)) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + binary-extensions: 2.3.0 + js-tiktoken: 1.0.12 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.11 + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 9.0.1 + yaml: 2.4.2 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + optionalDependencies: + axios: 1.7.2 + ignore: 5.3.1 + transitivePeerDependencies: + - encoding + - openai + + langchain@0.2.4(openai@4.47.3): + dependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + '@langchain/openai': 0.1.1(langchain@0.2.4(openai@4.47.3)) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + binary-extensions: 2.3.0 + js-tiktoken: 1.0.12 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.11 + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 9.0.1 + yaml: 2.4.2 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + transitivePeerDependencies: + - encoding + - openai + optional: true + + langchainhub@0.0.11: {} + + langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3): + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + langchain: 0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3) + openai: 4.47.3 + + langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(openai@4.47.3))(openai@4.47.3): + dependencies: + '@types/uuid': 9.0.8 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + langchain: 0.2.4(openai@4.47.3) + openai: 4.47.3 + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -7098,6 +7539,27 @@ snapshots: minipass@7.1.2: {} + ml-array-mean@1.1.6: + dependencies: + ml-array-sum: 1.1.6 + + ml-array-sum@1.1.6: + dependencies: + is-any-array: 2.0.1 + + ml-distance-euclidean@2.0.0: {} + + ml-distance@4.0.1: + dependencies: + ml-array-mean: 1.1.6 + ml-distance-euclidean: 2.0.0 + ml-tree-similarity: 1.0.0 + + ml-tree-similarity@1.0.0: + dependencies: + binary-search: 1.3.6 + num-sort: 2.1.0 + module-details-from-path@1.0.3: {} ms@2.0.0: {} @@ -7106,6 +7568,8 @@ snapshots: ms@2.1.3: {} + mustache@4.2.0: {} + mute-stream@0.0.7: {} mute-stream@0.0.8: {} @@ -7244,6 +7708,8 @@ snapshots: dependencies: path-key: 4.0.0 + num-sort@2.1.0: {} + number-is-nan@1.0.1: {} object-assign@4.1.1: {} @@ -7342,6 +7808,8 @@ snapshots: transitivePeerDependencies: - encoding + openapi-types@12.1.3: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -7369,6 +7837,8 @@ snapshots: p-cancelable@3.0.0: {} + p-finally@1.0.0: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -7402,8 +7872,22 @@ snapshots: mimic-fn: 4.0.0 type-fest: 3.13.1 + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + p-throttle@6.1.0: {} + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + p-timeout@6.1.2: {} p-try@2.2.0: {} @@ -7736,6 +8220,8 @@ snapshots: onetime: 6.0.0 signal-exit: 4.1.0 + retry@0.13.1: {} + reusify@1.0.4: {} rfdc@1.3.1: {} @@ -8361,6 +8847,8 @@ snapshots: utils-merge@1.0.1: {} + uuid@9.0.1: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: diff --git a/readme.md b/readme.md index f6dc04250..97655a47d 100644 --- a/readme.md +++ b/readme.md @@ -35,6 +35,13 @@ - weatherapi - wikipedia +## SDKs + +- vercel ai sdk +- dexa dexter +- firebase genkit +- langchain + ## TODO - core @@ -45,16 +52,13 @@ - agentic - walter - sdks - - ai sdk - - dexter - - genkit - - langchain - instructor-js - services - wolfram alpha - midjourney - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) + - provide a converter for langchain `DynamicStructuredTool` - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) diff --git a/src/sdks/ai-sdk.ts b/src/sdks/ai-sdk.ts index aea60da30..870a9871e 100644 --- a/src/sdks/ai-sdk.ts +++ b/src/sdks/ai-sdk.ts @@ -7,7 +7,7 @@ import { AIToolsProvider } from '../fns.js' * Converts a set of Agentic stdlib AI functions to an object compatible with * the Vercel AI SDK's `tools` parameter. */ -export function tools(tools: AIToolsProvider | AIFunctionSet) { +export function createAISDKTools(tools: AIToolsProvider | AIFunctionSet) { const fns = tools instanceof AIToolsProvider ? tools.functions : tools return Object.fromEntries( diff --git a/src/sdks/dexter.ts b/src/sdks/dexter.ts index 9154b9e65..14110b535 100644 --- a/src/sdks/dexter.ts +++ b/src/sdks/dexter.ts @@ -7,7 +7,7 @@ import { AIToolsProvider } from '../fns.js' * Converts a set of Agentic stdlib AI functions to an array of Dexter- * compatible AI functions. */ -export function functions(input: AIToolsProvider | AIFunctionSet) { +export function createDexterFunctions(input: AIToolsProvider | AIFunctionSet) { const fns = input instanceof AIToolsProvider ? input.functions : input return fns.map((fn) => diff --git a/src/sdks/genkit.ts b/src/sdks/genkit.ts index 03aaf4d2a..c38b53a25 100644 --- a/src/sdks/genkit.ts +++ b/src/sdks/genkit.ts @@ -8,7 +8,7 @@ import { AIToolsProvider } from '../fns.js' * Converts a set of Agentic stdlib AI functions to an array of Genkit- * compatible tools. */ -export function tools(input: AIToolsProvider | AIFunctionSet) { +export function createGenkitTools(input: AIToolsProvider | AIFunctionSet) { const fns = input instanceof AIToolsProvider ? input.functions : input return fns.map((fn) => diff --git a/src/sdks/langchain.ts b/src/sdks/langchain.ts new file mode 100644 index 000000000..b5650dcc2 --- /dev/null +++ b/src/sdks/langchain.ts @@ -0,0 +1,27 @@ +import { DynamicStructuredTool } from '@langchain/core/tools' + +import type { AIFunctionSet } from '../ai-function-set.js' +import { AIToolsProvider } from '../fns.js' +import { stringifyForModel } from '../stringify-for-model.js' + +/** + * Converts a set of Agentic stdlib AI functions to an array of LangChain- + * compatible tools. + */ +export function createLangChainTools(input: AIToolsProvider | AIFunctionSet) { + const fns = input instanceof AIToolsProvider ? input.functions : input + + return fns.map( + (fn) => + new DynamicStructuredTool({ + name: fn.spec.name, + description: fn.spec.description, + schema: fn.inputSchema, + func: async (input) => { + const result = await Promise.resolve(fn.impl(input)) + // LangChain tools require the output to be a string + return stringifyForModel(result) + } + }) + ) +} From 190ef0e100ba5c0bd61bef22572ef3648e5957df Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 03:16:23 -0500 Subject: [PATCH 24/81] =?UTF-8?q?=E2=98=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/ai-sdk/weather.ts | 7 ++-- examples/dexter/weather.ts | 69 +++++------------------------------ examples/langchain/weather.ts | 6 +-- 3 files changed, 16 insertions(+), 66 deletions(-) diff --git a/examples/ai-sdk/weather.ts b/examples/ai-sdk/weather.ts index 9c380eabe..35b60a8c1 100644 --- a/examples/ai-sdk/weather.ts +++ b/examples/ai-sdk/weather.ts @@ -11,11 +11,12 @@ async function main() { const weather = new WeatherClient() const result = await generateText({ - model: openai('gpt-4-turbo'), + model: openai('gpt-4o'), tools: createAISDKTools(weather), toolChoice: 'required', - prompt: - 'What is the weather in San Francisco and what attractions should I visit?' + temperature: 0, + system: 'You are a weather assistant. Be as concise as possible.', + prompt: 'What is the weather in San Francisco?' }) console.log(result.toolResults[0]) diff --git a/examples/dexter/weather.ts b/examples/dexter/weather.ts index c9c41f1ea..78ac72d7e 100644 --- a/examples/dexter/weather.ts +++ b/examples/dexter/weather.ts @@ -1,73 +1,22 @@ #!/usr/bin/env node import 'dotenv/config' -import { - ChatModel, - createAIFunction, - createAIRunner, - Msg -} from '@dexaai/dexter' -import { z } from 'zod' +import { ChatModel, createAIRunner } from '@dexaai/dexter' import { WeatherClient } from '../../src/index.js' import { createDexterFunctions } from '../../src/sdks/dexter.js' -/** Get the capital city for a given state. */ -const getCapitalCity = createAIFunction( - { - name: 'get_capital_city', - description: 'Use this to get the the capital city for a given state', - argsSchema: z.object({ - state: z - .string() - .length(2) - .describe( - 'The state to get the capital city for, using the two letter abbreviation e.g. CA' - ) - }) - }, - async ({ state }) => { - await new Promise((resolve) => setTimeout(resolve, 500)) - let capitalCity = '' - switch (state) { - case 'CA': - capitalCity = 'Sacramento' - break - case 'NY': - capitalCity = 'Albany' - break - default: - capitalCity = 'Unknown' - } - return { capitalCity } - } -) - -const weather = new WeatherClient() - -/** A runner that uses the weather and capital city functions. */ -const weatherCapitalRunner = createAIRunner({ - chatModel: new ChatModel({ params: { model: 'gpt-4-1106-preview' } }), - functions: [...createDexterFunctions(weather), getCapitalCity], - systemMessage: `You use functions to answer questions about the weather and capital cities.` -}) - async function main() { - // Run with a string input - const rString = await weatherCapitalRunner( - `Whats the capital of California and NY and the weather for both?` - ) - console.log('rString', rString) + const weather = new WeatherClient() - // Run with a message input - const rMessage = await weatherCapitalRunner({ - messages: [ - Msg.user( - `Whats the capital of California and NY and the weather for both?` - ) - ] + const runner = createAIRunner({ + chatModel: new ChatModel({ params: { model: 'gpt-4o', temperature: 0 } }), + functions: createDexterFunctions(weather), + systemMessage: 'You are a weather assistant. Be as concise as possible.' }) - console.log('rMessage', rMessage) + + const result = await runner('What is the weather in San Francisco?') + console.log(result) } await main() diff --git a/examples/langchain/weather.ts b/examples/langchain/weather.ts index da16211f8..75081737d 100644 --- a/examples/langchain/weather.ts +++ b/examples/langchain/weather.ts @@ -13,7 +13,7 @@ async function main() { const tools = createLangChainTools(weather) const agent = createToolCallingAgent({ - llm: new ChatOpenAI({ temperature: 0 }), + llm: new ChatOpenAI({ model: 'gpt-4o', temperature: 0 }), tools, prompt: ChatPromptTemplate.fromMessages([ ['system', 'You are a weather assistant. Be as concise as possible.'], @@ -25,8 +25,8 @@ async function main() { const agentExecutor = new AgentExecutor({ agent, - tools, - verbose: true + tools + // verbose: true }) const result = await agentExecutor.invoke({ From 4b4e7e051009f925983a544c655f67aee9e6ab79 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 17:30:39 -0500 Subject: [PATCH 25/81] feat: add openai example --- examples/ai-sdk/weather.ts | 2 +- examples/dexter/weather.ts | 2 +- examples/genkit/weather.ts | 2 +- examples/langchain/weather.ts | 2 +- examples/openai/weather.ts | 57 +++++++++++++++++++++++++ examples/package.json | 2 + package.json | 5 ++- pnpm-lock.yaml | 80 ++++++++++++++++++++++++++++++----- readme.md | 12 ++---- src/ai-function-set.ts | 11 +++++ src/ai-tool-set.ts | 8 ++++ src/types.ts | 4 +- tsconfig.json | 5 ++- 13 files changed, 166 insertions(+), 26 deletions(-) create mode 100644 examples/openai/weather.ts diff --git a/examples/ai-sdk/weather.ts b/examples/ai-sdk/weather.ts index 35b60a8c1..0ef7ae4b3 100644 --- a/examples/ai-sdk/weather.ts +++ b/examples/ai-sdk/weather.ts @@ -15,7 +15,7 @@ async function main() { tools: createAISDKTools(weather), toolChoice: 'required', temperature: 0, - system: 'You are a weather assistant. Be as concise as possible.', + system: 'You are a helpful assistant. Be as concise as possible.', prompt: 'What is the weather in San Francisco?' }) diff --git a/examples/dexter/weather.ts b/examples/dexter/weather.ts index 78ac72d7e..511ee302e 100644 --- a/examples/dexter/weather.ts +++ b/examples/dexter/weather.ts @@ -12,7 +12,7 @@ async function main() { const runner = createAIRunner({ chatModel: new ChatModel({ params: { model: 'gpt-4o', temperature: 0 } }), functions: createDexterFunctions(weather), - systemMessage: 'You are a weather assistant. Be as concise as possible.' + systemMessage: 'You are a helpful assistant. Be as concise as possible.' }) const result = await runner('What is the weather in San Francisco?') diff --git a/examples/genkit/weather.ts b/examples/genkit/weather.ts index 637159274..7f6557fa9 100644 --- a/examples/genkit/weather.ts +++ b/examples/genkit/weather.ts @@ -23,7 +23,7 @@ async function main() { role: 'system', content: [ { - text: 'You are a weather assistant. Be as concise as possible.' + text: 'You are a helpful assistant. Be as concise as possible.' } ] } diff --git a/examples/langchain/weather.ts b/examples/langchain/weather.ts index 75081737d..112c90af4 100644 --- a/examples/langchain/weather.ts +++ b/examples/langchain/weather.ts @@ -16,7 +16,7 @@ async function main() { llm: new ChatOpenAI({ model: 'gpt-4o', temperature: 0 }), tools, prompt: ChatPromptTemplate.fromMessages([ - ['system', 'You are a weather assistant. Be as concise as possible.'], + ['system', 'You are a helpful assistant. Be as concise as possible.'], ['placeholder', '{chat_history}'], ['human', '{input}'], ['placeholder', '{agent_scratchpad}'] diff --git a/examples/openai/weather.ts b/examples/openai/weather.ts new file mode 100644 index 000000000..39ac02df5 --- /dev/null +++ b/examples/openai/weather.ts @@ -0,0 +1,57 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import OpenAI from 'openai' +import { default as assert } from 'tiny-invariant' + +import { WeatherClient } from '../../src/index.js' + +async function main() { + const weather = new WeatherClient() + const openai = new OpenAI() + + const messages: OpenAI.ChatCompletionMessageParam[] = [ + { + role: 'system', + content: 'You are a helpful assistant. Be as concise as possible.' + }, + { role: 'user', content: 'What is the weather in San Francisco?' } + ] + + const res0 = await openai.chat.completions.create({ + messages, + model: 'gpt-4o', + temperature: 0, + tools: weather.tools.specs, + tool_choice: 'required' + }) + const message0 = res0.choices[0]?.message! + console.log(JSON.stringify(message0, null, 2)) + assert(message0.role === 'assistant') + assert(message0.tool_calls?.[0]?.function?.name === 'get_current_weather') + + const getCurrentWeather = weather.tools.get('get_current_weather')!.function + assert(getCurrentWeather) + + const toolParams = message0.tool_calls[0].function.arguments + assert(typeof toolParams === 'string') + const toolResult = await getCurrentWeather(toolParams) + + messages.push(message0) + messages.push({ + role: 'tool', + tool_call_id: message0.tool_calls[0].id, + content: JSON.stringify(toolResult) + }) + + const res1 = await openai.chat.completions.create({ + messages, + model: 'gpt-4o', + temperature: 0, + tools: weather.tools.specs + }) + const message1 = res1.choices[0].message + console.log(JSON.stringify(message1, null, 2)) +} + +await main() diff --git a/examples/package.json b/examples/package.json index 89b28cff9..5e90477da 100644 --- a/examples/package.json +++ b/examples/package.json @@ -28,12 +28,14 @@ "@dexaai/dexter": "^2.0.3", "@genkit-ai/ai": "^0.5.2", "@genkit-ai/core": "^0.5.2", + "@instructor-ai/instructor": "^1.3.0", "@langchain/core": "^0.2.5", "@langchain/openai": "^0.1.1", "ai": "^3.1.22", "dotenv": "^16.4.5", "genkitx-openai": "^0.9.0", "langchain": "^0.2.4", + "openai": "^4.47.3", "zod": "^3.23.3" } } diff --git a/package.json b/package.json index 5c38bb568..ba061f362 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,12 @@ }, "devDependencies": { "@dexaai/dexter": "^2.0.3", - "@fisch0920/eslint-config": "^1.3.1", + "@fisch0920/eslint-config": "^1.3.3", "@genkit-ai/ai": "^0.5.2", + "@instructor-ai/instructor": "^1.3.0", "@langchain/core": "^0.2.5", "@total-typescript/ts-reset": "^0.5.1", - "@types/node": "^20.12.7", + "@types/node": "^20.13.0", "ai": "^3.1.22", "del-cli": "^5.1.0", "dotenv": "^16.4.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f199db354..5f1eacdfd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,11 +46,14 @@ importers: specifier: ^2.0.3 version: 2.1.0 '@fisch0920/eslint-config': - specifier: ^1.3.1 - version: 1.3.2(eslint@8.57.0)(typescript@5.4.5) + specifier: ^1.3.3 + version: 1.3.3(eslint@8.57.0)(typescript@5.4.5) '@genkit-ai/ai': specifier: ^0.5.2 version: 0.5.2 + '@instructor-ai/instructor': + specifier: ^1.3.0 + version: 1.3.0(openai@4.47.3)(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 version: 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) @@ -58,7 +61,7 @@ importers: specifier: ^0.5.1 version: 0.5.1 '@types/node': - specifier: ^20.12.7 + specifier: ^20.13.0 version: 20.13.0 ai: specifier: ^3.1.22 @@ -126,6 +129,9 @@ importers: '@genkit-ai/core': specifier: ^0.5.2 version: 0.5.2 + '@instructor-ai/instructor': + specifier: ^1.3.0 + version: 1.3.0(openai@4.47.3)(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 version: 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) @@ -144,6 +150,9 @@ importers: langchain: specifier: ^0.2.4 version: 0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3) + openai: + specifier: ^4.47.3 + version: 4.47.3 zod: specifier: ^3.23.3 version: 3.23.8 @@ -369,8 +378,8 @@ packages: '@fastify/deepmerge@1.3.0': resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - '@fisch0920/eslint-config@1.3.2': - resolution: {integrity: sha512-CUpMxCPWzoxvWFlmvH0OthooRlenqrezrVVleKEZv+NbibwgT4phyZadBLYsF8aB7Et2OoEzk4LKg8Xsdu5spA==} + '@fisch0920/eslint-config@1.3.3': + resolution: {integrity: sha512-BhjKXkVVSmdj1M60rAbJMaM1yFUFMlOeaWNmxOL4SNgLF2TR+LFNlcUkVH7bb2A5sq4BEc+2POBCCDXwKOlbUg==} engines: {node: '>=18'} peerDependencies: typescript: ^5.0.0 @@ -405,6 +414,12 @@ packages: resolution: {integrity: sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==} engines: {node: '>=18'} + '@instructor-ai/instructor@1.3.0': + resolution: {integrity: sha512-nzadwGSkiVLcK3NAVeinPUrA6KwV5mkyWDGTXLMR8eXKbzlUwmLwQ+PTabPn2hCR+LtQ+7MvtuoR2acSTXgy6Q==} + peerDependencies: + openai: '>=4.28.0' + zod: '>=3.22.4' + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1265,8 +1280,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001625: - resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + caniuse-lite@1.0.30001626: + resolution: {integrity: sha512-JRW7kAH8PFJzoPCJhLSHgDgKg5348hsQ68aqb+slnzuB5QFERv846oA/mRChmlLAOdEDeOkRn3ynb1gSFnjt3w==} chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} @@ -3508,6 +3523,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + ramda@0.29.1: + resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -3719,6 +3737,11 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + schema-stream@3.1.0: + resolution: {integrity: sha512-R4PoSFJnMORRGJ5i5BTHRO2Ed3Lf2h8DMofHd5XBU4ZE0lEBCTGRqOXBurjTEO2QntPSYAhv93jLt8PFMqDEPw==} + peerDependencies: + zod: 3.22.4 + scoped-regex@3.0.0: resolution: {integrity: sha512-yEsN6TuxZhZ1Tl9iB81frTNS292m0I/IG7+w8lTvfcJQP2x3vnpOoevjBoE3Np5A6KnZM2+RtVenihj9t6NiYg==} engines: {node: '>=12'} @@ -4458,6 +4481,12 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zod-stream@1.0.3: + resolution: {integrity: sha512-HxK/PZ0faOMgI1Pgjhcwin22StvlwiaYo6R7jWCT3jOFcPa4wGyFLVpeC5TwmpT6YlZhNJfDoB0qJoa+rQLYmQ==} + peerDependencies: + openai: '>=4.24.1' + zod: '>=3.22.4' + zod-to-json-schema@3.22.5: resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} peerDependencies: @@ -4468,6 +4497,12 @@ packages: peerDependencies: zod: ^3.23.3 + zod-validation-error@2.1.0: + resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + zod-validation-error@3.3.0: resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} engines: {node: '>=18.0.0'} @@ -4650,7 +4685,7 @@ snapshots: '@fastify/deepmerge@1.3.0': {} - '@fisch0920/eslint-config@1.3.2(eslint@8.57.0)(typescript@5.4.5)': + '@fisch0920/eslint-config@1.3.3(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@rushstack/eslint-patch': 1.10.3 '@typescript-eslint/eslint-plugin': 7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) @@ -4731,6 +4766,13 @@ snapshots: '@inquirer/figures@1.0.3': {} + '@instructor-ai/instructor@1.3.0(openai@4.47.3)(zod@3.23.8)': + dependencies: + openai: 4.47.3 + zod: 3.23.8 + zod-stream: 1.0.3(openai@4.47.3)(zod@3.23.8) + zod-validation-error: 2.1.0(zod@3.23.8) + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5666,7 +5708,7 @@ snapshots: browserslist@4.23.0: dependencies: - caniuse-lite: 1.0.30001625 + caniuse-lite: 1.0.30001626 electron-to-chromium: 1.4.788 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) @@ -5724,7 +5766,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001625: {} + caniuse-lite@1.0.30001626: {} chai@5.1.1: dependencies: @@ -8041,6 +8083,8 @@ snapshots: quick-lru@5.1.1: {} + ramda@0.29.1: {} + range-parser@1.2.1: {} raw-body@2.5.2: @@ -8291,6 +8335,11 @@ snapshots: safer-buffer@2.1.2: {} + schema-stream@3.1.0(zod@3.23.8): + dependencies: + ramda: 0.29.1 + zod: 3.23.8 + scoped-regex@3.0.0: {} secure-json-parse@2.7.0: {} @@ -9070,6 +9119,13 @@ snapshots: yocto-queue@1.0.0: {} + zod-stream@1.0.3(openai@4.47.3)(zod@3.23.8): + dependencies: + openai: 4.47.3 + schema-stream: 3.1.0(zod@3.23.8) + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-to-json-schema@3.22.5(zod@3.23.8): dependencies: zod: 3.23.8 @@ -9078,6 +9134,10 @@ snapshots: dependencies: zod: 3.23.8 + zod-validation-error@2.1.0(zod@3.23.8): + dependencies: + zod: 3.23.8 + zod-validation-error@3.3.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/readme.md b/readme.md index 97655a47d..6732ff241 100644 --- a/readme.md +++ b/readme.md @@ -13,7 +13,7 @@ Discuss on Twitter

-# Walter +# Agentic **Coming soon** @@ -44,15 +44,11 @@ ## TODO -- core - - company schema - - person schema - - database - - move out to a separate project - - agentic - - walter +- rename this repo to agentic +- change license to MIT - sdks - instructor-js + - TODO - services - wolfram alpha - midjourney diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index 6dfdf20cd..c011e688c 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -58,6 +58,17 @@ export class AIFunctionSet implements Iterable { return [...this.entries].map(fn) } + get specs(): types.AIFunctionSpec[] { + return this.map((fn) => fn.spec) + } + + get toolSpecs(): types.AIToolSpec[] { + return this.map((fn) => ({ + type: 'function' as const, + function: fn.spec + })) + } + get entries(): IterableIterator { return this._map.values() } diff --git a/src/ai-tool-set.ts b/src/ai-tool-set.ts index 0748aa2a3..d7b21c622 100644 --- a/src/ai-tool-set.ts +++ b/src/ai-tool-set.ts @@ -62,6 +62,14 @@ export class AIToolSet implements Iterable { return [...this.entries].map(fn) } + get functionSpecs(): types.AIFunctionSpec[] { + return this.map((fn) => fn.function.spec) + } + + get specs(): types.AIToolSpec[] { + return this.map((fn) => fn.spec) + } + get entries(): IterableIterator { return this._map.values() } diff --git a/src/types.ts b/src/types.ts index 49becdef2..17a5215fe 100644 --- a/src/types.ts +++ b/src/types.ts @@ -34,7 +34,9 @@ export type AIFunctionImpl = Omit< export interface AIFunction< InputSchema extends z.ZodObject = z.ZodObject, Return = any -> extends AIFunctionImpl { +> { + (input: string | Msg): MaybePromise + /** The Zod schema for the arguments string. */ inputSchema: InputSchema diff --git a/tsconfig.json b/tsconfig.json index 4f2456ed3..c47b9c4ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,5 +25,8 @@ "outDir": "dist", "sourceMap": true }, - "include": ["src"] + "include": ["src"], + "ts-node": { + "transpileOnly": true + } } From 65e2e73a00e35eadac9f1e3ae06ea1288a90b241 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 18:13:24 -0500 Subject: [PATCH 26/81] =?UTF-8?q?=F0=9F=90=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/openai/weather.ts | 74 ++++++++++--------- src/{ai-function.ts => create-ai-function.ts} | 11 ++- src/fns.ts | 11 +-- src/index.ts | 2 +- 4 files changed, 54 insertions(+), 44 deletions(-) rename src/{ai-function.ts => create-ai-function.ts} (87%) diff --git a/examples/openai/weather.ts b/examples/openai/weather.ts index 39ac02df5..7c8658802 100644 --- a/examples/openai/weather.ts +++ b/examples/openai/weather.ts @@ -18,40 +18,46 @@ async function main() { { role: 'user', content: 'What is the weather in San Francisco?' } ] - const res0 = await openai.chat.completions.create({ - messages, - model: 'gpt-4o', - temperature: 0, - tools: weather.tools.specs, - tool_choice: 'required' - }) - const message0 = res0.choices[0]?.message! - console.log(JSON.stringify(message0, null, 2)) - assert(message0.role === 'assistant') - assert(message0.tool_calls?.[0]?.function?.name === 'get_current_weather') - - const getCurrentWeather = weather.tools.get('get_current_weather')!.function - assert(getCurrentWeather) - - const toolParams = message0.tool_calls[0].function.arguments - assert(typeof toolParams === 'string') - const toolResult = await getCurrentWeather(toolParams) - - messages.push(message0) - messages.push({ - role: 'tool', - tool_call_id: message0.tool_calls[0].id, - content: JSON.stringify(toolResult) - }) - - const res1 = await openai.chat.completions.create({ - messages, - model: 'gpt-4o', - temperature: 0, - tools: weather.tools.specs - }) - const message1 = res1.choices[0].message - console.log(JSON.stringify(message1, null, 2)) + const tools = weather.tools + + { + // First call to OpenAI to invoke the weather tool + const res = await openai.chat.completions.create({ + messages, + model: 'gpt-4o', + temperature: 0, + tools: tools.specs, + tool_choice: 'required' + }) + const message = res.choices[0]?.message! + console.log(JSON.stringify(message, null, 2)) + assert(message.tool_calls?.[0]?.function?.name === 'get_current_weather') + + const fn = tools.get('get_current_weather')!.function + assert(fn) + + const toolParams = message.tool_calls[0].function.arguments + const toolResult = await fn(toolParams) + + messages.push(message) + messages.push({ + role: 'tool', + tool_call_id: message.tool_calls[0].id, + content: JSON.stringify(toolResult) + }) + } + + { + // Second call to OpenAI to generate a text response + const res = await openai.chat.completions.create({ + messages, + model: 'gpt-4o', + temperature: 0, + tools: tools.specs + }) + const message = res.choices[0].message + console.log(JSON.stringify(message, null, 2)) + } } await main() diff --git a/src/ai-function.ts b/src/create-ai-function.ts similarity index 87% rename from src/ai-function.ts rename to src/create-ai-function.ts index 6c8fd1e1a..c2988829f 100644 --- a/src/ai-function.ts +++ b/src/create-ai-function.ts @@ -26,12 +26,15 @@ export function createAIFunction, Return>( /** Implementation of the function to call with the parsed arguments. */ implementation: (params: z.infer) => types.MaybePromise ): types.AIFunction { - assert(spec.name, 'Missing required AIFunction "spec.name"') - assert(spec.inputSchema, 'Missing required AIFunction "spec.inputSchema"') - assert(implementation, 'Missing required AIFunction "implementation"') + assert(spec.name, 'createAIFunction missing required "spec.name"') + assert( + spec.inputSchema, + 'createAIFunction missing required "spec.inputSchema"' + ) + assert(implementation, 'createAIFunction missing required "implementation"') assert( typeof implementation === 'function', - 'Required AIFunction "implementation" must be a function' + 'createAIFunction "implementation" must be a function' ) /** Parse the arguments string, optionally reading from a message. */ diff --git a/src/fns.ts b/src/fns.ts index dbea51a09..cd8d2efbd 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -3,9 +3,9 @@ import './symbol-polyfill.js' import type { z } from 'zod' import type * as types from './types.js' -import { createAIFunction } from './ai-function.js' import { AIFunctionSet } from './ai-function-set.js' import { AIToolSet } from './ai-tool-set.js' +import { createAIFunction } from './create-ai-function.js' import { assert } from './utils.js' export interface Invocable { @@ -35,7 +35,7 @@ export abstract class AIToolsProvider { // console.log({ metadata, invocables }) const aiFunctions = invocables.map((invocable) => { - const impl = (this as any)[invocable.methodName]?.bind(this) + const impl = (this as any)[invocable.methodName] assert(impl) return createAIFunction(invocable, impl) @@ -87,14 +87,15 @@ export function aiFunction< inputSchema, methodName }) + // console.log({ // name, // methodName, // context // }) - // context.addInitializer(function () { - // ;(this as any)[methodName] = (this as any)[methodName].bind(this) - // }) + context.addInitializer(function () { + ;(this as any)[methodName] = (this as any)[methodName].bind(this) + }) } } diff --git a/src/index.ts b/src/index.ts index 2cfdd4cc7..2032dadd2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ -export * from './ai-function.js' export * from './ai-function-set.js' export * from './ai-tool-set.js' +export * from './create-ai-function.js' export * from './errors.js' export * from './fns.js' export * from './parse-structured-output.js' From a5bf1736a9be1095f27bb0f400bf1613f3a4d6ee Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 18:31:09 -0500 Subject: [PATCH 27/81] feat: remove AIToolSet in favor of just AIFunctionSet --- examples/openai/weather.ts | 8 +- package.json | 1 - src/ai-function-set.ts | 22 ++-- src/ai-tool-set.ts | 100 ------------------ ...ion.test.ts => create-ai-function.test.ts} | 2 +- src/fns.ts | 12 +-- src/index.ts | 2 +- src/sdks/ai-sdk.ts | 10 +- src/sdks/dexter.ts | 10 +- src/sdks/genkit.ts | 8 +- src/sdks/langchain.ts | 8 +- src/services/serpapi-client.ts | 4 +- src/services/serper-client.ts | 4 +- src/services/weather-client.test.ts | 11 -- src/services/weather-client.ts | 4 +- src/types.ts | 5 + 16 files changed, 46 insertions(+), 165 deletions(-) delete mode 100644 src/ai-tool-set.ts rename src/{ai-function.test.ts => create-ai-function.test.ts} (94%) delete mode 100644 src/services/weather-client.test.ts diff --git a/examples/openai/weather.ts b/examples/openai/weather.ts index 7c8658802..853a985be 100644 --- a/examples/openai/weather.ts +++ b/examples/openai/weather.ts @@ -18,22 +18,20 @@ async function main() { { role: 'user', content: 'What is the weather in San Francisco?' } ] - const tools = weather.tools - { // First call to OpenAI to invoke the weather tool const res = await openai.chat.completions.create({ messages, model: 'gpt-4o', temperature: 0, - tools: tools.specs, + tools: weather.functions.toolSpecs, tool_choice: 'required' }) const message = res.choices[0]?.message! console.log(JSON.stringify(message, null, 2)) assert(message.tool_calls?.[0]?.function?.name === 'get_current_weather') - const fn = tools.get('get_current_weather')!.function + const fn = weather.functions.get('get_current_weather')! assert(fn) const toolParams = message.tool_calls[0].function.arguments @@ -53,7 +51,7 @@ async function main() { messages, model: 'gpt-4o', temperature: 0, - tools: tools.specs + tools: weather.functions.toolSpecs }) const message = res.choices[0].message console.log(JSON.stringify(message, null, 2)) diff --git a/package.json b/package.json index ba061f362..4479219fc 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "scripts": { "preinstall": "npx only-allow pnpm", "build": "tsc", - "dev": "tsup --watch", "clean": "del dist", "prebuild": "run-s clean", "predev": "run-s clean", diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index c011e688c..50aaec5c9 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -1,13 +1,19 @@ -import type { AIToolSet } from './ai-tool-set.js' import type * as types from './types.ts' +import { AIFunctionsProvider } from './fns.js' export class AIFunctionSet implements Iterable { protected readonly _map: Map - constructor(functions?: readonly types.AIFunction[]) { - this._map = new Map( - functions ? functions.map((fn) => [fn.spec.name, fn]) : null + constructor(aiFunctionLikeObjects?: types.AIFunctionLike[]) { + const fns = aiFunctionLikeObjects?.flatMap((fn) => + fn instanceof AIFunctionsProvider + ? [...fn.functions] + : fn instanceof AIFunctionSet + ? [...fn] + : [fn] ) + + this._map = new Map(fns ? fns.map((fn) => [fn.spec.name, fn]) : null) } get size(): number { @@ -76,12 +82,4 @@ export class AIFunctionSet implements Iterable { [Symbol.iterator](): Iterator { return this.entries } - - static fromAIToolSet(tools: AIToolSet): AIFunctionSet { - return new AIFunctionSet( - Array.from(tools) - .filter((tool) => tool.spec.type === 'function') - .map((tool) => tool.function) - ) - } } diff --git a/src/ai-tool-set.ts b/src/ai-tool-set.ts deleted file mode 100644 index d7b21c622..000000000 --- a/src/ai-tool-set.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type * as types from './types.js' -import { AIFunctionSet } from './ai-function-set.js' - -export class AIToolSet implements Iterable { - protected _map: Map - - constructor(tools?: readonly types.AITool[]) { - this._map = new Map( - tools ? tools.map((tool) => [tool.spec.function.name, tool]) : [] - ) - } - - get size(): number { - return this._map.size - } - - add(tool: types.AITool): this { - this._map.set(tool.spec.function.name, tool) - return this - } - - get(name: string): types.AITool | undefined { - return this._map.get(name) - } - - set(name: string, tool: types.AITool): this { - this._map.set(name, tool) - return this - } - - has(name: string): boolean { - return this._map.has(name) - } - - clear(): void { - this._map.clear() - } - - delete(name: string): boolean { - return this._map.delete(name) - } - - pick(...keys: string[]): AIToolSet { - const keysToIncludeSet = new Set(keys) - return new AIToolSet( - Array.from(this).filter((tool) => - keysToIncludeSet.has(tool.spec.function.name) - ) - ) - } - - omit(...keys: string[]): AIToolSet { - const keysToExcludeSet = new Set(keys) - return new AIToolSet( - Array.from(this).filter( - (tool) => !keysToExcludeSet.has(tool.spec.function.name) - ) - ) - } - - map(fn: (fn: types.AITool) => T): T[] { - return [...this.entries].map(fn) - } - - get functionSpecs(): types.AIFunctionSpec[] { - return this.map((fn) => fn.function.spec) - } - - get specs(): types.AIToolSpec[] { - return this.map((fn) => fn.spec) - } - - get entries(): IterableIterator { - return this._map.values() - } - - [Symbol.iterator](): Iterator { - return this.entries - } - - static fromAIFunctionSet(functions: AIFunctionSet): AIToolSet { - return new AIToolSet( - Array.from(functions).map((fn) => ({ - function: fn, - spec: { - type: 'function' as const, - function: fn.spec - } - })) - ) - } - - static fromFunctions(functions: types.AIFunction[]): AIToolSet { - return AIToolSet.fromAIFunctionSet(new AIFunctionSet(functions)) - } - - static fromTools(tools: types.AITool[]): AIToolSet { - return new AIToolSet(tools) - } -} diff --git a/src/ai-function.test.ts b/src/create-ai-function.test.ts similarity index 94% rename from src/ai-function.test.ts rename to src/create-ai-function.test.ts index 8b5262a2d..94c3a62b0 100644 --- a/src/ai-function.test.ts +++ b/src/create-ai-function.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import { z } from 'zod' -import { createAIFunction } from './ai-function.js' +import { createAIFunction } from './create-ai-function.js' const fullName = createAIFunction( { diff --git a/src/fns.ts b/src/fns.ts index cd8d2efbd..1543e15eb 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -4,7 +4,6 @@ import type { z } from 'zod' import type * as types from './types.js' import { AIFunctionSet } from './ai-function-set.js' -import { AIToolSet } from './ai-tool-set.js' import { createAIFunction } from './create-ai-function.js' import { assert } from './utils.js' @@ -15,18 +14,9 @@ export interface Invocable { methodName: string } -export abstract class AIToolsProvider { - private _tools?: AIToolSet +export abstract class AIFunctionsProvider { private _functions?: AIFunctionSet - get tools(): AIToolSet { - if (!this._tools) { - this._tools = AIToolSet.fromAIFunctionSet(this.functions) - } - - return this._tools - } - get functions(): AIFunctionSet { if (!this._functions) { const metadata = this.constructor[Symbol.metadata] diff --git a/src/index.ts b/src/index.ts index 2032dadd2..269386e00 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ export * from './ai-function-set.js' -export * from './ai-tool-set.js' +export * from './create-ai-function.js' export * from './create-ai-function.js' export * from './errors.js' export * from './fns.js' diff --git a/src/sdks/ai-sdk.ts b/src/sdks/ai-sdk.ts index 870a9871e..7edaa5fe6 100644 --- a/src/sdks/ai-sdk.ts +++ b/src/sdks/ai-sdk.ts @@ -1,17 +1,17 @@ import { tool } from 'ai' -import type { AIFunctionSet } from '../ai-function-set.js' -import { AIToolsProvider } from '../fns.js' +import type { AIFunctionLike } from '../types.js' +import { AIFunctionSet } from '../ai-function-set.js' /** * Converts a set of Agentic stdlib AI functions to an object compatible with * the Vercel AI SDK's `tools` parameter. */ -export function createAISDKTools(tools: AIToolsProvider | AIFunctionSet) { - const fns = tools instanceof AIToolsProvider ? tools.functions : tools +export function createAISDKTools(...aiFunctionLikeTools: AIFunctionLike[]) { + const fns = new AIFunctionSet(aiFunctionLikeTools) return Object.fromEntries( - [...fns].map((fn) => [ + fns.map((fn) => [ fn.spec.name, tool({ description: fn.spec.description, diff --git a/src/sdks/dexter.ts b/src/sdks/dexter.ts index 14110b535..8e8df06f7 100644 --- a/src/sdks/dexter.ts +++ b/src/sdks/dexter.ts @@ -1,14 +1,16 @@ import { createAIFunction } from '@dexaai/dexter' -import type { AIFunctionSet } from '../ai-function-set.js' -import { AIToolsProvider } from '../fns.js' +import type { AIFunctionLike } from '../types.js' +import { AIFunctionSet } from '../ai-function-set.js' /** * Converts a set of Agentic stdlib AI functions to an array of Dexter- * compatible AI functions. */ -export function createDexterFunctions(input: AIToolsProvider | AIFunctionSet) { - const fns = input instanceof AIToolsProvider ? input.functions : input +export function createDexterFunctions( + ...aiFunctionLikeTools: AIFunctionLike[] +) { + const fns = new AIFunctionSet(aiFunctionLikeTools) return fns.map((fn) => createAIFunction( diff --git a/src/sdks/genkit.ts b/src/sdks/genkit.ts index c38b53a25..a9c454ba5 100644 --- a/src/sdks/genkit.ts +++ b/src/sdks/genkit.ts @@ -1,15 +1,15 @@ import { defineTool } from '@genkit-ai/ai' import { z } from 'zod' -import type { AIFunctionSet } from '../ai-function-set.js' -import { AIToolsProvider } from '../fns.js' +import type { AIFunctionLike } from '../types.js' +import { AIFunctionSet } from '../ai-function-set.js' /** * Converts a set of Agentic stdlib AI functions to an array of Genkit- * compatible tools. */ -export function createGenkitTools(input: AIToolsProvider | AIFunctionSet) { - const fns = input instanceof AIToolsProvider ? input.functions : input +export function createGenkitTools(...aiFunctionLikeTools: AIFunctionLike[]) { + const fns = new AIFunctionSet(aiFunctionLikeTools) return fns.map((fn) => defineTool( diff --git a/src/sdks/langchain.ts b/src/sdks/langchain.ts index b5650dcc2..b273c91f0 100644 --- a/src/sdks/langchain.ts +++ b/src/sdks/langchain.ts @@ -1,15 +1,15 @@ import { DynamicStructuredTool } from '@langchain/core/tools' -import type { AIFunctionSet } from '../ai-function-set.js' -import { AIToolsProvider } from '../fns.js' +import type { AIFunctionLike } from '../types.js' +import { AIFunctionSet } from '../ai-function-set.js' import { stringifyForModel } from '../stringify-for-model.js' /** * Converts a set of Agentic stdlib AI functions to an array of LangChain- * compatible tools. */ -export function createLangChainTools(input: AIToolsProvider | AIFunctionSet) { - const fns = input instanceof AIToolsProvider ? input.functions : input +export function createLangChainTools(...aiFunctionLikeTools: AIFunctionLike[]) { + const fns = new AIFunctionSet(aiFunctionLikeTools) return fns.map( (fn) => diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index af5f13091..f351f07ae 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -1,7 +1,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' -import { aiFunction, AIToolsProvider } from '../fns.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv } from '../utils.js' /** @@ -633,7 +633,7 @@ export namespace serpapi { * * @see https://serpapi.com/search-api */ -export class SerpAPIClient extends AIToolsProvider { +export class SerpAPIClient extends AIFunctionsProvider { protected ky: KyInstance protected apiKey: string protected apiBaseUrl: string diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 064f56de9..556dfb819 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -1,7 +1,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' -import { aiFunction, AIToolsProvider } from '../fns.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv } from '../utils.js' export namespace serper { @@ -194,7 +194,7 @@ export namespace serper { * * @see https://serper.dev */ -export class SerperClient extends AIToolsProvider { +export class SerperClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiKey: string readonly apiBaseUrl: string diff --git a/src/services/weather-client.test.ts b/src/services/weather-client.test.ts deleted file mode 100644 index 53ad2d1dc..000000000 --- a/src/services/weather-client.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { expect, test } from 'vitest' - -import { WeatherClient } from './weather-client.js' - -test('WeatherClient.functions', () => { - const weather = new WeatherClient({ - apiKey: 'sk-test' - }) - - expect(weather.functions.get('get_current_weather')).toBeTruthy() -}) diff --git a/src/services/weather-client.ts b/src/services/weather-client.ts index 4f032352c..c5cc94abe 100644 --- a/src/services/weather-client.ts +++ b/src/services/weather-client.ts @@ -1,7 +1,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' -import { aiFunction, AIToolsProvider } from '../fns.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv } from '../utils.js' export namespace weatherapi { @@ -74,7 +74,7 @@ export namespace weatherapi { } } -export class WeatherClient extends AIToolsProvider { +export class WeatherClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiKey: string readonly apiBaseUrl: string diff --git a/src/types.ts b/src/types.ts index 17a5215fe..653b16be8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,9 @@ import type { Jsonifiable } from 'type-fest' import type { z } from 'zod' +import type { AIFunctionSet } from './ai-function-set.js' +import type { AIFunctionsProvider } from './fns.js' + export type { KyInstance } from 'ky' export type { ThrottledFunction } from 'p-throttle' @@ -28,6 +31,8 @@ export type AIFunctionImpl = Omit< 'name' | 'toString' | 'arguments' | 'caller' | 'prototype' | 'length' > +export type AIFunctionLike = AIFunctionsProvider | AIFunction | AIFunctionSet + /** * A function meant to be used with LLM function calling. */ From 1a90a1e129dc594a3a1468c38060927d6531af76 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 19:12:22 -0500 Subject: [PATCH 28/81] =?UTF-8?q?=F0=9F=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 3 ++- src/ai-function-set.ts | 7 +++++++ src/fns.ts | 7 ++++--- src/services/serper-client.ts | 34 ++++++++++++++++++++++++++------ src/services/wikipedia-client.ts | 28 ++++++++++++++++++++++++-- 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 3441579cb..7c2b8dea8 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -29,7 +29,8 @@ async function main() { const wikipedia = new WikipediaClient() const res = await wikipedia.getPageSummary({ - title: 'Naruto_(TV_series)' + // title: 'Naruto_(TV_series)' + title: 'SpaceX' }) console.log(JSON.stringify(res, null, 2)) diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index 50aaec5c9..a053a56c9 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -1,6 +1,13 @@ import type * as types from './types.ts' import { AIFunctionsProvider } from './fns.js' +/** + * A set of AI functions intended to make it easier to work with large sets of + * AI functions across different clients. + * + * This class mimics a built-in `Set`, but with additional utility + * methods like `pick`, `omit`, and `map`. + */ export class AIFunctionSet implements Iterable { protected readonly _map: Map diff --git a/src/fns.ts b/src/fns.ts index 1543e15eb..7f827ef9c 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -7,7 +7,7 @@ import { AIFunctionSet } from './ai-function-set.js' import { createAIFunction } from './create-ai-function.js' import { assert } from './utils.js' -export interface Invocable { +export interface PrivateAIFunctionMetadata { name: string description: string inputSchema: z.AnyZodObject @@ -21,7 +21,8 @@ export abstract class AIFunctionsProvider { if (!this._functions) { const metadata = this.constructor[Symbol.metadata] assert(metadata) - const invocables = (metadata?.invocables as Invocable[]) ?? [] + const invocables = + (metadata?.invocables as PrivateAIFunctionMetadata[]) ?? [] // console.log({ metadata, invocables }) const aiFunctions = invocables.map((invocable) => { @@ -71,7 +72,7 @@ export function aiFunction< if (!context.metadata.invocables) { context.metadata.invocables = [] } - ;(context.metadata.invocables as Invocable[]).push({ + ;(context.metadata.invocables as PrivateAIFunctionMetadata[]).push({ name: name ?? methodName, description, inputSchema, diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 556dfb819..9fb227b1b 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -2,7 +2,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv } from '../utils.js' +import { assert, getEnv, omit } from '../utils.js' export namespace serper { export const BASE_URL = 'https://google.serper.dev' @@ -13,10 +13,25 @@ export namespace serper { gl: z.string().default('us').optional(), hl: z.string().default('en').optional(), page: z.number().int().positive().default(1).optional(), - num: z.number().int().positive().default(10).optional() + num: z + .number() + .int() + .positive() + .default(10) + .optional() + .describe('number of results to return') }) export type SearchParams = z.infer + export const GeneralSearchSchema = SearchParamsSchema.extend({ + type: z + .enum(['search', 'images', 'videos', 'places', 'news', 'shopping']) + .default('search') + .optional() + .describe('Type of Google search to perform') + }) + export type GeneralSearchParams = z.infer + export interface SearchResponse { searchParameters: SearchParameters & { type: 'search' } organic: Organic[] @@ -233,12 +248,19 @@ export class SerperClient extends AIFunctionsProvider { name: 'serper_google_search', description: 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', - inputSchema: serper.SearchParamsSchema.pick({ - q: true + inputSchema: serper.GeneralSearchSchema.pick({ + q: true, + num: true, + type: true }) }) - async search(queryOrOpts: string | serper.SearchParams) { - return this._fetch('search', queryOrOpts) + async search(queryOrOpts: string | serper.GeneralSearchParams) { + const searchType = + typeof queryOrOpts === 'string' ? 'search' : queryOrOpts.type || 'search' + return this._fetch( + searchType, + typeof queryOrOpts === 'string' ? queryOrOpts : omit(queryOrOpts, 'type') + ) } async searchImages(queryOrOpts: string | serper.SearchParams) { diff --git a/src/services/wikipedia-client.ts b/src/services/wikipedia-client.ts index 7dfd591fb..e8f0ebe29 100644 --- a/src/services/wikipedia-client.ts +++ b/src/services/wikipedia-client.ts @@ -1,10 +1,12 @@ import defaultKy, { type KyInstance } from 'ky' import pThrottle from 'p-throttle' +import { z } from 'zod' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, throttleKy } from '../utils.js' export namespace wikipedia { - // Only allow 200 requests per second + // Only allow 200 requests per second by default. export const throttle = pThrottle({ limit: 200, interval: 1000 @@ -94,7 +96,7 @@ export namespace wikipedia { } } -export class WikipediaClient { +export class WikipediaClient extends AIFunctionsProvider { readonly apiBaseUrl: string readonly apiUserAgent: string readonly ky: KyInstance @@ -114,6 +116,7 @@ export class WikipediaClient { } = {}) { assert(apiBaseUrl, 'WikipediaClient missing required "apiBaseUrl"') assert(apiUserAgent, 'WikipediaClient missing required "apiUserAgent"') + super() this.apiBaseUrl = apiBaseUrl this.apiUserAgent = apiUserAgent @@ -127,6 +130,13 @@ export class WikipediaClient { }) } + @aiFunction({ + name: 'wikipedia_search', + description: 'Searches Wikipedia for pages matching the given query.', + inputSchema: z.object({ + query: z.string().describe('Search query') + }) + }) async search({ query, ...opts }: wikipedia.SearchOptions) { return ( // https://www.mediawiki.org/wiki/API:REST_API @@ -138,12 +148,26 @@ export class WikipediaClient { ) } + @aiFunction({ + name: 'wikipedia_get_page_summary', + description: 'Gets a summary of the given Wikipedia page.', + inputSchema: z.object({ + title: z.string().describe('Wikipedia page title'), + acceptLanguage: z + .string() + .optional() + .default('en-us') + .describe('Locale code for the language to use.') + }) + }) async getPageSummary({ title, acceptLanguage = 'en-us', redirect = true, ...opts }: wikipedia.PageSummaryOptions) { + title = title.trim().replaceAll(' ', '_') + // https://en.wikipedia.org/api/rest_v1/ return this.ky .get(`page/summary/${title}`, { From 8fb9ddf27117d05045e02ea1d6602fecdadcd4dc Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 19:35:48 -0500 Subject: [PATCH 29/81] =?UTF-8?q?=F0=9F=A4=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/searxng-client.ts | 456 +++++++++++++++++---------------- src/services/serpapi-client.ts | 12 +- src/services/serper-client.ts | 4 +- 3 files changed, 253 insertions(+), 219 deletions(-) diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 97adc00e9..1103af235 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -1,222 +1,229 @@ import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, omit, pick, pruneUndefined } from '../utils.js' export namespace searxng { - export type SearchCategory = - | 'general' - | 'images' - | 'videos' - | 'news' - | 'map' - | 'music' - | 'it' - | 'science' - | 'files' - | 'social media' + export const SearchCategorySchema = z.enum([ + 'general', + 'images', + 'videos', + 'news', + 'map', + 'music', + 'it', + 'science', + 'files', + 'social media' + ]) + export type SearchCategory = z.infer - export type SearchEngine = - | '9gag' - | 'annas archive' - | 'apk mirror' - | 'apple app store' - | 'ahmia' - | 'anaconda' - | 'arch linux wiki' - | 'artic' - | 'arxiv' - | 'ask' - | 'bandcamp' - | 'wikipedia' - | 'bilibili' - | 'bing' - | 'bing images' - | 'bing news' - | 'bing videos' - | 'bitbucket' - | 'bpb' - | 'btdigg' - | 'ccc-tv' - | 'openverse' - | 'chefkoch' - | 'crossref' - | 'crowdview' - | 'yep' - | 'yep images' - | 'yep news' - | 'curlie' - | 'currency' - | 'bahnhof' - | 'deezer' - | 'destatis' - | 'deviantart' - | 'ddg definitions' - | 'docker hub' - | 'erowid' - | 'wikidata' - | 'duckduckgo' - | 'duckduckgo images' - | 'duckduckgo videos' - | 'duckduckgo news' - | 'duckduckgo weather' - | 'apple maps' - | 'emojipedia' - | 'tineye' - | 'etymonline' - | '1x' - | 'fdroid' - | 'flickr' - | 'free software directory' - | 'frinkiac' - | 'fyyd' - | 'genius' - | 'gentoo' - | 'gitlab' - | 'github' - | 'codeberg' - | 'goodreads' - | 'google' - | 'google images' - | 'google news' - | 'google videos' - | 'google scholar' - | 'google play apps' - | 'google play movies' - | 'material icons' - | 'gpodder' - | 'habrahabr' - | 'hackernews' - | 'hoogle' - | 'imdb' - | 'imgur' - | 'ina' - | 'invidious' - | 'jisho' - | 'kickass' - | 'lemmy communities' - | 'lemmy users' - | 'lemmy posts' - | 'lemmy comments' - | 'library genesis' - | 'z-library' - | 'library of congress' - | 'lingva' - | 'lobste.rs' - | 'mastodon users' - | 'mastodon hashtags' - | 'mdn' - | 'metacpan' - | 'mixcloud' - | 'mozhi' - | 'mwmbl' - | 'npm' - | 'nyaa' - | 'mankier' - | 'odysee' - | 'openairedatasets' - | 'openairepublications' - | 'openstreetmap' - | 'openrepos' - | 'packagist' - | 'pdbe' - | 'photon' - | 'pinterest' - | 'piped' - | 'piped.music' - | 'piratebay' - | 'podcastindex' - | 'presearch' - | 'presearch images' - | 'presearch videos' - | 'presearch news' - | 'pub.dev' - | 'pubmed' - | 'pypi' - | 'qwant' - | 'qwant news' - | 'qwant images' - | 'qwant videos' - | 'radio browser' - | 'reddit' - | 'rottentomatoes' - | 'sepiasearch' - | 'soundcloud' - | 'stackoverflow' - | 'askubuntu' - | 'internetarchivescholar' - | 'superuser' - | 'searchcode code' - | 'semantic scholar' - | 'startpage' - | 'tokyotoshokan' - | 'solidtorrents' - | 'tagesschau' - | 'tmdb' - | 'torch' - | 'unsplash' - | 'yandex music' - | 'yahoo' - | 'yahoo news' - | 'youtube' - | 'dailymotion' - | 'vimeo' - | 'wiby' - | 'alexandria' - | 'wikibooks' - | 'wikinews' - | 'wikiquote' - | 'wikisource' - | 'wikispecies' - | 'wiktionary' - | 'wikiversity' - | 'wikivoyage' - | 'wikicommons.images' - | 'wolframalpha' - | 'dictzone' - | 'mymemory translated' - | '1337x' - | 'duden' - | 'seznam' - | 'mojeek' - | 'moviepilot' - | 'naver' - | 'rubygems' - | 'peertube' - | 'mediathekviewweb' - | 'yacy' - | 'yacy images' - | 'rumble' - | 'livespace' - | 'wordnik' - | 'woxikon.de synonyme' - | 'seekr news' - | 'seekr images' - | 'seekr videos' - | 'sjp.pwn' - | 'stract' - | 'svgrepo' - | 'tootfinder' - | 'wallhaven' - | 'wikimini' - | 'wttr.in' - | 'yummly' - | 'brave' - | 'brave.images' - | 'brave.videos' - | 'brave.news' - | 'lib.rs' - | 'sourcehut' - | 'goo' - | 'bt4g' - | 'pkg.go.dev' + export const SearchEngineSchema = z.enum([ + '9gag', + 'annas archive', + 'apk mirror', + 'apple app store', + 'ahmia', + 'anaconda', + 'arch linux wiki', + 'artic', + 'arxiv', + 'ask', + 'bandcamp', + 'wikipedia', + 'bilibili', + 'bing', + 'bing images', + 'bing news', + 'bing videos', + 'bitbucket', + 'bpb', + 'btdigg', + 'ccc-tv', + 'openverse', + 'chefkoch', + 'crossref', + 'crowdview', + 'yep', + 'yep images', + 'yep news', + 'curlie', + 'currency', + 'bahnhof', + 'deezer', + 'destatis', + 'deviantart', + 'ddg definitions', + 'docker hub', + 'erowid', + 'wikidata', + 'duckduckgo', + 'duckduckgo images', + 'duckduckgo videos', + 'duckduckgo news', + 'duckduckgo weather', + 'apple maps', + 'emojipedia', + 'tineye', + 'etymonline', + '1x', + 'fdroid', + 'flickr', + 'free software directory', + 'frinkiac', + 'fyyd', + 'genius', + 'gentoo', + 'gitlab', + 'github', + 'codeberg', + 'goodreads', + 'google', + 'google images', + 'google news', + 'google videos', + 'google scholar', + 'google play apps', + 'google play movies', + 'material icons', + 'gpodder', + 'habrahabr', + 'hackernews', + 'hoogle', + 'imdb', + 'imgur', + 'ina', + 'invidious', + 'jisho', + 'kickass', + 'lemmy communities', + 'lemmy users', + 'lemmy posts', + 'lemmy comments', + 'library genesis', + 'z-library', + 'library of congress', + 'lingva', + 'lobste.rs', + 'mastodon users', + 'mastodon hashtags', + 'mdn', + 'metacpan', + 'mixcloud', + 'mozhi', + 'mwmbl', + 'npm', + 'nyaa', + 'mankier', + 'odysee', + 'openairedatasets', + 'openairepublications', + 'openstreetmap', + 'openrepos', + 'packagist', + 'pdbe', + 'photon', + 'pinterest', + 'piped', + 'piped.music', + 'piratebay', + 'podcastindex', + 'presearch', + 'presearch images', + 'presearch videos', + 'presearch news', + 'pub.dev', + 'pubmed', + 'pypi', + 'qwant', + 'qwant news', + 'qwant images', + 'qwant videos', + 'radio browser', + 'reddit', + 'rottentomatoes', + 'sepiasearch', + 'soundcloud', + 'stackoverflow', + 'askubuntu', + 'internetarchivescholar', + 'superuser', + 'searchcode code', + 'semantic scholar', + 'startpage', + 'tokyotoshokan', + 'solidtorrents', + 'tagesschau', + 'tmdb', + 'torch', + 'unsplash', + 'yandex music', + 'yahoo', + 'yahoo news', + 'youtube', + 'dailymotion', + 'vimeo', + 'wiby', + 'alexandria', + 'wikibooks', + 'wikinews', + 'wikiquote', + 'wikisource', + 'wikispecies', + 'wiktionary', + 'wikiversity', + 'wikivoyage', + 'wikicommons.images', + 'wolframalpha', + 'dictzone', + 'mymemory translated', + '1337x', + 'duden', + 'seznam', + 'mojeek', + 'moviepilot', + 'naver', + 'rubygems', + 'peertube', + 'mediathekviewweb', + 'yacy', + 'yacy images', + 'rumble', + 'livespace', + 'wordnik', + 'woxikon.de synonyme', + 'seekr news', + 'seekr images', + 'seekr videos', + 'sjp.pwn', + 'stract', + 'svgrepo', + 'tootfinder', + 'wallhaven', + 'wikimini', + 'wttr.in', + 'yummly', + 'brave', + 'brave.images', + 'brave.videos', + 'brave.news', + 'lib.rs', + 'sourcehut', + 'goo', + 'bt4g', + 'pkg.go.dev' + ]) + export type SearchEngine = z.infer - export interface SearchOptions { - query: string - categories?: SearchCategory[] - engines?: SearchEngine[] - language?: string - pageno?: number - } + export const SearchOptionsSchema = z.object({ + query: z.string().describe('search query'), + categories: z.array(SearchCategorySchema).optional(), + engines: z.array(SearchEngineSchema).optional(), + language: z.string().optional(), + pageno: z.number().int().optional() + }) + export type SearchOptions = z.infer export interface SearchResult { title: string @@ -246,7 +253,7 @@ export namespace searxng { * * See [perplexica](https://github.com/ItzCrazyKns/Perplexica/blob/master/docker-compose.yaml) for an example. */ -export class SearxngClient { +export class SearxngClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiBaseUrl: string @@ -254,7 +261,6 @@ export class SearxngClient { apiBaseUrl = getEnv('SEARXNG_API_BASE_URL'), ky = defaultKy }: { - apiKey?: string apiBaseUrl?: string ky?: KyInstance } = {}) { @@ -262,12 +268,34 @@ export class SearxngClient { apiBaseUrl, 'SearxngClient missing required "apiBaseUrl" (defaults to "SEARXNG_API_BASE_URL")' ) + super() this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: apiBaseUrl }) } + @aiFunction({ + name: 'searxng', + description: `Searches across multiple search engines using a local instance of Searxng. To search only specific engines, use the \`engines\` parameter. + +The most important search engines are: + +- "reddit" (Reddit posts) +- "google" (Google web search) +- "google news" (Google News search) +- "brave" (Brave web search) +- "arxiv" (academic papers) +- "genius" (Genius.com for song lyrics) +- "imdb" (movies and TV shows) +- "hackernews" (Hacker News) +- "wikidata" (Wikidata) +- "wolframalpha" (Wolfram Alpha) +- "youtube" (YouTube videos) +- "github" (GitHub code and repositories) +`, + inputSchema: searxng.SearchOptionsSchema + }) async search({ query, ...opts diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index f351f07ae..b84eab9e7 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -649,7 +649,7 @@ export class SerpAPIClient extends AIFunctionsProvider { apiBaseUrl?: string ky?: KyInstance } & serpapi.ClientParams = {}) { - assert(apiKey, `Error SerpAPIClient missing required "apiKey"`) + assert(apiKey, 'Error SerpAPIClient missing required "apiKey"') super() this.apiKey = apiKey @@ -667,7 +667,13 @@ export class SerpAPIClient extends AIFunctionsProvider { 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', inputSchema: z.object({ q: z.string().describe('search query'), - num: z.number().int().positive().default(5).optional() + num: z + .number() + .int() + .positive() + .default(5) + .optional() + .describe('number of results to return') }) }) async search(queryOrOpts: string | serpapi.GoogleParameters) { @@ -685,7 +691,7 @@ export class SerpAPIClient extends AIFunctionsProvider { ...rest, engine: 'google', api_key: this.apiKey, - ...(options as any) // TODO + ...(options as any) }, timeout }) diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 9fb227b1b..b4df6df4f 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -227,7 +227,7 @@ export class SerperClient extends AIFunctionsProvider { } & serper.ClientParams = {}) { assert( apiKey, - `SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)` + 'SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)' ) super() @@ -239,7 +239,7 @@ export class SerperClient extends AIFunctionsProvider { this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, headers: { - 'X-API-KEY': this.apiKey + 'x-api-key': this.apiKey } }) } From 526b96d87a52e88751a6d1d210f542f7ca640c49 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 19:54:39 -0500 Subject: [PATCH 30/81] =?UTF-8?q?=F0=9F=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ai-function-set.ts | 33 +++++++++++++++++++++++---------- src/services/searxng-client.ts | 12 ++++++++++-- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index a053a56c9..53e7a9734 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -7,6 +7,9 @@ import { AIFunctionsProvider } from './fns.js' * * This class mimics a built-in `Set`, but with additional utility * methods like `pick`, `omit`, and `map`. + * + * Function names are case-insensitive to make it easier to match them with + * possible LLM hallucinations. */ export class AIFunctionSet implements Iterable { protected readonly _map: Map @@ -20,7 +23,9 @@ export class AIFunctionSet implements Iterable { : [fn] ) - this._map = new Map(fns ? fns.map((fn) => [fn.spec.name, fn]) : null) + this._map = new Map( + fns ? fns.map((fn) => [transformName(fn.spec.name), fn]) : null + ) } get size(): number { @@ -28,21 +33,21 @@ export class AIFunctionSet implements Iterable { } add(fn: types.AIFunction): this { - this._map.set(fn.spec.name, fn) + this._map.set(transformName(fn.spec.name), fn) return this } get(name: string): types.AIFunction | undefined { - return this._map.get(name) + return this._map.get(transformName(name)) } set(name: string, fn: types.AIFunction): this { - this._map.set(name, fn) + this._map.set(transformName(name), fn) return this } has(name: string): boolean { - return this._map.has(name) + return this._map.has(transformName(name)) } clear(): void { @@ -50,20 +55,24 @@ export class AIFunctionSet implements Iterable { } delete(name: string): boolean { - return this._map.delete(name) + return this._map.delete(transformName(name)) } pick(...keys: string[]): AIFunctionSet { - const keysToIncludeSet = new Set(keys) + const keysToIncludeSet = new Set(keys.map(transformName)) return new AIFunctionSet( - Array.from(this).filter((fn) => keysToIncludeSet.has(fn.spec.name)) + Array.from(this).filter((fn) => + keysToIncludeSet.has(transformName(fn.spec.name)) + ) ) } omit(...keys: string[]): AIFunctionSet { - const keysToExcludeSet = new Set(keys) + const keysToExcludeSet = new Set(keys.map(transformName)) return new AIFunctionSet( - Array.from(this).filter((fn) => !keysToExcludeSet.has(fn.spec.name)) + Array.from(this).filter( + (fn) => !keysToExcludeSet.has(transformName(fn.spec.name)) + ) ) } @@ -90,3 +99,7 @@ export class AIFunctionSet implements Iterable { return this.entries } } + +function transformName(name: string): string { + return name.toLowerCase() +} diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 1103af235..a19f98dc0 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -218,8 +218,16 @@ export namespace searxng { export const SearchOptionsSchema = z.object({ query: z.string().describe('search query'), - categories: z.array(SearchCategorySchema).optional(), - engines: z.array(SearchEngineSchema).optional(), + categories: z + .array(SearchCategorySchema) + .optional() + .describe( + 'narrows the search to only use search engines in specific categories' + ), + engines: z + .array(SearchEngineSchema) + .optional() + .describe('narrows the search to only use specific search engines'), language: z.string().optional(), pageno: z.number().int().optional() }) From 5e0017be6251b9cbc045caa89b7cfd6d1007e1c1 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 20:08:38 -0500 Subject: [PATCH 31/81] =?UTF-8?q?=F0=9F=8C=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ai-function-set.ts | 1 + src/services/scraper-client.ts | 85 ++++++++++++++++++++++++++-------- 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/ai-function-set.ts b/src/ai-function-set.ts index 53e7a9734..1c3d21867 100644 --- a/src/ai-function-set.ts +++ b/src/ai-function-set.ts @@ -101,5 +101,6 @@ export class AIFunctionSet implements Iterable { } function transformName(name: string): string { + // TODO: decamalize? return name.toLowerCase() } diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts index bd5694508..c71d50e70 100644 --- a/src/services/scraper-client.ts +++ b/src/services/scraper-client.ts @@ -1,27 +1,33 @@ import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' -import { assert, getEnv } from '../utils.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv, omit } from '../utils.js' export namespace scraper { export type ScrapeResult = { author: string byline: string - /** The HTML for the main content of the page. */ - content: string description: string imageUrl: string lang: string length: number logoUrl: string - /** The text for the main content of the page in markdown format. */ - markdownContent: string publishedTime: string + siteName: string + title: string + + /** The HTML for the main content of the page. */ + content: string + /** The raw HTML response from the server. */ rawHtml: string - siteName: string + + /** The text for the main content of the page in markdown format. */ + markdownContent: string + /** The text for the main content of the page. */ textContent: string - title: string } } @@ -33,7 +39,7 @@ export namespace scraper { * It tries the simplest and fastest methods first, and falls back to slower * proxies and JavaScript rendering if needed. */ -export class ScraperClient { +export class ScraperClient extends AIFunctionsProvider { readonly apiBaseUrl: string readonly ky: KyInstance @@ -45,25 +51,64 @@ export class ScraperClient { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert(apiBaseUrl, 'ScraperClient apiBaseUrl is required') + assert( + apiBaseUrl, + 'ScraperClient missing required "apiBaseUrl" (defaults to "SCRAPER_API_BASE_URL")' + ) + super() this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: this.apiBaseUrl }) } + @aiFunction({ + name: 'scrape_url', + description: 'Scrapes the content of a single URL.', + inputSchema: z.object({ + url: z.string().url().describe('The URL of the web page to scrape'), + format: z + .enum(['html', 'markdown', 'plaintext']) + .default('markdown') + .optional() + .describe( + 'Whether to return the content as HTML, markdown, or plaintext.' + ) + }) + }) async scrapeUrl( - url: string, - { - timeout = 60_000 - }: { - timeout?: number - } = {} - ): Promise { - return this.ky + urlOrOpts: + | string + | { + url: string + format?: 'html' | 'markdown' | 'plaintext' + timeoutMs?: number + } + ): Promise> { + const { + timeoutMs = 60_000, + format = 'markdown', + ...opts + } = typeof urlOrOpts === 'string' ? { url: urlOrOpts } : urlOrOpts + + const res = await this.ky .post('scrape', { - json: { url }, - timeout + json: opts, + timeout: timeoutMs }) - .json() + .json() + + switch (format) { + case 'html': + return omit(res, 'markdownContent', 'textContent', 'rawHtml') + + case 'markdown': + return omit(res, 'textContent', 'rawHtml', 'content') + + case 'plaintext': + return omit(res, 'markdownContent', 'rawHtml', 'content') + + default: + return res + } } } From 1dc4a66a03a4769f2f6c743503ef81015d2f3ef8 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 20:26:40 -0500 Subject: [PATCH 32/81] =?UTF-8?q?=F0=9F=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/proxycurl-client.ts | 96 ++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 24 deletions(-) diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index 1ca8b9155..e922e5911 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -1,6 +1,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv } from '../utils.js' // All proxycurl types are auto-generated from their openapi spec @@ -52,7 +53,9 @@ export namespace proxycurl { > export const PersonLookupEndpointParamsQueryClassSchema = z.object({ - company_domain: z.string(), + company_domain: z + .string() + .describe('The domain URL of the company the person works at'), enrich_profile: z.string().optional(), first_name: z.string(), last_name: z.string().optional(), @@ -66,8 +69,8 @@ export namespace proxycurl { export const RoleLookupEndpointParamsQueryClassSchema = z.object({ company_name: z.string(), - enrich_profile: z.string().optional(), - role: z.string() + role: z.string(), + enrich_profile: z.string().optional() }) export type RoleLookupEndpointParamsQueryClass = z.infer< typeof RoleLookupEndpointParamsQueryClassSchema @@ -84,7 +87,7 @@ export namespace proxycurl { > export const ReverseEmailLookupEndpointParamsQueryClassSchema = z.object({ - email: z.string().optional(), + email: z.string(), enrich_profile: z.string().optional(), lookup_depth: z.string().optional() }) @@ -98,7 +101,6 @@ export namespace proxycurl { description: z.string().optional(), employee_count_max: z.string().optional(), employee_count_min: z.string().optional(), - enrich_profiles: z.string().optional(), follower_count_max: z.string().optional(), follower_count_min: z.string().optional(), founded_after_year: z.string().optional(), @@ -113,7 +115,8 @@ export namespace proxycurl { public_identifier_in_list: z.string().optional(), public_identifier_not_in_list: z.string().optional(), region: z.string().optional(), - type: z.string().optional() + type: z.string().optional(), + enrich_profiles: z.string().optional() }) export type CompanySearchEndpointParamsQueryClass = z.infer< typeof CompanySearchEndpointParamsQueryClassSchema @@ -2000,7 +2003,7 @@ export namespace proxycurl { export type CompanySearchResult = z.infer } -export class ProxycurlClient { +export class ProxycurlClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiKey: string readonly apiBaseUrl: string @@ -2015,8 +2018,15 @@ export class ProxycurlClient { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert(apiKey, 'ProxycurlClient missing required "apiKey"') - assert(apiBaseUrl, 'ProxycurlClient missing required "apiBaseUrl"') + assert( + apiKey, + 'ProxycurlClient missing required "apiKey" (defaults to "PROXYCURL_API_KEY")' + ) + assert( + apiBaseUrl, + 'ProxycurlClient missing required "apiBaseUrl" (defaults to "PROXYCURL_API_BASE_URL")' + ) + super() this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl @@ -2029,6 +2039,12 @@ export class ProxycurlClient { }) } + @aiFunction({ + name: 'get_linkedin_company', + description: + "Gets the LinkedIn profile for a company given it's domain `url`.", + inputSchema: proxycurl.CompanyProfileEndpointParamsQueryClassSchema + }) async getLinkedInCompany( opts: proxycurl.CompanyProfileEndpointParamsQueryClass ) { @@ -2039,6 +2055,12 @@ export class ProxycurlClient { .json() } + @aiFunction({ + name: 'get_linkedin_person', + description: + 'Gets the LinkedIn profile for a person given some unique, identifying information about them.', + inputSchema: proxycurl.PersonProfileEndpointParamsQueryClassSchema + }) async getLinkedInPerson( opts: proxycurl.PersonProfileEndpointParamsQueryClass ) { @@ -2049,6 +2071,12 @@ export class ProxycurlClient { .json() } + @aiFunction({ + name: 'resolve_linkedin_person', + description: + 'Resolves the LinkedIn profile for a person given their `first_name` and `company_domain` URL.', + inputSchema: proxycurl.PersonLookupEndpointParamsQueryClassSchema + }) async resolveLinkedInPerson( opts: proxycurl.PersonLookupEndpointParamsQueryClass ) { @@ -2059,7 +2087,13 @@ export class ProxycurlClient { .json() } - async resolvePersonByEmail( + @aiFunction({ + name: 'resolve_linkedin_person_by_email', + description: + 'Resolves the LinkedIn profile for a person given their `email`.', + inputSchema: proxycurl.ReverseEmailLookupEndpointParamsQueryClassSchema + }) + async resolveLinkedInPersonByEmail( opts: proxycurl.ReverseEmailLookupEndpointParamsQueryClass ) { return this.ky @@ -2069,47 +2103,61 @@ export class ProxycurlClient { .json() } + @aiFunction({ + name: 'resolve_linkedin_person_at_company_by_role', + description: + 'Resolves the LinkedIn profile for a person at a given `company_name` and `role`.', + inputSchema: proxycurl.RoleLookupEndpointParamsQueryClassSchema + }) async resolveLinkedInPersonAtCompanyByRole( opts: proxycurl.RoleLookupEndpointParamsQueryClass ) { return this.ky - .get('/api/find/company/role/', { + .get('api/find/company/role/', { searchParams: { ...opts } }) .json() } + @aiFunction({ + name: 'resolve_linkedin_company', + description: + 'Resolves the LinkedIn profile for a company given the `company_name` and/or `company_domain`.', + inputSchema: proxycurl.CompanyLookupEndpointParamsQueryClassSchema + }) async resolveLinkedInCompany( opts: proxycurl.CompanyLookupEndpointParamsQueryClass ) { return this.ky - .get('/api/linkedin/company/resolve', { + .get('api/linkedin/company/resolve', { searchParams: { ...opts } }) .json() } - async resolveLinkedInPersonByEmail( - opts: proxycurl.ReverseEmailLookupEndpointParamsQueryClass - ) { - return this.ky - .get('/api/linkedin/profile/resolve/email', { - searchParams: { ...opts } - }) - .json() - } - + @aiFunction({ + name: 'search_linkedin_companies', + description: + 'Searches LinkedIn company profiles based on a set of criteria such as `name`, `industry`, `region`, `description`, `city`, number of employees, founding date, funding raised, etc.', + inputSchema: proxycurl.CompanySearchEndpointParamsQueryClassSchema + }) async searchCompanies(opts: proxycurl.CompanySearchEndpointParamsQueryClass) { return this.ky - .get('/api/v2/search/company', { + .get('api/v2/search/company', { searchParams: { ...opts } }) .json() } + @aiFunction({ + name: 'search_linkedin_people', + description: + 'Searches LinkedIn people profiles based on a set of criteria such as `country`, `first_name`, `last_name`, `current_company_name`, `headline`, `industries`, `past_company_name`, `summary`, `city`, `education_school_name`, etc.', + inputSchema: proxycurl.PersonSearchEndpointParamsQueryClassSchema + }) async searchPeople(opts: proxycurl.PersonSearchEndpointParamsQueryClass) { return this.ky - .get('/api/v2/search/person/', { + .get('api/v2/search/person/', { searchParams: { ...opts } }) .json() From d03af975cbd97fc2ab6db3fbd18d6f32d59f1334 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 21:42:53 -0500 Subject: [PATCH 33/81] =?UTF-8?q?=F0=9F=A5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/predict-leads-client.ts | 678 ++++++++++++++++++++------- src/types.ts | 7 +- 2 files changed, 505 insertions(+), 180 deletions(-) diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts index 5cca84aa8..33b52b01a 100644 --- a/src/services/predict-leads-client.ts +++ b/src/services/predict-leads-client.ts @@ -1,8 +1,10 @@ import defaultKy, { type KyInstance } from 'ky' import pThrottle from 'p-throttle' +import { z } from 'zod' import type { DeepNullable } from '../types.js' -import { assert, getEnv, throttleKy } from '../utils.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv, pruneUndefined, throttleKy } from '../utils.js' export namespace predictleads { export const throttle = pThrottle({ @@ -11,6 +13,9 @@ export namespace predictleads { strict: true }) + export const DEFAULT_PAGE_SIZE = 100 + export const MAX_PAGE_SIZE = 1000 + export type Meta = DeepNullable<{ count: number message?: string | null @@ -182,13 +187,284 @@ export namespace predictleads { }> export type JobOpeningByIdResponse = Omit + + export const EventCategorySchema = z.union([ + z + .literal('hires') + .describe( + 'Company hired new executive or senior personnel. (leadership)' + ), + z + .literal('promotes') + .describe( + 'Company promoted existing executive or senior personnel. (leadership)' + ), + z + .literal('leaves') + .describe('Executive or senior personnel left the company. (leadership)'), + z + .literal('retires') + .describe( + 'Executive or senior personnel retires from the company. (leadership)' + ), + z + .literal('acquires') + .describe('Company acquired other company. (acquisition)'), + z + .literal('merges_with') + .describe('Company merges with other company. (acquisition)'), + z + .literal('sells_assets_to') + .describe( + 'Company sells assets (like properties or warehouses) to other company. (acquisition)' + ), + z + .literal('expands_offices_to') + .describe( + 'Company opens new offices in another town, state, country or continent. (expansion)' + ), + z + .literal('expands_offices_in') + .describe('Company expands existing offices. (expansion)'), + z + .literal('expands_facilities') + .describe( + 'Company opens new or expands existing facilities like warehouses, data centers, manufacturing plants etc. (expansion)' + ), + z + .literal('opens_new_location') + .describe( + 'Company opens new service location like hotels, restaurants, bars, hospitals etc. (expansion)' + ), + z + .literal('increases_headcount_by') + .describe('Company offers new job vacancies. (expansion)'), + z + .literal('launches') + .describe('Company launches new offering. (new_offering)'), + z + .literal('integrates_with') + .describe('Company integrates with other company. (new_offering)'), + z + .literal('is_developing') + .describe('Company begins development of a new offering. (new_offering)'), + z + .literal('receives_financing') + .describe( + 'Company receives investment like venture funding, loan, grant etc. (investment)' + ), + z + .literal('invests_into') + .describe('Company invests into other company. (investment)'), + z + .literal('invests_into_assets') + .describe( + 'Company invests into assets like property, trucks, facilities etc. (investment)' + ), + z + .literal('goes_public') + .describe( + 'Company issues shares to the public for the first time. (investment)' + ), + z + .literal('closes_offices_in') + .describe('Company closes existing offices. (cost_cutting)'), + z + .literal('decreases_headcount_by') + .describe('Company lays off employees. (cost_cutting)'), + z + .literal('partners_with') + .describe('Company partners with other company. (partnership)'), + z + .literal('receives_award') + .describe( + 'Company or person at the company receives an award. (recognition)' + ), + z + .literal('recognized_as') + .describe( + 'Company or person at the company receives recognition. (recognition)' + ), + z + .literal('signs_new_client') + .describe('Company signs new client. (contract)'), + z + .literal('files_suit_against') + .describe( + 'Company files suit against other company. (corporate_challenges)' + ), + z + .literal('has_issues_with') + .describe('Company has vulnerability problems. (corporate_challenges)'), + z + .literal('identified_as_competitor_of') + .describe('New or existing competitor was identified. (relational)') + ]) + export type EventCategory = z.infer + + export const CompanyParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company') + }) + export type CompanyParams = z.infer + + export const CompanyEventsParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + categories: z.array(EventCategorySchema).optional(), + found_at_from: z + .string() + .optional() + .describe('Signals found from specified date (ISO 8601).'), + found_at_until: z + .string() + .optional() + .describe('Signals found until specified date (ISO 8601).'), + page: z.number().int().positive().default(1).optional(), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional(), + with_news_article_bodies: z + .boolean() + .optional() + .describe('Whether or not to include the body contents of news articles.') + }) + export type CompanyEventsParams = z.infer + + export const CompanyFinancingEventsParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company') + }) + export type CompanyFinancingEventsParams = z.infer< + typeof CompanyFinancingEventsParamsSchema + > + + export const CompanyJobOpeningsParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + categories: z.array(EventCategorySchema).optional(), + found_at_from: z + .string() + .optional() + .describe('Signals found from specified date (ISO 8601).'), + found_at_until: z + .string() + .optional() + .describe('Signals found until specified date (ISO 8601).'), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional(), + with_job_descriptions: z + .boolean() + .optional() + .describe('Whether or not to include the full descriptions of the jobs.'), + with_description_only: z + .boolean() + .optional() + .describe('If set, only returns job openings with descriptions.'), + with_location_only: z + .boolean() + .optional() + .describe('If set, only returns job openings with locations.'), + active_only: z + .boolean() + .optional() + .describe( + 'If set, only returns job openings that are not closed, have `last_seen_at` more recent than 5 days and were found in the last year.' + ), + not_closed: z + .boolean() + .optional() + .describe( + 'Similar to `active_only`, but without considering `last_seen_at` timestamp.' + ) + }) + export type CompanyJobOpeningsParams = z.infer< + typeof CompanyJobOpeningsParamsSchema + > + + export const CompanyTechnologiesParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + categories: z.array(EventCategorySchema).optional(), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional() + }) + export type CompanyTechnologiesParams = z.infer< + typeof CompanyTechnologiesParamsSchema + > + + export const CompanyConnectionsParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + categories: z.array(EventCategorySchema).optional(), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional() + }) + export type CompanyConnectionsParams = z.infer< + typeof CompanyConnectionsParamsSchema + > + + export const CompanyWebsiteEvolutionParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional() + }) + export type CompanyWebsiteEvolutionParams = z.infer< + typeof CompanyWebsiteEvolutionParamsSchema + > + + export const CompanyGitHubReposParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional() + }) + export type CompanyGitHubReposParams = z.infer< + typeof CompanyGitHubReposParamsSchema + > + + export const CompanyProductsParamsSchema = z.object({ + domain: z.string().min(3).describe('domain of the company'), + sources: z.array(z.string()).optional(), + limit: z + .number() + .int() + .positive() + .max(MAX_PAGE_SIZE) + .default(DEFAULT_PAGE_SIZE) + .optional() + }) + export type CompanyProductsParams = z.infer< + typeof CompanyProductsParamsSchema + > } -export class PredictLeadsClient { +export class PredictLeadsClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiKey: string readonly apiToken: string - readonly _maxPageSize = 100 constructor({ apiKey = getEnv('PREDICT_LEADS_API_KEY'), @@ -204,8 +480,15 @@ export class PredictLeadsClient { throttle?: boolean ky?: KyInstance } = {}) { - assert(apiKey, 'PredictLeadsClient missing required "apiKey"') - assert(apiToken, 'PredictLeadsClient missing required "apiToken"') + assert( + apiKey, + 'PredictLeadsClient missing required "apiKey" (defaults to "PREDICT_LEADS_API_KEY")' + ) + assert( + apiToken, + 'PredictLeadsClient missing required "apiToken" (defaults to "PREDICT_LEADS_API_TOKEN")' + ) + super() this.apiKey = apiKey this.apiToken = apiToken @@ -213,264 +496,303 @@ export class PredictLeadsClient { const throttledKy = throttle ? throttleKy(ky, predictleads.throttle) : ky this.ky = throttledKy.extend({ + prefixUrl: 'https://predictleads.com/api', timeout: timeoutMs, headers: { - 'X-Api-Key': apiKey, - 'X-Api-Token': apiToken + 'x-api-key': apiKey, + 'x-api-token': apiToken } }) } - async followCompany(domain: string, customCompanyIdentifier?: string) { - return this.ky - .post( - `https://predictleads.com/api/v2/companies/${domain}/follow`, - customCompanyIdentifier - ? { - json: { customCompanyIdentifier } - } - : undefined - ) - .json() - } + @aiFunction({ + name: 'get_company', + description: + 'Returns basic information about a company given its `domain` like location, name, stock ticker, description, etc.', + inputSchema: predictleads.CompanyParamsSchema + }) + async company(domainOrOpts: string | predictleads.CompanyParams) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { domain } = opts + assert(domain, 'Missing required company "domain"') - async getFollowingCompanies(limit: number = this._maxPageSize) { - return this.ky - .get(`https://predictleads.com/api/v2/followings`, { - searchParams: { limit } - }) - .json() + return this.ky.get(`v2/companies/${domain}`).json() } - async unfollowCompany(domain: string, customCompanyIdentifier?: string) { - return this.ky - .post( - `https://predictleads.com/api/v2/companies/${domain}/unfollow`, - customCompanyIdentifier - ? { - json: { customCompanyIdentifier } - } - : undefined - ) - .json() - } - - async events( - domain: string, - params: { - categories?: string - found_at_from?: string - found_at_until?: string - page?: number - limit?: string - with_news_article_bodies?: boolean - } = {} + @aiFunction({ + name: 'get_company_events', + description: + 'Returns a list of events from news for a given company. Events are found in press releases, industry news, blogs, social media, and other online sources.', + inputSchema: predictleads.CompanyEventsParamsSchema + }) + async getCompanyEvents( + domainOrOpts: string | predictleads.CompanyEventsParams ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { + domain, + page = 1, + limit = predictleads.DEFAULT_PAGE_SIZE, + categories, + ...params + } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get(`https://predictleads.com/api/v2/companies/${domain}/events`, { - searchParams: { page: 1, ...params } + .get(`v2/companies/${domain}/events`, { + searchParams: pruneUndefined({ + page, + limit: String(limit), + categories: categories?.join(','), + ...params + }) }) .json() } - async eventById(id: string) { - return this.ky - .get(`https://predictleads.com/api/v2/events/${id}`) - .json() + async getEventById(id: string) { + return this.ky.get(`v2/events/${id}`).json() } - async financingEvents(domain: string) { + @aiFunction({ + name: 'get_company_financing_events', + description: + 'Returns a list of financing events for a given company. Financing events include fundraising announcements and quarterly earning reports for public companies. They are sourced from press releases, industry news, blogs, social media, and other online sources.', + inputSchema: predictleads.CompanyFinancingEventsParamsSchema + }) + async getCompanyFinancingEvents( + domainOrOpts: string | predictleads.CompanyFinancingEventsParams + ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { domain } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get( - `https://predictleads.com/api/v2/companies/${domain}/financing_events` - ) + .get(`v2/companies/${domain}/financing_events`) .json() } - async jobOpenings( - domain: string, - params: { - categories?: string - with_job_descriptions?: boolean - active_only?: boolean - not_closed?: boolean - limit?: string - } = {} + @aiFunction({ + name: 'get_company_job_openings', + description: + 'Returns a list of job openings for a given company. Job openings are found on companies’ career sites and job boards.', + inputSchema: predictleads.CompanyJobOpeningsParamsSchema + }) + async getCompanyJobOpenings( + domainOrOpts: string | predictleads.CompanyJobOpeningsParams ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { + domain, + limit = predictleads.DEFAULT_PAGE_SIZE, + categories, + ...params + } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get(`https://predictleads.com/api/v2/companies/${domain}/job_openings`, { - searchParams: params + .get(`v2/companies/${domain}/job_openings`, { + searchParams: pruneUndefined({ + limit: String(limit), + categories: categories?.join(','), + ...params + }) }) .json() } - async jobOpeningById(id: string) { + async getJobOpeningById(id: string) { return this.ky - .get(`https://predictleads.com/api/v2/job_openings/${id}`) + .get(`v2/job_openings/${id}`) .json() } - async technologies( - domain: string, - params: { - categories: string - limit?: string - } + @aiFunction({ + name: 'get_company_technologies', + description: 'Returns a list of technology providers for a given company.', + inputSchema: predictleads.CompanyTechnologiesParamsSchema + }) + async getCompanyTechnologies( + domainOrOpts: string | predictleads.CompanyTechnologiesParams ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { + domain, + limit = predictleads.DEFAULT_PAGE_SIZE, + categories, + ...params + } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get(`https://predictleads.com/api/v2/companies/${domain}/technologies`, { - searchParams: params + .get(`v2/companies/${domain}/technologies`, { + searchParams: pruneUndefined({ + limit: String(limit), + categories: categories?.join(','), + ...params + }) }) .json() } - async connections( - domain: string, - params?: { - categories: string - limit?: string - } + @aiFunction({ + name: 'get_company_connections', + description: + 'Returns a list of categorized business connections. Business connections can be found via backlinks or logos on /our-customers, /case-studies, /portfolio, /clients etc. pages. Business connections enable you to eg. calculate network health of a company, to build systems when new high value connections are made… Connections can be of many types: partner, vendor, investor, parent…', + inputSchema: predictleads.CompanyConnectionsParamsSchema + }) + async getCompanyConnections( + domainOrOpts: string | predictleads.CompanyConnectionsParams ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { + domain, + limit = predictleads.DEFAULT_PAGE_SIZE, + categories, + ...params + } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get(`https://predictleads.com/api/v2/companies/${domain}/connections`, { - searchParams: params + .get(`v2/companies/${domain}/connections`, { + searchParams: pruneUndefined({ + limit: String(limit), + categories: categories?.join(','), + ...params + }) }) .json() } - async websiteEvolution( - domain: string, - { limit = 100 }: { limit?: number } = {} + @aiFunction({ + name: 'get_company_website_evolution', + description: + 'Returns insights into how a website has changed over time. E.g., when pages like “Blog”, “Privacy policy”, “Pricing”, “Product”, “API Docs”, “Team”, “Support pages” etc were added. This can serve as a proxy to how quickly a website is growing, to determine the growth stage they are at and also to help segment websites.', + inputSchema: predictleads.CompanyWebsiteEvolutionParamsSchema + }) + async getCompanyWebsiteEvolution( + domainOrOpts: string | predictleads.CompanyWebsiteEvolutionParams ) { - return this.ky - .get( - `https://predictleads.com/api/v2/companies/${domain}/website_evolution`, - { - searchParams: { limit } - } - ) - .json() - } + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts + assert(domain, 'Missing required company "domain"') - async githubRepositories( - domain: string, - { limit = 100 }: { limit?: number } = {} - ) { return this.ky - .get( - `https://predictleads.com/api/v2/companies/${domain}/github_repositories`, - { - searchParams: { limit } - } - ) + .get(`v2/companies/${domain}/website_evolution`, { + searchParams: pruneUndefined({ limit: String(limit), ...params }) + }) .json() } - async products( - domain: string, - params?: { - sources: string - limit?: number - } + @aiFunction({ + name: 'get_company_github_repos', + description: + 'Returns insights into how frequently a company is contributing to its public GitHub repositories.', + inputSchema: predictleads.CompanyGitHubReposParamsSchema + }) + async getCompanyGitHubRepositories( + domainOrOpts: string | predictleads.CompanyGitHubReposParams ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get(`https://predictleads.com/api/v2/companies/${domain}/products`, { - searchParams: params + .get(`v2/companies/${domain}/github_repositories`, { + searchParams: pruneUndefined({ limit: String(limit), ...params }) }) .json() } - async company(domain: string) { + @aiFunction({ + name: 'get_company_products', + description: + 'Returns what kind of products / solutions / features a company is offering.', + inputSchema: predictleads.CompanyProductsParamsSchema + }) + async getCompanyProducts( + domainOrOpts: string | predictleads.CompanyProductsParams + ) { + const opts = + typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts + const { + domain, + sources, + limit = predictleads.DEFAULT_PAGE_SIZE, + ...params + } = opts + assert(domain, 'Missing required company "domain"') + return this.ky - .get(`https://predictleads.com/api/v2/companies/${domain}`) + .get(`v2/companies/${domain}/products`, { + searchParams: pruneUndefined({ + limit: String(limit), + sources: sources?.join(','), + ...params + }) + }) .json() } - async discoverStartupJobs(params?: { + async discoverStartupJobsHN(params?: { post_datetime_from?: string post_datetime_until?: string min_score?: string limit?: string }) { return this.ky - .get( - `https://predictleads.com/api/v2/discover/startup_platform/jobs_hn`, - { - searchParams: params - } - ) + .get(`v2/discover/startup_platform/jobs_hn`, { + searchParams: params + }) .json() } - async discoverStartupShow(params?: { + async discoverStartupShowHN(params?: { post_datetime_from?: string post_datetime_until?: string min_score?: string limit?: string }) { return this.ky - .get( - `https://predictleads.com/api/v2/discover/startup_platform/show_hn`, - { - searchParams: params - } - ) + .get(`v2/discover/startup_platform/show_hn`, { + searchParams: params + }) .json() } - /* - TODO this returns 500 error, even using the curl example from docs. - Also for this reason I couldn't test the other segments endpoints - curl -X POST "https://predictleads.com/api/v2/segments" - -d '{"technologies":"Salesforce", "job_categories":"sales"}' - -H "Content-Type: application/json" \ - -H 'X-Api-Key: ' \ - -H 'X-Api-Token: ' - */ - async createSegment(params: { - webhook_url?: string - locations?: string - headquarters_locations?: string - job_categories?: string - technologies?: string - found_at_from?: string - found_at_until?: string - active?: string - limit?: string - }) { - return this.ky - .post(`https://predictleads.com/api/v2/segments`, { - json: params - }) - .json() - } + // -------------------------------------------------------------------------- + // Stateful endpoints which should generally not be used as AI functions. + // -------------------------------------------------------------------------- - async updateSegment(params: { - id: string - webhook_url: string - active: string - }) { + async followCompany(domain: string, customCompanyIdentifier?: string) { return this.ky - .put( - `https://predictleads.com/api/v2/discover/startup_platform/show_hn`, - { - json: params - } - ) - .json() + .post(`v2/companies/${domain}/follow`, { + json: pruneUndefined({ customCompanyIdentifier }) + }) + .json() } - async showSegment(id: string) { + async getFollowingCompanies(limit: number = predictleads.DEFAULT_PAGE_SIZE) { return this.ky - .get(`https://predictleads.com/api/v2/segments/${id}`) - .json() + .get(`v2/followings`, { + searchParams: { limit: String(limit) } + }) + .json() } - async showAllSegment(limit = 100) { + async unfollowCompany(domain: string, customCompanyIdentifier?: string) { return this.ky - .get(`https://predictleads.com/api/v2/segments`, { - searchParams: { limit } + .post(`v2/companies/${domain}/unfollow`, { + json: pruneUndefined({ customCompanyIdentifier }) }) - .json() + .json() } } diff --git a/src/types.ts b/src/types.ts index 653b16be8..4a27a1c22 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,8 +7,11 @@ import type { AIFunctionsProvider } from './fns.js' export type { KyInstance } from 'ky' export type { ThrottledFunction } from 'p-throttle' -// TODO -export type DeepNullable = T | null +export type Nullable = T | null + +export type DeepNullable = T extends object + ? { [K in keyof T]: DeepNullable } + : Nullable export type MaybePromise = T | Promise From ac76b5098bf8a9fe00ce94b3f4b4229b745954e3 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 21:49:15 -0500 Subject: [PATCH 34/81] =?UTF-8?q?=E2=AC=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/clearbit-client.ts | 10 ++++++---- src/services/diffbot-client.ts | 1 + src/services/people-data-labs-client.ts | 1 + src/services/perigon-client.ts | 1 + src/services/predict-leads-client.ts | 4 ++-- src/services/proxycurl-client.ts | 15 +++++++++++++-- src/services/wikipedia-client.ts | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/services/clearbit-client.ts b/src/services/clearbit-client.ts index b213559bf..c945df14e 100644 --- a/src/services/clearbit-client.ts +++ b/src/services/clearbit-client.ts @@ -5,11 +5,10 @@ import type { DeepNullable, KyInstance } from '../types.js' import { assert, delay, getEnv, throttleKy } from '../utils.js' export namespace clearbit { - // Only allow 20 clearbit API requests per 60s + // Allow up to 20 requests per minute by default. export const throttle = pThrottle({ limit: 20, - interval: 60 * 1000, - strict: true + interval: 60 * 1000 }) export interface CompanyEnrichmentOptions { @@ -524,7 +523,10 @@ export class ClearbitClient { throttle?: boolean ky?: KyInstance } = {}) { - assert(apiKey, 'Error clearbit client missing required "apiKey"') + assert( + apiKey, + 'ClearbitClient missing required "apiKey" (defaults to "CLEARBIT_API_KEY")' + ) this.apiKey = apiKey diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 9f6780b7e..da90cba9e 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -7,6 +7,7 @@ export namespace diffbot { export const API_BASE_URL = 'https://api.diffbot.com' export const KNOWLEDGE_GRAPH_API_BASE_URL = 'https://kg.diffbot.com' + // Allow up to 5 requests per second by default. export const throttle = pThrottle({ limit: 5, interval: 1000, diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts index e0846ea16..195f53be5 100644 --- a/src/services/people-data-labs-client.ts +++ b/src/services/people-data-labs-client.ts @@ -6,6 +6,7 @@ import { assert, getEnv, throttleKy } from '../utils.js' export namespace peopledatalabs { export const BASE_URL = 'https://api.peopledatalabs.com/v5/' + // Allow up to 20 requests per minute by default. export const throttle = pThrottle({ limit: 20, interval: 60 * 1000, diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index 60d19fae6..54a863fe8 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -4,6 +4,7 @@ import pThrottle from 'p-throttle' import { assert, getEnv, throttleKy } from '../utils.js' export namespace perigon { + // Allow up to 20 requests per minute by default. export const throttle = pThrottle({ limit: 20, interval: 60 * 1000, diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts index 33b52b01a..947a1cbad 100644 --- a/src/services/predict-leads-client.ts +++ b/src/services/predict-leads-client.ts @@ -7,10 +7,10 @@ import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, pruneUndefined, throttleKy } from '../utils.js' export namespace predictleads { + // Allow up to 20 requests per minute by default. export const throttle = pThrottle({ limit: 20, - interval: 60 * 1000, - strict: true + interval: 60 * 1000 }) export const DEFAULT_PAGE_SIZE = 100 diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index e922e5911..2de52eeff 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -1,11 +1,18 @@ import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv } from '../utils.js' +import { assert, getEnv, throttleKy } from '../utils.js' // All proxycurl types are auto-generated from their openapi spec export namespace proxycurl { + // Allow up to 1500 requests per minute by default. + export const throttle = pThrottle({ + limit: 1500, + interval: 5 * 60 * 1000 + }) + export const CompanyTypeSchema = z.enum([ 'EDUCATIONAL', 'GOVERNMENT_AGENCY', @@ -2012,10 +2019,12 @@ export class ProxycurlClient extends AIFunctionsProvider { apiKey = getEnv('PROXYCURL_API_KEY'), apiBaseUrl = getEnv('PROXYCURL_API_BASE_URL') ?? 'https://nubela.co/proxycurl', + throttle = true, ky = defaultKy }: { apiKey?: string apiBaseUrl?: string + throttle?: boolean ky?: KyInstance } = {}) { assert( @@ -2031,7 +2040,9 @@ export class ProxycurlClient extends AIFunctionsProvider { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl - this.ky = ky.extend({ + const throttledKy = throttle ? throttleKy(ky, proxycurl.throttle) : ky + + this.ky = throttledKy.extend({ prefixUrl: apiBaseUrl, headers: { Authorization: `Bearer ${apiKey}` diff --git a/src/services/wikipedia-client.ts b/src/services/wikipedia-client.ts index e8f0ebe29..ed044b683 100644 --- a/src/services/wikipedia-client.ts +++ b/src/services/wikipedia-client.ts @@ -6,7 +6,7 @@ import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, throttleKy } from '../utils.js' export namespace wikipedia { - // Only allow 200 requests per second by default. + // Allow up to 200 requests per second by default. export const throttle = pThrottle({ limit: 200, interval: 1000 From 419c0a44a7b7f32a184da0a2d124924a7d97eacc Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 21:59:08 -0500 Subject: [PATCH 35/81] =?UTF-8?q?=F0=9F=98=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/clearbit-client.ts | 10 +++++----- src/services/dexa-client.ts | 5 ++++- src/services/diffbot-client.ts | 5 ++++- src/services/exa-client.ts | 5 ++++- src/services/people-data-labs-client.ts | 5 ++++- src/services/perigon-client.ts | 5 ++++- src/services/proxycurl-client.ts | 2 +- src/services/serpapi-client.ts | 5 ++++- src/services/serper-client.ts | 2 +- 9 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/services/clearbit-client.ts b/src/services/clearbit-client.ts index c945df14e..52337f707 100644 --- a/src/services/clearbit-client.ts +++ b/src/services/clearbit-client.ts @@ -5,9 +5,9 @@ import type { DeepNullable, KyInstance } from '../types.js' import { assert, delay, getEnv, throttleKy } from '../utils.js' export namespace clearbit { - // Allow up to 20 requests per minute by default. + // Allow up to 600 requests per minute by default. export const throttle = pThrottle({ - limit: 20, + limit: 600, interval: 60 * 1000 }) @@ -535,7 +535,8 @@ export class ClearbitClient { this.ky = throttledKy.extend({ timeout: timeoutMs, headers: { - Authorization: `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}` + // Authorization: `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}` + Authorization: `Bearer ${apiKey}` } }) } @@ -546,7 +547,6 @@ export class ClearbitClient { searchParams: { ...options } }) .json() - .catch((_) => undefined) } async companySearch(options: clearbit.CompanySearchOptions) { @@ -642,7 +642,7 @@ export class ClearbitClient { .catch((_) => undefined) } - async revealCompanyFromIp(ip: string) { + async revealCompanyFromIP(ip: string) { return this.ky .get('https://reveal.clearbit.com/v1/companies/find', { searchParams: { ip } diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index 6acf3caee..d43afb1dc 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -19,7 +19,10 @@ export class DexaClient { timeoutMs?: number ky?: KyInstance } = {}) { - assert(apiKey, 'DexaClient missing required "apiKey"') + assert( + apiKey, + 'DexaClient missing required "apiKey" (defaults to "DEXA_API_KEY")' + ) this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index da90cba9e..56afce90d 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -351,7 +351,10 @@ export class DiffbotClient { throttle?: boolean ky?: KyInstance } = {}) { - assert(apiKey, `DiffbotClient missing required "apiKey"`) + assert( + apiKey, + `DiffbotClient missing required "apiKey" (defaults to "DIFFBOT_API_KEY")` + ) this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index a516fe2d1..76d0495e3 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -143,7 +143,10 @@ export class ExaClient { apiBaseUrl?: string ky?: KyInstance } = {}) { - assert(apiKey, 'ExaClient missing required "apiKey"') + assert( + apiKey, + 'ExaClient missing required "apiKey" (defaults to "EXA_API_KEY")' + ) this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts index 195f53be5..4e74c79d2 100644 --- a/src/services/people-data-labs-client.ts +++ b/src/services/people-data-labs-client.ts @@ -449,7 +449,10 @@ export class PeopleDataLabsClient { throttle?: boolean ky?: KyInstance } = {}) { - assert(apiKey, 'PeopleDataLabsClient missing required "apiKey"') + assert( + apiKey, + 'PeopleDataLabsClient missing required "apiKey" (defaults to "PEOPLE_DATA_LABS_API_KEY")' + ) this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index 54a863fe8..23ed95012 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -273,7 +273,10 @@ export class PerigonClient { timeoutMs?: number ky?: KyInstance } = {}) { - assert(apiKey, 'Error PerigonClient missing required "apiKey"') + assert( + apiKey, + 'PerigonClient missing required "apiKey" (defaults to "PERIGON_API_KEY")' + ) this.apiKey = apiKey diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index 2de52eeff..ab6e3dbbf 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -7,7 +7,7 @@ import { assert, getEnv, throttleKy } from '../utils.js' // All proxycurl types are auto-generated from their openapi spec export namespace proxycurl { - // Allow up to 1500 requests per minute by default. + // Allow up to 300 requests per minute by default (enforced at 5 minute intervals). export const throttle = pThrottle({ limit: 1500, interval: 5 * 60 * 1000 diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index b84eab9e7..659f57763 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -649,7 +649,10 @@ export class SerpAPIClient extends AIFunctionsProvider { apiBaseUrl?: string ky?: KyInstance } & serpapi.ClientParams = {}) { - assert(apiKey, 'Error SerpAPIClient missing required "apiKey"') + assert( + apiKey, + 'SerpAPIClient missing required "apiKey" (defaults to "SERPAPI_API_KEY")' + ) super() this.apiKey = apiKey diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index b4df6df4f..7d0495d7d 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -227,7 +227,7 @@ export class SerperClient extends AIFunctionsProvider { } & serper.ClientParams = {}) { assert( apiKey, - 'SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY" env var)' + 'SerperClient missing required "apiKey" (defaults to "SERPER_API_KEY")' ) super() From b03a38c6e85f71ca010a91164460b4bbafd36171 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Sun, 2 Jun 2024 22:01:25 -0500 Subject: [PATCH 36/81] =?UTF-8?q?=F0=9F=92=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parse-structured-output.test.ts.snap | 133 ++++++++++++++++++ src/utils.test.ts | 58 ++++---- 2 files changed, 164 insertions(+), 27 deletions(-) create mode 100644 src/__snapshots__/parse-structured-output.test.ts.snap diff --git a/src/__snapshots__/parse-structured-output.test.ts.snap b/src/__snapshots__/parse-structured-output.test.ts.snap new file mode 100644 index 000000000..c32098daf --- /dev/null +++ b/src/__snapshots__/parse-structured-output.test.ts.snap @@ -0,0 +1,133 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`parseArrayOutput - handles arrays surrounded by text correctly > should return ["a", "b", "c"] for "Array: ["a", "b", "c"]. That's all!" 1`] = ` +[ + "a", + "b", + "c", +] +`; + +exports[`parseArrayOutput - handles arrays surrounded by text correctly > should return [{"a": 1}, {"b": 2}] for "This is the array [{"a": 1}, {"b": 2}] in the text" 1`] = ` +[ + { + "a": 1, + }, + { + "b": 2, + }, +] +`; + +exports[`parseArrayOutput - handles arrays surrounded by text correctly > should return [1, 2, 3] for "The array is [1,2,3]" 1`] = ` +[ + 1, + 2, + 3, +] +`; + +exports[`parseArrayOutput - handles valid arrays correctly > should return ["a", "b", "c"] for "["a", "b", "c"] 1`] = ` +[ + "a", + "b", + "c", +] +`; + +exports[`parseArrayOutput - handles valid arrays correctly > should return [{"a": 1}, {"b": 2}] for [{"a": 1}, {"b": 2}] 1`] = ` +[ + { + "a": 1, + }, + { + "b": 2, + }, +] +`; + +exports[`parseArrayOutput - handles valid arrays correctly > should return [1, 2, 3] for "[1,2,3]" 1`] = ` +[ + 1, + 2, + 3, +] +`; + +exports[`parseBooleanOutput - handles \`false\` outputs correctly > should return false for "FALSE" 1`] = `false`; + +exports[`parseBooleanOutput - handles \`false\` outputs correctly > should return false for "False" 1`] = `false`; + +exports[`parseBooleanOutput - handles \`false\` outputs correctly > should return false for "false!" 1`] = `false`; + +exports[`parseBooleanOutput - handles \`true\` outputs correctly > should return true for "TRUE" 1`] = `true`; + +exports[`parseBooleanOutput - handles \`true\` outputs correctly > should return true for "True" 1`] = `true`; + +exports[`parseBooleanOutput - handles \`true\` outputs correctly > should return true for "true." 1`] = `true`; + +exports[`parseNumberOutput - handles float outputs correctly > should return -5.5 for " -5.5 " 1`] = `-5.5`; + +exports[`parseNumberOutput - handles float outputs correctly > should return 42.42 for "42.42" 1`] = `42.42`; + +exports[`parseNumberOutput - handles integer outputs correctly > should return -5 for " -5 " 1`] = `-5`; + +exports[`parseNumberOutput - handles integer outputs correctly > should return 42 for "42" 1`] = `42`; + +exports[`parseObjectOutput - handles JSON array of objects > should return first object {"a":1,"b":2} for [{"a":1,"b":2},{"c":3,"d":4}] 1`] = ` +{ + "a": 1, + "b": 2, +} +`; + +exports[`parseObjectOutput - handles objects surrounded by text correctly > should return {"a":1,"b":2,"c":3} for "The object is {"a":1,"b":2,"c":3}" 1`] = ` +{ + "a": 1, + "b": 2, + "c": 3, +} +`; + +exports[`parseObjectOutput - handles objects surrounded by text correctly > should return {"name":"John","age":30,"city":"New York"} for "Object: {"name":"John","age":30,"city":"New York"}. That's all!" 1`] = ` +{ + "age": 30, + "city": "New York", + "name": "John", +} +`; + +exports[`parseObjectOutput - handles valid objects correctly > should return {"a":1,"b":2,"c":3} for {"a":1,"b":2,"c":3} 1`] = ` +{ + "a": 1, + "b": 2, + "c": 3, +} +`; + +exports[`parseObjectOutput - handles valid objects correctly > should return {"name":"John","age":30,"city":"New York"} for {"name":"John","age":30,"city":"New York"} 1`] = ` +{ + "age": 30, + "city": "New York", + "name": "John", +} +`; + +exports[`parseStructuredOutput - handles arrays correctly > should parse and return [1, 2, 3] for "[1, 2, 3]" 1`] = ` +[ + 1, + 2, + 3, +] +`; + +exports[`parseStructuredOutput - handles booleans correctly > should parse and return true for "True" 1`] = `true`; + +exports[`parseStructuredOutput - handles numbers correctly > should parse and return 123.45 for "123.45" 1`] = `123.45`; + +exports[`parseStructuredOutput - handles objects correctly > should parse and return {"a": 1, "b": "two"} for "{"a": 1, "b": "two"}" 1`] = ` +{ + "a": 1, + "b": "two", +} +`; diff --git a/src/utils.test.ts b/src/utils.test.ts index 77e2c353f..269d018e9 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -19,32 +19,36 @@ test('omit', () => { ).toEqual({ a: { b: 'foo' }, d: -1 }) }) -test('throttleKy should rate-limit requests to ky properly', async () => { - // TODO: set timeout - - const interval = 1000 - const throttle = pThrottle({ - limit: 1, - interval, - strict: true - }) - - const ky2 = mockKyInstance(throttleKy(ky, throttle)) - - const url = 'https://httpbin.org/get' - - for (let i = 0; i < 10; i++) { - const before = Date.now() - const res = await ky2.get(url) - const after = Date.now() - - const duration = after - before - // console.log(duration, res.status) - expect(res.status).toBe(200) - - // leave a bit of wiggle room for the interval - if (i > 0) { - expect(duration >= interval - interval / 5).toBeTruthy() +test( + 'throttleKy should rate-limit requests to ky properly', + async () => { + const interval = 1000 + const throttle = pThrottle({ + limit: 1, + interval, + strict: true + }) + + const ky2 = mockKyInstance(throttleKy(ky, throttle)) + + const url = 'https://httpbin.org/get' + + for (let i = 0; i < 10; i++) { + const before = Date.now() + const res = await ky2.get(url) + const after = Date.now() + + const duration = after - before + // console.log(duration, res.status) + expect(res.status).toBe(200) + + // leave a bit of wiggle room for the interval + if (i > 0) { + expect(duration >= interval - interval / 5).toBeTruthy() + } } + }, + { + timeout: 60_000 } -}) +) From b195c6b8f5f00ab094ad07535429fe20b2af6f37 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 00:03:01 -0500 Subject: [PATCH 37/81] =?UTF-8?q?=E2=9A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 26 +- package.json | 1 - src/services/perigon-client.ts | 787 +++++++++++++++++++++++++++------ 3 files changed, 673 insertions(+), 141 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 7c2b8dea8..e21109a88 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -1,13 +1,13 @@ #!/usr/bin/env node import 'dotenv/config' -import { gracefulExit } from 'exit-hook' import restoreCursor from 'restore-cursor' // import { SearxngClient } from '../src/services/searxng-client.js' // import { ClearbitClient } from '../src/index.js' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' -import { WikipediaClient } from '../src/index.js' +// import { WikipediaClient } from '../src/index.js' +import { PerigonClient } from '../src/index.js' /** * Scratch pad for testing. @@ -27,12 +27,12 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const wikipedia = new WikipediaClient() - const res = await wikipedia.getPageSummary({ - // title: 'Naruto_(TV_series)' - title: 'SpaceX' - }) - console.log(JSON.stringify(res, null, 2)) + // const wikipedia = new WikipediaClient() + // const res = await wikipedia.getPageSummary({ + // // title: 'Naruto_(TV_series)' + // title: 'SpaceX' + // }) + // console.log(JSON.stringify(res, null, 2)) // const searxng = new SearxngClient() // const res = await searxng.search({ @@ -41,12 +41,18 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - return gracefulExit(0) + const perigon = new PerigonClient() + const res = await perigon.searchArticles({ + q: 'AI agents AND startup', + sourceGroup: 'top50tech' + }) + + console.log(JSON.stringify(res, null, 2)) } try { await main() } catch (err) { console.error('unexpected error', err) - gracefulExit(1) + process.exit(1) } diff --git a/package.json b/package.json index 4479219fc..1531195eb 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,6 @@ "del-cli": "^5.1.0", "dotenv": "^16.4.5", "eslint": "^8.57.0", - "exit-hook": "^4.0.0", "husky": "^9.0.11", "lint-staged": "^15.2.5", "np": "^10.0.5", diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index 23ed95012..e9750dc40 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -1,105 +1,401 @@ import defaultKy, { type KyInstance } from 'ky' import pThrottle from 'p-throttle' +import { z } from 'zod' -import { assert, getEnv, throttleKy } from '../utils.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv, pruneUndefined, throttleKy } from '../utils.js' export namespace perigon { - // Allow up to 20 requests per minute by default. + // Allow up to 2 requests per second by default. export const throttle = pThrottle({ - limit: 20, - interval: 60 * 1000, + limit: 2, + interval: 1000, strict: true }) - export type ArticleLabel = - | 'Opinion' - | 'Non-news' - | 'Paid News' - | 'Fact Check' - | 'Pop Culture' - | 'Roundup' - | 'Press Release' - - export type Categories = - | 'Politics' - | 'Tech' - | 'Sports' - | 'Business' - | 'Finance' - | 'Entertainment' - | 'Health' - | 'Weather' - | 'Lifestyle' - | 'Auto' - | 'Science' - | 'Travel' - | 'Environment' - | 'World' - | 'General' - | 'none' - - export type ArticlesOptions = { - q: string - title?: string - desc?: string - content?: string - url?: string - from?: string | Date - to?: string | Date - addDateFrom?: string | Date - addDateTo?: string | Date - refreshDateFrom?: string | Date - refreshDateTo?: string | Date - articleId?: string - clusterId?: string - medium?: 'article' | 'video' - source?: string - sourceGroup?: - | 'top10' - | 'top100' - | 'top500English' - | 'top25crypto' - | 'top25finance' - | 'top50tech' - | 'top100sports' - | 'top100leftUS' - | 'top100rightUS' - | 'top100centerUS' - excludeSource?: string - paywall?: boolean - country?: string - language?: string - label?: ArticleLabel - excludeLabel?: ArticleLabel | 'Low Content' - byline?: string - topic?: string - category?: Categories - journalistId?: string - state?: string - city?: string - area?: string - location?: string - sortBy?: 'date' | 'relevance' | 'addDate' | 'pubDate' | 'refreshDate' - relevance?: number - size?: number - showReprints?: boolean - showNumResults?: boolean - type?: 'all' | 'local' | 'world' - linkTo?: string - reprintGroupId?: string - personWikidataId?: string[] - personName?: string[] - companyId?: string[] - companyName?: string - companyDomain?: string[] - companySymbol?: string[] - maxDistance?: number - lat?: number - lon?: number - searchTranslation?: boolean - } + export const DEFAULT_PAGE_SIZE = 10 + export const MAX_PAGE_SIZE = 100 + + export const ArticleLabelSchema = z.union([ + z.literal('Opinion'), + z.literal('Non-news'), + z.literal('Paid News'), + z.literal('Fact Check'), + z.literal('Pop Culture'), + z.literal('Roundup'), + z.literal('Press Release') + ]) + export type ArticleLabel = z.infer + + export const CategoriesSchema = z.union([ + z.literal('Politics'), + z.literal('Tech'), + z.literal('Sports'), + z.literal('Business'), + z.literal('Finance'), + z.literal('Entertainment'), + z.literal('Health'), + z.literal('Weather'), + z.literal('Lifestyle'), + z.literal('Auto'), + z.literal('Science'), + z.literal('Travel'), + z.literal('Environment'), + z.literal('World'), + z.literal('General'), + z.literal('none') + ]) + export type Categories = z.infer + + export const SourceGroupSchema = z.union([ + z.literal('top10').describe('Top 10 most popular sources globally'), + z.literal('top100').describe('Top 100 most popular sources globally'), + z + .literal('top500English') + .describe('Top 500 most popular (English) sources globally'), + z + .literal('top25crypto') + .describe( + 'Top 25 most popular sources covering cryptocurrency & blockchain developments' + ), + z + .literal('top25finance') + .describe( + 'Top 25 most popular sources covering financial news, movement in the markets & public equities' + ), + z + .literal('top50tech') + .describe('Top 50 sources covering new technology & businesses in tech'), + z + .literal('top100sports') + .describe( + 'Top 100 most popular (English) sources covering sports of all types' + ), + z + .literal('top100leftUS') + .describe( + 'Top 100 most popular (US) sources with an average political bias rating of Left or Leans Left' + ), + z + .literal('top100rightUS') + .describe( + 'Top 100 most popular (US) sources with an average political bias rating of Right or Leans Right' + ), + z + .literal('top100centerUS') + .describe( + 'Top 100 most popular (US) sources with an average political bias rating of Center or Middle' + ) + ]) + export type SourceGroup = z.infer + + export const SortBySchema = z.union([ + z.literal('date'), + z.literal('relevance'), + z.literal('addDate'), + z.literal('pubDate'), + z.literal('refreshDate') + ]) + export type SortBy = z.infer + + export const ArticlesSearchOptionsSchema = z.object({ + q: z.string() + .describe(`Search query. It may use boolean operators (AND, OR, NOT) and quotes for exact matching. Example search queries: + +- AI agents +- Compare the latest predictions and popular opinions on the 2024 US election +- "elon musk" AND tesla +- (upcoming release OR launch) AND apple +- (Google OR Amazon) AND NOT ("Jeff Bezos" OR Android) +- "climate change" +- Crypto* OR Bitcoin NOT Ethereum +`), + title: z + .string() + .optional() + .describe( + 'Search query which applies only to article titles / headlines.' + ), + desc: z.string().optional(), + content: z.string().optional(), + url: z.string().optional(), + from: z + .string() + .optional() + .describe( + 'Filter to only return articles published after the specified date (ISO or "yyyy-mm-dd" format)' + ), + to: z + .string() + .optional() + .describe( + 'Filter to only return articles published before the specified date (ISO or "yyyy-mm-dd" format)' + ), + addDateFrom: z.string().optional(), + addDateTo: z.string().optional(), + refreshDateFrom: z.string().optional(), + refreshDateTo: z.string().optional(), + articleId: z.string().optional(), + clusterId: z.string().optional(), + medium: z.union([z.literal('article'), z.literal('video')]).optional(), + source: z + .string() + .optional() + .describe("Filter articles from a specific publisher's source domain."), + sourceGroup: SourceGroupSchema.optional().describe( + 'The source group to retrieve articles from.' + ), + excludeSource: z + .string() + .optional() + .describe( + 'Source website domains which should be excluded from the search. Wildcards (* and ?) are suported (e.g. "*.cnn.com").' + ), + paywall: z + .boolean() + .optional() + .describe( + 'Filter to show only results where the source has a paywall (true) or does not have a paywall (false).' + ), + country: z + .string() + .optional() + .describe('Country code to filter by country.'), + language: z.string().optional(), + label: ArticleLabelSchema.optional().describe( + 'Labels to filter by, could be "Opinion", "Paid-news", "Non-news", etc. If multiple parameters are passed, they will be applied as OR operations.' + ), + excludeLabel: z + .union([ArticleLabelSchema, z.literal('Low Content')]) + .optional() + .describe( + 'Exclude results that include specific labels ("Opinion", "Non-news", "Paid News", etc.). You can filter multiple by repeating the parameter.' + ), + byline: z.string().optional(), + topic: z.string().optional(), + category: CategoriesSchema.optional().describe( + 'Filter by categories. Categories are general themes that the article is about. Examples of categories: Tech, Politics, etc. If multiple parameters are passed, they will be applied as OR operations. Use "none" to search uncategorized articles.' + ), + journalistId: z.string().optional(), + state: z + .string() + .optional() + .describe( + 'Filters articles where a specified state plays a central role in the content, beyond mere mentions, to ensure the results are deeply relevant to the state in question.' + ), + city: z + .string() + .optional() + .describe( + 'Filters articles where a specified city plays a central role in the content, beyond mere mentions, to ensure the results are deeply relevant to the urban area in question.' + ), + area: z + .string() + .optional() + .describe( + 'Filters articles where a specified area, such as a neighborhood, borough, or district, plays a central role in the content, beyond mere mentions, to ensure the results are deeply relevant to the area in question.' + ), + location: z.string().optional(), + sortBy: SortBySchema.default('relevance') + .optional() + .describe('How to sort the article results.'), + showReprints: z + .boolean() + .optional() + .describe( + 'Whether to return reprints in the response or not. Reprints are usually wired articles from sources like AP or Reuters that are reprinted in multiple sources at the same time. By default, this parameter is "true".' + ), + showNumResults: z.boolean().optional(), + type: z + .union([z.literal('all'), z.literal('local'), z.literal('world')]) + .optional(), + linkTo: z.string().optional(), + reprintGroupId: z.string().optional(), + personWikidataId: z.array(z.string()).optional(), + personName: z + .array(z.string()) + .optional() + .describe('List of person names for exact matches.'), + companyId: z.array(z.string()).optional(), + companyName: z.string().optional().describe('Search by company name.'), + companyDomain: z + .array(z.string()) + .optional() + .describe('Search by company domain.'), + companySymbol: z + .array(z.string()) + .optional() + .describe('Search by company stock ticker symbol.'), + maxDistance: z.number().optional(), + lat: z.number().optional(), + lon: z.number().optional(), + searchTranslation: z + .boolean() + .optional() + .describe( + 'Expand a query to search the translation, translatedTitle, and translatedDescription fields for non-English articles.' + ), + page: z + .number() + .int() + .positive() + .max(10_000) + .default(0) + .optional() + .describe('Page number of results to return (zero-based)'), + size: z + .number() + .int() + .positive() + .max(DEFAULT_PAGE_SIZE) + .optional() + .describe('Number of results to return per page') + }) + export type ArticlesSearchOptions = z.infer< + typeof ArticlesSearchOptionsSchema + > + + export const StoriesSearchOptionsSchema = ArticlesSearchOptionsSchema.pick({ + q: true, + clusterId: true, + topic: true, + category: true, + from: true, + to: true, + state: true, + city: true, + area: true, + showNumResults: true, + page: true, + size: true, + sourceGroup: true, + personWikidataId: true, + personName: true, + companyId: true, + companyName: true, + companyDomain: true, + companySymbol: true + }).extend({ + name: z.string().optional().describe('Search stories by name.'), + nameExists: z.boolean().optional(), + initializedFrom: z.string().optional(), + initializedTo: z.string().optional(), + updatedFrom: z.string().optional(), + updatedTo: z.string().optional(), + minClusterSize: z.number().optional(), + maxClusterSize: z.number().optional(), + showDuplicates: z + .boolean() + .optional() + .describe( + 'Stories are deduplicated by default. If a story is deduplicated, all future articles are merged into the original story. `duplicateOf` field contains the original cluster id. When showDuplicates=true, all stories are shown.' + ), + sortBy: z + .union([ + z.literal('count'), + z.literal('createdAt'), + z.literal('updatedAt') + ]) + .optional() + .describe('How to sort the results.') + }) + export type StoriesSearchOptions = z.infer - export type ArticlesResponse = { + export const PeopleSearchOptionsSchema = z.object({ + name: z + .string() + .describe( + 'Person name query to search for. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.' + ), + wikidataId: z + .array(z.string()) + .optional() + .describe('Search by ID of Wikidata entity.'), + occupationId: z + .array(z.string()) + .optional() + .describe('Search by Wikidata occupation ID.'), + occupationLabel: z + .string() + .optional() + .describe('Search by occupation name.'), + size: z + .number() + .int() + .positive() + .max(DEFAULT_PAGE_SIZE) + .optional() + .describe('Number of results to return per page') + }) + export type PeopleSearchOptions = z.infer + + export const CompanySearchOptionsSchema = z.object({ + q: z + .string() + .optional() + .describe( + 'Company search query. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.' + ), + name: z + .string() + .optional() + .describe( + 'Search by company name. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.' + ), + industry: z + .string() + .optional() + .describe( + 'Search by company industry. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.' + ), + sector: z + .string() + .optional() + .describe( + 'Search by company sector. It may use boolean operators (AND, OR, NOT) and quotes for exact matching.' + ), + id: z.array(z.string()).optional().describe('Search by company ID.'), + symbol: z + .array(z.string()) + .optional() + .describe('Search by company stock ticker symbol.'), + domain: z + .array(z.string()) + .optional() + .describe('Search by company domain.'), + country: z.string().optional().describe('Search by country.'), + exchange: z.string().optional().describe('Search by exchange name.'), + numEmployeesFrom: z + .number() + .int() + .positive() + .optional() + .describe('Minimum number of employees.'), + numEmployeesTo: z + .number() + .int() + .positive() + .optional() + .describe('Maximum number of employees.'), + ipoFrom: z + .string() + .optional() + .describe('Starting IPO date (ISO or "yyyy-mm-dd" format)'), + ipoTo: z + .string() + .optional() + .describe('Ending IPO date (ISO or "yyyy-mm-dd" format)'), + size: z + .number() + .int() + .positive() + .max(DEFAULT_PAGE_SIZE) + .optional() + .describe('Number of results to return per page') + }) + export type CompanySearchOptions = z.infer + + export type ArticlesSearchResponse = { status: number numResults: number articles: Article[] @@ -157,31 +453,7 @@ export namespace perigon { places: null } - export type StoriesOptions = { - clusterId?: string - topic?: string - category?: Categories - q?: string - name?: string - nameExists?: boolean - from?: string - to?: string - initializedFrom?: string - initializedTo?: string - updatedFrom?: string - updatedTo?: string - minClusterSize?: number - maxClusterSize?: number - state?: string - city?: string - area?: string - page?: number - size?: number - sortBy?: 'count' | 'createdAt' | 'updatedAt' - showNumResults?: boolean - } - - export type StoriesResponse = { + export type StoriesSearchResponse = { status: number numResults: number results: Story[] @@ -251,15 +523,109 @@ export namespace perigon { county?: string }> } + + export interface PeopleSearchResponse { + status: number + numResults: number + results: Person[] + } + + export interface Person { + wikidataId: string + name: string + gender: Gender + dateOfBirth: DateOfBirth + dateOfDeath: any + description: string + aliases: string[] + occupation: Occupation[] + position: Position[] + politicalParty: PoliticalParty[] + image?: Image + abstract: string + } + + export interface Gender { + wikidataId: string + label: string + } + + export interface DateOfBirth { + time: string + precision: string + } + + export interface Occupation { + wikidataId: string + label: string + } + + export interface Position { + wikidataId: string + label: string + startTime: any + endTime: any + employer: any + } + + export interface PoliticalParty { + wikidataId: string + label: string + startTime: any + endTime: any + } + + export interface Image { + url: string + } + + export interface CompanySearchResponse { + status: number + numResults: number + results: Company[] + } + + export interface Company { + id: string + name: string + altNames: string[] + domains: string[] + monthlyVisits: number + globalRank?: number + description: string + ceo: any + industry: string + sector: any + country: string + fullTimeEmployees?: number + address: any + city: any + state: any + zip: any + logo?: string + favicon?: string + isEtf: boolean + isActivelyTrading: any + isFund: boolean + isAdr: boolean + symbols: any[] + } } /** - * @see https://www.goperigon.com + * **The intelligent news API** + * + * Real-time global news and web content data from 140,000+ sources. + * + * - search news articles + * - search news stories (clusters of related news articles) + * - search people, companies, topics, and journalists + * + * @see https://www.goperigon.com/products/news-api */ -export class PerigonClient { +export class PerigonClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiKey: string - readonly _maxPageSize = 10 constructor({ apiKey = getEnv('PERIGON_API_KEY'), @@ -277,6 +643,7 @@ export class PerigonClient { apiKey, 'PerigonClient missing required "apiKey" (defaults to "PERIGON_API_KEY")' ) + super() this.apiKey = apiKey @@ -288,29 +655,189 @@ export class PerigonClient { }) } - async articles(options: perigon.ArticlesOptions) { + /** + * @see https://docs.goperigon.com/reference/all-news + */ + @aiFunction({ + name: 'search_news_articles', + description: + 'Search for news articles indexed by Perigon. Articles can optionally be filtered by various parameters.', + inputSchema: perigon.ArticlesSearchOptionsSchema.pick({ + q: true, + title: true, + from: true, + to: true, + source: true, + sourceGroup: true, + excludeSource: true, + category: true, + personName: true, + companyName: true, + companyDomain: true, + sortBy: true + }) + }) + async searchArticles(opts: perigon.ArticlesSearchOptions) { + const { + personWikidataId, + personName, + companyId, + companyDomain, + companySymbol, + ...params + } = opts + + const arrayParams = pruneUndefined({ + personWikidataId: personWikidataId?.join(','), + personName: personName?.join(','), + companyId: companyId?.join(','), + companyDomain: companyDomain?.join(','), + companySymbol: companySymbol?.join(',') + }) + return this.ky .get('all', { - // @ts-expect-error there are multiple query params that array of strings - // and KY SearchParamsOption shows a TS error for those types searchParams: { + ...arrayParams, + ...params, apiKey: this.apiKey, - ...options, - size: Math.min(this._maxPageSize, options.size || this._maxPageSize) + size: Math.max( + 1, + Math.min( + perigon.MAX_PAGE_SIZE, + opts.size || perigon.DEFAULT_PAGE_SIZE + ) + ) } }) - .json() + .json() } - async stories(options: perigon.StoriesOptions) { + /** + * @see https://docs.goperigon.com/reference/stories-1 + */ + @aiFunction({ + name: 'search_news_stories', + description: + 'Search for news stories indexed by Perigon. Stories are clusters of related news articles and are useful for finding top stories and trending headlines. Stories can optionally be filtered by various parameters.', + inputSchema: perigon.StoriesSearchOptionsSchema.pick({ + q: true, + name: true, + from: true, + to: true, + sourceGroup: true, + category: true, + personName: true, + companyName: true, + companyDomain: true, + sortBy: true + }) + }) + async searchStories(opts: perigon.StoriesSearchOptions) { + const { + personWikidataId, + personName, + companyId, + companyDomain, + companySymbol, + ...params + } = opts + + const arrayParams = pruneUndefined({ + personWikidataId: personWikidataId?.join(','), + personName: personName?.join(','), + companyId: companyId?.join(','), + companyDomain: companyDomain?.join(','), + companySymbol: companySymbol?.join(',') + }) + return this.ky .get('stories/all', { searchParams: { + ...arrayParams, + ...params, + apiKey: this.apiKey, + size: Math.max( + 1, + Math.min( + perigon.MAX_PAGE_SIZE, + opts.size || perigon.DEFAULT_PAGE_SIZE + ) + ) + } + }) + .json() + } + + /** + * @see https://docs.goperigon.com/docs/people-data + * @see https://docs.goperigon.com/reference/people + */ + @aiFunction({ + name: 'search_people', + description: 'Search for well-known people indexed by Perigon.', + inputSchema: perigon.PeopleSearchOptionsSchema + }) + async searchPeople(opts: perigon.PeopleSearchOptions) { + const { wikidataId, occupationId, ...params } = opts + + const arrayParams = pruneUndefined({ + wikidataId: wikidataId?.join(','), + occupationId: occupationId?.join(',') + }) + + return this.ky + .get('people/all', { + searchParams: { + ...arrayParams, + ...params, + apiKey: this.apiKey, + size: Math.max( + 1, + Math.min( + perigon.MAX_PAGE_SIZE, + opts.size || perigon.DEFAULT_PAGE_SIZE + ) + ) + } + }) + .json() + } + + /** + * @see https://docs.goperigon.com/docs/company-data + * @see https://docs.goperigon.com/reference/companies + */ + @aiFunction({ + name: 'search_companies', + description: + 'Search for companies indexed by Perigon. Includes public and private companies sourced from public records and Wikidata.', + inputSchema: perigon.CompanySearchOptionsSchema + }) + async searchCompanies(opts: perigon.CompanySearchOptions) { + const { id, symbol, domain, ...params } = opts + + const arrayParams = pruneUndefined({ + id: id?.join(','), + domain: domain?.join(','), + symbol: symbol?.join(',') + }) + + return this.ky + .get('companies/all', { + searchParams: { + ...arrayParams, + ...params, apiKey: this.apiKey, - ...options, - size: Math.min(this._maxPageSize, options.size || this._maxPageSize) + size: Math.max( + 1, + Math.min( + perigon.MAX_PAGE_SIZE, + opts.size || perigon.DEFAULT_PAGE_SIZE + ) + ) } }) - .json() + .json() } } From 760b4d5716a97ae34777bc0aff38ee75abd22268 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 00:10:17 -0500 Subject: [PATCH 38/81] =?UTF-8?q?=F0=9F=8D=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/perigon-client.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index e9750dc40..0c92001fe 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -5,6 +5,10 @@ import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, pruneUndefined, throttleKy } from '../utils.js' +// TODO: https://docs.goperigon.com/docs/searching-sources +// TODO: https://docs.goperigon.com/docs/journalist-data +// TODO: https://docs.goperigon.com/docs/topics + export namespace perigon { // Allow up to 2 requests per second by default. export const throttle = pThrottle({ @@ -656,6 +660,7 @@ export class PerigonClient extends AIFunctionsProvider { } /** + * @see https://docs.goperigon.com/docs/overview * @see https://docs.goperigon.com/reference/all-news */ @aiFunction({ @@ -714,6 +719,7 @@ export class PerigonClient extends AIFunctionsProvider { } /** + * @see https://docs.goperigon.com/docs/stories-overview * @see https://docs.goperigon.com/reference/stories-1 */ @aiFunction({ From ca9254d567c52748a0a516f64e2c4a2c4f5a0e3c Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 01:19:10 -0500 Subject: [PATCH 39/81] =?UTF-8?q?=F0=9F=93=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 21 ++++++++++------ examples/openai/weather.ts | 3 +-- package.json | 1 - pnpm-lock.yaml | 11 --------- readme.md | 5 ++++ src/assert.ts | 32 +++++++++++++++++++++++++ src/services/firecrawl-client.ts | 20 +++++++++++++--- src/services/people-data-labs-client.ts | 30 +++++++++++++++++++---- src/utils.ts | 2 +- 9 files changed, 95 insertions(+), 30 deletions(-) create mode 100644 src/assert.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index e21109a88..7cf5df388 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -7,7 +7,8 @@ import restoreCursor from 'restore-cursor' // import { ClearbitClient } from '../src/index.js' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' // import { WikipediaClient } from '../src/index.js' -import { PerigonClient } from '../src/index.js' +// import { PerigonClient } from '../src/index.js' +import { FirecrawlClient } from '../src/index.js' /** * Scratch pad for testing. @@ -41,18 +42,24 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const perigon = new PerigonClient() - const res = await perigon.searchArticles({ - q: 'AI agents AND startup', - sourceGroup: 'top50tech' - }) + // const perigon = new PerigonClient() + // const res = await perigon.searchArticles({ + // q: 'AI agents AND startup', + // sourceGroup: 'top50tech' + // }) + // console.log(JSON.stringify(res, null, 2)) + const firecrawl = new FirecrawlClient() + const res = await firecrawl.scrapeUrl({ + // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + url: 'https://www.firecrawl.dev' + }) console.log(JSON.stringify(res, null, 2)) } try { await main() } catch (err) { - console.error('unexpected error', err) + console.error('error', err) process.exit(1) } diff --git a/examples/openai/weather.ts b/examples/openai/weather.ts index 853a985be..6b11ccbc5 100644 --- a/examples/openai/weather.ts +++ b/examples/openai/weather.ts @@ -2,9 +2,8 @@ import 'dotenv/config' import OpenAI from 'openai' -import { default as assert } from 'tiny-invariant' -import { WeatherClient } from '../../src/index.js' +import { assert, WeatherClient } from '../../src/index.js' async function main() { const weather = new WeatherClient() diff --git a/package.json b/package.json index 1531195eb..45fbe1ce8 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,6 @@ "jsonrepair": "^3.6.1", "ky": "^1.2.4", "p-throttle": "^6.1.0", - "tiny-invariant": "^1.3.3", "twitter-api-sdk": "^1.2.1", "type-fest": "^4.18.3", "zod": "^3.23.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f1eacdfd..7b9efbd47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,9 +26,6 @@ importers: p-throttle: specifier: ^6.1.0 version: 6.1.0 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 twitter-api-sdk: specifier: ^1.2.1 version: 1.2.1 @@ -75,9 +72,6 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 - exit-hook: - specifier: ^4.0.0 - version: 4.0.0 husky: specifier: ^9.0.11 version: 9.0.11 @@ -4060,9 +4054,6 @@ packages: tiktoken@1.0.15: resolution: {integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw==} - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} @@ -8681,8 +8672,6 @@ snapshots: tiktoken@1.0.15: {} - tiny-invariant@1.3.3: {} - tinybench@2.8.0: {} tinypool@0.9.0: {} diff --git a/readme.md b/readme.md index 6732ff241..9ec9ddb52 100644 --- a/readme.md +++ b/readme.md @@ -50,6 +50,11 @@ - instructor-js - TODO - services + - calculator + - e2b + - search-and-scrape + - replicate + - huggingface - wolfram alpha - midjourney - unstructured diff --git a/src/assert.ts b/src/assert.ts new file mode 100644 index 000000000..01d92535c --- /dev/null +++ b/src/assert.ts @@ -0,0 +1,32 @@ +/** + * Slightly modified version of [tiny-invariant](https://github.com/alexreardon/tiny-invariant). + * + * `assert` is used to [assert](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions) that the `condition` is [truthy](https://github.com/getify/You-Dont-Know-JS/blob/bdbe570600d4e1107d0b131787903ca1c9ec8140/up%20%26%20going/ch2.md#truthy--falsy). + * + * 💥 `assert` will `throw` an `Error` if the `condition` is [falsey](https://github.com/getify/You-Dont-Know-JS/blob/bdbe570600d4e1107d0b131787903ca1c9ec8140/up%20%26%20going/ch2.md#truthy--falsy) + * + * @example + * + * ```ts + * const value: Person | null = { name: 'Alex' }; + * assert(value, 'Expected value to be a person'); + * // type of `value`` has been narrowed to `Person` + * ``` + */ +export function assert( + condition: any, + /** + * Can provide a string, or a function that returns a string for cases where + * the message takes a fair amount of effort to compute. + */ + message?: string | (() => string) +): asserts condition { + if (condition) { + return + } + + const providedMessage: string | undefined = + typeof message === 'function' ? message() : message + + throw new Error(providedMessage ?? 'Assertion failed') +} diff --git a/src/services/firecrawl-client.ts b/src/services/firecrawl-client.ts index 970b97935..cd7157d96 100644 --- a/src/services/firecrawl-client.ts +++ b/src/services/firecrawl-client.ts @@ -1,15 +1,17 @@ import defaultKy, { type KyInstance } from 'ky' import z from 'zod' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, delay, getEnv } from '../utils.js' import { zodToJsonSchema } from '../zod-to-json-schema.js' +// TODO: Deprioritizing this client for now because the API doesn't seem to be stable. + export namespace firecrawl { /** * Generic parameter interface. */ export interface Params { - [key: string]: any extractorOptions?: { extractionSchema: z.ZodSchema | any mode?: 'llm-extraction' @@ -59,8 +61,9 @@ export namespace firecrawl { /** * @see https://www.firecrawl.dev + * @see https://github.com/mendableai/firecrawl */ -export class FirecrawlClient { +export class FirecrawlClient extends AIFunctionsProvider { readonly ky: KyInstance readonly apiKey: string readonly apiBaseUrl: string @@ -69,10 +72,12 @@ export class FirecrawlClient { apiKey = getEnv('FIRECRAWL_API_KEY'), apiBaseUrl = getEnv('FIRECRAWL_API_BASE_URL') ?? 'https://api.firecrawl.dev', + timeoutMs = 60_000, ky = defaultKy }: { apiKey?: string apiBaseUrl?: string + timeoutMs?: number ky?: KyInstance } = {}) { assert( @@ -83,18 +88,27 @@ export class FirecrawlClient { apiBaseUrl, 'FirecrawlClient missing required "apiBaseUrl" (defaults to "FIRECRAWL_API_BASE_URL")' ) + super() this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl this.ky = ky.extend({ prefixUrl: apiBaseUrl, + timeout: timeoutMs, headers: { Authorization: `Bearer ${this.apiKey}` } }) } + @aiFunction({ + name: 'firecrawl_scrape_url', + description: 'Scrape the contents of a URL.', + inputSchema: z.object({ + url: z.string().url().describe('The URL to scrape.') + }) + }) async scrapeUrl( opts: { url: string @@ -173,7 +187,7 @@ export class FirecrawlClient { async waitForCrawlJob({ jobId, - timeoutMs = 30_000 + timeoutMs = 60_000 }: { jobId: string timeoutMs?: number diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts index 4e74c79d2..dc980eee6 100644 --- a/src/services/people-data-labs-client.ts +++ b/src/services/people-data-labs-client.ts @@ -3,12 +3,25 @@ import pThrottle from 'p-throttle' import { assert, getEnv, throttleKy } from '../utils.js' +/** + * TODO: I'm holding off on converting this client to an `AIFunctionsProvider` + * because it seems to be significantly more expensive than other data sources, + * and I'm not sure if it's worth the cost. + */ + export namespace peopledatalabs { export const BASE_URL = 'https://api.peopledatalabs.com/v5/' - // Allow up to 20 requests per minute by default. - export const throttle = pThrottle({ - limit: 20, + // Allow up to 10 requests per minute. + export const throttle10PerMin = pThrottle({ + limit: 10, + interval: 60 * 1000, + strict: true + }) + + // Allow up to 100 requests per minute. + export const throttle100PerMin = pThrottle({ + limit: 100, interval: 60 * 1000, strict: true }) @@ -431,6 +444,11 @@ export namespace peopledatalabs { } } +/** + * People & Company Data + * + * @see https://www.peopledatalabs.com + */ export class PeopleDataLabsClient { readonly ky: KyInstance readonly apiKey: string @@ -457,13 +475,15 @@ export class PeopleDataLabsClient { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl - const throttledKy = throttle ? throttleKy(ky, peopledatalabs.throttle) : ky + const throttledKy = throttle + ? throttleKy(ky, peopledatalabs.throttle10PerMin) + : ky this.ky = throttledKy.extend({ prefixUrl: apiBaseUrl, timeout: timeoutMs, headers: { - 'X-Api-Key': `${this.apiKey}` + 'x-api-key': `${this.apiKey}` } }) } diff --git a/src/utils.ts b/src/utils.ts index b080d1d97..e6c4bc423 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,7 +1,7 @@ import type * as types from './types.js' +export { assert } from './assert.js' export { default as delay } from 'delay' -export { default as assert } from 'tiny-invariant' /** * From `inputObj`, create a new object that does not include `keys`. From 7731ca09bcf41b11e14eb378f84a3d3c84060e77 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 02:09:12 -0500 Subject: [PATCH 40/81] =?UTF-8?q?=F0=9F=93=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/exa-client.ts | 335 ++++++++++++++----------------- src/services/firecrawl-client.ts | 3 +- 2 files changed, 157 insertions(+), 181 deletions(-) diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index 76d0495e3..b61a251d8 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -1,135 +1,160 @@ import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv } from '../utils.js' export namespace exa { - /** - * Search options for performing a search query. - */ - export type BaseSearchOptions = { - /** Number of search results to return. Default 10. Max 10 for basic plans. */ - numResults?: number - /** List of domains to include in the search. */ - includeDomains?: string[] - /** List of domains to exclude in the search. */ - excludeDomains?: string[] - /** Start date for results based on crawl date. */ - startCrawlDate?: string - /** End date for results based on crawl date. */ - endCrawlDate?: string - /** Start date for results based on published date. */ - startPublishedDate?: string - /** End date for results based on published date. */ - endPublishedDate?: string - /** A data category to focus on, with higher comprehensivity and data cleanliness. Currently, the only category is company. */ - category?: string - } - - /** - * Search options for performing a search query. - */ - export type RegularSearchOptions = BaseSearchOptions & { - /** If true, converts query to a Metaphor query. */ - useAutoprompt?: boolean - /** Type of search, 'keyword' or 'neural'. */ - type?: string - } - - /** - * Options for finding similar links. - */ - export type FindSimilarOptions = BaseSearchOptions & { - /** If true, excludes links from the base domain of the input. */ - excludeSourceDomain?: boolean - } - - /** - * Search options for performing a search query. - */ - export type ContentsOptions = { - /** Options for retrieving text contents. */ - text?: TextContentsOptions | true - /** Options for retrieving highlights. */ - highlights?: HighlightsContentsOptions | true - } - - /** - * Options for retrieving text from page. - */ - export type TextContentsOptions = { - /** The maximum number of characters to return. */ - maxCharacters?: number - /** If true, includes HTML tags in the returned text. Default: false */ - includeHtmlTags?: boolean - } - - /** - * Options for retrieving highlights from page. - * @typedef {Object} HighlightsContentsOptions - */ - export type HighlightsContentsOptions = { - /** The query string to use for highlights search. */ - query?: string - /** The number of sentences to return for each highlight. */ - numSentences?: number - /** The number of highlights to return for each URL. */ - highlightsPerUrl?: number - } - - export type TextResponse = { - /** Text from page */ - text: string - } - - export type HighlightsResponse = { - /** The highlights as an array of strings. */ - highlights: string[] - /** The corresponding scores as an array of floats, 0 to 1 */ - highlightScores: number[] - } - - export type Default = [keyof T] extends [never] ? U : T - - /** - * Depending on 'ContentsOptions', this yields either a 'TextResponse', - * a 'HighlightsResponse', both, or an empty object. - */ - export type ContentsResultComponent = Default< - (T['text'] extends object | true ? TextResponse : {}) & - (T['highlights'] extends object | true ? HighlightsResponse : {}), - TextResponse + export const TextContentsOptionsSchema = z.object({ + maxCharacters: z + .number() + .optional() + .describe('The maximum number of characters to return.'), + includeHtmlTags: z + .boolean() + .optional() + .describe('If true, includes HTML tags in the returned text.') + }) + export type TextContentsOptions = z.infer + + export const HighlightsContentsOptionsSchema = z.object({ + query: z + .string() + .optional() + .describe('The query string to use for highlights search.'), + numSentences: z + .number() + .optional() + .describe('The number of sentences to return for each highlight.'), + highlightsPerUrl: z + .number() + .optional() + .describe('The number of highlights to return for each URL.') + }) + export type HighlightsContentsOptions = z.infer< + typeof HighlightsContentsOptionsSchema > + export const ContentsOptionsSchema = z.object({ + text: z.union([TextContentsOptionsSchema, z.literal(true)]).optional(), + highlights: z + .union([HighlightsContentsOptionsSchema, z.literal(true)]) + .optional() + }) + export type ContentsOptions = z.infer + + export const BaseSearchOptionsSchema = z.object({ + numResults: z + .number() + .optional() + .describe('Number of search results to return.'), + includeDomains: z + .array(z.string()) + .optional() + .describe('List of domains to include in the search.'), + excludeDomains: z + .array(z.string()) + .optional() + .describe('List of domains to exclude from the search.'), + startCrawlDate: z + .string() + .optional() + .describe('Start date for results based on crawl date.'), + endCrawlDate: z + .string() + .optional() + .describe('End date for results based on crawl date.'), + startPublishedDate: z + .string() + .optional() + .describe('Start date for results based on published date.'), + endPublishedDate: z + .string() + .optional() + .describe('End date for results based on published date.'), + category: z + .string() + .optional() + .describe( + 'A data category to focus on, with higher comprehensivity and data cleanliness. Currently, the only category is company.' + ), + contents: ContentsOptionsSchema.optional().describe( + 'Whether to include the contents of the search results.' + ) + }) + export type BaseSearchOptions = z.infer + + export const RegularSearchOptionsSchema = BaseSearchOptionsSchema.extend({ + query: z.string().describe('search query'), + useAutoprompt: z.boolean().optional(), + type: z.enum(['keyword', 'neural', 'magic']).optional() + }) + export type RegularSearchOptions = z.infer + + export const FindSimilarOptionsSchema = BaseSearchOptionsSchema.extend({ + url: z + .string() + .describe('The url for which you would like to find similar links'), + excludeSourceDomain: z + .boolean() + .optional() + .describe('If true, excludes links from the base domain of the input.') + }) + export type FindSimilarOptions = z.infer + + export const GetContentsOptionsSchema = ContentsOptionsSchema.extend({ + ids: z + .array(z.string()) + .nonempty() + .describe('Exa IDs of the documents to retrieve.') + }) + export type GetContentsOptions = z.infer + /** * Represents a search result object. */ - export type SearchResult = { + export type SearchResult = { /** The title of the search result. */ title: string | null + /** The URL of the search result. */ url: string + /** The estimated creation date of the content. */ publishedDate?: string + /** The author of the content, if available. */ author?: string + /** Similarity score between the query/url and the result. */ score?: number - /** The temporary ID for the document. */ + + /** The temporary Exa ID for the document. */ id: string - } & ContentsResultComponent + + /** Text from page */ + text?: string + + /** The highlights as an array of strings. */ + highlights?: string[] + + /** The corresponding scores as an array of floats, 0 to 1 */ + highlightScores?: number[] + } /** * Represents a search response object. */ - export type SearchResponse = { + export type SearchResponse = { /** The list of search results. */ - results: SearchResult[] + results: SearchResult[] + /** The autoprompt string, if applicable. */ autopromptString?: string } } -export class ExaClient { +export class ExaClient extends AIFunctionsProvider { readonly apiKey: string readonly apiBaseUrl: string readonly ky: KyInstance @@ -147,6 +172,7 @@ export class ExaClient { apiKey, 'ExaClient missing required "apiKey" (defaults to "EXA_API_KEY")' ) + super() this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl @@ -162,103 +188,52 @@ export class ExaClient { /** * Performs an Exa search for the given query. */ - async search(opts: { query: string } & exa.RegularSearchOptions) { - return this.ky.get('search', { json: opts }).json() - } - - /** - * Performs a search with a Exa prompt-engineered query and returns the - * contents of the documents. - */ - async searchAndContents({ - query, - text, - highlights, - ...rest - }: { query: string } & exa.RegularSearchOptions & T) { - return this.ky - .post('search', { - json: { - query, - contents: - !text && !highlights - ? { text: true } - : { - ...(text ? { text } : {}), - ...(highlights ? { highlights } : {}) - }, - ...rest - } - }) - .json>() + @aiFunction({ + name: 'exa_search', + description: 'Search the web for the given query.', + inputSchema: exa.RegularSearchOptionsSchema + }) + async search(queryOrOpts: string | exa.RegularSearchOptions) { + const json = + typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts + + return this.ky.post('search', { json }).json() } /** * Finds similar links to the provided URL. */ - async findSimilar(opts: { url: string } & exa.FindSimilarOptions) { + @aiFunction({ + name: 'exa_find_similar', + description: 'Find similar links to the provided URL.', + inputSchema: exa.FindSimilarOptionsSchema + }) + async findSimilar(opts: exa.FindSimilarOptions) { return this.ky .post('findSimilar', { json: opts }) .json() } /** - * Finds similar links to the provided URL and returns the contents of the - * documents. + * Retrieves contents of documents based on a list of Exa document IDs. */ - async findSimilarAndContents< - T extends exa.ContentsOptions = exa.ContentsOptions - >({ - url, - text, - highlights, - ...rest - }: { url: string } & exa.FindSimilarOptions & T) { - return this.ky - .post('findSimilar', { - json: { - url, - contents: - !text && !highlights - ? { text: true } - : { - ...(text ? { text } : {}), - ...(highlights ? { highlights } : {}) - }, - ...rest - } - }) - .json>() - } - - /** - * Retrieves contents of documents based on a list of document IDs. - */ - async getContents({ - ids, - ...opts - }: { ids: string | string[] | exa.SearchResult[] } & T) { - let requestIds: string[] - - if (typeof ids === 'string') { - requestIds = [ids] - } else if (typeof ids[0] === 'string') { - requestIds = ids as string[] - } else { - requestIds = (ids as exa.SearchResult[]).map((result) => result.id) - } - - if (ids.length === 0) { - throw new Error('Must provide at least one ID') - } + @aiFunction({ + name: 'exa_get_contents', + description: + 'Retrieve contents of documents based on a list of Exa document IDs.', + inputSchema: exa.GetContentsOptionsSchema + }) + async getContents({ ids, ...opts }: exa.GetContentsOptions) { + const documentIDs = Array.isArray(ids) ? ids : [ids] + assert(documentIDs.length, 'Must provide at least one document ID') return this.ky .post('contents', { json: { ...opts, - ids: requestIds + ids: documentIDs } }) - .json>() + .json() } } diff --git a/src/services/firecrawl-client.ts b/src/services/firecrawl-client.ts index cd7157d96..134d1d48b 100644 --- a/src/services/firecrawl-client.ts +++ b/src/services/firecrawl-client.ts @@ -5,7 +5,8 @@ import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, delay, getEnv } from '../utils.js' import { zodToJsonSchema } from '../zod-to-json-schema.js' -// TODO: Deprioritizing this client for now because the API doesn't seem to be stable. +// TODO: Deprioritizing this client for now because the API doesn't seem to be +// stable. export namespace firecrawl { /** From 3caa185fbe7b254c9c400214a31b8dcfcbaffb8f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 02:19:25 -0500 Subject: [PATCH 41/81] =?UTF-8?q?=F0=9F=A6=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 20 +++++++++++++++----- src/services/exa-client.ts | 17 +++++++++++++++-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 7cf5df388..4ed458ac8 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -8,7 +8,8 @@ import restoreCursor from 'restore-cursor' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' // import { WikipediaClient } from '../src/index.js' // import { PerigonClient } from '../src/index.js' -import { FirecrawlClient } from '../src/index.js' +// import { FirecrawlClient } from '../src/index.js' +import { ExaClient } from '../src/index.js' /** * Scratch pad for testing. @@ -49,10 +50,19 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const firecrawl = new FirecrawlClient() - const res = await firecrawl.scrapeUrl({ - // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' - url: 'https://www.firecrawl.dev' + // const firecrawl = new FirecrawlClient() + // const res = await firecrawl.scrapeUrl({ + // // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + // url: 'https://www.firecrawl.dev' + // }) + // console.log(JSON.stringify(res, null, 2)) + + const exa = new ExaClient() + const res = await exa.search({ + query: 'OpenAI', + contents: { + text: true + } }) console.log(JSON.stringify(res, null, 2)) } diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index b61a251d8..dac09150a 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -2,7 +2,7 @@ import defaultKy, { type KyInstance } from 'ky' import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv } from '../utils.js' +import { assert, getEnv, pruneUndefined } from '../utils.js' export namespace exa { export const TextContentsOptionsSchema = z.object({ @@ -151,6 +151,9 @@ export namespace exa { /** The autoprompt string, if applicable. */ autopromptString?: string + + /** Internal ID of this request. */ + requestId?: string } } @@ -209,8 +212,18 @@ export class ExaClient extends AIFunctionsProvider { inputSchema: exa.FindSimilarOptionsSchema }) async findSimilar(opts: exa.FindSimilarOptions) { + const { excludeSourceDomain, ...rest } = opts + const excludeDomains = (opts.excludeDomains ?? []).concat( + excludeSourceDomain ? [new URL(opts.url).hostname] : [] + ) + return this.ky - .post('findSimilar', { json: opts }) + .post('findSimilar', { + json: pruneUndefined({ + ...rest, + excludeDomains: excludeDomains.length ? excludeDomains : undefined + }) + }) .json() } From 5863f31f8bcfaabec8952848e2d82062a112b3f6 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 03:46:05 -0500 Subject: [PATCH 42/81] =?UTF-8?q?=F0=9F=98=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + bin/scratch.ts | 23 +- src/fns.ts | 2 +- src/services/diffbot-client.ts | 580 ++++++++++++++++++++++++++------- 4 files changed, 483 insertions(+), 124 deletions(-) diff --git a/.gitignore b/.gitignore index a06a32b14..29026e30c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ yarn-error.log* next-env.d.ts .env + +old/ diff --git a/bin/scratch.ts b/bin/scratch.ts index 4ed458ac8..a0b4c31ad 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -9,7 +9,8 @@ import restoreCursor from 'restore-cursor' // import { WikipediaClient } from '../src/index.js' // import { PerigonClient } from '../src/index.js' // import { FirecrawlClient } from '../src/index.js' -import { ExaClient } from '../src/index.js' +// import { ExaClient } from '../src/index.js' +import { DiffbotClient } from '../src/index.js' /** * Scratch pad for testing. @@ -57,12 +58,20 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const exa = new ExaClient() - const res = await exa.search({ - query: 'OpenAI', - contents: { - text: true - } + // const exa = new ExaClient() + // const res = await exa.search({ + // query: 'OpenAI', + // contents: { text: true } + // }) + // console.log(JSON.stringify(res, null, 2)) + + const diffbot = new DiffbotClient() + // const res = await diffbot.analyzeUrl({ + // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + // }) + const res = await diffbot.enhanceEntity({ + type: 'Person', + name: 'Travis Fischer' }) console.log(JSON.stringify(res, null, 2)) } diff --git a/src/fns.ts b/src/fns.ts index 7f827ef9c..55422f710 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -40,7 +40,7 @@ export abstract class AIFunctionsProvider { } export function aiFunction< - This, + This extends AIFunctionsProvider, InputSchema extends z.SomeZodObject, OptionalArgs extends Array, Return extends types.MaybePromise diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 56afce90d..8ea45deed 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -1,6 +1,8 @@ import defaultKy, { type KyInstance } from 'ky' import pThrottle from 'p-throttle' +import { z } from 'zod' +import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, throttleKy } from '../utils.js' export namespace diffbot { @@ -8,13 +10,14 @@ export namespace diffbot { export const KNOWLEDGE_GRAPH_API_BASE_URL = 'https://kg.diffbot.com' // Allow up to 5 requests per second by default. + // https://docs.diffbot.com/reference/rate-limits export const throttle = pThrottle({ limit: 5, interval: 1000, strict: true }) - export interface DiffbotExtractOptions { + export interface ExtractOptions { /** Specify optional fields to be returned from any fully-extracted pages, e.g.: &fields=querystring,links. See available fields within each API's individual documentation pages. * @see https://docs.diffbot.com/reference/extract-optional-fields */ @@ -45,8 +48,8 @@ export namespace diffbot { customHeaders?: Record } - export interface DiffbotExtractAnalyzeOptions extends DiffbotExtractOptions { - /** Web page URL of the analyze to process */ + export interface ExtractAnalyzeOptions extends ExtractOptions { + /** URL of the web page to process */ url: string /** By default the Analyze API will fully extract all pages that match an existing Automatic API -- articles, products or image pages. Set mode to a specific page-type (e.g., mode=article) to extract content only from that specific page-type. All other pages will simply return the default Analyze fields. */ @@ -56,8 +59,8 @@ export namespace diffbot { fallback?: string } - export interface DiffbotExtractArticleOptions extends DiffbotExtractOptions { - /** Web page URL of the analyze to process */ + export interface ExtractArticleOptions extends ExtractOptions { + /** URL of the web page to process */ url: string /** Set the maximum number of automatically-generated tags to return. By default a maximum of ten tags will be returned. */ @@ -70,15 +73,14 @@ export namespace diffbot { naturalLanguage?: string[] } - export interface DiffbotExtractResponse { + export interface ExtractResponse { request: DiffbotRequest objects: DiffbotObject[] } - export type DiffbotExtractArticleResponse = DiffbotExtractResponse + export type ExtractArticleResponse = ExtractResponse - export interface DiffbotExtractAnalyzeResponse - extends DiffbotExtractResponse { + export interface ExtractAnalyzeResponse extends ExtractResponse { type: string title: string humanLanguage: string @@ -87,7 +89,7 @@ export namespace diffbot { export interface DiffbotObject { date: string sentiment: number - images: DiffbotImage[] + images: Image[] author: string estimatedDate: string publisherRegion: string @@ -96,44 +98,44 @@ export namespace diffbot { siteName: string type: string title: string - tags: DiffbotTag[] + tags: Tag[] publisherCountry: string humanLanguage: string authorUrl: string pageUrl: string html: string text: string - categories?: DiffbotCategory[] - authors: DiffbotAuthor[] - breadcrumb?: DiffbotBreadcrumb[] - items?: DiffbotListItem[] + categories?: ObjectCategory[] + authors: Author[] + breadcrumb?: Breadcrumb[] + items?: ListItem[] meta?: any } - interface DiffbotListItem { + export interface ListItem { title: string link: string summary: string image?: string } - interface DiffbotAuthor { + export interface Author { name: string link: string } - interface DiffbotCategory { + export interface ObjectCategory { score: number name: string id: string } - export interface DiffbotBreadcrumb { + export interface Breadcrumb { link: string name: string } - interface DiffbotImage { + export interface Image { url: string diffbotUri: string @@ -146,29 +148,6 @@ export namespace diffbot { primary?: boolean } - interface DiffbotTag { - score: number - sentiment: number - count: number - label: string - uri: string - rdfTypes: string[] - } - - interface DiffbotRequest { - pageUrl: string - api: string - version: number - } - - export interface Image { - naturalHeight: number - diffbotUri: string - url: string - naturalWidth: number - primary: boolean - } - export interface Tag { score: number sentiment: number @@ -178,13 +157,13 @@ export namespace diffbot { rdfTypes: string[] } - export interface Request { + export interface DiffbotRequest { pageUrl: string api: string version: number } - export interface DiffbotKnowledgeGraphSearchOptions { + export interface KnowledgeGraphSearchOptions { type?: 'query' | 'text' | 'queryTextFallback' | 'crawl' query: string col?: string @@ -206,8 +185,8 @@ export namespace diffbot { report?: boolean } - export interface DiffbotKnowledgeGraphEnhanceOptions { - type: 'Person' | 'Organization' + export interface KnowledgeGraphEnhanceOptions { + type: EntityType id?: string name?: string @@ -233,8 +212,8 @@ export namespace diffbot { nonCanonicalFacts?: boolean } - export interface DiffbotKnowledgeGraphResponse { - data: DiffbotKnowledgeGraphNode[] + export interface KnowledgeGraphResponse { + data: KnowledgeGraphNode[] version: number hits: number results: number @@ -244,10 +223,10 @@ export namespace diffbot { errors?: any[] } - export interface DiffbotKnowledgeGraphNode { + export interface KnowledgeGraphNode { score: number esscore?: number - entity: DiffbotKnowledgeGraphEntity + entity: KnowledgeGraphEntity entity_ctx: any errors: string[] callbackQuery: string @@ -258,77 +237,406 @@ export namespace diffbot { uri: string } - export interface DiffbotKnowledgeGraphEntity { + export interface KnowledgeGraphEntity { id: string diffbotUri: string type?: string name: string - images: DiffbotImage[] + images: Image[] origins: string[] nbOrigins?: number - gender?: DiffbotGender + gender?: Gender githubUri?: string importance?: number description?: string homepageUri?: string allNames?: string[] - skills?: DiffbotSkill[] + skills?: Skill[] crawlTimestamp?: number summary?: string image?: string types?: string[] nbIncomingEdges?: number allUris?: string[] - employments?: DiffbotEmployment[] - locations?: DiffbotLocation[] - location?: DiffbotLocation + employments?: Employment[] + locations?: Location[] + location?: Location allOriginHashes?: string[] - nameDetail?: DiffbotNameDetail + nameDetail?: NameDetail + } + + export type EntityType = 'Organization' | 'Place' + + export const EnhanceEntityOptionsSchema = z.object({ + type: z.enum(['Person', 'Organization']), + id: z + .string() + .optional() + .describe('Diffbot ID of the entity to enhance if known'), + name: z + .union([z.string(), z.array(z.string())]) + .optional() + .describe('Name of the entity'), + url: z + .array(z.string()) + .optional() + .describe('Origin or homepage URL of the entity'), + phone: z.string().optional().describe('Phone number of the entity'), + email: z.string().optional().describe('Email of the entity'), + employer: z + .string() + .optional() + .describe("Name of the entity's employer (for Person entities)"), + title: z + .string() + .optional() + .describe('Title of the entity (for Person entities)'), + school: z + .string() + .optional() + .describe('School of the entity (for Person entities)'), + location: z.string().optional().describe('Location of the entity'), + ip: z.string().optional().describe('IP address of the entity'), + customId: z.string().optional().describe('User-defined ID for correlation'), + threshold: z.number().optional().describe('Similarity threshold'), + refresh: z + .boolean() + .optional() + .describe( + 'If set, will attempt to refresh the entity data by recrawling the source URLs.' + ), + search: z + .boolean() + .optional() + .describe( + 'If set, will attempt to search the web for the entity and merge the results into its knowledge base.' + ), + size: z + .number() + .int() + .positive() + .max(100) + .optional() + .describe('Number of results to return') + }) + export type EnhanceEntityOptions = z.infer + + export interface EnhanceEntityResponse { + version: number + hits: number + kgversion: string + request_ctx: RequestCtx + data: EnhanceEntityResponseDatum[] + errors: any[] + } + + export interface RequestCtx { + query: Query + query_ctx: QueryCtx + } + + export interface Query { + type: string + name: string[] + } + + export interface QueryCtx { + search: string } - interface DiffbotEmployment { - employer: Entity + export interface EnhanceEntityResponseDatum { + score: number + esscore: number + entity: Entity + errors: any[] } - interface Entity { + export interface Entity { + name: string + type: EntityType + id: string + summary?: string + description?: string + homepageUri?: string + twitterUri?: string + linkedInUri?: string + githubUri?: string + crunchbaseUri?: string + googlePlusUri?: string + diffbotUri?: string + educations?: Education[] + nationalities?: Nationality[] + allNames?: string[] + skills?: Skill[] + children?: Children[] + nbOrigins?: number + height?: number image?: string + images?: Image[] + nbIncomingEdges?: number + nbFollowers?: number + allOriginHashes?: string[] + nameDetail?: NameDetail + parents?: Parent[] + gender?: Gender + importance?: number + origin?: string + wikipediaUri: string + wikipediaPageviewsLastQuarterGrowth?: number + wikipediaPageviewsLastYear?: number + wikipediaPageviewsLastYearGrowth?: number + wikipediaPageviews?: number + wikipediaPageviewsLastQuarter?: number + wikipediaPageviewsGrowth?: number + birthPlace?: BirthPlace + origins: string[] + crawlTimestamp: number types?: string[] + unions?: Union[] + languages?: Language[] + allUris?: string[] + employments?: Employment[] + birthDate?: DateTime + religion?: Religion + awards?: Award[] + netWorth?: NetWorth + allDescriptions?: string[] + locations?: Location[] + location?: Location + interests?: Interest[] + age?: number + } + + export interface Education { + institution: Institution + isCurrent?: boolean + major?: Major + degree?: Degree + from?: DateTime + to?: DateTime + } + + export interface Institution { + summary: string + image: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Major {} + + export interface Degree { + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface DateTime { + str: string + precision: number + timestamp: number + } + + export interface Nationality { + name: string + type: string + } + + export interface Skill { name: string diffbotUri?: string - type: EntityType - summary?: string + targetDiffbotId?: string + } + + export interface Children { + summary: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Image { + url: string + primary?: boolean } - type EntityType = 'Organization' | 'Place' + export interface NameDetail { + firstName: string + lastName: string + middleName?: string[] + } + + export interface Parent { + summary: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + image?: string + } - interface DiffbotGender { + export interface Gender { normalizedValue: string } - interface DiffbotLocation { - country: Entity + export interface BirthPlace { + country: Country isCurrent: boolean address: string + city: City + subregion: Subregion latitude: number precision: number surfaceForm: string - region: Entity + region: Region longitude: number } - interface DiffbotNameDetail { - firstName: string - lastName: string + export interface Country { + summary: string + image: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface City { + summary: string + image: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string } - interface DiffbotSkill { + export interface Subregion { + summary: string + image: string + types: string[] name: string diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Region { + summary: string + image: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Union { + person: Person + from?: DateTime + to?: DateTime + type?: string + } + + export interface Person { + summary: string + image: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Language { + str: string + normalizedValue: string + } + + export interface Employment { + isCurrent?: boolean + employer?: Employer + from?: DateTime + categories?: EmploymentCategory[] + title?: string + to?: DateTime + location?: Location + } + + export interface Employer { + summary?: string + image?: string + types?: string[] + name: string + diffbotUri?: string + targetDiffbotId?: string + type: string + } + + export interface EmploymentCategory { + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Location { + country?: Country + isCurrent: boolean + address: string + city: City + street: string + metroArea: MetroArea + subregion: Subregion + latitude: number + precision: number + postalCode: string + region?: Region + longitude: number + } + + export interface MetroArea { + summary: string + image: string + types: string[] + name: string + diffbotUri: string + targetDiffbotId: string + type: string + } + + export interface Religion { + str: string + } + + export interface Award { + title: string + date?: DateTime + } + + export interface NetWorth { + currency: string + value: number + } + + export interface Interest { + name: string + type: string } } -export class DiffbotClient { +export class DiffbotClient extends AIFunctionsProvider { readonly ky: KyInstance readonly kyKnowledgeGraph: KyInstance @@ -355,6 +663,7 @@ export class DiffbotClient { apiKey, `DiffbotClient missing required "apiKey" (defaults to "DIFFBOT_API_KEY")` ) + super() this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl @@ -373,9 +682,88 @@ export class DiffbotClient { }) } + @aiFunction({ + name: 'diffbot_analyze_url', + description: + 'Scrapes and extracts structured data from a web page. Also classifies the web page as one of several types (article, product, discussion, job, image, video, list, event, or other).', + inputSchema: z.object({ + url: z.string().url().describe('The URL to process.') + }) + }) + async analyzeUrl(options: diffbot.ExtractAnalyzeOptions) { + return this._extract('v3/analyze', options) + } + + @aiFunction({ + name: 'diffbot_extract_article_from_url', + description: + 'Scrapes and extracts clean article text from news articles, blog posts, and other text-heavy web pages.', + inputSchema: z.object({ + url: z.string().url().describe('The URL to process.') + }) + }) + async extractArticleFromUrl(options: diffbot.ExtractArticleOptions) { + return this._extract('v3/article', options) + } + + @aiFunction({ + name: 'diffbot_enhance_entity', + description: + 'Enriches a person or organization entity given partial data. Enhance is an enrichment API to find a person or organization using partial data as input. Enhance scores several candidates against the submitted query and returns the best match. More information in the query helps Enhance models estimate with more confidence and will typically result in better matches and a higher score for the matches.', + inputSchema: diffbot.EnhanceEntityOptionsSchema.omit({ + refresh: true, + search: true, + customId: true, + threshold: true + }) + }) + async enhanceEntity(opts: diffbot.EnhanceEntityOptions) { + const { name, url, ...params } = opts + + // TODO: clean this array handling up... + const arraySearchParams = [ + name ? (Array.isArray(name) ? name : [name]).map((v) => ['name', v]) : [], + url?.map((v) => ['url', v]) + ] + .filter(Boolean) + .flat() + + return this.kyKnowledgeGraph + .get('kg/v3/enhance', { + searchParams: new URLSearchParams([ + ...arraySearchParams, + ...Object.entries(params).map(([key, value]) => [key, String(value)]), + ['token', this.apiKey] + ]) + }) + .json() + } + + async searchKnowledgeGraph(options: diffbot.KnowledgeGraphSearchOptions) { + return this.kyKnowledgeGraph + .get('kg/v3/dql', { + searchParams: { + ...options, + token: this.apiKey + } + }) + .json() + } + + async enhanceKnowledgeGraph(options: diffbot.KnowledgeGraphEnhanceOptions) { + return this.kyKnowledgeGraph + .get('kg/v3/enhance', { + searchParams: { + ...options, + token: this.apiKey + } + }) + .json() + } + protected async _extract< - T extends diffbot.DiffbotExtractResponse = diffbot.DiffbotExtractResponse - >(endpoint: string, options: diffbot.DiffbotExtractOptions): Promise { + T extends diffbot.ExtractResponse = diffbot.ExtractResponse + >(endpoint: string, options: diffbot.ExtractOptions): Promise { const { customJs, customHeaders, ...rest } = options const searchParams: Record = { ...rest, @@ -404,44 +792,4 @@ export class DiffbotClient { }) .json() } - - async extractAnalyze(options: diffbot.DiffbotExtractAnalyzeOptions) { - return this._extract( - 'v3/analyze', - options - ) - } - - async extractArticle(options: diffbot.DiffbotExtractArticleOptions) { - return this._extract( - 'v3/article', - options - ) - } - - async knowledgeGraphSearch( - options: diffbot.DiffbotKnowledgeGraphSearchOptions - ) { - return this.kyKnowledgeGraph - .get('kg/v3/dql', { - searchParams: { - ...options, - token: this.apiKey - } - }) - .json() - } - - async knowledgeGraphEnhance( - options: diffbot.DiffbotKnowledgeGraphEnhanceOptions - ) { - return this.kyKnowledgeGraph - .get('kg/v3/enhance', { - searchParams: { - ...options, - token: this.apiKey - } - }) - .json() - } } From 94198f318b93cd33b70032707156db52029d47f1 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 03:55:56 -0500 Subject: [PATCH 43/81] =?UTF-8?q?=F0=9F=91=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fns.ts | 3 +++ src/services/diffbot-client.ts | 14 +++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/fns.ts b/src/fns.ts index 55422f710..6b6d10ddc 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -12,6 +12,9 @@ export interface PrivateAIFunctionMetadata { description: string inputSchema: z.AnyZodObject methodName: string + + // TODO + // pre and post } export abstract class AIFunctionsProvider { diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 8ea45deed..08d2075ce 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -364,7 +364,15 @@ export namespace diffbot { githubUri?: string crunchbaseUri?: string googlePlusUri?: string + facebookUri?: string + angellistUri?: string + wikipediaUri?: string diffbotUri?: string + origin?: string + origins?: string[] + allUris?: string[] + + // extra metadata educations?: Education[] nationalities?: Nationality[] allNames?: string[] @@ -381,8 +389,6 @@ export namespace diffbot { parents?: Parent[] gender?: Gender importance?: number - origin?: string - wikipediaUri: string wikipediaPageviewsLastQuarterGrowth?: number wikipediaPageviewsLastYear?: number wikipediaPageviewsLastYearGrowth?: number @@ -390,12 +396,9 @@ export namespace diffbot { wikipediaPageviewsLastQuarter?: number wikipediaPageviewsGrowth?: number birthPlace?: BirthPlace - origins: string[] - crawlTimestamp: number types?: string[] unions?: Union[] languages?: Language[] - allUris?: string[] employments?: Employment[] birthDate?: DateTime religion?: Religion @@ -406,6 +409,7 @@ export namespace diffbot { location?: Location interests?: Interest[] age?: number + crawlTimestamp?: number } export interface Education { From ed85b708fd7b6e148ea54eb89d191315fb0f5f0b Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 12:26:46 -0500 Subject: [PATCH 44/81] feat: add sanitizeSearchParams --- readme.md | 1 + src/__snapshots__/utils.test.ts.snap | 15 ++ src/fns.ts | 3 - src/services/diffbot-client.ts | 61 +++--- src/services/perigon-client.ts | 79 ++----- src/services/predict-leads-client.ts | 300 +++++++++++++-------------- src/utils.test.ts | 29 ++- src/utils.ts | 25 +++ 8 files changed, 258 insertions(+), 255 deletions(-) create mode 100644 src/__snapshots__/utils.test.ts.snap diff --git a/readme.md b/readme.md index 9ec9ddb52..f624e532b 100644 --- a/readme.md +++ b/readme.md @@ -62,6 +62,7 @@ - provide a converter for langchain `DynamicStructuredTool` - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) +- https://github.com/causaly/zod-validation-error ## License diff --git a/src/__snapshots__/utils.test.ts.snap b/src/__snapshots__/utils.test.ts.snap new file mode 100644 index 000000000..78e47ee2e --- /dev/null +++ b/src/__snapshots__/utils.test.ts.snap @@ -0,0 +1,15 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`sanitizeSearchParams 1`] = `"a=1&c=13"`; + +exports[`sanitizeSearchParams 2`] = `"a=1&a=2&a=3"`; + +exports[`sanitizeSearchParams 3`] = `"b=a&b=b&foo=true"`; + +exports[`sanitizeSearchParams 4`] = `"b=false&b=true&b=false"`; + +exports[`sanitizeSearchParams 5`] = `"flag=foo&flag=bar&flag=baz&token=test"`; + +exports[`sanitizeSearchParams 6`] = `""`; + +exports[`sanitizeSearchParams 7`] = `""`; diff --git a/src/fns.ts b/src/fns.ts index 6b6d10ddc..55422f710 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -12,9 +12,6 @@ export interface PrivateAIFunctionMetadata { description: string inputSchema: z.AnyZodObject methodName: string - - // TODO - // pre and post } export abstract class AIFunctionsProvider { diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 08d2075ce..bb729b0e1 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -3,7 +3,13 @@ import pThrottle from 'p-throttle' import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv, throttleKy } from '../utils.js' +import { + assert, + getEnv, + omit, + sanitizeSearchParams, + throttleKy +} from '../utils.js' export namespace diffbot { export const API_BASE_URL = 'https://api.diffbot.com' @@ -373,17 +379,17 @@ export namespace diffbot { allUris?: string[] // extra metadata + nbOrigins?: number + nbIncomingEdges?: number + nbFollowers?: number educations?: Education[] nationalities?: Nationality[] allNames?: string[] skills?: Skill[] children?: Children[] - nbOrigins?: number height?: number image?: string images?: Image[] - nbIncomingEdges?: number - nbFollowers?: number allOriginHashes?: string[] nameDetail?: NameDetail parents?: Parent[] @@ -638,6 +644,18 @@ export namespace diffbot { name: string type: string } + + export function pruneEntity(entity: diffbot.Entity) { + return omit( + entity, + 'allOriginHashes', + 'locations', + 'images', + 'nationalities', + 'awards', + 'interests' + ) + } } export class DiffbotClient extends AIFunctionsProvider { @@ -713,7 +731,7 @@ export class DiffbotClient extends AIFunctionsProvider { @aiFunction({ name: 'diffbot_enhance_entity', description: - 'Enriches a person or organization entity given partial data. Enhance is an enrichment API to find a person or organization using partial data as input. Enhance scores several candidates against the submitted query and returns the best match. More information in the query helps Enhance models estimate with more confidence and will typically result in better matches and a higher score for the matches.', + 'Resolves and enriches a partial person or organization entity.', inputSchema: diffbot.EnhanceEntityOptionsSchema.omit({ refresh: true, search: true, @@ -722,25 +740,16 @@ export class DiffbotClient extends AIFunctionsProvider { }) }) async enhanceEntity(opts: diffbot.EnhanceEntityOptions) { - const { name, url, ...params } = opts - - // TODO: clean this array handling up... - const arraySearchParams = [ - name ? (Array.isArray(name) ? name : [name]).map((v) => ['name', v]) : [], - url?.map((v) => ['url', v]) - ] - .filter(Boolean) - .flat() - - return this.kyKnowledgeGraph + const res = await this.kyKnowledgeGraph .get('kg/v3/enhance', { - searchParams: new URLSearchParams([ - ...arraySearchParams, - ...Object.entries(params).map(([key, value]) => [key, String(value)]), - ['token', this.apiKey] - ]) + searchParams: sanitizeSearchParams({ + ...opts, + token: this.apiKey + }) }) .json() + + return res.data.map((datum) => diffbot.pruneEntity(datum.entity)) } async searchKnowledgeGraph(options: diffbot.KnowledgeGraphSearchOptions) { @@ -769,10 +778,10 @@ export class DiffbotClient extends AIFunctionsProvider { T extends diffbot.ExtractResponse = diffbot.ExtractResponse >(endpoint: string, options: diffbot.ExtractOptions): Promise { const { customJs, customHeaders, ...rest } = options - const searchParams: Record = { + const searchParams = sanitizeSearchParams({ ...rest, token: this.apiKey - } + }) const headers = { ...Object.fromEntries( [['X-Forward-X-Evaluate', customJs]].filter(([, value]) => value) @@ -780,12 +789,6 @@ export class DiffbotClient extends AIFunctionsProvider { ...customHeaders } - for (const [key, value] of Object.entries(rest)) { - if (Array.isArray(value)) { - searchParams[key] = value.join(',') - } - } - // console.log(`DiffbotClient._extract: ${endpoint}`, searchParams) return this.ky diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index 0c92001fe..b239c9dbd 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -3,7 +3,7 @@ import pThrottle from 'p-throttle' import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv, pruneUndefined, throttleKy } from '../utils.js' +import { assert, getEnv, sanitizeSearchParams, throttleKy } from '../utils.js' // TODO: https://docs.goperigon.com/docs/searching-sources // TODO: https://docs.goperigon.com/docs/journalist-data @@ -683,28 +683,10 @@ export class PerigonClient extends AIFunctionsProvider { }) }) async searchArticles(opts: perigon.ArticlesSearchOptions) { - const { - personWikidataId, - personName, - companyId, - companyDomain, - companySymbol, - ...params - } = opts - - const arrayParams = pruneUndefined({ - personWikidataId: personWikidataId?.join(','), - personName: personName?.join(','), - companyId: companyId?.join(','), - companyDomain: companyDomain?.join(','), - companySymbol: companySymbol?.join(',') - }) - return this.ky .get('all', { - searchParams: { - ...arrayParams, - ...params, + searchParams: sanitizeSearchParams({ + ...opts, apiKey: this.apiKey, size: Math.max( 1, @@ -713,7 +695,7 @@ export class PerigonClient extends AIFunctionsProvider { opts.size || perigon.DEFAULT_PAGE_SIZE ) ) - } + }) }) .json() } @@ -740,28 +722,10 @@ export class PerigonClient extends AIFunctionsProvider { }) }) async searchStories(opts: perigon.StoriesSearchOptions) { - const { - personWikidataId, - personName, - companyId, - companyDomain, - companySymbol, - ...params - } = opts - - const arrayParams = pruneUndefined({ - personWikidataId: personWikidataId?.join(','), - personName: personName?.join(','), - companyId: companyId?.join(','), - companyDomain: companyDomain?.join(','), - companySymbol: companySymbol?.join(',') - }) - return this.ky .get('stories/all', { - searchParams: { - ...arrayParams, - ...params, + searchParams: sanitizeSearchParams({ + ...opts, apiKey: this.apiKey, size: Math.max( 1, @@ -770,7 +734,7 @@ export class PerigonClient extends AIFunctionsProvider { opts.size || perigon.DEFAULT_PAGE_SIZE ) ) - } + }) }) .json() } @@ -785,18 +749,10 @@ export class PerigonClient extends AIFunctionsProvider { inputSchema: perigon.PeopleSearchOptionsSchema }) async searchPeople(opts: perigon.PeopleSearchOptions) { - const { wikidataId, occupationId, ...params } = opts - - const arrayParams = pruneUndefined({ - wikidataId: wikidataId?.join(','), - occupationId: occupationId?.join(',') - }) - return this.ky .get('people/all', { - searchParams: { - ...arrayParams, - ...params, + searchParams: sanitizeSearchParams({ + ...opts, apiKey: this.apiKey, size: Math.max( 1, @@ -805,7 +761,7 @@ export class PerigonClient extends AIFunctionsProvider { opts.size || perigon.DEFAULT_PAGE_SIZE ) ) - } + }) }) .json() } @@ -821,19 +777,10 @@ export class PerigonClient extends AIFunctionsProvider { inputSchema: perigon.CompanySearchOptionsSchema }) async searchCompanies(opts: perigon.CompanySearchOptions) { - const { id, symbol, domain, ...params } = opts - - const arrayParams = pruneUndefined({ - id: id?.join(','), - domain: domain?.join(','), - symbol: symbol?.join(',') - }) - return this.ky .get('companies/all', { - searchParams: { - ...arrayParams, - ...params, + searchParams: sanitizeSearchParams({ + ...opts, apiKey: this.apiKey, size: Math.max( 1, @@ -842,7 +789,7 @@ export class PerigonClient extends AIFunctionsProvider { opts.size || perigon.DEFAULT_PAGE_SIZE ) ) - } + }) }) .json() } diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts index 947a1cbad..2354fb752 100644 --- a/src/services/predict-leads-client.ts +++ b/src/services/predict-leads-client.ts @@ -4,7 +4,15 @@ import { z } from 'zod' import type { DeepNullable } from '../types.js' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv, pruneUndefined, throttleKy } from '../utils.js' +import { + assert, + getEnv, + pruneUndefined, + sanitizeSearchParams, + throttleKy +} from '../utils.js' + +// TODO: improve `domain` validation for fast-fail export namespace predictleads { // Allow up to 20 requests per minute by default. @@ -188,118 +196,124 @@ export namespace predictleads { export type JobOpeningByIdResponse = Omit - export const EventCategorySchema = z.union([ - z - .literal('hires') - .describe( - 'Company hired new executive or senior personnel. (leadership)' - ), - z - .literal('promotes') - .describe( - 'Company promoted existing executive or senior personnel. (leadership)' - ), - z - .literal('leaves') - .describe('Executive or senior personnel left the company. (leadership)'), - z - .literal('retires') - .describe( - 'Executive or senior personnel retires from the company. (leadership)' - ), - z - .literal('acquires') - .describe('Company acquired other company. (acquisition)'), - z - .literal('merges_with') - .describe('Company merges with other company. (acquisition)'), - z - .literal('sells_assets_to') - .describe( - 'Company sells assets (like properties or warehouses) to other company. (acquisition)' - ), - z - .literal('expands_offices_to') - .describe( - 'Company opens new offices in another town, state, country or continent. (expansion)' - ), - z - .literal('expands_offices_in') - .describe('Company expands existing offices. (expansion)'), - z - .literal('expands_facilities') - .describe( - 'Company opens new or expands existing facilities like warehouses, data centers, manufacturing plants etc. (expansion)' - ), - z - .literal('opens_new_location') - .describe( - 'Company opens new service location like hotels, restaurants, bars, hospitals etc. (expansion)' - ), - z - .literal('increases_headcount_by') - .describe('Company offers new job vacancies. (expansion)'), - z - .literal('launches') - .describe('Company launches new offering. (new_offering)'), - z - .literal('integrates_with') - .describe('Company integrates with other company. (new_offering)'), - z - .literal('is_developing') - .describe('Company begins development of a new offering. (new_offering)'), - z - .literal('receives_financing') - .describe( - 'Company receives investment like venture funding, loan, grant etc. (investment)' - ), - z - .literal('invests_into') - .describe('Company invests into other company. (investment)'), - z - .literal('invests_into_assets') - .describe( - 'Company invests into assets like property, trucks, facilities etc. (investment)' - ), - z - .literal('goes_public') - .describe( - 'Company issues shares to the public for the first time. (investment)' - ), - z - .literal('closes_offices_in') - .describe('Company closes existing offices. (cost_cutting)'), - z - .literal('decreases_headcount_by') - .describe('Company lays off employees. (cost_cutting)'), - z - .literal('partners_with') - .describe('Company partners with other company. (partnership)'), - z - .literal('receives_award') - .describe( - 'Company or person at the company receives an award. (recognition)' - ), - z - .literal('recognized_as') - .describe( - 'Company or person at the company receives recognition. (recognition)' - ), - z - .literal('signs_new_client') - .describe('Company signs new client. (contract)'), - z - .literal('files_suit_against') - .describe( - 'Company files suit against other company. (corporate_challenges)' - ), - z - .literal('has_issues_with') - .describe('Company has vulnerability problems. (corporate_challenges)'), - z - .literal('identified_as_competitor_of') - .describe('New or existing competitor was identified. (relational)') - ]) + export const EventCategorySchema = z + .union([ + z + .literal('hires') + .describe( + 'Company hired new executive or senior personnel. (leadership)' + ), + z + .literal('promotes') + .describe( + 'Company promoted existing executive or senior personnel. (leadership)' + ), + z + .literal('leaves') + .describe( + 'Executive or senior personnel left the company. (leadership)' + ), + z + .literal('retires') + .describe( + 'Executive or senior personnel retires from the company. (leadership)' + ), + z + .literal('acquires') + .describe('Company acquired other company. (acquisition)'), + z + .literal('merges_with') + .describe('Company merges with other company. (acquisition)'), + z + .literal('sells_assets_to') + .describe( + 'Company sells assets (like properties or warehouses) to other company. (acquisition)' + ), + z + .literal('expands_offices_to') + .describe( + 'Company opens new offices in another town, state, country or continent. (expansion)' + ), + z + .literal('expands_offices_in') + .describe('Company expands existing offices. (expansion)'), + z + .literal('expands_facilities') + .describe( + 'Company opens new or expands existing facilities like warehouses, data centers, manufacturing plants etc. (expansion)' + ), + z + .literal('opens_new_location') + .describe( + 'Company opens new service location like hotels, restaurants, bars, hospitals etc. (expansion)' + ), + z + .literal('increases_headcount_by') + .describe('Company offers new job vacancies. (expansion)'), + z + .literal('launches') + .describe('Company launches new offering. (new_offering)'), + z + .literal('integrates_with') + .describe('Company integrates with other company. (new_offering)'), + z + .literal('is_developing') + .describe( + 'Company begins development of a new offering. (new_offering)' + ), + z + .literal('receives_financing') + .describe( + 'Company receives investment like venture funding, loan, grant etc. (investment)' + ), + z + .literal('invests_into') + .describe('Company invests into other company. (investment)'), + z + .literal('invests_into_assets') + .describe( + 'Company invests into assets like property, trucks, facilities etc. (investment)' + ), + z + .literal('goes_public') + .describe( + 'Company issues shares to the public for the first time. (investment)' + ), + z + .literal('closes_offices_in') + .describe('Company closes existing offices. (cost_cutting)'), + z + .literal('decreases_headcount_by') + .describe('Company lays off employees. (cost_cutting)'), + z + .literal('partners_with') + .describe('Company partners with other company. (partnership)'), + z + .literal('receives_award') + .describe( + 'Company or person at the company receives an award. (recognition)' + ), + z + .literal('recognized_as') + .describe( + 'Company or person at the company receives recognition. (recognition)' + ), + z + .literal('signs_new_client') + .describe('Company signs new client. (contract)'), + z + .literal('files_suit_against') + .describe( + 'Company files suit against other company. (corporate_challenges)' + ), + z + .literal('has_issues_with') + .describe('Company has vulnerability problems. (corporate_challenges)'), + z + .literal('identified_as_competitor_of') + .describe('New or existing competitor was identified. (relational)') + ]) + .describe('Event category') export type EventCategory = z.infer export const CompanyParamsSchema = z.object({ @@ -535,17 +549,15 @@ export class PredictLeadsClient extends AIFunctionsProvider { domain, page = 1, limit = predictleads.DEFAULT_PAGE_SIZE, - categories, ...params } = opts assert(domain, 'Missing required company "domain"') return this.ky .get(`v2/companies/${domain}/events`, { - searchParams: pruneUndefined({ + searchParams: sanitizeSearchParams({ page, - limit: String(limit), - categories: categories?.join(','), + limit, ...params }) }) @@ -586,19 +598,13 @@ export class PredictLeadsClient extends AIFunctionsProvider { ) { const opts = typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts - const { - domain, - limit = predictleads.DEFAULT_PAGE_SIZE, - categories, - ...params - } = opts + const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts assert(domain, 'Missing required company "domain"') return this.ky .get(`v2/companies/${domain}/job_openings`, { - searchParams: pruneUndefined({ - limit: String(limit), - categories: categories?.join(','), + searchParams: sanitizeSearchParams({ + limit, ...params }) }) @@ -621,19 +627,13 @@ export class PredictLeadsClient extends AIFunctionsProvider { ) { const opts = typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts - const { - domain, - limit = predictleads.DEFAULT_PAGE_SIZE, - categories, - ...params - } = opts + const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts assert(domain, 'Missing required company "domain"') return this.ky .get(`v2/companies/${domain}/technologies`, { - searchParams: pruneUndefined({ - limit: String(limit), - categories: categories?.join(','), + searchParams: sanitizeSearchParams({ + limit, ...params }) }) @@ -651,19 +651,13 @@ export class PredictLeadsClient extends AIFunctionsProvider { ) { const opts = typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts - const { - domain, - limit = predictleads.DEFAULT_PAGE_SIZE, - categories, - ...params - } = opts + const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts assert(domain, 'Missing required company "domain"') return this.ky .get(`v2/companies/${domain}/connections`, { - searchParams: pruneUndefined({ - limit: String(limit), - categories: categories?.join(','), + searchParams: sanitizeSearchParams({ + limit, ...params }) }) @@ -686,7 +680,7 @@ export class PredictLeadsClient extends AIFunctionsProvider { return this.ky .get(`v2/companies/${domain}/website_evolution`, { - searchParams: pruneUndefined({ limit: String(limit), ...params }) + searchParams: sanitizeSearchParams({ limit, ...params }) }) .json() } @@ -707,7 +701,7 @@ export class PredictLeadsClient extends AIFunctionsProvider { return this.ky .get(`v2/companies/${domain}/github_repositories`, { - searchParams: pruneUndefined({ limit: String(limit), ...params }) + searchParams: sanitizeSearchParams({ limit, ...params }) }) .json() } @@ -723,19 +717,13 @@ export class PredictLeadsClient extends AIFunctionsProvider { ) { const opts = typeof domainOrOpts === 'string' ? { domain: domainOrOpts } : domainOrOpts - const { - domain, - sources, - limit = predictleads.DEFAULT_PAGE_SIZE, - ...params - } = opts + const { domain, limit = predictleads.DEFAULT_PAGE_SIZE, ...params } = opts assert(domain, 'Missing required company "domain"') return this.ky .get(`v2/companies/${domain}/products`, { - searchParams: pruneUndefined({ - limit: String(limit), - sources: sources?.join(','), + searchParams: sanitizeSearchParams({ + limit, ...params }) }) @@ -783,7 +771,7 @@ export class PredictLeadsClient extends AIFunctionsProvider { async getFollowingCompanies(limit: number = predictleads.DEFAULT_PAGE_SIZE) { return this.ky .get(`v2/followings`, { - searchParams: { limit: String(limit) } + searchParams: sanitizeSearchParams({ limit }) }) .json() } diff --git a/src/utils.test.ts b/src/utils.test.ts index 269d018e9..16314ce63 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -3,7 +3,7 @@ import pThrottle from 'p-throttle' import { expect, test } from 'vitest' import { mockKyInstance } from './_utils.js' -import { omit, pick, throttleKy } from './utils.js' +import { omit, pick, sanitizeSearchParams, throttleKy } from './utils.js' test('pick', () => { expect(pick({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ a: 1, c: 3 }) @@ -19,6 +19,33 @@ test('omit', () => { ).toEqual({ a: { b: 'foo' }, d: -1 }) }) +test('sanitizeSearchParams', () => { + expect( + sanitizeSearchParams({ a: 1, b: undefined, c: 13 }).toString() + ).toMatchSnapshot() + + expect(sanitizeSearchParams({ a: [1, 2, 3] }).toString()).toMatchSnapshot() + + expect( + sanitizeSearchParams({ b: ['a', 'b'], foo: true }).toString() + ).toMatchSnapshot() + + expect( + sanitizeSearchParams({ b: [false, true, false] }).toString() + ).toMatchSnapshot() + + expect( + sanitizeSearchParams({ + flag: ['foo', 'bar', 'baz'], + token: 'test' + }).toString() + ).toMatchSnapshot() + + expect(sanitizeSearchParams({}).toString()).toMatchSnapshot() + + expect(sanitizeSearchParams({ a: [] }).toString()).toMatchSnapshot() +}) + test( 'throttleKy should rate-limit requests to ky properly', async () => { diff --git a/src/utils.ts b/src/utils.ts index e6c4bc423..7aae335d4 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -86,3 +86,28 @@ export function throttleKy( } }) } + +/** + * Creates a new `URLSearchParams` object with all values coerced to strings + * that correctly handles arrays of values as repeated keys. + */ +export function sanitizeSearchParams( + searchParams: Record< + string, + string | number | boolean | string[] | number[] | boolean[] | undefined + > +): URLSearchParams { + return new URLSearchParams( + Object.entries(searchParams).flatMap(([key, value]) => { + if (key === undefined || value === undefined) { + return [] + } + + if (Array.isArray(value)) { + return value.map((v) => [key, String(v)]) + } + + return [[key, String(value)]] + }) + ) +} From f5319b4e174313ae44f4e8f51428c5453642b149 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 15:06:41 -0500 Subject: [PATCH 45/81] =?UTF-8?q?=F0=9F=91=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.json | 6 +- bin/scratch.ts | 2 +- package.json | 2 + pnpm-lock.yaml | 6 + src/index.ts | 2 +- src/message.test.ts | 55 +++++ src/message.ts | 344 ++++++++++++++++++++++++++++++++ src/sdks/langchain.ts | 2 +- src/services/dexa-client.ts | 24 ++- src/services/diffbot-client.ts | 1 + src/stringify-for-model.test.ts | 22 -- src/stringify-for-model.ts | 16 -- src/types.ts | 127 +----------- src/utils.test.ts | 29 ++- src/utils.ts | 29 +++ 15 files changed, 494 insertions(+), 173 deletions(-) create mode 100644 src/message.test.ts create mode 100644 src/message.ts delete mode 100644 src/stringify-for-model.test.ts delete mode 100644 src/stringify-for-model.ts diff --git a/.eslintrc.json b/.eslintrc.json index d03d820ec..6de124a48 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,4 +1,8 @@ { "root": true, - "extends": ["@fisch0920/eslint-config/node"] + "extends": ["@fisch0920/eslint-config/node"], + "rules": { + "unicorn/no-static-only-class": "off", + "@typescript-eslint/naming-convention": "off" + } } diff --git a/bin/scratch.ts b/bin/scratch.ts index a0b4c31ad..5472bd0ff 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -71,7 +71,7 @@ async function main() { // }) const res = await diffbot.enhanceEntity({ type: 'Person', - name: 'Travis Fischer' + name: 'Kevin Raheja' }) console.log(JSON.stringify(res, null, 2)) } diff --git a/package.json b/package.json index 45fbe1ce8..42cd3864d 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ }, "dependencies": { "@nangohq/node": "^0.39.32", + "dedent": "^1.5.3", "delay": "^6.0.0", "jsonrepair": "^3.6.1", "ky": "^1.2.4", @@ -85,6 +86,7 @@ "np": "^10.0.5", "npm-run-all2": "^6.2.0", "only-allow": "^1.2.1", + "openai-fetch": "^2.0.3", "prettier": "^3.2.5", "restore-cursor": "^5.0.0", "ts-node": "^10.9.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b9efbd47..2da374468 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@nangohq/node': specifier: ^0.39.32 version: 0.39.32 + dedent: + specifier: ^1.5.3 + version: 1.5.3 delay: specifier: ^6.0.0 version: 6.0.0 @@ -87,6 +90,9 @@ importers: only-allow: specifier: ^1.2.1 version: 1.2.1 + openai-fetch: + specifier: ^2.0.3 + version: 2.0.3 prettier: specifier: ^3.2.5 version: 3.3.0 diff --git a/src/index.ts b/src/index.ts index 269386e00..50edc27c7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,9 +3,9 @@ export * from './create-ai-function.js' export * from './create-ai-function.js' export * from './errors.js' export * from './fns.js' +export * from './message.js' export * from './parse-structured-output.js' export * from './services/index.js' -export * from './stringify-for-model.js' export type * from './types.js' export * from './utils.js' export * from './zod-to-json-schema.js' diff --git a/src/message.test.ts b/src/message.test.ts new file mode 100644 index 000000000..3da4301f9 --- /dev/null +++ b/src/message.test.ts @@ -0,0 +1,55 @@ +import type * as OpenAI from 'openai-fetch' +import { describe, expect, expectTypeOf, it } from 'vitest' + +import type * as types from './types.js' +import { Msg } from './message.js' + +describe('Msg', () => { + it('creates a message and fixes indentation', () => { + const msgContent = ` + Hello, World! + ` + const msg = Msg.system(msgContent) + expect(msg.role).toEqual('system') + expect(msg.content).toEqual('Hello, World!') + }) + + it('supports disabling indentation fixing', () => { + const msgContent = ` + Hello, World! + ` + const msg = Msg.system(msgContent, { cleanContent: false }) + expect(msg.content).toEqual('\n Hello, World!\n ') + }) + + it('handles tool calls request', () => { + const msg = Msg.toolCall([ + { + id: 'fake-tool-call-id', + type: 'function', + function: { + arguments: '{"prompt": "Hello, World!"}', + name: 'hello' + } + } + ]) + expectTypeOf(msg).toMatchTypeOf() + expect(Msg.isToolCall(msg)).toBe(true) + }) + + it('handles tool call response', () => { + const msg = Msg.toolResult('Hello, World!', 'fake-tool-call-id') + expectTypeOf(msg).toMatchTypeOf() + expect(Msg.isToolResult(msg)).toBe(true) + }) + + it('prompt message types should interop with openai-fetch message types', () => { + expectTypeOf({} as OpenAI.ChatMessage).toMatchTypeOf() + expectTypeOf({} as types.Msg).toMatchTypeOf() + expectTypeOf({} as types.Msg.System).toMatchTypeOf() + expectTypeOf({} as types.Msg.User).toMatchTypeOf() + expectTypeOf({} as types.Msg.Assistant).toMatchTypeOf() + expectTypeOf({} as types.Msg.FuncCall).toMatchTypeOf() + expectTypeOf({} as types.Msg.FuncResult).toMatchTypeOf() + }) +}) diff --git a/src/message.ts b/src/message.ts new file mode 100644 index 000000000..6202c252b --- /dev/null +++ b/src/message.ts @@ -0,0 +1,344 @@ +import type { Jsonifiable } from 'type-fest' + +import { cleanStringForModel, stringifyForModel } from './utils.js' + +/** + * Generic/default OpenAI message without any narrowing applied. + */ +export interface Msg { + /** + * The contents of the message. `content` is required for all messages, and + * may be null for assistant messages with function calls. + */ + content: string | null + + /** + * The role of the messages author. One of `system`, `user`, `assistant`, + * 'tool', or `function`. + */ + role: Msg.Role + + /** + * The name and arguments of a function that should be called, as generated + * by the model. + */ + function_call?: Msg.Call.Function + + /** + * The tool calls generated by the model, such as function calls. + */ + tool_calls?: Msg.Call.Tool[] + + /** + * Tool call that this message is responding to. + */ + tool_call_id?: string + + /** + * The name of the author of this message. `name` is required if role is + * `function`, and it should be the name of the function whose response is in the + * `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of + * 64 characters. + */ + name?: string +} + +/** Narrowed OpenAI Message types. */ +export namespace Msg { + /** Possible roles for a message. */ + export type Role = 'system' | 'user' | 'assistant' | 'function' | 'tool' + + export namespace Call { + /** + * The name and arguments of a function that should be called, as generated + * by the model. + */ + export type Function = { + /** + * The arguments to call the function with, as generated by the model in + * JSON format. + */ + arguments: string + + /** The name of the function to call. */ + name: string + } + + /** The tool calls generated by the model, such as function calls. */ + export type Tool = { + /** The ID of the tool call. */ + id: string + + /** The type of the tool. Currently, only `function` is supported. */ + type: 'function' + + /** The function that the model called. */ + function: Call.Function + } + } + + /** Message with text content for the system. */ + export type System = { + role: 'system' + content: string + name?: string + } + + /** Message with text content from the user. */ + export type User = { + role: 'user' + name?: string + content: string + } + + /** Message with text content from the assistant. */ + export type Assistant = { + role: 'assistant' + name?: string + content: string + } + + /** Message with arguments to call a function. */ + export type FuncCall = { + role: 'assistant' + name?: string + content: null + function_call: Call.Function + } + + /** Message with the result of a function call. */ + export type FuncResult = { + role: 'function' + name: string + content: string + } + + /** Message with arguments to call one or more tools. */ + export type ToolCall = { + role: 'assistant' + name?: string + content: null + tool_calls: Call.Tool[] + } + + /** Message with the result of a tool call. */ + export type ToolResult = { + role: 'tool' + tool_call_id: string + content: string + } +} + +/** Utility functions for creating and checking message types. */ +export namespace Msg { + /** Create a system message. Cleans indentation and newlines by default. */ + export function system( + content: string, + opts?: { + /** Custom name for the message. */ + name?: string + /** Whether to clean extra newlines and indentation. Defaults to true. */ + cleanContent?: boolean + } + ): Msg.System { + const { name, cleanContent = true } = opts ?? {} + return { + role: 'system', + content: cleanContent ? cleanStringForModel(content) : content, + ...(name ? { name } : {}) + } + } + + /** Create a user message. Cleans indentation and newlines by default. */ + export function user( + content: string, + opts?: { + /** Custom name for the message. */ + name?: string + /** Whether to clean extra newlines and indentation. Defaults to true. */ + cleanContent?: boolean + } + ): Msg.User { + const { name, cleanContent = true } = opts ?? {} + return { + role: 'user', + content: cleanContent ? cleanStringForModel(content) : content, + ...(name ? { name } : {}) + } + } + + /** Create an assistant message. Cleans indentation and newlines by default. */ + export function assistant( + content: string, + opts?: { + /** Custom name for the message. */ + name?: string + /** Whether to clean extra newlines and indentation. Defaults to true. */ + cleanContent?: boolean + } + ): Msg.Assistant { + const { name, cleanContent = true } = opts ?? {} + return { + role: 'assistant', + content: cleanContent ? cleanStringForModel(content) : content, + ...(name ? { name } : {}) + } + } + + /** Create a function call message with argumets. */ + export function funcCall( + function_call: { + /** Name of the function to call. */ + name: string + /** Arguments to pass to the function. */ + arguments: string + }, + opts?: { + /** The name descriptor for the message.(message.name) */ + name?: string + } + ): Msg.FuncCall { + return { + ...opts, + role: 'assistant', + content: null, + function_call + } + } + + /** Create a function result message. */ + export function funcResult( + content: Jsonifiable, + name: string + ): Msg.FuncResult { + const contentString = stringifyForModel(content) + return { role: 'function', content: contentString, name } + } + + /** Create a function call message with argumets. */ + export function toolCall( + tool_calls: Msg.Call.Tool[], + opts?: { + /** The name descriptor for the message.(message.name) */ + name?: string + } + ): Msg.ToolCall { + return { + ...opts, + role: 'assistant', + content: null, + tool_calls + } + } + + /** Create a tool call result message. */ + export function toolResult( + content: Jsonifiable, + tool_call_id: string, + opts?: { + /** The name of the tool which was called */ + name?: string + } + ): Msg.ToolResult { + const contentString = stringifyForModel(content) + return { ...opts, role: 'tool', tool_call_id, content: contentString } + } + + /** Get the narrowed message from an EnrichedResponse. */ + export function getMessage( + // @TODO + response: any + // response: ChatModel.EnrichedResponse + ): Msg.Assistant | Msg.FuncCall | Msg.ToolCall { + const msg = response.choices[0].message as Msg + return narrowResponseMessage(msg) + } + + /** Narrow a message received from the API. It only responds with role=assistant */ + export function narrowResponseMessage( + msg: Msg + ): Msg.Assistant | Msg.FuncCall | Msg.ToolCall { + if (msg.content === null && msg.tool_calls != null) { + return Msg.toolCall(msg.tool_calls) + } else if (msg.content === null && msg.function_call != null) { + return Msg.funcCall(msg.function_call) + } else if (msg.content !== null) { + return Msg.assistant(msg.content) + } else { + // @TODO: probably don't want to error here + console.log('Invalid message', msg) + throw new Error('Invalid message') + } + } + + /** Check if a message is a system message. */ + export function isSystem(message: Msg): message is Msg.System { + return message.role === 'system' + } + /** Check if a message is a user message. */ + export function isUser(message: Msg): message is Msg.User { + return message.role === 'user' + } + /** Check if a message is an assistant message. */ + export function isAssistant(message: Msg): message is Msg.Assistant { + return message.role === 'assistant' && message.content !== null + } + /** Check if a message is a function call message with arguments. */ + export function isFuncCall(message: Msg): message is Msg.FuncCall { + return message.role === 'assistant' && message.function_call != null + } + /** Check if a message is a function result message. */ + export function isFuncResult(message: Msg): message is Msg.FuncResult { + return message.role === 'function' && message.name != null + } + /** Check if a message is a tool calls message. */ + export function isToolCall(message: Msg): message is Msg.ToolCall { + return message.role === 'assistant' && message.tool_calls != null + } + /** Check if a message is a tool call result message. */ + export function isToolResult(message: Msg): message is Msg.ToolResult { + return message.role === 'tool' && !!message.tool_call_id + } + + /** Narrow a ChatModel.Message to a specific type. */ + export function narrow(message: Msg.System): Msg.System + export function narrow(message: Msg.User): Msg.User + export function narrow(message: Msg.Assistant): Msg.Assistant + export function narrow(message: Msg.FuncCall): Msg.FuncCall + export function narrow(message: Msg.FuncResult): Msg.FuncResult + export function narrow(message: Msg.ToolCall): Msg.ToolCall + export function narrow(message: Msg.ToolResult): Msg.ToolResult + export function narrow( + message: Msg + ): + | Msg.System + | Msg.User + | Msg.Assistant + | Msg.FuncCall + | Msg.FuncResult + | Msg.ToolCall + | Msg.ToolResult { + if (isSystem(message)) { + return message + } + if (isUser(message)) { + return message + } + if (isAssistant(message)) { + return message + } + if (isFuncCall(message)) { + return message + } + if (isFuncResult(message)) { + return message + } + if (isToolCall(message)) { + return message + } + if (isToolResult(message)) { + return message + } + throw new Error('Invalid message type') + } +} diff --git a/src/sdks/langchain.ts b/src/sdks/langchain.ts index b273c91f0..f1b0cf45d 100644 --- a/src/sdks/langchain.ts +++ b/src/sdks/langchain.ts @@ -2,7 +2,7 @@ import { DynamicStructuredTool } from '@langchain/core/tools' import type { AIFunctionLike } from '../types.js' import { AIFunctionSet } from '../ai-function-set.js' -import { stringifyForModel } from '../stringify-for-model.js' +import { stringifyForModel } from '../utils.js' /** * Converts a set of Agentic stdlib AI functions to an array of LangChain- diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index d43afb1dc..b6a0dacfa 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -1,9 +1,18 @@ import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' -import type * as types from '../types.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { Msg } from '../message.js' import { assert, getEnv } from '../utils.js' -export class DexaClient { +export namespace dexa { + export const AskDexaOptionsSchema = z.object({ + question: z.string().describe('The question to ask Dexa.') + }) + export type AskDexaOptions = z.infer +} + +export class DexaClient extends AIFunctionsProvider { readonly apiKey: string readonly apiBaseUrl: string readonly ky: KyInstance @@ -23,6 +32,7 @@ export class DexaClient { apiKey, 'DexaClient missing required "apiKey" (defaults to "DEXA_API_KEY")' ) + super() this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl @@ -30,12 +40,18 @@ export class DexaClient { this.ky = ky.extend({ prefixUrl: this.apiBaseUrl, timeout: timeoutMs }) } - async askDexa({ messages }: { messages: types.Msg[] }) { + @aiFunction({ + name: 'ask_dexa', + description: + 'Answers questions based on knowledge of trusted experts and podcasters. Example experts include: Andrew Huberman, Tim Ferriss, Lex Fridman, Peter Attia, Seth Godin, Rhonda Patrick, Rick Rubin, and more.', + inputSchema: dexa.AskDexaOptionsSchema + }) + async askDexa(opts: dexa.AskDexaOptions) { return this.ky .post('api/ask-dexa', { json: { secret: this.apiKey, - messages + messages: [Msg.user(opts.question)] } }) .json() diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index bb729b0e1..549bd4798 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -414,6 +414,7 @@ export namespace diffbot { locations?: Location[] location?: Location interests?: Interest[] + emailAddresses?: any age?: number crawlTimestamp?: number } diff --git a/src/stringify-for-model.test.ts b/src/stringify-for-model.test.ts deleted file mode 100644 index be6a68995..000000000 --- a/src/stringify-for-model.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { describe, expect, it } from 'vitest' - -import { stringifyForModel } from './stringify-for-model.js' - -describe('stringifyForModel', () => { - it('handles basic objects', () => { - const input = { - foo: 'bar', - nala: ['is', 'cute'], - kittens: null, - cats: undefined, - paws: 4.3 - } - const result = stringifyForModel(input) - expect(result).toEqual(JSON.stringify(input, null)) - }) - - it('handles empty input', () => { - const result = stringifyForModel() - expect(result).toEqual('') - }) -}) diff --git a/src/stringify-for-model.ts b/src/stringify-for-model.ts deleted file mode 100644 index 8a3602df8..000000000 --- a/src/stringify-for-model.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { Jsonifiable } from 'type-fest' - -/** - * Stringifies a JSON value in a way that's optimized for use with LLM prompts. - */ -export function stringifyForModel(jsonObject?: Jsonifiable): string { - if (jsonObject === undefined) { - return '' - } - - if (typeof jsonObject === 'string') { - return jsonObject - } - - return JSON.stringify(jsonObject, null, 0) -} diff --git a/src/types.ts b/src/types.ts index 4a27a1c22..44f2e203a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,7 +3,9 @@ import type { z } from 'zod' import type { AIFunctionSet } from './ai-function-set.js' import type { AIFunctionsProvider } from './fns.js' +import type { Msg } from './message.js' +export type { Msg } from './message.js' export type { KyInstance } from 'ky' export type { ThrottledFunction } from 'p-throttle' @@ -70,128 +72,3 @@ export interface AITool< /** The tool spec for the OpenAI API `tools` property. */ spec: AIToolSpec } - -/** - * Generic/default OpenAI message without any narrowing applied. - */ -export interface Msg { - /** - * The contents of the message. `content` is required for all messages, and - * may be null for assistant messages with function calls. - */ - content: string | null - - /** - * The role of the messages author. One of `system`, `user`, `assistant`, - * 'tool', or `function`. - */ - role: Msg.Role - - /** - * The name and arguments of a function that should be called, as generated - * by the model. - */ - function_call?: Msg.Call.Function - - /** The tool calls generated by the model, such as function calls. */ - tool_calls?: Msg.Call.Tool[] - - /** - * Tool call that this message is responding to. - */ - tool_call_id?: string - - /** - * The name of the author of this message. `name` is required if role is - * `function`, and it should be the name of the function whose response is in the - * `content`. May contain a-z, A-Z, 0-9, and underscores, with a maximum length of - * 64 characters. - */ - name?: string -} - -/** Narrowed Message types. */ -export namespace Msg { - /** Possible roles for a message. */ - export type Role = 'system' | 'user' | 'assistant' | 'function' | 'tool' - - export namespace Call { - /** - * The name and arguments of a function that should be called, as generated - * by the model. - */ - export type Function = { - /** - * The arguments to call the function with, as generated by the model in - * JSON format. - */ - arguments: string - - /** The name of the function to call. */ - name: string - } - - /** The tool calls generated by the model, such as function calls. */ - export type Tool = { - /** The ID of the tool call. */ - id: string - - /** The type of the tool. Currently, only `function` is supported. */ - type: 'function' - - /** The function that the model called. */ - function: Call.Function - } - } - - /** Message with text content for the system. */ - export type System = { - role: 'system' - content: string - name?: string - } - - /** Message with text content from the user. */ - export type User = { - role: 'user' - name?: string - content: string - } - - /** Message with text content from the assistant. */ - export type Assistant = { - role: 'assistant' - name?: string - content: string - } - - /** Message with arguments to call a function. */ - export type FuncCall = { - role: 'assistant' - name?: string - content: null - function_call: Call.Function - } - - /** Message with the result of a function call. */ - export type FuncResult = { - role: 'function' - name: string - content: string - } - - /** Message with arguments to call one or more tools. */ - export type ToolCall = { - role: 'assistant' - name?: string - content: null - tool_calls: Call.Tool[] - } - - /** Message with the result of a tool call. */ - export type ToolResult = { - role: 'tool' - tool_call_id: string - content: string - } -} diff --git a/src/utils.test.ts b/src/utils.test.ts index 16314ce63..b234243ff 100644 --- a/src/utils.test.ts +++ b/src/utils.test.ts @@ -1,9 +1,15 @@ import ky from 'ky' import pThrottle from 'p-throttle' -import { expect, test } from 'vitest' +import { describe, expect, test } from 'vitest' import { mockKyInstance } from './_utils.js' -import { omit, pick, sanitizeSearchParams, throttleKy } from './utils.js' +import { + omit, + pick, + sanitizeSearchParams, + stringifyForModel, + throttleKy +} from './utils.js' test('pick', () => { expect(pick({ a: 1, b: 2, c: 3 }, 'a', 'c')).toEqual({ a: 1, c: 3 }) @@ -79,3 +85,22 @@ test( timeout: 60_000 } ) + +describe('stringifyForModel', () => { + test('handles basic objects', () => { + const input = { + foo: 'bar', + nala: ['is', 'cute'], + kittens: null, + cats: undefined, + paws: 4.3 + } + const result = stringifyForModel(input) + expect(result).toEqual(JSON.stringify(input, null)) + }) + + test('handles empty input', () => { + const result = stringifyForModel() + expect(result).toEqual('') + }) +}) diff --git a/src/utils.ts b/src/utils.ts index 7aae335d4..10ae0b8d9 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,3 +1,6 @@ +import type { Jsonifiable } from 'type-fest' +import dedent from 'dedent' + import type * as types from './types.js' export { assert } from './assert.js' @@ -111,3 +114,29 @@ export function sanitizeSearchParams( }) ) } + +/** + * Stringifies a JSON value in a way that's optimized for use with LLM prompts. + */ +export function stringifyForModel(jsonObject?: Jsonifiable): string { + if (jsonObject === undefined) { + return '' + } + + if (typeof jsonObject === 'string') { + return jsonObject + } + + return JSON.stringify(jsonObject, null, 0) +} + +const dedenter = dedent.withOptions({ escapeSpecialCharacters: true }) + +/** + * Clean a string by removing extra newlines and indentation. + * + * @see: https://github.com/dmnd/dedent + */ +export function cleanStringForModel(text: string): string { + return dedenter(text).trim() +} From 0f999c4f00f250343e6d29a0aa7a458bcab26719 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 17:09:28 -0500 Subject: [PATCH 46/81] =?UTF-8?q?=F0=9F=92=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/dexter/election-news.ts | 32 +++++++++ examples/dexter/weather.ts | 5 +- readme.md | 112 +++++++++++++++++++++++++++++-- 3 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 examples/dexter/election-news.ts diff --git a/examples/dexter/election-news.ts b/examples/dexter/election-news.ts new file mode 100644 index 000000000..a19fa50b6 --- /dev/null +++ b/examples/dexter/election-news.ts @@ -0,0 +1,32 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { ChatModel, createAIRunner } from '@dexaai/dexter' + +import { PerigonClient, SerperClient } from '../../src/index.js' +import { createDexterFunctions } from '../../src/sdks/dexter.js' + +async function main() { + const perigon = new PerigonClient() + const serper = new SerperClient() + + const runner = createAIRunner({ + chatModel: new ChatModel({ + params: { model: 'gpt-4o', temperature: 0 } + // debug: true + }), + functions: createDexterFunctions( + perigon.functions.pick('search_news_stories'), + serper + ), + systemMessage: + 'You are a helpful assistant. Be as concise as possible. Respond in markdown. Always cite your sources.' + }) + + const result = await runner( + 'Summarize the latest news stories about the upcoming US election.' + ) + console.log(result) +} + +await main() diff --git a/examples/dexter/weather.ts b/examples/dexter/weather.ts index 511ee302e..e762d3f6c 100644 --- a/examples/dexter/weather.ts +++ b/examples/dexter/weather.ts @@ -10,7 +10,10 @@ async function main() { const weather = new WeatherClient() const runner = createAIRunner({ - chatModel: new ChatModel({ params: { model: 'gpt-4o', temperature: 0 } }), + chatModel: new ChatModel({ + params: { model: 'gpt-4o', temperature: 0 } + // debug: true + }), functions: createDexterFunctions(weather), systemMessage: 'You are a helpful assistant. Be as concise as possible.' }) diff --git a/readme.md b/readme.md index f624e532b..9c0fb7306 100644 --- a/readme.md +++ b/readme.md @@ -13,9 +13,106 @@ Discuss on Twitter

-# Agentic +# @agentic/stdlib -**Coming soon** +**TODO: this is an active WIP** + +The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based usage** across any popular AI SDK via simple adaptors. + +For example, all of the stdlib tools like `WeatherClient` can be used both as normal, fully-typed TS SDKs: + +```ts +import { WeatherClient } from '@agentic/stdlib' + +const weather = new WeatherClient() // (requires `WEATHER_API_KEY` env var) + +const result = await clearbit.getCurrentWeather({ + q: 'San Francisco' +}) + +console.log(result) +``` + +Or you can use them as a set of LLM-based functions / tools using adaptors specific to each LLM SDK. This example uses [Vercel's AI SDK](https://github.com/vercel/ai): + +```ts +// sdk-specific imports +import { openai } from '@ai-sdk/openai' +import { generateText } from 'ai' +import { createAISDKTools } from '@agentic/stdlib/ai-sdk' + +// sdk-agnostic imports +import { WeatherClient } from '@agentic/stdlib' + +const weather = new WeatherClient() + +const result = await generateText({ + model: openai('gpt-4o'), + tools: createAISDKTools(weather), + toolChoice: 'required', + prompt: 'What is the weather in San Francisco?' +}) + +console.log(result.toolResults[0]) +``` + +Let's take a slightly more complicated example which uses multiple clients and selects a subset of their functions using the `pick` method: + +```ts +// sdk-specific imports +import { ChatModel, createAIRunner } from '@dexaai/dexter' +import { createDexterFunctions } from '@agentic/stdlib/dexter' + +// sdk-agnostic imports +import { PerigonClient, SerperClient } from '@agentic/stdlib' + +async function main() { + const perigon = new PerigonClient() + const serper = new SerperClient() + + const runner = createAIRunner({ + chatModel: new ChatModel({ + params: { model: 'gpt-4o', temperature: 0 } + // debug: true + }), + functions: createDexterFunctions( + perigon.functions.pick('search_news_stories'), + serper + ), + systemMessage: + 'You are a helpful assistant. Be as concise as possible. Respond in markdown. Always cite your sources.' + }) + + const result = await runner( + 'Summarize the latest news stories about the upcoming US election.' + ) + console.log(result) +} +``` + +Here we've exposed 2 functions to the LLM, `search_news_stories` which corresponds to the `PerigonClient.searchStories` method and `serper_google_search` via the `SerperClient.search` method. + +All of the SDK adaptors like `createDexterFunctions` are very flexible in what they accept, which is why we can pass an `AIFunctionSet` (like `perigon.functions.pick('search_news_stories')` or `perigon.functions` or `serper.functions`) or an `AIFunctioProvider` (like `perigon` or `serper`) or an individual `AIFunction` (like `perigon.functions.get('search_news_stories')` or `serper.functions.get('serper_google_search')`). You can pass as many or as few of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` sets via `.pick`, `.omit`, and `.map`. + +The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as lightweight as possible. + +## Goals + +- clients should be as minimal as possible +- clients must use `ky` as a lightweight native fetch wrapper +- clients must have a strongly-typed TS DX +- clients should expose select methods via the `@aiFunction(...)` decorator + - `@aiFunction` methods must use `zod` for input schema validation +- it should be easy to create external clients which follow the `AIFunctioProvider` superclass / `@aiFunction` decorator pattern +- common utility functions for LLM-based function calling should be exported for convenience +- clients and AIFunctions should be composable via `AIFunctionSet` +- clients must work with all major TS AI SDKs + - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/core` + - SDK adatptor entrypoints should all be isolated to their own top-level imports + - `@agentic/core/ai-sdk` + - `@agentic/core/dexter` + - `@agentic/core/genkit` + - `@agentic/core/langchain` ## Services @@ -23,19 +120,20 @@ - dexa - diffbot - exa -- firecrawl -- people data labs +- firecrawl (WIP) +- people data labs (WIP) - perigon - predict leads - proxycurl +- scraper - searxng - serpapi - serper -- twitter +- twitter (WIP) - weatherapi - wikipedia -## SDKs +## AI SDKs - vercel ai sdk - dexa dexter @@ -62,6 +160,8 @@ - provide a converter for langchain `DynamicStructuredTool` - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) +- tools / chains / flows / runnables + - market maps - https://github.com/causaly/zod-validation-error ## License From 2717eaa516a5cd4dc41747c7b8853492f935c7a4 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 17:23:56 -0500 Subject: [PATCH 47/81] =?UTF-8?q?=F0=9F=8F=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/exa-client.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index dac09150a..37d6e2864 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -59,19 +59,25 @@ export namespace exa { startCrawlDate: z .string() .optional() - .describe('Start date for results based on crawl date.'), + .describe( + 'Start date for results based on crawl date (ISO 8601 format).' + ), endCrawlDate: z .string() .optional() - .describe('End date for results based on crawl date.'), + .describe('End date for results based on crawl date (ISO 8601 format).'), startPublishedDate: z .string() .optional() - .describe('Start date for results based on published date.'), + .describe( + 'Start date for results based on published date (ISO 8601 format).' + ), endPublishedDate: z .string() .optional() - .describe('End date for results based on published date.'), + .describe( + 'End date for results based on published date (ISO 8601 format).' + ), category: z .string() .optional() @@ -120,7 +126,7 @@ export namespace exa { /** The URL of the search result. */ url: string - /** The estimated creation date of the content. */ + /** The estimated creation date of the content (ISO 8601 format). */ publishedDate?: string /** The author of the content, if available. */ From ab3d0f919f5b1232c62e812b9f9ced0995ed77cc Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Mon, 3 Jun 2024 17:24:58 -0500 Subject: [PATCH 48/81] =?UTF-8?q?=F0=9F=9A=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c24925273..aa55da764 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,7 +27,7 @@ jobs: uses: pnpm/action-setup@v3 id: pnpm-install with: - version: 8 + version: 9.1.4 run_install: false - name: Get pnpm store directory From 52fe2db15681bf9c8ce470ca8d7df846314e6a60 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 06:30:36 -0500 Subject: [PATCH 49/81] =?UTF-8?q?=E2=99=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- license | 20 ++++++++++++++++++-- media/agentic-header.jpg | Bin 0 -> 415597 bytes readme.md | 28 +++++++++++++++++----------- 3 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 media/agentic-header.jpg diff --git a/license b/license index 5ac9cf7be..bfa02ec5a 100644 --- a/license +++ b/license @@ -1,5 +1,21 @@ -**PROPRIETARY LICENSE** +MIT License Copyright (c) 2024 Travis Fischer -All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/media/agentic-header.jpg b/media/agentic-header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3cb5a5b9601fc1e23df26a78921c5c274a34a43 GIT binary patch literal 415597 zcmeFYcUY56w=Wz-K}A3;AYDa3qzOoGA_9-nLRnKNhT&(NPeOHccrr9XR)MrY44FfcMOoMT{QJb#{%k>SGm z3m5-ri=DOs*v`}EoE@U4V*{LF zqoZe|JN*UV1JD8J&eH$E`X5A7!g&4+{RO&9zS!k(c*3Bg?D*WL>&Yt~?_O+`pe}-5`?7<^eMq$Bs__!^V+U z{!@-VHu>PS8hSBS8w27$fAXH%s~kE$T~6bl%O%klHMXbnD8Bu-G#hhp*Eq=iRoO%O z1(BQO52YC|X%_3XRH1d9CR$5j4Sy=VR~KsD3uxG898~%H-_>M|2hLA)JAMh#hXyCE zcJwPL2E=D8Dj{4OUf5OWZlD_LO9y<`4}|~##;(ziyr9@Rm)L+s8;Zg2|L8M4t3yj_ z#hIVDF0&Hz4KfF-Nz zCKo1ZE7&5XGbywLPoctdkt;C$~u@IQ8=ivha7+Ic&~#j5$2dQt-))^|_RlQOBigC?rygsPUl z?#%IKRrb`=E{#Ob=^JX&eOgLm1uiFOmkzf;dQXH2> zJ!(9@=YDd$0$W1cCH`X#K+%Yz!Ax>Co9fUJTU)w!D=77FcYeY2`;m95U)6YwuM@m* z^t_2h&a~6{eSv|r>)1O>PMHD6DD6g8sKI_ra^vO$c;$iuLA)0|+s|n8Y{;<=Qx;rc!jP5XQY|&xYsz zld@l2jLv-?H|vw|X^KWV6eU0L+%su*&z2f!#_jur=X~B91ivn^OW}#_yeeK1J3|lw zYVs}4K=Siy{74OcO@!pW%{AyhW;`=q$a&RCMCBow9ntP>T(hZyOat?e>i6wbe4^@% z&4In7CKr($n9*}x(jLkem&BL8c{h}aI=WddJx0|aauYP#WUd@`t()rNIjiUHR7Q)N zH0j>WDO+ipEF~ahkLZ{CJG=^VN_@J(dx3*3&5BLI|MZofXU$;9Uf+37^P#8B=XdtU zn;Wbp6B4brc6Gz*V6zz38~xEHf|z^i*Ww>Z%~?+w3gj2gCzd*mC|=j+-OiPN)7ZA2 z8SGg7X+2^1PKN)k_UgvW8$wc?YiP~Lj8svpumugxV94rZS4&O+7v4Y3GQRgb^BxVTi35_`YQ`eo&t<&%jU#ytjsgi6Pk(^c1SJZr{vecWN3BI*{-TSe< zPC@MOdygf2-8*XdY?L<|)^huF6A1TCHe*+@m2?TOMA4&~{OiS;A+?*$bPUmozc+c!V9-G24%iMadCanPP;b0_NE!{yJgrQOm>>pjAS#p5@67*vvCq z3HS1L$$EY;Qv~V7(pd=E;n>Jp9;HRdp$&iG9U00UO#ywOVn1eMBfZ zamvIA&Bsdcx%>(U!^B7#R_(7H9ovt)A*?Ewpa_9QZlJ+^LJcleNaLHmE3xpXV*1Xs zFW=(hJ73^fn{*?u@!zvhBwYlCy7aXyx6o+A5&PXthHN5w51^*5eftD9OXJtWN~|wbvi9POc&2>gyX7?VVTZ#XDxQTZ@635PsJ)-C z0;Q)_HXRvd*O;s^K8SWebUZLl8MIPX21#;jd=jmuqI&d~+MCP>a<(6Fy8g(wWE|Xj4YRNb+bPMagZheZHL$jH6%2Gp@5H$oBMX8$0YBEC{D2GeyzyDId6O&7u zXnq_nkJ(Z3o%JLmKG})E7stQ1%e%7eZcK=BHmusH?b5pjVQ#Z`7p(nsok*XWjO=$4 zE)Ax?)HSQ()dIH&ebYctJ3AcH+GvuX8w)(a2lu3a3?7VoL1(S%+k7`SXHd%EuiOe67*Fx^pFj}Jb;5oI!^!g@BY z<@Q9^8sEUd-V`uNT;3_tqI$sXi73kl2&a2x$cG(Gqu%SKOErfE;=!eP8zmGPv~w(q zh3yLIf}@{YW+BFI6O6s))$`UOM~PsBvQoH$P3P0 {5z<5zlGIzgw+?7eD5EjiE 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

}$3Jp- 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 z zWzE*v)MCumZipcuQkyvocQOPIqt6sJBgI$j;wm(D;(N!H1pt1HuYu2zshxG#Ea(cAQ#ASW5GSf8e`$lGF$$odLvYcKw zbt9>bfGe|a(c zWGn8srmG)vextMA%ZRxZTB8kqOuQ}$bdwvv2pUXnKjd+s&F2SolN2?SqPoTS${30{{U$lVblfN>He9B%E$2ErMT!x)o>l= z@}+jt$5QXflZpuJ<88$(7Vz>5kQlgulhwn>OCfGPJts%IenR9xPAG_7scf67GJg?y zQK3DlarA4^t3B6s&6fdY%Vf^n>YQE6NJVmIURe|E>X5?$lab)6^PiitXJ=efJFNZQ zG2r15qhw!+j}**5(-qFEWcmXO9y&d$$LF2*XT z`7_#LaZ#?NledIjKU3l|xfvLy{Vwgb$df;ejh@v_wtxtqQN%7&OmO0v6^bw*Je;es zdDM8rHw-;icq4=degVr*DKmwl7K+SfoiMwmZ$pdZjy*T*UNCjqUs;!V*Ei*wp%vK1 z$5B=pZ02Qh!&*|>jfCL%crkEyEm($Gm~l)odTmmW80NDiilC2oDRbhltTca5BPTm} zkl~Kn8yZte#7$-DRj*D7?Q>3|hnwc|&0y2xSSn#z zzA*#o7PQ}|T5h73;qZ!$PR&Nz;>%>nrU8z`=RJrb?ZQRvu*%E~tb#buxdpgf;dH-nUfPQvK={fS-0YtX!y`?TlanfgS)%4JH2?K zrBcM_G`}_`liI&-Pt0$Lcvab&$5~GA9y0)&Q31)#*#r_1=CdOsEO0Sg%*m*!l#OWv zj)lCwiANUZ>l<9};;VOU4%xo!-)>8&Eod>2_b)rC1IHCKLhNkfDr(WkQ>Lr1*Y`b} zo)a%VlbbVTXZi>Q-PcaR-OFVQl(3I#v!QN93o{2+NxX`LJ{tzNwYOycP@dL8PFLwi zwP@Vrf&c)7OI#L~*Cg(T?dcDN5k;*;yJDIaOxkZjh2OFvu`MBjWvx6oc==mi9h<`oGNRv@$xq(MVc_l6 z+GcM;AYipS%|B1VO1v*C$bRN_Q@m)92C zh^aI&^o?)JMh`XoiRwM5KfM4yJp7#Uu*c3^o40f!l+lB(;%Cx#;zUm54AIxc!`z%J zj>J}x3TSltM-vkUgVqrp2AQJ~*K8MP7i1S?5Q8!!VQ9_C6kGHWcYoO2rWPYCMaE5v zyuS@N78bqt8BC z?Q@8HSF z9zrVd-^tHq>(-umDRlVPXKgEVtIXD`6cb?M`b&p_@|oG16X8;{FD&twji!H0^{x;s zJZ3ogHx+J7>~V`VXt`MGxkH{bJ@upboXK$KHoF{Hhtb_l3yoU`%4*~87Ikm?c*t6| z6BG>Pm6OV;;#i25O!;ImQFk);Uv_9j!CHFJN;YxaaxdjrlZ|+Xa@>7Ghz(YalX`9b zPAA;b7WV{vS-d~-!INz{F7T!)3El=k3@nN*yMD>Gzn^mZgwPyL5{}!E2sWfSxT_}i zZpRpmVHvvb&MDnGGSZd(uH_+Na1mBq+mf?tIAZ*6MEQ#g@oPGJ)`<}-9~L{l+gndOP{C@i!kWu?zDqFomF5N^Vf!T|noRpoe zp2UY1-zM()5@%er*Q~tuR1vU4cl>`GOng$Q`E2pAWa;}V^t>*1oSU7UvVRZh_dL0X zRaIm9YDnH&Swj(n856a8#?Lc-;!(&7)9%knhVth7cq|LTcVHKuR+4A%vIqG}jrH;( z?G+H?RyDQB6q`=qi@2eWk(?3>}^B7S_dgbi1aV%+SJ}*_&^-Z`o~=rcCUI zP7lRC_-oCIG02WNqb_B*TqJ8AS5qHr3xgfph?xs{>U)1tV?Y6k=e263FsE0_pp5*j0RRzjkqBi(O zZMe3WTWb#&b3c{am0@nxm)wlrVUJ<5)c*k9=|k-XLHC>1^D(bT=V#o3K<+%Z_pfd=Lk?S!69 zHxcIU{N#n6BgY!Z%u?H{3q=Mt4pK<|+XcBv*3{B*Zl0tBRx%QqK_rgBD7k34PvltF zl+U!z=y^FdIz?vGUF|w&^QLuBH)E}3@q!jZAZ`fTd2<8E#TiK@xtNw474R@}^fS^4 z`6gA_o>eGwkNF>~U#NqIPMZFH&zz(2nD0zCO-(!UXZo7CX1JPvxC6 z_=|3N-97jFlk+ajowk%!nR(2xQSQ(Woi^2f@@ABUpYLLJIBCJ!#zgMS@8{A*jf9s~ zu?tom%q-hsWzwU|C6xaFBW%h~xa)BXaOJnN{!dH~R3rq4pZ8p#rDZgR?tq_QN3qf_*BOCi&D>V^+FBr=w^ zxd^jJ4xRr1Wa*!f^3xh0u@ASqxV$+NatOFGd0)Gqz3{mFMQ4(CRAO<4UOXSmlOjVG ze$B~a7^9JjNFsJk9>@#Ydtf(bj7gMrpiKBrdA z%O#B1)`h&}EwyZ7V(mrK^mvh(5pTg0GLXHd?$SduI;s8sUgaS-c9#1cOzimzKCd+K zgw!z?WT}n7(^6QT;jl*>WN0o0r*CmekTgl7L<2Td*GLtUD4J(qf z3W`6W)B0c+b+1Z7ugoJF?cA`GM)vML$5Q1t1rkz*?-w{pag zbk)Loy)}!Cpn?z=*4=X??z_BKP~*m}{3Wl5#`+HqKX!i&`wt6}Cw)G*>|_KEKE_^q zp~2J2z`K$%>P&;!y+*%cs0S(8ftE^rSN=Mwq01|jo7mpk z{FeP4R|gonwa4)+V`>f?dtTbT9K-NA4>n`-9G|QIJuWd3Q)&s&!! zybd;7dS+K@H1SCsk(^mefZvT>Pn*c8ZQPk+dRoNltx9!coOwt^<7-+^$4={)k~bIX z-FzQP{Yv;uiP(umBL4uhcH2Jn;gcXZ^}hu2a^lRmn=>~Bn!XjQVyisX$zvdOESp)0 zNTyDVHqP2&Cf>OwB@4Eqj!6o=DA;*`DX+^a$Y(raF;ZNbwR+JF$@B#e6|Y7^^zr6g z=Zw5UI*Hx&5J>1Nd7d|pOHz=-$$VeZGt$MtMz!Qt^vHhjKjo`GdnXI&xhDIs3y^4C zk!eQZ%I%=5T06fJ27Q@^lYUp`03s&gPL4#}A$3AM%aJ|J(%=3hBdC^6J~lC$camcG z%*d8^=8>JfQW+G59lSd79J;dtl+=@>kOzgL(hChk0&O8+=eZ@UEdp=OC ziM$w`II~11n3H^(TTU(`pS<%=M;PIc>S5zGcKpAqH>0XCM*v#A&0e-s&Y%X019CFy zcIAeJ_Y%yLbHyV)BB2e_q_iPVmZ?@hT{>gjmnB2cKdFHayKha>`|w=oAbDJf5rO(LmWYr(bmdLTa! zDYs*OV;!GWNYUZpe%)xxU>bF|*4Eb0zMO!W^A|oA3^g}70pp6US0Gm|MBh*4r&YBq zk0E8|aTio!=QcuJM>IXUeIow=@nc}(PnWC4d5&2znrMi*WHWPjGF=`1U=aL%N!g=Y zTUe29e?*%$`^!S!##wj#jtBf#L1r^Hb!y;24S6IWxoec!g6?8z9~)9=NFUlH&*=ml z)b*Y=+H_xdN0a{m>h6M11I5AQkVrwDin)pR9hA2;tji5pu3ehUiltd>Sn4}s1Jaa8 zDhy2CjDGLyzo#%>8H=9T_`fpb1@$&g(G%~V66#ySK0^~zwNRa7TzGp`^5b3IbM~hD zZP`$OWhnI-UYC^Jm}*wbbp?wqtHC7GV(7tAtkxp{ZtT)YFNf0GA}858$G6t&Dc$6V zd_>zo-fPJV40bEA$uBhj0C@1*N!NxWUfOHvd-pS!=U{hjp-P3J7=^*z;9ab&Y>29wPq=&$T#IWK3~gR zd0EM{=vnL2_@2Zr?(fmh{{STm7sup_ZR>;*?KFFCpdLAxn_xT{W&!>Kr(}(Weto=c zu!QE!3o2Blu_VUe5>9UOPDYtIcWd`N1g@G@TE_<&8NmILZD~bLZB5}ArrQmflyUKn zJdIIbi&kWJ-c@ewGzNPUO)9TmS*Dg+*h;v{6JNc1CiQLlNFL_Cw#!R*`H$1fm?nWk2y?MD17l+fa$^hSqhV13)LmX8uUX&t?12LF# zZ$WRR35F%R*TE9Sj9KHZFRzGdJ}=oi@|D**Bn&vfHyp0xsMQ#GS{FCDnKN z$OF)&QIm~~p4v{W;@IU< zCyK2>d2F+3Hyzpsip@LaW|Z+Xhuf9kDU%9q>C?r-HF3CPGOg_O$AJ7Dj}6qZEJVWf z{iOwKO)E>vz1ng^W+SSGqiR+Wj{Vj%^fvkx=Iu{l7=~SniozKkoJu!B0KLyE%*bXH z%fzxU*LEk3>^U(B1GBL;jGt^hDA2KPVtQCw6>40+YD+Y5uwuG?X{Gt(EeOmhzoY#9 zmlx#vb+!KhyNNSL9K#;PnTJZu!(J)oIcA{`YN7E?`cjkVq%CqrTO=zFRAidRX^dDS zXoya0_awD#Lyxg6c>4Y8?6PO?PPVq6(lO+AWsRc4$6jovOBpperSG#vb(h)B-Gmh% zbm~oFT)WkwO92}Qcl7){ulKAQcWDsmd1Zcohr+G}!Z{2N@fao+jfv!jQC?X*@iHrJ zq>@8_NaHgp;&|l5yB;GLTyJI};cYTyD|c#jHFqp5AH|byDSB#FNMhEYVwMP zMtY_lPe7W_R70zG?N~2JqH{ptVC|>F+KxypLBOSr#l~`G3ots5T;E(wkGclhc_Qa# zKy@VX>BLO|5S5!Fzf5j2dy?3{Llp%|87#f485nAY7XTHX=Y8qj-_jlN`Q7#C{JkHS z5Q&+X`7bP_cNq3AFUfUH{YOSF<-S6-=O<~}*$cZ!EVRFtcIDueNd6lhAs-^{+diqZ zFxEgWMKLrLIzGQVmYrLZl>1KWY2Vh6Zq9Fnc(3Oh)UcFagjbR~Si%+v^ui`?80Lws zbtpv-IE;jj(?=(UCgcLlpTh9znb%a=*QFXTzB1KQhEM201d@^Vszl)-2TaNJ z<1Q0tA>14EWsaAeGlNY@oy4+oyp=JZ*eRYu7-b|dy2{pIKUiTSa+6ACb~~GvusG{Kdr-;Wt>iYs-B8NN!mxk;|e7^-^JxR4PER<{+Xq@qjV zV%WwE;z+Ebk#cSmWFirkX(W1W+eZnr+`HWM$71HRRf;W z;@Fnk+-XMP&*7`c z0(NUl7gOdzpQ|#C({&DBMk69GN?vi9I#Ni{UAGEs#nyQ9SyOy``Ce{IyBuL^#FN;F z9OTH&+NV~;Hz2o4NMGiyjF{Ax;D7)nu_;0iUZlld)uwLf@v(}z${AxZG4ZTTk?sqC zo=z^_LYL-oIGaY%#^izBiW)}h+%P-MkCb2GtSIsBr?L#t#K1QH09HOmmlDIF^k-D% zVyQFxL+L+L(eKuZLyYQJY2&>|l%C5`%~oifA(WIjs|JFdO08=rB&xnFB8`iQ#_>xO z@jP-xA%WD%1kED}ys(fy$rY)S*p<_fI)=QG6mc^m7}%z^Za$P~l+Sl4XBImXUc7c~ zTgzI<vvY@Faas%Nw$tfm`ch&h%MrU`30;M@*DI~?#crmveejJvTlc)8@ zhtul$2cPpCqz^RDA$-_El3F6P4uUw4X_mIqGXQ2X{{R&06(85k&$c=|tHqK}jIA;} zJ;7gwUQLL+z5)BRXn18hW%BOpFTxtwMVt0_FZP)3m4EV`* zA!ImCwz_`Sj#(Ron<9Y0n>UO2X>oHn&Rbk|TwNEntYrjLRBu~2>r|x?J)DHLu@Rjh zd23Ge3e|ZdFfnx%=@>%j8tjP))p1V)ILQHO6A>vSh+bKY{c2L?tlT+OcY3E!Gb0MRcE>cGr!_0Bt@F zO@C>{Ff__*<#5ZoUA;9Ju&`=Tub(w|3Q; zJt}aoSe)mx7Z-aJ;FbRX11{&n=7l%oOW<L#e}mA zF|dmkvY4o?$5zbrr@xPm+;YV%N3_PGxi}`wSVfW-Qe_Rqq&N8>pwW!>C9@#BG(xQz z?a5jpjz5|=KMT@`%9 ztsWUiO1uJOofOU6D?&2fuiY5jz^mkA*l{KFo+L!V)@ONTz`Kq{@4Gi$xi6&~otX{g zVt27dysh{oJBt-i7j3m}AIsy(S>+X~^T%?YLB5my(7UR0=u66J-*!wt4j0iVq|)sk zp1h{T9E|w>Afj!tztR?W5s|syqf+c~&2t?zjZ*A3v9rMGme$t&V~EUzYg1+$Hzk%x zX@wkN5i>T0y}vLhkfJ7JGk(BRp&d7tas=fo7gop5AB2c5bomX6mg(jzWGa9I2Y9;3NMYZq2rhgZ%`B!*|{jf7#XdehA^=;-)E-WOJjl-^M?*U07IW!!cPl**hD zM@lyDTDxfBe~G^9{!Q0n^Ps4#l!G065z5!76F!h&T{-dKp%#a zj6lxr5(CN0P;%oWq(nw;!NuL9ehv+;D5GU!xJWRxz^_8ytzvdx7iAo>7p4#Vt99S; zc$zkcy$or;R@;fRUV_Nm$teDnyTQ16Z!Fbkp0jYU8k1gG3hp8{b#KKq+v3IUicT*c zP2OJVD*QKOOpWpxs;`W`H$q6X(6YT+DF)6m)l;jN7gFQvOs2)!1YschfSEja!)B7~ zafM85lRb-K3Wg_w;K{rp`Nc)IVfz^JO&M?Y59#-9{cs0XV;SM;iw|EV)EKDjKn6lk zXYvuR{Hoip{F+o?9Bh?+A29yT8h{Qz-Oe5n4^6(j2o0+Re0s+iz`M*C0p@SE@Q=>Tm;8gJM?rkide{*2m0+fq5OkC*C7U7K}t z4|WWuFrzQ%FuT26Q7f4N7F6pvv=O|s$N;T32-BzDojT;4)Q+wDDH5svMp947V*}{d z_h0!4SeUC=grdrdal}f#27>%Hnk;THga-#3Lzaw5t;|qCC2@OF!saa(7~`wX+;Q)> zAH&v;7Mj!zv8@+wC(&_7APd0aMK>lXt1$(7^0OFE&nZ#NTU&b4>rR3x30KBC`yn?% zTWzwiLc`5PEAd`kNY05`kDOGd;#ml`D;?C6L<1EoN#o$WDI3oxR}bkw-mILUWooO- z9$sT?e@;>hRdP1Vy(U0=9aR@B$53ppRw+$5v98AyZZ4#ESF%|cYzBXmcY1zR@Hhuu zj+zBpd}ndtM~?%L8Iy`(ZL@gS%)){+0GYpL-(=r++WKIok|>5-!p$hOjbgQmGvV#k zwy*ToK4O!latxmblw~F_APexz`fPp2QQ~eB#nTMKB=}lmYa=wsK!~d1G}nM*tJ4*G z*=HTAkM&deM2Q=skr6uNvodNDSg-Q4WZY{v3Rt%CTHnaZO3@mZ5nGdC8GZ~Yu<)p{ z)PSRm6zm&@Hgl1kf&M2VqkFFV^aDXAo>Ou^Ms&~SL`l`yTqLbxDeBmO zqBPFz@#eA&1DLExuGc1eQ7I&IC5%5{t*dZ%tKhQ*kFz9j+J1HFjaf$_n1$ZnQme)a zH-}8*EKM_!3!;c!j~ztQ;3zx)0OPb2cwBHHhA|x{To-NAH_fCVf;1qt`$zk4%ARO} z9rY(Ne%TYpkN2HQZw^xlW}LOUvhXlRhaKCN@QDsB6egpO8rN`4>{zwKK(z zyCQ?9%~r2gHqykAN^nb-W)w(aBbgY-UD zPDJUuN_OBdoMLYNeVw%AY*B5?%Q?v+h>Mfhm5$B51xsbQEuVBOepRhW+~u*B?*i`& z#!`tKk<%LVps%lh`u6J>NS!~($-N8j>$FatI+O&5>Q|aRHiFF=q4}9@V%yw2kiVtu zOH56K$?lg*NbNR0CxW#wjmQU0IE%(yk=S;7)=D9W+~O^-;K#TE&HXlIr4V>w{k*qg z1a=Ih(;<#hQRClHMH3G;Tw8sRWoHYFu=4bVHOzWCtB?L02A`y1XC9ZL$S}CUaJ7d7 z&Lq)fpesBDmj$0T_@0}Iqr=&gRrb6iMu|V&)BWlAv6v@&q_7bFTK@pm%je5f@$tJ* zAzJyHY281dnKz>v6CI4+WH{VncoDEUxWe&PVeZdd1>l5To}8>e%)vc54CJe-jS;z8 zttdkf?F;GWBYBD4{!K1FF1|-vLJaBZpDD5JAduOqJzRt{jjTij)6uaJe6-+r;vJ^e zo9`T4Sei#}-!{_`LnA!=n{vSx+;<2MC3=g<6`(ldCvCqIULp_aGa-!(X@~aHPBE!w zoYNPPuOXp77su)~e37C5TlBx4z|IUb^{ z+Q-cEQ*jqrL*;%R5Z1PPMXyIB=)TU2N&eKEOC#ptI>7+EKtsQaHae%(&h;a^D)9bL z>Z6I-IIS&uv%4nN%ZH~QO&|oo=z-Y?JFhOCyo)=$j_RxE%$?4>kJ%F@D;FgQ;+|N} z-SSlIcE$@0+_xy4&#ipI-dueA(dmrh0d8@VHQDOS9|>kFcu7T9%3Fc{KAh}8E}o=N;xEYLY{{T~wHrSzO425}309tS9 zh@b=@hmMoJmoInh<*yuxsKkc6LYsb{%H!@XIxp4Zh>0@f%lL1xiSo;npHpT(vbvC2 z@fmaf0ENQG#~UDvH8JmG47n4&{R_e*>Hh#zx^(J?h;A1tm0l6!@ca1O(VVv;n}hw+ zf;!;o!EsvkVOFDv2?SBRF5VmN@R&;DAi0F%AV$gLE=MoZ8FccLT6^gXd;39N5%#3NOO{vP$9c**#MKdjW1Z+z}16n>ynDH$N z7}o_LZHcu0o)e03Tz{dY!001DK6v=x+SZ$sp=aOi{{WqPo!9c)U;8F~x2F9%qZ2Wz z8A`b-b5l54<)6gvTPMh507OSGBZfZ%A1r~Fj!W*1)1r6R@=xgQq9+PPt%!1x{G4du zwA0!y=4Wb~{WNf*2W7}!BY?$mPYjGOKfUP9G-pylF{(`#OM)RLROQk$uMo{_PD6eu zLHWueqlL)ifQCpQCwBtbMLR$-8@=l8C`H}vM&U4nx)C;z`;L22Nu_dLWHV|$Ue8iz zXZ2-DGWa1KE?)PJzauyy7mYY8IC^s_x^{L=kITY>-fR?CY#RF^Wu?VCD1cr2L&gwc zaEwS{jfF`Ya%c6BN#9N{>)Lm2Dd8<}L>gLJT1?5AL@%@Zv*`ouQ@bfg$jC{z`+a+~ z-h}#SoS)?;+c0=XBQnVJ-AUvQmiJAJwZ@J<8nNkhJe+FuwaF59_Y)A1} zP-2WB=FnA~+p`D76;e;M1VZFQL_6*BeaSq%mr(El&N5uO$0$u3LmZ>sdmXuu z{mq%5<=@E4vol4Mo>=3jaOOL45rlMvfJg}&GYc@M1;uei7SYyp(2{7E1;KXsrjN{V z3W6ZhcNxCS#N2%y**LNx)A94#75W^RF*`0m=%OXqWcATSrNs*hj5N|WxrN;`X_L2? zZL_wXBJul%+A()#Z89=;XOx|HO-6fmA%98z8XdEOI0%qOrs|1#U&h7TpzG|N5`Cgj z@OQKMLnuJ@(;YKHGKx83cV=gq{XzE9kGekuQG&Ez6_@lTPK$oK^o~gi?HGAa)NR7IC4&!sWQpg+`!KyS z9zIVjs%WJ6GINY$Wh8rAjUNDQym7}FyT>u6ZHYLGNYO@eF-aVb!V^0YcKFL|fsy%K zd;q(Yfv2w%kDA(5V0%+a&(TOX3E#?#!!fQbPM%NHM!lPZrtaf0*6(XkJEO>W@A z6K&(N?r_zv(T}6Ets`*&D|tMOr;Eul!sX>TxIUYUxeF-bc-(X=+}?u-3$3o}X{B4+ zvv~C6+j$)kZALpSdTI8-?CqAqG$XH8f0j`3v=6cU%d?`3);9M``aLv+-H~b8+1X#Q z*{6YroC>lg8g%Gl5iC?LA=Vlh)(Af>mOfWY>Gbzb2B`Y7vA)GIcb`jIBvoN} z-oMid@rb+o*jKRyX**XuJB*O7@W~XgI2*>?c)xSAAj0zdK%Z`2K(tfH@If7gwnENr zUX5~!&~cSCUq+Q~?3XHul$3#?zfMwdjG0)WG)3ziavRXc#-)k7bfJe+SLF9946)XS zKyfpGS7^RXEUX7EI}c_O$3Rh2SeRt9m>8QyABdx1VitBDUoO4ggW=fC%hFcZ`T=ow zGIYd9WpvKZ{W)J=f^YlI$RUV%N_s$hZreH-*}V((58hwZ)l=}t^xQg$ncc%5E3}yT zm|Z$_NSA~orHp18y;~2uRH80gV{CqZkzVXb98s;|*hx$QgiSjxm~A)10{Y*S*^iWF$t+dzyb71A#jvQos*GzNFO9E?afb;sbPnw za?k$&g;w1>ZE9h~^zoYGuTIe-Z93xV#oO0!r5QSH`X2cF(H4t~e2wegZTd*w??L;1 z>PZtju43%y3s2}#zcPggZMwE?+{HuN$K&Ji>37AKTk!i%qnZOup^uDt={e>VP#CI2 z&n>>DKcPf8)AeL2yv`PTO<$A_c`T4%#&E3&ms^q>M@4SslwAwzF{E zibyNDdo{yqTzmupkB}@hM65yGuaBrq;kD)6NI)^yq20GUCNh{ZA$aF+vv_FBMDdq( z{e;fW!?f;>Msf5JcX4ep?8UYG>(2PMaGgdTlDCkL$1N^m{;i~BE~4Y>CqG6fX8A?- zKP=nQhnJ+0?RLvhkB{E4yZQ*byL_5i6ZpK|nVNxpFH7I$C;R^Z8A)7gPJrp#c<@MwZ-5ec+r~=rvUD&T)WugA+UOIy)gEG z3`k*GWbuopW^b1Lj>RktT=EXFzkf@w`K_)v>1&&DbA4Ovl;Fa+j>Uyzi=7@Emj`6g zisZtjrOHU55cJY}kay#TFm)s`ny+3aPAu(^#gwjekA(1)XB>nDkDMnTLhX>VX}w!p z2OsDV`A_!Y<6K|EvBrVeT%t|(KL}f2Ba1rhCXM#(=<$+@H{bf^A=+s}U0G*_C#IqL zPU{p-=lslK5t%s`o%migZeHb#EPg2e0F|GUh8bgvw;kfwPxQcfsr7n`BW$dZJoV2dHJ--*_}7~=Q2Y&D=H~DB9dNR zV`1LL8YUc3myAh$b(o!)SG#|8ke{~#sSj!j1NpA4la3v7)f~sSAJf9YkLj^;vGM|m zH>9oYjCN8E+5I${6k){(Gd{%8`#x88W}E@e0S+x2>Gtap35*k6jt2{EFnWvoj5edL z%w*o~E`mL$jgu{Wm+7?d;m`8Emudu(e6b6D$4%)WzQy(_{{Y#a+HM+g@H6lZ=^K4V zi#IoOCjdNkpYK-3W@pS+<20oti~j&y7Gs2LPIAeMsmRCgiH~#jt(NqRN=Z75o8rI6 zz;x_9X#9YqP3sTca34-B>89TnTvN;Z8!T#A3$JYrH5|L99*2IE-bRKkYtKY zLVv4%j)<9+oUk&INhCUWwBZT0pFl0g{*+m3mM^ z=**7oY;;$zShryakrcdfxSpM@&d^>H$^5aX{zCrm^h|a<33iKIJWG6eK;bNXu=UJF z?4X`I5SH0kt=v&ieo@Dzdi(O^TZbWHHmy5N7oj)Lk+EQB#Yo`)0QD_>LKb0q-rUS3 zT+XC-X<=rPrb2dpr7!Vc~&yV`1 z)^iNkBf{o8#hdB5W0Jp8PRKHt2@zeu3s}!W%Eh}gzpZ++&T&`AW0m}+n`Mo{X{4!l zAv7?>6n`kFko<@J-`UGr2_CR^EfBMyeR>cHH{rE6c8PMK43Wd~efsr6UUM0)b_K~7viuIlPxxa zIb=G$J80EBWlH}5(`6eVZk>s%z#?MnS z#z%fq{*bbaQ2zk%msWZ@nMmCuNK`ngFhBH}kO~3)^S6O*H~p~17$ zfBvXn|HJ@M5C8!K0R#mI2L%QM1q1;D1pxp85g`K-F+mU_QDJceAToiGp|QaeLQ-OK z(cvR7GeGcAf|8=L@f1^Ia|JX*V8SGHgVJzhu;N5igp>0B+5iXv0RRR+1OEW_C}gU# zoKPeG0K*J937rfF80SD~BWeU-d6^@y8i$^+;xn7$o~Md{?gXXpA&#zisyVREAaVG@VEZ}vgq=G z`=kE=vZpC%_7k8Xo5G`AHN+F1q#N(py#l9Lt zi(UHKqB_cJvFqBaX_Xq7FJy6cKQ)5@5~K<^(ciUY2Lx`#``PSNeG8^~ z(KnpkVuc#)+PYVb?TECv>q#5B&@d@6HS=3FamW$5ZTzl3cHf7X;j!8e{eeEti>C*3 z-Dzm(YeE1AUA^{pWA%y_mcTySW=;D2(Y3Q5Y{C3Ne};L~dDPtRuioOaMD>+vKG9I) zl5=&9nDN0nV(7v+BJ29Me?>Y21>THsSmPKNsxBlW5H4P6t~6JiD$-&KkmlVw zy_qav36kmXl-r~l8eUDI5;FOyuM_(LzYj9gtIc7~pCoE2kL|e2Ee$)l-j2>qlU)r1 z);m|Ev>$Ha{3B=HUu79X76h7D2nT~w@@N{R^q(6w2ESl}bYifW~Znj0@ z3OLuT1{mmerxzDuVY0Z_6+XQ`K~@7}3U#K%+~L4s)QFr#6G<*7V8IgXcGCqR($o5) zd@yZ+nb0ODk2f_xb&uQdW zNAoLBNWcpS7lsFz_IkrvpAcDs3KkaU?R{5!UtVqr?ihtP-P)$Q91gZC8php<@o}@u zBzO#}sv|-XQ=6;%WR0N_u%_>)G0$;^ zwWOY?d%t`Eig6Gp3!u7y)kq-TkV&Qpz>Al!0Qo-)Fd7;IV0}!sz-2_eV5RFE)dXX2eL}Z_;DQN*@B&;PA*$_y<9v_jfHk{%% z9Sj@v^l1jOuo~14H4b}&^Q!$ z?NhBxgd>5%gO3y%MbZT;1F1UU+-Y9bE%apjUQ1oT<=+bI!IKxOIqgK8mE*kV%?OD7 zuv&9O9F^09ymZ}e2GZkx7UFzLYg!;Rpbo7Kva*uE>$YQQ+OFdFbltz7{vyYeTKXrt zqGUAiC^M7>*}L2Iew@w9-p?TVa5Wk&>>Yq4bv!1{7yTRiW5-C@3QX{#!h|N&&$HB| zOl}J~030NvO=y}*r%A(xYAZO*;G_^WYGeB&vIg%3(%TgPQzebu9n!7du#A9Z)YhjQ zS3q>C??@xEQ-A^|R8l8y)!mA-zlI%iz$a>qpoe0E8uw==Fx!r9zlPeK|7Hz;MJA8iJk8 z`P_lT(OU9?J;wRy77aS~qg&wmukkM$?;4w%_4|i0;#%PZD@!AnMD1=#yqeY2KZbm? z6&cE7y}J?IPL5DL)_JZ`{_OVE1;rX=iUzYAr3%SLUeS2sT&+IV&G(3)e#8L|ZT*=n z8;H)d3kC|(AM{f_2j;p_T0=pip*RX--lmjr*_Ra;ok5mrb37(jMlv@^JM#&k8@jWD zeXo+KipWO2bY7{E(k^H`D234v1|o3^3%XKrpi~o%P=r1vyl_o7r+`^Dl+PpvA~Bk& zFgK#vsTl;(yPP9E+6OwCD2lx&4J4e*s0ubB;zMu}ujD05P9lp9XcdhQpo|I{g_3u8 zaZcBkvJ6JH*iN|8)0OSC$u?RbKiQrbBYDmAc*WS*fnWzBO(=ktUc6#9DD{V}MO;wX z9x4eFT{~;x`!wwzc{w}9W~^+1_s@V<7I}tOiK#`zzyOkqoi{IDKLEgUH>&708fN}Q?x0Kh(K^^Li;Xvh=&B|p+bZI~;JafE8w zlYrca)QGOH3CR#m0H<2U^+ykq$e9=fK_tO6@4^x2J-7Z7y*OXQJ8d|s*L0!4Dq}*Q zF|0#~*4%|gCudaAPomw@-`I(kU2ArPZ(X`DIYJ!}-R2cc7{yGTP*Zh{W{ANe>Zz1b zF(-1XF06EBvO`Yzl~EcBAQ+_;P8h7BIfF#bSR&m*L`W*&7_{(B4vkYMwo!{D%bXZzA!8p(NMr{LJ@BGAT?eSF(Q6Tq^!m*^uNm89*iAp zV;{OPUXYDzYX0tA!_k0OhPHbYfGa{}Q?E}dZ~8^w!(AMoRmbdF5w65G1LT}P%d=yA z{PaE9y4S!Xv9_{*bL*ngF?kH_$GKWsj+5G5JIVkl zmR^t?V?p+#(^ySx>qmknvYU)&f^Av^>_lvo&8hbdFCK^k%?Ne+ zyA9k|;n~pQ+;FE_^~AER=0j3T;4 zT|v}`G6om~2EqFq(pk~LL8H0!q7&Vw-waDfTDP}33xmYyWrJ{O7JhF)3IHH;4FnLj zS7Lw-Asvu2(&4lah~BJNVi?fTt(-(B;sxX4jXTx7r?+b3-=I&aVqe=;%59BYTnCv( ziqHM;{7QzLIW3uwh6=L{=~%teI?3}vu8|4u+H~?SYtpzT<$0G+@UBy1JqED1t)fv8 zByCbEcFLs411wW_;&(#T5IX9Hv8;&gSWRb7S2?piUp1>*P^ZjB9f(xKbt+vN-O9To zc80pNPjijYHQskG{XZlx0~fsbL+4A~JHakNJLE4vmgK zCs7UhBvfhYL`_0)EuqOa0ywxFcW8o4qANRdQ6xzfLbwX#h-j;N=$p`O2{lfrjEE>O z=3R#1r)_rkp$qRC=`kx~Rke9GaY0lQ7XiSSK32>p?Ln5(YoeaOz3tD({{!>L#|GTX|PO0Ygt!zV)`60uZX!}8S&9?7zXF8Zp0$r*I3iQOc7+k8;1L&i# z0ilidoC3N%X93g}_gc95DNh3ttU8yXJtlujHnw8*gZgb=o0FT(JtpSU!t9Z0OLmL``6`2j72Tj- zjrC1naHjgKWy!hIS!S(mZ3+JX3t;$beYa$fDCH#jDWgVvhU6LmV;h58g5``kSer)i zV&&E+{+zkJm%KvcM>c=NZa4R!rt3vjQLNP-2-1{WAxSVzF;}swafcdG5q*~`KmtE~P_uFAb;xBo4Vn_g#81 zyrj9H?S;i}IbHKaxy_gndIoz_f#nU>Cq3K~Dhz;WdZ4F*U62^;>`o9H*YsEg_0q}P zpoy-?I5hpzjJGu1zgMGbWU4L$v(!(ulYdiKLZvz7q=g8>MFdQ9gc>E%| zEbK-$u9LyPRbt52i_YS7W2M;jBg`ChJEDJCskvC`NJg3DX_iPg18HstWpr8lvU`<_ zebReXj`mM(pGe0#$@7a;J6e^Z^!$;;ZD;EgT)-L18a3Isc+l%dbS&F={JP5JfAI@k z??>y66}`K@8Q$uZ%kAS-x(8dQ$xb;!kM6Li6iABU*svG76rCOmtL{S}noaDJtuNqk z;-q$OPwyMb=#aTTCtv_$*7q+)IyQQvfI{&hxvpDjk+L>zov&QFl(YezcU|*VEPFw5 zv@SKkkdI(g#u3MQCb27{ni#6L1!mTLquwcJTvh&4%e@5pjC2%P>D_HOi$~w?D#y{! zp|{17xoy^)lzlS2Dx#%=IHr0_R?PH7&tm*5W35aF{z!|DVZEJbq*}H_UNpfEN9v80 zgau9PNm%0|I~G}jm@FA4I#U;WQ=e^a-uD`*bDsDcVO_GkDXorNQFP5Ja`8sBn$>nJ zCvtY>o`Ehqs;`=RGK7&ZhcGj&=!(QBA9G*W7u$wv4O*lbM@YPH-gI&8r&4YMjw#Krvj5 zA)a(jGC&yr0CkLoVQn6${wAO7n{Qy?ZwimrYW1_5WZkYl12t!3V#Da#bsL#J(Lt4f z+MTC0CiOttu*jld&@ITI4mE`*Aev^B#ec*t4Q(vJxx%C5s;sWe-c16mwZXoUJ9JgmQsNqiqHYrobxn6F zy4SYo>{AE$hs{OjieT@m9*|r!`<;lH+OyDlXBNr=a2@JvTzIL3Yb8iKm6goXp{7E_ z8t8Mjof@Td&r+_kyyIP&4sHs+u%vWKkYQDzqDw(WiW=JOQcJj?+?YGcux@3yj~7*1 zUHnJIn?5Hdx7T%Ecl|V7of)pZ4(DzD$)0%NjO?b`4 zD!kDMO1n#-peB(-*54Q_xiWMibU3s7kGb{Wpt)r~piwnNAN6}tz_N<-yDs6Rk zm%6_-EjOJS&M10Ebgq)u;G1^>5P+}<@lD59IjX5E75*oahh7~f$CB3M*3EWd zq(^u}Sy_LEVd+{p>qi`+^Iv4O!!BN`}dW3g(5TB<=AkZ{o+*E@LUSN0JH0u~x*n>fW|1WeJPS+xHE z)U}ht6WyZC&J*a#E#tLrLJoR1=x|4ZcLko!9hwUCL^;Mah>9!Bz>C6@ii*^ovw|P& zGtWh@#yl7Q0OkJx=BydIdrvu*W2I>9I4(q7CiI*N$oP z(UVn!an+)1^rcAI3Hqn8VqspH8fvjXtTYDQoepzmffo_fo?IZ#354Eo!55!Y;ns{B z`r9x=(pWjn_M3}Vr!D1nV`bly)~UCAV*5t(7XvzhRrMy1Pm7)6HrEB zOD(M|&l4SzzSESwLY%IrN)HcM5#f$9gvyy>!9rj%On|#i0I_;q1LN zgQ4KjiA}R(ZndJE$S99sf`QmnpzA}xW>wM2Z4I2z&K=7rh*iURP!JbPifO0pBc?_OqK5?@)fKNOb^}qqB^-8PMG8jknJjbP&4|$}C798;O>#P$jCR)^kPv8U9Bg=FLY zUxgDG4mNk1dh|f7IT)M1X{{iYi4l^#Eh4pA(8V$fazwQE=xNJF&S|Vl=^SMX*utl@ zs>bUYsmc{-huPVk_d*eoMlA#`m3F7NI;BGmWdoK7p6+;|M9JWT1#ZxBD#@CsP7gMk+4e; zJ3@T46c;IX`lNpiG;)9TuYVO$<`_>Ci-7adcWG-^CFG5xtzIvFzgQ+%@^IF*x}jTG zTLzblGWIxa0#&Fu+1i3XU24efvSIGg70FKh8piIzwLwOpXNo;4ic**^gSzO0aVKII z>UJvV$M!f?AXb{*E7CWNF0@Jn`$gu9b>WC^IMcam?b(NJ^)UdFYqs|UMIt(ucwwUx z)zq@24(ZYsIxx^tZ~2DDya2GzBzUK8vu1~#t$)c{pKuQK9>*paj^*jC?JwGS`L9iBMqtt85wv*Le}ck_aIOjMGg4JOR2!NMEp(hw#0sd} zgeINoz3I(v2!%U&l`5N6QB=zv4U5o);GA!|RBzFCs-;}AXnV#cb$+W*TSvItqqpj{ z=l89r%~J1Gs{a7`j;mS!0Lc$XA5U(}=(X(s0EGPhYFg>sgRX~J;O(I`%qB31@(LU4 z>Z^NFF(IR?6w4tR#Evi*-5)tUt1s~hPR+O~vntrOl`({yzOpG(?y-n8OdjSdv-L~anU zRNAq2JN{?@o4(QKs_~5UOauuz#U%}GR}b%@wU&M6Rk7OUj>XGevCVI1_UBE=;9*tGXx>%g=99khSMRm%%3LYHC=#oJ z7h)5Q*6ce|M#WJ(5v-ikg$^jrSSEslM&)|Z?PnK4EwgLwI8b-3TP6X%O2wbTy+hUY zQE1z{@d!D!lqPXGENE5=M$H&uin=za&=&dFy#<-v?~-k$yF={{s&H@DnNYE!*Rc&g z+ci(frnovpKD#R%SUp zj(c~e$KlzmKwryE$X~Q*&wWCRI}(4s#UM7s9k4uPulb8F;y?XX7FL~X`XD)9B(|wV)tQ&kp1rnbkEdIB(56q$cJBoDnA~ zX*G-$cIf3U+iw2=9Tsf&$8cO;S15klW6alhYP-p~J*A=BlKWm%+b?y3O4sz(r`~_b zf6D&=GyZD#C$=Nqbw_HrOWU~Br7@0+J4xz15D4Q`>}YCL`mQK68p3Frg?iT7<$q8Y z*fQt5dS4}d^3Z*ILT9rT_Ktn2{t?|?^{dIONA3yjUxv@&3tN*}aRTY?PIZmvFnXt? zK5FZ~4EG=`i%BA974~ekaQAG4cqqASI>29uNB;ma={?*nerVZRwnWqx!;o`pJjXjc z2Ndp8X;!h+oZs~42CA!D7hp!I*m6&1)}GL;KXCV^kMk}60GInKM`Xr3J<8V9;$0qR zOm1A7$74&+fb&h<2|#;JSH)Ur_U#MOSiCr9GaXtfu~owK8VqqlXa)f_qY_gZFak7k z%R6gfWPLs0PH}mEhUAhgzv^0M@1hOXjf--Vnz>r3PSaWTi>{+?p zgGG?{!m@9~dtq7pB&pkIbY6Ra2(yye7|s6xss(?PS{r9vM^Z6D>adOk^F z>v!#g9hj-*Jh0fe*t7b5P;g;;$E@>s>FPq!q8n*H#H^X^S~PZ))-+uLixb+Y=L7?~ ziuABOC5df!6=`R(p>^qPlPj$Q;wsL`zN>rl=VL1*`%Hrz?!c_h((dq6t)~kcjp9|M zu2yXCchPc#?vD2bVhr?0eN{9HX05g|8Q4B*(cA(J_D7D3%zK!2gA4v)-HrJzYimQ- zru({a*s@M68o)0|=UjGmsy>aE8#LN?=!SN$OUeyBiI3trD~({Y3^W4;_O{J$U3)Q6 zV_@fRagOEoe4YmDDt5U^vSYU&MdU)cZ^-Q|o$X@Jrkf5~XR7_PfT-UUI>X-Vsb`aAO!0> z6AaDUQ*C)fw$CPJSE93PT<|Ey;5eac%B>w|W0QVCU9z(c--Y|4PHGlCYDmrLS!Qc!)P;;#K+iu8Pyt{0TwP zgD*X6?Ce+$(^qztky{jls~lHWSGE&)C0+2g_V?>LrNiSZw|G_ zGH=xzK2HyRZ}mqFs~5j(oM;u5o$~V5be3ncYQzPK$MrfkVV=Yc5DD%TPTtU;WOEmr z=9=g|EEJkAM`ieVpKIuazbJ0DEn&-fU*Y*2l1yJ1{^}OIq91FG+(7xAIF8khjmo83 zZ*vFp1lTuS9FpR#B$DeAZd)=}uy ze|@VAzgaJ$ZBBYQBQ`Pa?LSQb^{d+@%Huk2UYgoHF(1SAM#8|KM}Z?3eGs(eI*s-- zJa!<~HLPgJF7!WNMW6OvyH{3>N-=k$C^)ANWvv~{le_&uJ7~BkSXr8S=gBveTQ<1a zwD^_&7n4b8Fi7=|&I;W+j^%yxa`roTA$62#5Ik1?ZJBHCfOUjovR*X` z({qo8ixZ*7j7R zO#c8`tf%Rt9UKRe2XF`vV#3UKPnrX1R{@GbhSlYNinkiZtOqUpSNLlT#<|$vs=pVl zJ+tJhqM>ilB0DrzR!WCART6M-2%>woxT^vFt9(;KPuki88-~^Ctq0jO)7~rmC5K4S zU%}g7<_G+vy-leB)4plk^2n5`yf%nUh!_``2^|Ajie^L`j~Oa zT5^YQZye5xfo;)E4i<4es|#yh*!czawzgJX=jGm|?|rf31H0zF%abv^L27`iXPvNU z7_L|Qzt$HhwDwpV+J1mMV@4Wn!`X#YC-3 zN3*gjxxW${0Fte(J*z_;GVasKhqZm(u2yz(CDx$z0Ia|*yL1NjBadSJMvb-7 z&MTE4{{T^G{Y6?osW!>I0g2t2O|Y{N){PRYqNq_|A8th(vx@YV&o^eL$Sqn@0LdOJ z9`BNMt)&@eCoaV2yAz_|^_(fUVlT9d(JtCulT*2GC=%P+t=fJ;6V#}uW{baxYwV1; zsSdLP*|;O-nQC=Gu@5`7WeR>bDW2C#ApryX6=TVEYua%*4$Tg>ICNX)qekU|Yd^}e zXzMjYbyIBFU1;l8c4G#O6@)kGaXf!rXnJ0Nmpgvs8DzlG!3}wG3wE42@U4CKwY~G? zpJ;t+S011guDv$9Z3|o9^3gu&?vzu|AqMV}|L8{Jciy!RI!4?fWIO*xEtxP|KWXv7@=%!&N55=9l!tGwo; z3S%K^zFhIECa97JyySUBsQV^#LZiCEgzPZ~Bsij;{ghU0-#v=VXLe6tFa#U2iLlXZW4B zN#!=33qFkP+tj^b$m~u#Q&=e0VG9*^wL&&F25o(3dp}f3B$BM`n~U8EoSB^`vGI27CsX(byj*Z;SXEbpu@nrj=R9RVdyW|wh$53cifBJ}q2^mh> zBYxe_*fLv}q8%GE{L0G9FvhnmaVTjElUZ?hkn_=I&C2($$_)PQS~Fir(Te#kjZ>yfw&N%V>uM%(lmLX$N}0zb-Rcu|oKSD79UV=@ zQaO%xz?|*QE0gkho2|a?Ck+JcdSidgw*$4v@l6rfQO|OA7;ISnrD4^~w8Ns073rQO zmN$EH>`>eRLW(aU_!@qh!K8J6>MlxAYbqLcgn5ZBW=Q zo+$Er7fk*m$AHqyHuRq00Yd)mLd}3RjRF??(3@dqe$LAhGk$%TX!njNt=bJ}xmB)i9*w`f zk9L3tB&INA6$-A72SG=2vuCo=+ObvBxqY3lqdRWO*5%fRsQ&==TGqCQurI?d;!4%C zYj_Pf(N*`p8m7~wY+oPDtnBhXq0Hc(Kg(lT=jNHkGS4g3_(mu+P&7u2`*U3sYTc5u z*xm@f(2OL>@kY;+m=)K7+z~EuB<4>uuRw;M)fMYZvOoj?z(CQQEDq(-LWi@NkLFJD zwME-oLj%mONa*y|z#rXB0kKN&(Vt=s(B3k5Cp&d3nsu()4>g}NEpIeWycNBsPI-~)nI=*Ft;m5qOhr#{{8mtfr=Xz&Mmku}Lvm|Rb*;GAz7ow{vb?6NxD{g4thK--ch zNhTG&r?+b3-ih~2aa^O6yWt)s6;(wP+t#{0=-OIVJ0V9#%pQ-=nbBI$jsaB95~=9> zmaXGe0kGcW0IT2Irjfy6Em+;+s6o+AX79{0$n+TIx2OxwO|A~|(&rtByzS8UpM-g) zSvMT`rZiyD3p_OL#W9^~)%my(IJ%k`Hn=By#0AP7xvlN5l5biTr`58!1ZGrj>cv3E zsShq1IIg|AIZLA!MDc*EeZzeI?N;oNq~i)a*5kCQVxMnmJBDPZT0GS0vwH@qYiEpT zxb9JE=IkyyNx_ZjIR>;<&Va1!Tha{g%}K{TDjl6w$`E%aT07Mg8&1UgN11bufX3nL zJ77(-V1UqzT5B3TJ+2L)XSC$|N1C|kV9q4*IwLJ3inrLqaDMOA05K&ogAg&^tD=aP zUBLY06X?(tS9{KA8BP~PSVh|TGsFoq3)BgRIjrF%zrm(^w!lrtoZ5Q zrsuWc%yY=;+8p*#T08ZMg+((}ZvB=HBaCUVvd#qY#P_Kj%9vLH)oQ~=u~Y(80`-S- z*0u9hbIn#3bUv|HEE;VOa=!C=(b(weEJiA-nx#^_6~{I4!2VvLW6TO)gRKpIHqlZ} zwu4v*GR?F=G|koAfc9Ho6#I8(X`mVVJ~Y!NfvujjPSUwIC)h8$zxV_QnBzs8d8zPMAcb0+qE8LTM-|F72Ze5U~yGgH5?Ihj4^^q zQYmE0FnQ>&Kw_bu&3Lau_?U|36xr(ynW!L+DuA8}Z8b*B*P*hDgBZ;lQ_-;#`^N<$ zkZ@Q?LMU-ph#La*Z9ivYPu|Z()($6Py5HV*(xIe)pB3j>?t{av-*K8CWT+1fxum(4pry23m4OD-a>o)%Y<)Xx7(|rE#)km_o za~yLt3$IPqskC=cTA&lV=B2u!R^R!Gt-HTnYPX%&{ggGJa2hdPN+1=C9sdBE!BDNb zF<60W)2iSy-mW^xTQmwBd%=`{^w%eG9wrs;QEb+X#QuO@hm$v@Lho6~-suk%3Bk1~ zwr$1a1TMX^fb3m*TuxXZ4gp?wMYUG8nHOsC7-)O8nCws8PQ_!qPifJ&LE*6*hG71& zS*orDR|;ZRBD42Pk6;Sb**VeJKD@vJ{{RVOXg?I~J2VD_8s3y@{M6`&YmW6$;ncNS z%=$Qn6MC_f15sYLHpRMN&y0#MTyRy}T_`&(|N zsy4gy9V3pKtydM&X;9@uMbgu;WBHJIJFdO1?d?}>ELnRwX$Qq!ZIzesljgPWM%U0G zfpqkUD(?AGX?njT_nn|;wQiGy{FDAO;P!R9H^srQUR@K z804m#GE+$atdJfG=)%s$qs=ttXUCZU{6GW0ex91rjQOHYCqZ-iS^SZ6x%O6h7fZMd zQ5gya$3qVF$*dbv=a)d;K!dHine$W{$lf*4yECzR3j_8*>pR;&Ef#&fiH-J;g0s7g z;i5D&V65A{GS4e3KKFeg4UMVtTeMMDiMB)5tGHyWhR084oE8d8dNVcA?@?M>pIz4m zI1E$1I>KoE4rCz8)!fFMm>mBA*IK*t&42NDifL>d_P1hS_H0Eu&W=jV+|c9KRZe6T zYIZt1D2tWR`X~fwH+{^;XyUp{q!vG#5H*~q(!Z*Tq&RO?)I*A<)Nc+dHmEbXIpjcP zdl$s+<=}vhlQNmla(lIPM8$E-xlZ0@I$OG`?r%NGrzQ*EEdrn~#%J*lCH8i9?%=~6 zq(ZAhYnc<=s_rVcPBC5^ksZBj0249kE>wTjBlu{n#d-rtE-=Q4a&!GbMh|yKr+q0; zn)e0+?k%}N^|c$oVuuA8g&Qhrne@sY64Y66&rL;;)&W<0G#8OiRRNsS}oJmqa~48EEm;h+oY_2DF%dKRRDKi z&3+$vLGOcH0vA*#YZNwZCj`;ny&tUiYjq=Owt)%4R<0EA?pFabO!{;*X!tdrhwXVzE8YvNX0v|yXb+I8)9tv(%^Bh?)x=$X-OD)~N+%i1Fz z3-S3x{_n|smA#vXy)F5zYij}gN6Bk)qIfbq*W=rEHGP%4U$~2^?WLQVcdI)di|oPv z>IwOvRH^1oqqq#p_F0oc46|W#kaeUw)3|7;gS0E8%CvUZM`nr9n&nor7i^q+1g5uo z!+g?O1yUXqgdv3srH@o zPd@R}#H%_%HaDl^{RL?31YJxMFgR!w?pU9T=($P%09pPkl8^O4{u--JDYV9_qpe;q zI+l@LIcWw}NPHLYg{G{w)!ppa3|~CR*}_ms(JUN+s zr(&zmGc}T6Ad=@mZ)bwTzN?i!Dr}txjTMi@J%UymA8h`M1jf^lPqcZ~d6fuRkHvl} z58<;}=XcdyXu8J0h4^Z=G5g;|MzvL|7*t-4*?@!`(tQ~^u1$V;74=YyQ43ztoF=`9 z`XL_iQb{L8lS4p#z+JX;QKRauH$d)IW8I$JAsJkw-yjaM0(GX^1w`F1epztQX5VFi zD;?v>3@1iX>G4*8VAuo4#TRiZ+R}O~iQeTHR~-|i3S_4U4)u3!(K~clS$l5-w5S{~ z*o7+TGN~~GLE*L&q*>FxyS6J|_Z{Ma_H3SfkvmFm=A$PD%5(Oe7Q5T#o7do(ysI(p z`12~(u7`P9Cbm>XHm1qN5DafoIR%SWAdWoB=)#|sim2EZtYn-**>p_hn#Fs!e_PSI z=7&=AW|E-H%EYW{>Tbb0(`5%89TA>qzKHQWz{b?L{(`+}_|eud=&qH~yNwm>X|(NB zbf=eX`Z)gGOsV;y)pw{Gt68VZF->&wHp4u@yMl z9j^Ll>eIyusf8^x*r4K{X7Md>PqKHncdbI1-NvOzE=7&QlfRAT0gr@JNjsr!XxC!q0rVZ2j2naOq-ktFs8T6J}<}jwkY4N+o za;I$Mq;`>@#P(^GZSbab_$w`v4-+; zm^fgg8@i!1425{+iMt`bDDc85 zhuzwS;7>FSq$@3!b~NJS^w2Qaoa~z5I@Q_?7<)727otHLkI!#L9MwWR~FtzFIvJ(m%uq|l+DyN(N4*GKCl9QW%3`k-2t zZg(0eVY@!aRkP&|_{@J&)_sdQ=fEv)Q`u+#0Pi2^6;^3_vz;kTy#1(6}$7X=m;#~n)SdVPDou)DGRL@1L_dr(0F)a#o{^7|xIu5DO z#`{hKwHiQ)Q?_yD?46LgGkwRN*C!pyh|WuuyKC8>75kxQ)n5>g9T+!$X}CJ1u2KH| zr}Y)ezuvRaXR_sLf^gXLrQ01)y&3(~Ohm0$*mf0LQT$QhuUcC-sC?G0v%7oM+cvtn zG)Y6#5oITfzg=h&$J!r!`30+H#(XWirwp)I<}@3>hiEUi%qu4zkkvd!n(h3cp;$`w zwy76ttAm|Lo}}olMK)lt6~}siO264u7!g@j42h<<(OexHDq}j{vH-;5de9S|C3^HR z7zAR0&e_|b=)4X!kc5D@AZE2fU5?)+SX*-3Q?9VVh$f5eU4F3*n3UGEGHNb26zeNJ zdrJHu%Dnfw;Kj!+!8ME!-V@qWxbq3x`dGOyo&}nj-?)n^T7w(3VS~_O%Zrb zh!C%0;^=Q5qHA&5cIa-t#Y4M8RBUqxbgr~?>qy=eZCrYl%Q19#qD3}|Mi#=qcB!0K z7Zc&lyk>ym!4h*PL#=5_H_y2`FtY)H9Sv^vZ0yG<{{Y3SU{r8AAMp93Qz2S6W86E} zB_Ha8*;LW(ZrGxfVdjiz0$>;pPTvw&7ihKk3b&v0#(RRwkeh}{+)5}{Gy`s~Q~vXh zZC5QD>`!^o8k(Tg))Dt)h$qQ9ohtUMbVd#sC~zRIobg_#V*EfjHL4wG_ip+i`+2gn z+3O#Yi#s;4yMCz1m~hL2#|;!&EIZbCs_k5un7!#<2g3`M*&H={!3p+upNnE{yMF%w z%kkcz;CIR~fJM#LrU|sBYo>Tk*-kmZ{XzyqTLZOPJYEmGb-Je$@=|bZPm({WPJL@c zMd3*ALAy6?(h#bp3c*osoWh2*O=<$Z_p#OL#a?rvy~Q|L>M&ySNFGVnT$qqOYhPIK z*btc(b5g9>8y7GN8|wv9Cz<~M$KsrQr<2-H#3s`&^+Qx4yJ^5JXI;TN8Vq4NB2@mR zd&?9porOi1@hj+tfuk9rR@R>L&uQoF+@v9n^j=9ntP@-tc5;dypbI+Ns(h;-rGyeaii`VSJV0KGHhFq$t!9$d>3M_zrHEU!AHc_z>p zi@YeEux%%9$WE>tGUjj5#cR6Yp0y2RxwwbV_D*d$Hix-In+_3~?p~Lb+gxuNuSUlD zI{K_+K1Pe+=9^>; zhGX$78f#}<rOj=?R0}Z-#;X;P5Ki zv9IJ;S^!LApz&0y6^UG)(9XS)9f#_p+OxDD%PSNYN!;wQKnG$~BXstmT9K6{QPqvx zJ>@PNaRoI_sb`!E)d+LJc8aacBVSR~s#}p0me8EgkBy?*3y5 z&pBDR_K~7?epF*Zs&_~Tz~6$4f(Tf}*s7OB?b8T!n|iU1#b|MH=uC9JinR^aavwBY z0HFFSw~rVs;&%n>^=DqeFG`m4O1q0bXO z&soi1wRv&w3NT}OZcVbYZPwi|jNnBAyyy*;*0yQ0_=3AVJ8|JUacU*fU{Nq#IL^s2 zup=8b=f4%7ZiBU5*qRUGKCby_+N}11duoY~Rdt~VfPWUzgU`uXH{G7p)H%}>l|nB* zZjUwTU4S&+<$drP)=4Eg(*c7<!jt?1Wr%PA56;3-ypzzUjN!k9y@F`+xj`d8A%{1OO3Ty9S@Cv?j0s??P_M z#XJg2X|lW%g(->ZOp{BXUae!jU2l4T%phVVUAQ+Z z_WdJPuymdB3SHFEfY8e}2`(znl3ATwAluzSfjZEN+Pa(ul0PKcjcha+F+q|#*keC5 z*?~SO_00h0Oy1cGRm^Z8#xq4A$T-W42sOzTwk}!HnY%KC$aA%ilFx+`rs=%%aF9T2Fn!2^mH@HlZ(5YYhYh|OGPXCbv0KiN0Qh)!z@nPuMYIvHlsE_0wE zWY1TmcDfYyDJTyO2OKnYE7a7guw>zR-WoAMYcRVSufhutTTG*9;ViNjj~tZ_nsz9s zeumD~$!vr~7gJ>bR(}BQqHhJ)&c5?Of-iiAPjO6#MFb?gfJF+0li zmXmkIAG3pYpR5#;R82GoZvA(r>CQO)QRqIE#8!S=Q5z176-QO-&Q(BvD2-NoJKUW6M;AEfp{!#| zoZ~=^n=ZeWS~pqV$_=ee=eu@mk#b80FqamCxtM96zdU)7T1G0S8`eAJ5H{9YQ=<2I zLilD8KSd(+2XtBoVr|kutw&AD4J*^4{vg6n}m=mg1l7A)x5Vs^hh4c}z& ztv9{lHn}^;m^NNMOH?NxZq0|fJe866d=%bRtoKZIBE##poI;p2QVD4%C0TbBwwO^z zq=}S3Grvbtdpi2FLq=V?BpfOb!kvqRCdJCe@~~+V*slClVwa90lv=w8*-+#~(+)qb z^b3LEPCq3%k5?|F-OA`!Y~j}XeV?i%l1ViuK(n)L=M{3w>-k-yb)W2ob+Y?MpV2A_ zy=v<3arr0m`*Bx(82xVipfNNnB5T7P5iaQ*QJU8vjR=7lt!s|Wyb+pg$zpf5g)+bs zb-Lz}h@k3LmYLu$Phc??7KP)y`^;-A`9#Hp0kt?8;MV81ED?j9tAXVfx^R2Y$$mR2YdJNOuscjxw%U zQ-A9{HyAjaf~9R;+T-$2!7e6A$S*@<7QCt5Bl_@P;(2Vj=Annr<@YuFtmsx4sh%i; zDG9Lzaonm~Tmk{NVF7qyoqN;omcSyLHYjXf*j1&Wm<%p+sg?mf?#0d}F}m8V@u^?D zx8}GglNt%ph+dGyS;wliq@0e<#9n$W=<6#^QE5h5%a2mDwRfz023ju&j}>8O?OL=R z6I~2!;3r00)``X2cc(adj6MXb7TWY4TtAe@dW=|lEx2_HFFXcujWM z9fdX9E}t%A1$|t$1uz9?FEsf70H>^m!$Pn##Tn=m+*hO?uY#poacb6M+GAv|v$1h8 z8pa1=*L6LdyEN`aqeHnprXU|h*N8!;kr=eC$}tOCQ)e<1nmZHK^i!NSxi?!UeAMgo zyCtDZj72ip#uPRU*L0SyKF`T)TC~#*qen^G7oxHO)|))sQG1TAZ#WIXe}n%3hqm*{ zhgu4fcOh$UuWowo{eLPeo`cq#oFlD>r9NrKdvHX^ympie93u5fWZH_1f@ddXq_x`T z3_Vb+o9~4)PC2TpD)b<%Jl1OwqY5nXpiLCKMAvCooCoMDtru+CthqIr=?QR+0BtD8 zs>lh?{{Sw?_L_XxSWe^5ZtAOYBMZ1~F{99O*4}Ox@$LDm{Fc>^ZyE1e)>lup38fI$ z5^{xql-jbvn-56v3(;~bKStkd^pP$klZh(N-?e*itH6$IEIHPR+|6 zDmzRo4onY3Uw;#ZjbLTMdsH5y_b?SYMH^3fTUh@9n`KTdO+L%P>?yDIUE|CnX35Q4 z*yigeM`GYrfyz~$tcWUIO-Q1kLTC!UA`dgoU25tGIt@c#jx^Y<8SbB-FvM?Dn4FWS z2r?ky5T49|q1p}#9Cg|jtzO&?-N@L#5GgwmZdq{V-gqIqGgla$wO;K&g9I8XwU>lQ zD^zEP*9Fl(*-^d=>(saLI}y9L$$9?(bVEQSh*c|GQPD+8j6qNal5n$cN#7)SKP4gu zuln&`mz6r}V7}=vNZNNH$vF!m&k9mUkW)umkyrTzw5-1;hMaU~io0+Y!jjEk-sw%% z1e$>ooP8r3a~fg#3f9p2&+f@uzB(3N?x%#Ixg7eoDfXJuterV1sw)KtHD)PS396R| z2-s1)X}K4jRnY@9KI3o-?9|%{-~lS4Le*Nf zk7Ks9kiQr^;%inGAHnre>B~pB1AHo^l1|g7l7I4c`a*-6B!Pl}|W_jZqkWq0z+EVZ0#cd0E*h(y!m#cd)3Q0 zDo<+N9TasPClh}pMv>g4Zr(=^qyOg20 zA<0;F8&4sk0nHk1 z+((gJYX+Vxp=bO7Z2ftxBu#f7DbBTcv$7eH9hs|)1-3xW_Z_E2{FtnnvPrJhWcE_f zF{akF&dz%ZaTpt8{L7)OC}FHq0KIl8 zxnnA}RLIJunCmMu;IBB>xo$wB3H&QV*lXUWT4JHK>Q5W=zR2fLfHWmW?g-L_wc*(c z^FImZn~ueICwXYWv!bdQ4l47^4X4N=PR^0Vdln%6y49VNDHt8-wcv`>DIG-?xIr2q z)I#mYdxXj)WwNUyy>vpLZ&Ij`aYwi+?9+PC-LvsR%FJqEOwfI$Z6oyy*X}UV+P~Ja&~)Gt)3HI3><#q&b=u^ zXt7|>(51~7;-!x(raKlaSg}?8h_@5F6w799>N`RX^n%9MFzS5}i&nTHFSClyx6OU0 zE3yM+;XTzy{5_d_y|>}i73*6^IO#XImA%eUK%le|HWYmov=Ox!edzbTYZKbVSDv^0 zmbIwr61AOp@t);&$&jzwljfjMBh-s&xo;SSd6>moaUU_G9XFa_u1f6x0K?rqPARS0 z$9&VS;pr^=8lU!N6&g3DxEDdF2$wWVhH4!4a3m@F4&|sXcLlq-b%h*4HfIY_clU-0 zA}fq=jCUaZ-7R>;A2bE%md+>vQQh9Ea-s3TT8wpXj50hnD=&?{Ix|@iw?d;@I+QE+ zh0lj!km^Dj0EJMtS_~cYUW(Woq4OIzp!Sh5M`Z}Lz=Nia^3+a5|AX2IT8 zJkLpQL9tz6H+C;-*oA%O8~VWpfpiSM?*)(KCTO9wkwoZ;%81qkH^nlKn zul_5NS`1z31HX*IeUU$kDaEphtP{0jr~4tn1bCpgt#7kue_{>JHEhNx+FBZ(z&2>$Y4Xf%GL7%R*(6jw@ zs=RisXG(Ab)u-GGM|FJF*7QNgYQE}Z6&wmC@BkwZd;%a?7XIP$TE)P8 zP&)$FwCqsO3%2Qq%M6vn7*MOg3&SJ`FhYw_`@`g=j%&i-qDq{yO*2Y!wy!BWoZ<}NovhhA)p6XL23>KrisgPD2eA_LP@6G*@T$L{3=#f_K~jKBgMDr=71pIv8B; zlO=pkO#ljv*GKtR{{Zr_zMp%xvcBu*TezZ7p8He^?^c%UR-q zJs%V>i0nkh3M+yOS=!qZpd&$58x>3`-m%fttJTNhf;3P;OJsk9rjQB^x_K_Ex>eYCCJ1KV2B1qw1~qhG*~2fP&5w znPAUJwbKn%N76>+_7;`_+y4N%bDd{pXvwK>>&ZFIF?SKMH=<==0*3%va#!q0E${2v zq58fbMIeUn7%D@CW=BHZOvHp_IYE0e(tw2%;_7&U1+A710QS3}pzwilL12?`>Q~Q5y;zn%-{ht{sCk&JiTlX$&^REh z+h;RqVNKz6t(PA)XzS+3lUd{X%&lLr%#*|9uD;I>AftN8+3YLuyI84UKmPz&QDtP-gfCBD z$zOC5GdNZ*r$9kKStk0Gns>{{Z$t{{V{zXqKl-uNbB!MU{h{ zx*#Fx8D}$s8oJ9l3U@;3PUH-RsLJXv={YOcw;3yL^l~~NqMF;_3`o&a)QD8+1qNDF zfp~3gRtk+JOZx&8%b4A~@)2&-9ylEyj@`bR%lU%6$*o%N^xa257-f2%^M}%=(y(`R9Vd%6D1JphfK;3WZjw{BAe~j`!;XhiIHMYM(*9= z8-~u%1Hkv8_Be?U=KR*Rg`ny~>|a&*XSrZIRN7kg3U{IyL*22zH60f03IHUjw8vt3 z+Q1c_%Q<=K!@Xm%4b2qGnU;>dENut&(J%}&t1tvhiS7xfWtl!{=Ypp@S%GRj;BQCm zzmw{}6#oDZ)m88ARb~DqPzHsnh2p8TZ95kQwp0izpol2YkfVMmP|hd<+MM%E>#Dy7 zHmaPV5fcK69TK2QjMl@oYCFkbPf#oH`Nxo19aMaBwEg-7%Qny)P%UWuSH%AL(&d)SMrb>WuS8so1kP4w5C2LsO_D6y`uWtu@);7PyK1=YY zi6ua5K-dQ}FV}(*hwL0h=%o|A8%8Gx#!-`bM`U7!{LW4BD(l3wx;iGcG&EkDlln`7 zzVm*F3r1Pm$5H)tA{}FG#`8~*Ux#fG?6>~_vOi;QKfCixix=H!!te+dSg>(2wM!ZB zuq}H_NAV=8Sii2GEA1Wz=BTp+dHU#J+W!Cr$}M)hGqS#D)f3Fg8tDG%qL}T3(YT-2 zW{XK4%4qi!_gR7DkH^m&f^Iv|8)~(icxV;YoHSyF_11>5LJH|2ceO)`b=){9BX&p~ zi>VM>!Cv)lqDyhuwgVZ}7Xy39CkyQu5y3dYyExC}h%5C~`l7>EZ`?nCSZTc7SLZkt zOCRQM&0n{84fa@M_NzMHP_?!SJ5z3!mbLzk5 zAN(Oz_NT0Tk=103WXd77mQ6e%NFa^L)<#(H=&ovj4Gd`YS>miVzVo~ONa@Xe7g|4E zA4DlZ@=oC0*({UYPM?G*+WR*6E;fN#?~~v6hBFb&!39!@28jKj#4J%a)Dk0cRfyV! zW+{Y{J z!B7>fWl%0bV>jB=ZxcO-0Z#^MsTh#~T zxjf?UMg1zre4f%#cEKvhA70tB+f;PnGQOzj&p`cnqsQ7GB=fcIJ^C7OEwb7)x049IH%JCRZ)^Bf~ql>Hy&wpP%pz_AnXe8ZmeM#Ci~f=O{8xJru(KctLny8BCo3usP28n^Y1?ewKj$4pzFKh|M_O7deR%Aq(RRkg+ zUNjEtL(&jTZ17HSk*YjXWw9cAR$El&fZB*y#@W#XQxqthLq_AEjevL~!8apB{7I8K z2C;2%Ltga}5ICsq`;!-Bm4M$0AmKZcn<65uC^WcTIBDqJJ6lDmXxDL~)oaJX@2ahn z-NwxMD0e2cX816$&zn__XakJOv?DiQu-BB@b}rAlpT8fN>gFH0FS9;`oq|VV*X0E8 zZ`FDmA4g+j>pDquls6NJ%;>UbwP`(r>a8EO(b>-VD3#cP7-FB7*_^ihbXojExgUAJ zb}M&mx#pgB7yPtInc1Yw$~b7v8e*=S(JA_&v4kf@Z5`}`D(GXV>5@>mA1nYA3$D}6 zH(E)>G_j^Y)|?ay2O7~`y{ggM3iAtb=-!ev2MmfN;!(z$8U)5=OGK1e5FjBUcP@a{ z+MO(!C|+nGT3jL|{qtag+o%Cc+09kc(#Wk`WqqT4Y9kpGN{P#xhcV~*`NWLJ^CSvGJv%FwOYIr#s7|A#|YF>m6 z#PHjVmY7g_ldE=XT>8-(qWH-%xYZjty5C4~$z?;nsBF7JPAd+6ADxXOo0gr4{{H|dfx=_MpPrWq zFap5CK_yuU8t#6!606T)?)-)Ao@ZJPU5{Bw9A{Ug_~Q% z#a0+*jw&~zHX)KCunOooG*TLyvqPr8K4WilGs(xrBMqqQ9|mSm_+;(QRox8#hNBkUqmpyt&7i6#J&OLBEv^edw@=o_!0{;Nu{;%$wcG{l-&395AdM27K-2q$^TuO9jwKPjN ztRYa0ZuO$qrVm6PBd&-=<1KNGitSySr3&LzTYB@T>@wn--&D0)igZC);kQieO>wQO z@b^>i7Z)4~!8N3S6S`ATUMe>a4GwgQ5lq(Mifj#H;U~KVa6HaHxmlPOjSMFXmBBC= z)*Q`NlC|#(Mw#gZ>P;|G*eyFnLXmWJARVi{G*?tbcPPOc%=2xS&XHpO01qLSt+jD2 zG`yW_Zs5QhKyf?*Yns>s*U}xrWnzv<)@q?vIk^4iKYNaW`P_6FR60(O&+{z@V5+r# z*9P_~Dv%aOns@1F&mPoAv1GyL=c3E_r->@t{l^Z(8~)pSKeDmkc>e$~=8?1`wBydg zD63rn#YP$iJ$fx4c7_m+AvDrr7evG<7)+fGl4vQRt;V4?Jyi<|3`!pDP&jJsPz`cc zS6)nkc{1$QR~D6d#-MjENY0y_F<4Q;rd3g9tDmr;6d9mK363H_D4Cn)dbHZz$@LqJ zRE+@To{8p*Rx{G_ay6SB60tT`$9>m)imxfOkAy3>ZKiuwD2l`G@K}CO{(71)=Tk+M zpRs2>ZdM~}Z+6ueb!oKtv=y2^HLCfI4cx|##mbNRvHUdAW;R*3`cntDY&*)aZreh8 z2h~^)^qb-N33X92aE;3h`LJV(bYUujVyW2za7;N~3AFV}I+YNG)`3J7Z%`q+vbL+a zgy$TjXd0r2MdIMSD_$b}#%Stl?NCCP^{2m>TntNm(ITVP8Y_?7O~y|Fq^hhG^C4H5 zA#c)lenWPR>Qw&5wU1krT^s?81Z;MjUyDXCvc+B6=;~H{QwG-!7OwWK9D7Q$Z?yJ~ z(yd+W*}V5F4~lyPu1?Q)#QstocB(y5NlZ5kUl5&0)+&_Mu8oPV+XZE(sTQ`pKvsVyG0dM5S51>b|~{F_IVlTnOA?!wF9VCTR&@qdo)^b3j|z! zQ7U)n>dj)FcdJKrD=&;LRDaWs(;7Klr?biKjxR8|DB4@*t=+k!#abU_)}7kFl#xQE z{hA0UwYst+MlBjT;ad&uQgP<*(03Jn=)Jd23WE-01$Dtl=-o4?5nMklhwZJEG~L>X zbhK}~2*gfX`;d!3W2H@~3yr-F&jrcs{fjHdi@&n68MqgAmA+HH4Gpp!PL0bou)0Qu zH+5B?#EACoSUmi+N4IVL1M0a0KhvJzoa39^dVpM_(|7e5{EW_uXU=hM)cf<%rxK~H zNv2#@Y3B>rD2Z~VIfFya*hlVt;n7!fV~(3AnbbV#{{XUZnxj@cme#u~w*=7_0XvM( zdU6a$BWN^^U-F_q&KvyHhVTh#eeX3zx%7++sW*w-5HRB zs6p4JMllJyTSaL;(s|&jRU8jKGW&+R)V87Hr2hcf^GYi~0U`;dI+Om*&{z!L6gw8B z$2#PLAv##t=$;*tm~}xg;jKL%-V(V$KjxF$R3C{grZA2i%#>Nw?a4_bl{SrmdIMQ3E(Z7o3TOklyS1MZLC;51IuT15&rX9G`? zlF)QUKq&}tL!BA(-LzD7COd0;{{ZbShf0py6;FW_)qt9Ebq)c4w$mEUk|~r`TG+g_ z>IZ)5ZDWB}cGn06p{EPGpoL?BKZa?u4(?z8ONdo2cIB<8JJkhtoj2_(YT>D8pV1pj zM@jAjc7OnqO1u96QU3tcaqLFZD>2?vtZt1cz?WV;@^q_0AJ|mk!O}Tceztg|jXGg8yB?N}qUHUr_D*0**Ca+&}&2hAbs0^C`N5^Yqo_tV=Rt=SgLK)Nax3-WbxAW z?P?*y2u`v*TmJxS2QyaQ&!X=o=s7^S%B<;J(YNH2jFvYM@TF56N-$*6p?X_(m=z3)^`LD5 zv9N9p&#?xvum|1_ugYsM6ze}#!t;5MKp}KbX-zh4q(lX+nVxWFQ71tM)jDd{o*_|; z90&cc=`8g*LpmaIZmQIgoRlU5>*0i|n3VBVff68TD z)~;AESTlA#t5k7u!B0v4(enHD{#MG<*nM~!edu#>0|gfy*sF=h{@lDFmcUWlc&|ln z!uDhxv)yuwJ4Opgqb(?iwEqByaz=apiudy@yA>4MztQ`czq2m2a>c%dyShh%wL9J*2W%&kvRn0ktb=@W#r&i_Gt$ z*Z%;A@-y&9!B?Vxg^bj_RqjBFuJ`sLgL^aZs2mt{A0Y5VT0R96SDBD^tei$K-{>ah0 zAW$d&0MCxCzC{2ep)riVsRpCe+!Rr7h)|d-)C)M&?G4V*2H_lmEpP|$G?BNp!&{pGPTql-aio8;*=e4o`T`4rIR2y5fK=Z{Lj#qt z1cpG@GPVH7Gwh+lpwdU(LI4EWK}RY4f8KNs2qFIfiDFFGKA?gD1%v+phQIz1+xNoZ zsyFnq0D$1p=Q`i4p}+|3?*P5vL7M;(SmyXyFp4HD@lFwCU5g+9`EUhhi^(7S5WxyT zSwp$~xPa*Sc=P}uf(W8LKmdQ>G5-MIj#0J69{~A>sv zwE+p$si6ZbznB^iFyhu&^bmjnnQDC?hH_Zx4wZq>_@6vVY z@;7_OW|h&QT8vYc31kH_dv}JZH1OJuvDRf`pa>uqgD@b-Mg(Y}rd7?6?g>u8tl$`# zkQoEH^dt>`;vjZ5a-ji003Z0(?e{;yn;`iffJiR5KDrl;ql|wGl6hV~`sPO@`)lZC z7kEF+avl@(IWrFRW4YclEQ2nd{J-+Zm6S2*)M+_}hr#;K{&Z5v*U*xdplXzKFCmy% z6;L)DLZN96gA$g3C3!kV_<Nr2hbo&gefxd4dYQu;kNe=ei=k^p9u2Ji_QbEFLb`38=6{{Ya5 znk(%5*n#jQ(f$z)h8k(+5(kf4g;`IuWL98nm|zw_01$Bfpuo2dh-Qjm{X>JYgu;Of zi`p3i&QY5ZO}qsIZNv?l(Mxz!OJbr%2T1`I0L9<5130-c?135RwHj}#Vlf3U3WYri z<>@m)uvb7uPMJL za+dF~Of-$8vY|(p+Gz@bXQ23E8Z0eq)fnA@srZ^wmzVbf0SYTZ4}%)O*!O^#A{!x} z;Kb}9xnf}h{{RC4pfm)Z0t;3E(#P?B^&Us{{5qRIP#K~MD9gq)fEBm-7zik)7!~3$ zOpGWO=(ylI0cNz78^B>c*?xt3I<#l$$It%&XOt7|ucu599sdA|rEwpo$o1_LUtX`^ zBBAn5z-nfj7$9$_gER(q9~>J#FRmQH8WG?GO#w|UdT2+W0E7ZZ5pNlf2b@p9F$6$@ zKm>nj{Xak!0kQ4tLdxzn)D*`lz|kRg2^Rr9OIgwuGoYhJ_>2-nh60HjW*d|(dN@8} z0EI#_(;>iw5qD9!sEFi~u>(-=9KpPM1D5%V3g~NU1EVkk@C}*YL=cYL5!~-PA!a5fdDeTW@F@NO=GuSo}f76ObToEqnTeLV+*{3c4^!xrWB2U=7ol?Rp?6 zVPE7pSSVRg8#TXp0tgT}0O)Q{5kM2%>Wzu^jhI8Eqw$*b`=zS#f`m-{tDockM8rW2X=aptU*hF5=xWI z#H=I@d)!n)AZn3=EhtYv>;?#USZ=s1SQ)GSp#bCq4$J^aj($>o@$A3*B}ND#my!v@ zEbsmQ00$@~z%vs<=r;b601MMmavy*-FaiW>NwR5D9Kyu&MVIm&Oa-OW_a9%ue+}wk z^Lj(?p6~#IK?Q;#(E9WH2-W}~Rgt4YY6!KT;6Mmqh&WsclBSp+1~8Z}Wu~x800Y4T z)WL*I5i$m8g|@KE`Vhue@$P30P(>X`Iz~)Xp)wDS(1nwL4v!p6YO>Cp#n?9o{^^4A zEuR9B)l6;i7yvzl)$ZWxc5NmFwmZXW2K+&^=)+9G!5q21W#wP>2})wh(A49&geH=l zfHeKVATa_Jzw%|9bSZumLKGU-4xnvDC!7P(nh?NISYdDV2uuKGHzA*B2a?dT=1pn< zf*d4&g`W^$K8Uwldf4C4!0~2L2ar`np`a(wkOWrN2Y^5fde|>O1QEPG;*TDO0k_)Y zBTZaJ%;OapO-_zZPp`J~ScL%74pqM3;{LGkM zb6|d)U3&iOjU__xw!v-)>#~^zoKh83Y(a^b3xTl#542sTZa2X9MA*Z&3akMJ)UXY* z%j&Tei~s|IvReJ{dLuw?(2H*uMoCQw1>omMq!K1+cz>}6i>s}MXn@>Hx>J$pfQcvp zrKXU;tjH|ZXkSR;U;@UJ*_Nj6z2!FA95x@oFR>+mAplsfO>eX*Rw1NP5HKnkvlK2= zy#xdwp#Xvo47>;?Mw+FZN&`NC^lgAd6rG1Z)Q=y>KR2AS&)%FZ#Mzs3_9$dzJA2Ef zgd4_LIU_rrP0319DSH%^6_V^EWmH1K_viN?d>)U_>)U^?cD-0GbC9A$B*j zMl&j^e=DV*6qmVj)eRz>Zx=>C$e=MD@Yp`{w7G<1=8EUBF0Mimh3psPmBEb3bZnyE zLC{_WmyDHnt`@V8iiGHpGeZb9-vFi>G!>wzNbMK$wdnyGV(xxEe20W+s(p6C_NJ8)M>C58$Y++?drM>!7UM|lO2Fxx_GgOE9hj$>+bGQ5sD zpiP`{hdQ1OGu6(YFNCgi=W=!FQoW2CrANDdqCQwJSKP>2k@}{D>Mq^=OA>uR4I^?k zT^fM#e;I(i82(OePHajbl=Z9pHeCMvXjRL$^{NttL5Sw<(Vi1oM zC4rt9GegIb-o75~jQ!EDlzM4)>_Cio9^B7~QiYR>OI>tu49;v58c28p8)2?WtAsx9 zYSkU&^6P--V7_h(skEj;O?3)+(1BA9n1j!n@N8c|t-!#>Yc_x+`3Gke;U+)`^SDC_ z(;q#O=PtCnB_BxAbx%wwrn0)Hu*y7xpPIvv zG66hx=C0|tVj_|?Ul{fZUH-CeitbOo(<;>~gug@WA0+B;|5*t9*fm+dUsUYq@fZ*)n;WX<(djz^k#vJ?$Lext(2&MpmpA zcn9WGp6oE_S1mMEf{!D#wd?;?LsoA^wsi}>xwgIhxasCoFr&Str-`!xKn5N9(m=fv zxEjDz?4B3>P?)m^P%-(yOa z{D9$p-R8Z<@LrwCSLg81hZ>7vW6a9;iNa@b^T@FSk%TH+Gk_57v0DI^| z09M(Un6&RvcHw7b<8Ji2Ku@#Z#BuE&`fA||Wxp&F4{_PQ!MWh1@O&!Cu6babx3DW{ z*9r#!0G!DcX?STM@J80*91CTX!S^v(FYQX0`q!DH2zCLcaU}ylZ^JzAc$N*%(4&Vc zy2I~SnZ3qAsYs9ze8R2vNU*q+k<13bB6f~*eo zXF2{5C>_91D@1^B2kzec^pjD!SBCEAC7Ekr_6;>BeQeVa!T%OkWWG`c_k?eY*{5^7 zo{d*;k(v(oGMj9AG2BJ>5r4{?O6#j-fzd3mNfP}*F)-WqsG&7JkV>){H7cC@cC`;P z{LS1^!c9!-3b0AxU)gIhVJ(1WqFBIek0R+u@7Z?ZLh2uZqNz=c#8NzZ3|St#vPrp& zrPzjsim|$6eyu-}d3=}7^UHQE>1518JuW|G5A;|DM&~?ml+I8|m_Dzz`}ToDWVbN~ z6666&JlRazB zH1d-c+Lb~4qQRR+^u-a;WCh99>g1tA->)+U=c-R_(zr_;zQI{U!qh%)znE!Ps%{xD zL|iG#huaafT$Dief2@*e-*V=2DHvu&pHsj0c$Pyy`fvS0vdW04o)1xZcsgEb9n9q< z|2L528csc^l*J^khuhq2$0RI=X`@8Gyl>c3Haza}>)H3BbKss{z-s#|IbL31#@6B_ z1*paOTsXd~jWizu8q+_wRHkZP2~2u0whZ;x2^e#*ygg;AZHRad+3B-B?n+?8`UUtZ zn1~$AW1U|@d^6LTH(U>87X6%PUASvO9WIoH-sel_xn#Y^pm(WZlWhocovP#-En0Sj z%B#j-Mwqv{0S$*Td%|J(>W`a($jwMNO2j;3IqvKHYkQUK4(5iB%@a5+y8d{ES1kp?s{V7NsvBrV}cyJtlLli|t&U7)pKDF>PwBxwaou^zV491`YC$qSO-(hEE zc(+rL=8H@c6NEr++xPpGt#6YcOwd2-L}nb5;A!Y>0|x9OW7)yEnT^Qgak3SUy2!3b zL}M#={2&E#A`3N|515Wt6)E6Z^HxNaptX3c!`=eAXF((ZO3^aE=xMw%4FG}g~K%Ss&wj51O zHP+l?py%nuJWhsx<(i8o$L* zTfEeX>XD|5y;U$6gnuDcVSob7;21U>cr8lCRZ1hZGjJ+JQ z{$yfj22<`2Ox1%BweTN`HJ-J-{wIt?)~WsWd+ zd+UN!@^av+aYV|Ix*nvuZ2@Zt-eo#OuJIGlVy<)mh-G$rMU{Rh_H3+ixlN~zIZofC^ zhWC0NbFjy#e@$svfz7&H`BZ!ecIgHK)yK*W3IcJR-~sKYS+`H&3_h z*NX8}Y#~d=D$I?0J<7=`{uETdAH+m6LofSMgCvw0argO2)^)hFNh$x;X6hynbU7WJ z>2qU;F$TVli%drT_A-Y?T-lw&47G5tiN44$Z*YvWM>@%z>c`io*b6OSA=s}cYO~&S z5xNe^&2hZCo2kL&If}>7Pi%+c_i0A^mZ=vFRIGkTVMpOkkUV>#Zz&-3l4_|_++rw} z6-wuc!A#gTp(%s-3Ly=~O1twtdbWSh91*M2nw3tIBT4dF{2uW8gZ48GbRcg@BI==%1kk8m{H1-M*L1>cG{oKFm{6 z*!1{@te6&m1Y2RgF8zd2&T_?)DmDA<>f_FZIA09g0Gj_ zG&BiMLKpgJgq8MPh@E~+J0&Jh>c4^#@88?L^2n6ag0A5_N-QyrrSN*yWmYN=oo@nt zx0KwUKCdVJ#2h{QNis6m?C;OyuNs?1^1O3Q6O-^tfy<#lTy+lu1d}I?QG|nzI>9%L zdJdp!gA9o{uwXv?$HW1nfJ`zCR|r3KwL)Edq7A;gRnY2F80U+<8T%cp`zF`+dwX*N z(A0|jO5uWHP9j@AcO#qPz?WGtXE!W?>>emw^A%_hPDR?{(kA#Dw~cqb)3HK`OY$WC zGv-3GFO^28R<`Dym^(>=$`7ntjvSyiT=N%;t_f&6>G_q&vK{3>l+cq~Z08klJV`K$fuw*uA-06UE@cdkO^}NedZ}5TQ zDx>2zvQX%mog6Kl4MwjAQ77CqwhHnEH#~-)n$1W*V)T+RjvY%qH0wM>#oVR%D)at? zp{QMM_bz(OKn@1Asj2})NE9~Rk%sjef=Ob~w}uL5p`iV;@&NG7d+70FU22u&G5N7q zOO@P$7aJ}Rw|EJ)c07V;+CMU>k0Um@0gvZYWSj)r ziI%QgR4x?1ud}Mbs>gRXnu`E8ZJPhCTnzp6Cgk2GRS(@y$O^=7(8Of36Npk&gJ0Hu z3~;gi0nEt`EYg(Xi}dkwO_PYiskyc9(ozlh?OmdPO2rjzITF1If_W=RMq3;D=;40= zK2D1_QgL(Xvv34lL?Vnpo2r(~5rRB#E%a&0EjD9;YVK|ANoUEK%71&#a{b+{TkKrI z=ro6*>yGabf{tuU6X{&`*ryEkIrkFi8mKao2?M$TTPudxDIFo(ltw9ZrwV}YiofR` zCh#6D!2I>6Ij`#bg(Onz7!H}UY9~zOY`M)PM!wW3GXI{q>$NG_D3XEnEICqmO^3OV zMk9<~bsrB>tIOR=4TZ%U4^LdS<%klo>$sjlE6p40Vj|#D~@Ns6#gSv2H zVFbiNJ)zU*GesTks&{|3c4M~K_ZD*`R7DW32e7C_bxn!gcqN{;$bPATb?`RMngcCT zwhhHM@{WucJ#2;FHp#n^Pc{GO=BYjya?slHx!TSm^@jP~*Ya134vJ%0p9aNkdscoC z?6sWjeht~=!3x><8*9$UY6aB>61%9BcTD!}X&JCxQd51&qdz1>r?(dgG1W z%2eyI6PP=7o%FP!DTP!Ak(VX&j9r&+~ZrpVDu`F6B?^1TT0E&m>>M+|p;DGrPK7jI1g|5In^coWAXx)6T&)+s^<#$XK zAN8OEg;lB@e6hJFd!fz}(8An4A4Zrz6x3~ktc+jKf>MPTHtzT4^hW#V>VDK=3!?fL zPHAw8AS(nkqkUzYdP7d4`t6$k$WziqwW`U1Pmr>8V>HhdHJVQjDU1u_ zR0uycFKMI&he@BLviAClOY#wWa}kxZqq%Fw!C_YCpS8XKGC+TbD*}sUUEJRQU;Tq^ z`4h$rUDQWMZOQmrixaNO0V40Z$2j{Zmpe=G96NTmNkKF)mE7 zs8}02U)nv89MJ#Mh^&8QMfk1Yv+MFAC1J>1hW@Jt#vMwSC0QAau`tI?{ODz05Hn@H z=sErk7g4(Cq|&)_Vz@vM?V60%;}vvH#j0N8+8SgX6s7f>XqKK;K{kUaUmV9PsoNz9 zva1qmgH==yBi)-O{XO|;mrymYG0N$z9@%~TK8?7xS#gedp;3SIvqf{8Oeo|w)armF z;jzTR=luMM)+xGx)w$}|iKpQD6u0*a0D$BmMEpG#_2y#{@N4L6sAZZjN%tY;TI$#OF&PFh83V6b-!TsHf!> zZ9{^#oCSNO)p~V{!LGt{P6kVgp;?0DRNc(~fRqq~Z$M8o?DO%pk6cadh*ojaEhuZw z=P)c>FNgU9Jr|TSBJ=Ar?j};mnv3#x?)%b(Yvr3P+rpV*63}Q{_`(u!6Uz5j+=+JO zu6`z|5ZN$K9nFh2Qb#_WFK(sj$fAtLxL>)^)omP{P`#h=`Mmcwy1^3=4!*@#r;j{L z^3m~%e!Tm2dC*D_UV~u!3cl}PQgruQjIblc#_H65=t<;kEb3uUs=!0U({U?Nf7I(4 z#PIA$cl!v|$eaH55LBh%nq!Phucz{JoF+U94aA>-^|(bW&3_6dXqd}roQTmIydMa- zHkgV_PJDtRnSb2C42`eyWYc>X)~CxcJfz3|)(}ZPK_V>fx2w{?o-+{p@rX+k%{^B6 z;{HyJR6HZ*W}o8peXl^qW1}01zy4^U51>NXGs^+!F$5nJ?qW9*ddgo_CJu;;Er?!S zX*oCfkbZP?Nnqb=Zwevx_RgzP&Tv)MliSFaxE<{fEA%qiohTxDJj?U<8?a3e`wQf-stf-{ z21-j0x7UJ3;@9Z2xCv0+)F^EiK-NHV|Dk*_(}|0UaNk|8aV18vTquiR3d098R0{jW z8Y~NKbSks@pi`BH1W~shNNyC(EFGkdI_|#uvy~>f;&DKgm2~3>9*U*b!}vAC!HEYR zZ`B3%YCNuG1YpR^Q^SW9rrGEPO_zh z)r?(vN!N9iO!mnZ(OC%yBZDMNQsRW8bV=3;k+zk;`hFxoSWxnhN|}c1N!%pKKl@j6 zh5BNpS!w0IVVYtEntD>t@h+pOFxSq zAg_O*IDG|+&$lg1{{yQ@?xGj)gZlLeU~i9Ui4UjoU16Felsd?d`8i$k_yKR=F>d@C z_4dF?W_ZZHiRfWQo;u?3%UM6RNmi}3+bdGWU+8_@qE$+av-Iu~CVXlCu=T%>Q&go) zty)ms<+;5774J9`cX#BE{7+79FahbXwIm67^j8?bS)rOrCv;KDQWLa&h`M2q##uQ0 zVdO=MnB!rJ9?_e(e_?PxYyP^Sobc{I-oJN{Ra$xzn5AXIVPWgAw6l$*F`O3P;H4!@ z2c}#W91Rm5gcopMQfO91uyOHhMZ+ms@3@qAz^UfYZ|!g4R$4^ss{5aZ3VY37Fc3|q zOfp*Yrm*eJivH$Js&^Zk*E}9hP%e7v*)}}*R}56xyq&VaVra+DI~; zPQr%3RV}T`JuGS-WxN_R(A<1!zw!=h^4>clpfu(de-Uaz$EXM6`yxB!?8^#?V7Q!~ z;4pIC@j({vFwG2T+txs3JlUPke5Kx7$QKa~H*wSnS-i#myRpzV{Ilw)Om1WfprrW58j}#zXvpW=|^|f z`oZR+kGIxoNVA^&d$m`551Bpv;R(6?PO@!mF$Bi1Cj@!i`>44v)sK1_-{g31F)DSk zR+;V)-a%6nWuA{p-P9X=J)YkB4m`u5 zzqkAEFp^>0p#4A#SqtgAB7At&Jt{*p9x+o=oLQYXGridJVbIn^pAGcx-4Uo_1ydAyDl5ATLQ6)roYt{cF}wUeqcM?q?AKC>>VXKcW<9EB5|Pvw-6D z2QvC7V!3PALszJ>ofyiw-Z3NQ)YYDI_icR?)ajW0lrl0;k=}x_V|dZ>y0`RB=uR7q ztdI3{!=L>XLbPwC#t(|a5`e7Nim}u=gNSSF#^WKk%Pjjm!z^zh>+I=`JisR9@;mI# zWPVSz3(sJ=8I+zu5!RIZU=YQTYSul%MjHW#gWtUu*@2-WOk6D<5Lss>E4#R_Vu1L< z!-DRTV~<<>_robiIa@-2=|wVMkI@&8DCiYzZR$0K<@i|zwwPeq0=RLYLiAjm1C}b2 zoA+k&XU)TuwO3x#+$jOoV$GA4F(9Ca{|`YHjnkQJMMv2Z{(NTmlRHh{%}JYi=%9_gs*x3R(~>%jkmd zIxpgkjI`b-1S?P?=fnGw(mJYOi+w36LEJG?p)O>(ljJ(7f#xzy);x-`<63j$p1{iA zYrowFX{0E6`8>&e`Lw%%2~in7A6}co!vPf%`T>y&<(RVqsyh|873?E+@sYHi7PvQJI&f?Adv1MIy;d`z3ESS zdp%JEbYW>5eCioAhku~i0MCPX-Wh!&hf?5Z*HVFHnw5D0kO)0}g~jdR_%Q>+RGEl@ z8^3}g#BcOn^4NC#zRBoNKnd0zjY2+M*C>oFML+K@Mtd+R{j!jku9Rp-CbyeP4Y*hT zRH6?<(9w2Rw4rrCba#>)=zGmd!QZH6SM_Ca_Rr_mC+!wT9rTV;q&d)Kj#&&Pie6Xv z`Qy=|>G!k?9IQkI+dgf>^v~``I@IN+6sBpX`blgdqR&T($v4kGx{EtkG?5dSx`#Fb z%XPvi^?$%4-L>_1!s|&>g}loTN?bub4p{Fn~Z9G#-onty2QWTmfr}lp$TH&0YpXCX; zx*xp7y33A_aZdY!SJ16)ONRGVYiDeZRnFnG*WZ9(96FZrX%-guGSd?)zdc0--!9Od zO(I{gDmXa;<+Q5X(l$wV+z&ajElJC*$z!-U-ot^*3J%t+)kVc5*k=cvMgs@0w#s(_ zJSRvY@#)?5UzUA>oi(pE&(eC&5VxU86W#&bZGHJ(RY*OkEr0&lVdcC!zi)OR7Gl|Z z+B@722GPWPy*{hUlHbV&*F}{KAl<9S^`=W57fb2@Ez(QOpDx;5^(~7ny5dm9TpBw)?p=i=@5+3yOB#|( zEHbNVV;`vf2Rx~3{W30tH9K1N2iOK1r}Y3w2dg1xMjU7}ckPQ@sx&2AOJ8b1HKW^0 z915##st|6fe>(9Je~+Vl{SG&d?{nkXA{wpp1>N`HHc4~bM0@gqX4zUQ?>ydCSU(Uv z%1;%Y)xV%Ewg_bgebCu|;#Pd*WW@AqP&CitObF=uHzUJi%~bd_{$I-0!x^-8ua(R zCEx)|x|aogM5&+KRMvCdHbqbJ^pqf8kn#xi;^7y8mz6(+ZUlI!GCT7y#i_xuhc}`$ znXFBh1RGnqc)BlCL({FaEKh(!6)=bfPrp%=k-A1)NK+q#NJ1mH!&4JE9)ITSo;Bbi zEHB3`WE=d#%R5xXj=s3RVuCP*{c%hNB0@#dkP1T4hT7bS@LqX0_2Iy>AM3pyIh+ep zf0*!KajMjJH`eW7v(CMv-C2lCQHqEjZO&ICU_-I z00)3gCE*dZ7fvE9d_T-eSe~!iYcR?5(WU-ZlLu3ZpvXW#YZR4QY|?R^NXs&ix)LU% z=Vgp;J809dr^NQ%PrtQCy&;NeNO~|+E1?&ggjwy*mR97fZYYbU=dK*R#qPE3uGoOcR9pb0eEFC4|hnu&k5GQ7W276vq5-R(qpGtO_g33tH(4h5DIF=ExDXVFOgro5OuZz259q<_2iC_M>d?3YlSdh2eLB z24f`DzAf)c5V1*RhRToov_Jm6uIaK^Y0h$oINR?SH~5%|z;Hq78ef%(=x=6phB6U( z^=1kbn)b{)f{x$Q+ZEG){B)v9ta$Xs?0*1`vH9Ztjf%-j9{KCuFoJ#gqw)Y&eoy0F za83ij6t{HUWFyaqgSYGOaB3ArXPRQehcu>IHQ#|wo~r)l^kCrR?3YR z2ctc46Pwi#JpBMY_B(TblJ&p@c0M-i+LE zpg>_XLE2f8{%jRK5IIa@npsBY!OP`&3 zmoF+QoF#1~^(Zlw{XP%;cKEqipaSJtcXlixi=$n>;yqjnJirxOUWvBzGJNONSQV=n z!5Yrm-PtlK7&H;j9fI@ap3~(cIR&?1q+qb2T<8>EAEgM>^BQJXVE&KE|JSFE-z!mw z63e{TE^0q3h;(Vh2f{2>4=C1hN&eycJ77p+9QW0kcAp|@6E2u;c+pyPo35Z0Ps8^N z#`QH3BtLobYiMiJ5G~9MB2_B!dELYmtD5`iH>re8T5F&})1Y4;i=*sr#^?&m=l@NP z`A9_zNqf~HGk;bETUtExd8kNI#51uP{l!fyLEnE+-5UOx`nFu^?a>~8AM+*EKVFux zkz5C6{;AsTAp!ye`M{gTt3S#53#`>78aGVkz#Bp@aJ#SdEe5qxm$>0c zjc5$h#yuxKGFq36wGqi1SqyG?T&bjMyY3$mQkq;c!x|-|H^9H1g|g$>;yA?`S3*M- z;8~+0Xz=p@lBcIFoWn>#lv#80XYpm_$G=(ZGuKdmlS5UJFZHCUmyZ!lwTSe?^rUeE zNp-=J-KzE{`0c?!nqtp6tBtR8CPA7zr;y0RU_gkb&VdlUwyH}|u}Qrs z-v-cNmW=m`gQB3R@&4*X3$!1WPK_nJW^TlVXQ*0H#L2Y0%OzRj^n?owGyO)wFYTG} z|A6rHtr<7~o{PH$#ociIw;606nWt{o1fGPd1aETXwl6NxeO>^=m=Yv& zU%hPAh9K>9G)^%(mv-xXe&Own#)@&QoHgg=i0XI+-K(w(_PTAeG?yk2DHH}PM#k_X zm?7bb%cH4X^G-*ZXd&7=v-BP~yOE}wY!eCZFxDlgw$x;k{;rEZ!q$=6&XyGttx9I6`E4?=n!9x4^|+C&-*(o6 zTO|(AOLlmTUlxO+a&p*$kSC-gx-e|&WyUS9P9%Pf4G*hjo)tWCL1nFJ*+#LCpJ~0j zb4QBF1y8rVOOm?-idq?dM6y;K;=q2y$TL@|z*^#9pMO$PO^Pc=kzizY!2=ufDHfQa zUG>?!r;!&e$kx67#C7H3?LGC!R|eHBtvfmityg$m=pQpRjx-R4k+)8u5iwc8=l2gv z8I!M`k@0YiGIu+WeURupn(GKdBxAB-El9RMSBH5kJb1a0Q5Sy5wWZ%R#Eu4@W~n#Ns;8nATKyAZ}_{` z)t=?glri4teB}L`lfIE5%Yrki(fJg){-O?ZY}3ZeI);a8FgMx&%!-Ta>eC)Ba6u@D&=3|0zE z#a+Z^0E4Dm_t&uWGBd#Rq&y-aOnZXvAyi;?j!Q15mzu0aQm%dWSI5BC{ARlG& zssEKn7mtd>p*W-GHs`WiCW-P}H|*RDiV!F`N;9VR+jyVy@VDA{!wq1ZZM3BKY=!!a z{+5FoqXUBGaefHnV_tcS-e1U-s*4PfK22H`K<(8$aS5jHz^CIG;QQ=f#t#eH&n09? zIcM{}cc0t&_u@Art!;n6wtAG`_`g#g??h5;>ZD~+*_?^=r9IbHm~?t3Z0FUT(w=LV zgYbSj4r%>fK;u2rb>J(roJw@gR#)&Iwc$?eIhq0QtW-}5KSS|$tULdq3XMZQk{2e`T^^It{G^r}s0FyYx| zd8UoezVmdYiBh|ZGt<1jhm_qg_n3S$P<6Q?Xo6~6*C(ypBVRK$^>g)+3=2C!YuiQb z8TUhB^9O07rlRdP35ap@HnEbfmuq@=OvJC;4E&)6VzWQ`R{|jymm*_wRMOIn)Fd7cMAqTw#HLFQkKin!ySS9HiFib zvCeC7&pFkgSDtf>vl3U^x~z_!$zFrQJyWw#Hl)Y50jGN_6aXluZ2bg-2f9zMVOJw( z{sZ1w;Wi9DX6N+rcUuTb_ESx?y-$ov*@85HV()gdV>K*KLW&WDbm7ql?|db8{BeoN z`u7)8V-OPen%_q+RF+^D1b3~eO)$9*EfU*Mm9Cr{acdl@@1yyZlgGJoJAP~5C(b36 z?8^Crt$ns%mJs#r%pL@JULUrLzPE^}Zskx%D#H7{w)(q><`zw|AFPDk|De#iQ6SXyw09y#pvYytT`#AgYl4vhZx}$*cjc1- z2{keO8>CE~?g#)?bCV4oZ+E}ROndCo9bKLJl2U=Je|#IJ1=n;AYy(5z-U(waLr_fO zmOHcoW5}Tng&Jw0SN<0A{23t-Dl9>L`+hE6zhKQ2mw-iMYN4P;#U?W)m1KO2@Nhx= z+DAB5bKczs5daq!%%9e->@fGZYXGT60jF8$l{)1dR`nXlygT-_5-6r$Zh?F8wnrm@#hPOaG^LZ4Ei42tIZD+zI@V%*8Z}N7R-lH&1B9Cr5i4~AxwDH*691bWQoRW-ti3*v~33ge#?6V&y*VdWokBV;x9FbF2e^CqvoK;9R&(x68@3VWh)6G4MQ?$Vpg$wuUhG)udPv~0+|vp>%qhVBp{mSDDE+Fz+mYSc2I?% zOce0t=89H3;~nMOgAhiWte4dOcSuH zz(9(3f8wg3!irp__WV)l>Y45okkWHN^%gPIn}%YPGiqeqT;Hkvd^@`Lc#vm8=8Jpq zC#|<&@ccT;R1kR+#~7`)g=Ed@JEWCHChN`x?MX|v>-h9_xzpr3x4t@ z73dOK$SjgidW$wEw9}iEhHK3&8h;MZE;9Z)O>O~b&ZJo47b(x(eQspEDVC;z-Cz80 zpHU#xC&2ezKR^kXzs;pjzs#?U&{Ad6H2$&8#w9Xc6S0^@;~^pZvP|BhANE?rIczg% z#I)LuS5H=yaj$Xzb&EoBV9@x4fbxc})tZZ*cRnD_s$@!ruQRs)#XlxqA_s^PqpOPR z%LR*9uo~vCUm85zWxK4OPYKgXl_fiC9;N7@gM?XjOd#?1ZgPL8?FiO2V=?uc8Yoas zc&24^^LR!6BQDGzhJZ9}q~9}j{0<=(1(2R&lL1g(pu@rIvzY8eDOQ!GiK|rhKGg!( zew}J>!8QSY3suZh$BWMr%7G*l_y}B=q-70&`NO{u(HI1rhQrMV%ix$TszU zq+9*u1x`$-y2vWusi%pqg%tY|=6*E;&*C4wzqFq_c>D~zXv~}VtBVAbwvOUS4#ALK zcmNs<4KvguZ!wEaHM^ZrJKCt?F`&B82tZgR?16Jx%B69#>24BkXHnBRCmR_OChWj% z-uqj59>S~KtxMXQ1wH326xW%Ea>I`vR>M+{JcSM5Gw^eB{ z-r!fN|AQe>2%@H4HGaX9$;HrHweK)>NT5+?mAMr{$TBYBhvPjxf8fv6dweI#CZ0Z4 z*h$E2@tTC4tq>A@#|3{>FA7t04TrVPdpKI~3z6GCi|>$x*B?X)v<&S&(NwnOLCh1giKffMlQcLvN z{6lm`TFie6o>6RIJ<|h>Md5RCtpfj+8xo-`rYfcf(*sBPzq4rKS{E@tr|ew~kQy{- zYwf$An(X_|&i{>6g8vB)f{Fo_%25lBOtAl&uB5v17SuiW913kEZ88gzaUt}V@!i(e zl|5|J5Y2vX_Q@fa%K5(1iO;5`N^{JPgnaH;n*Elk-a7wdEE%PtMbaKt62 zI!p;IVurdMXvG2O)$h;QJ4wp$D|wccfzq7MjHte4uH#sDk&kX;BnVjQnhoMoZ6k5Z zG#;ZXvVbH!)rIU>r3IRzgxY2JQk#9r6F$yYJa9Dh9mHfcTIlqGdo88^Xd~hO5;uu4 z5WdC#@wY(wTM<5^)H{{$H^InD4)B}0=~me@HjyoQGKb-MtvAu`)%A2%&$#sSpWb9L zR*wF(N0RGDV2wO33hyW!b#{GVDXQPsbT^!sL^sNdnw%9lw-u?OQ^x(=7DUsV!uW?0 zPXo&f(kuNmF4;6{KHpx^KjP%*?)@Vf$J}}#`@QLleP8&t+EH1s7?>u&?&U8<$0Zn-CP70 zmyMoh*e~@}(%8rk7%ogZu-ILshq7WT)qIq27R9BF|C@$DQ;Sy8Zc*ga1!BVhb~41+ zz}Yk2Ixj!eS9$Ux13boBast6`?WCGK`n#dkU5vZz%k`O_H%U|fl`Eu`Dk-<5e1!p6 zxn-wvMop3(=R~0OJp5IhqT?)Shb!2%>kEEShFTh6VCNN7MCc-WwUhN1hji}W7C{a@J^7OYU%Xg^sRR7m@$EyyK{}i&y$l$ugb1pZ<4r0)|4ah6J*zUA_k62^L7nntuB3_&I}D@eNWI$ z&w;aD7HYbAfvZu`E8S&2g{t`WAkrV&x>PUPGGZKKQcDP=44IDmPN^0K1;Bf8N=C2u zLii|0BLksq%H{^RQFNe3Vq53y!O+tyl1-Nv(L6&q`rJF+dReW;qO$Bahkhcy{;WtJ zv#j}7aem75?EMk`ESLFEyApoH=Jbu4WlHvE@DPI@-n$AudWxpI6Wt1K|H9E(JQ}kE z0iw7xgcFm+uRv&HP`$nnPi>dU*9E_#SZ4yOWqAr-*D|L(c#4SN=KIdtXVPFL^1~m* zR6N2ID>2c;+Pt{KtZaCJ;$qpr>;Gw^dnIr>BJl%iDDna%Z~ShV`DVUZuqMBI3)($14HYe?QBD>|wyI@Us@MJM#_;zZT+sh_ zfKjO2g7^1t9R`AWexD|L`%Flg-BMs5*4ql4zK#N>zW$!g-EpOq;eDtpEiR${$2IgW zcJ|ds+8~9isb7@`82JYp6oP^3J!zof3w(*)jy?X}^reIGUnhFT6*@cX1M0ZI9hgFL z<#=b2N^4U5`1?N<=h=D&1Y{0(7z>bzUYQDW4Jou!~K2DQJj8hI-?k*C(0Z=V% zzF>Lze#vWjISrx0t!^$M=uvGstK`@J0a=U+ zq(jP6&`~)^oQb7Y{!^EFMHW!HrBxNjf4@XXX>ukvZR1WHeUi@(R5S2R>*-;|Z$%dk zfT1jl3F6)iK1?QEFCuAW5xAz7=!p@@01AB_P zUH=1I5+&dvHR>In_7Hzag$1^9lvHy~h!~%a;D4 zI`IRG4(B2mW&V~ccFO6~t$}nOgS(2(1i_gn2eUmA9*ybzWc8WKk1VD##WXM~5Z{L{ znvtaY&(@)!e+zJB-N?p+7S8J}Q+l;rz^DAL-HVlP}gQzGGbP=SN( zN7RA-X8IP*pztw&ve`KtO?W3Xru%zXn5I`%y|KM4Q=r=C@%X<2q;rMIW9#thR=|Y6 ztm`&M_!g*A#VUD#hvz?_HP5o@mQ{xPvx~S=Z4o{L)Nf1mrd_c~TNeDf@T9jlv{Jm^ zCye^_0o_gQwj&w=p-YI@T=Z^Mm^Iv{b6++@^xrp0lTtSkMyh+hGmv>prB)cY;o5;rD9TEFYXPVHYmR@e~sB1!}KKN zH`K%&7+Z-jsf1`T>S8y-m9T)` zZlNAKPNP-Mlje`D5~=!Zp8Un2YfI|rt5-zl19lZ@M|$Q?^sNH23*WG18+jF|3{KN| zUs6w%3IQ{rtyWl9#MxvUwRLAACNp36m_vJ7QEZ^DVQUYrZ)XO7XKrT6&0l~i9I(9d zj@TfbHYc3vjed_!etr6bZX>UpJ3_Wk68cM57K(p>1H}?tUS|(RMoQmxWeHm(i%4S; zGiXLW_R7pF2efP!vd)bC^33n8DAxIVn8DWJoWnBuH2vz| z0p53sZWA0pZKI_AB0Y|)Guyry5h>HV#q8Idz3K#&aawj@5^TJAQTx4h)xDL6SJz-V z^IuZfbsfUEzYnKNe09?pvYcFZrT-V-s!=<&(6OWhnA^WhcU+%6g<`FJVuWs2yX;Bh zL4(ty*K%ur&hVS)v@Mi63W~0);(z#l?LNun)h~Oidru0F@eS`Z8GZKn;atD(>lfgJ zPZ&HKMovar&S|S;+*bb{<4g$yiNnH?E2$PY`@Iz;$DZBwURi;ODZz`k6$k9mS0-SMi3kA)I4U%)D;|3zpn&`$G4Tv$*Fl zzK>pw-e^bB1CFjp9nf1tfpCKNYs9zpf2!oFgw4fKRM;+hpjU8Bduk%k3Jl?w>A)*IK4XK)Gnv~HBYEQY>&*k*hFMJ+g$hv_zm z;da>})#XJsv_`I^EoV$|4L>=VMu1 zJ-(WuI>||;-tF0JV|7ugK$yM#{?<2YIQg?6=^_5YCqWXh<-N{&W9(F;tzUqd#1tso zIQqKxk2MHTQAr@HNkB$5R71*`jwM8-K#!IqSKs>CrW}vPQ-rj-gbT|sEI;lqx@iv; zlI7yB{>87ILLd7T`Rs$XIn@3Q^9g$t+exAHoywN8rGOxqbZ*d5fN~?V?_AYnz&eLe zJ-_kZDlJ7*{F;}13{O$;bK~dr?36k{+vkU>90$AT4B7Op+tnG+^INld5Ak|;>AMDV zLa#%fZPr~Ix*Z2sHE%z_vI&Uy()!QT$D3XId+nBitVQ)FV~W_Vz0-|n0UtTyBs&z- z#+x`R7x!M0QeD9gh)&k$?uuO7PF%oM3%5IYE5G42Tn1sAYdM`M{5^U}v z!QZUs1xh{HukzncyA^hjGwa>@toX!i@KOY2FG+vgD^CT1Ek?droe#yClv$4 z;-^w==IOT$uOHGKaH%H@-O;nJalLm^9obPe`RU&eeU`~(yl~`(xQBbLDJSg>2b1aZ zgeB40^;g{cC2G*m+UpeLUuH+21FBRrdRl0u1LF8z^A{Df=-2T{z>kCow=gj zzc0=n*O6id+TTf# zV?Fh+JG3mwE>RY@pN4`gs}M+^kz-ka;%yqd5->J+V8C9_j9r1$$|PBnB><5Z zlLc>XiF4hl^DAyj8e>7=Ucn0<5En5OZ>pRsQ;6SM-ha1!3e-7A1c+{D0Jpt1#dIk4_&&I55Om11dY=!9MOGkz7HKf_WO3Ph;Q)F zc!%JmKdt#6Aj$0AuihV5c`AJD;`{@zb!J)r#qd^lK#oFNX=Ex z0Q;r-VYFwkOvp>7L!56b;(Px>UnEQGUPSXS68ei{h&Ai2WJ>Cz=jHUyns;n2iIq&f zslM72^;3v94<0jxH$XRN&ynrYNmf7ucyd$3=sdHOMK8-GdYP)`ShktUrjZDXO)955 zeSilCGPmXR)VGyH32A0mrPY!Artw?|TuqnSu0^mml%r|30$>HYWKQV^EBEqPX_@%U zqn?9jk`1X(K0?A&!E%@QMr|(`@w`0R@|cZ2v~xmeg7A?VH3++^xyv6Xo~0Yn*V0Ay zfY*}mdRk!@e=noY>Se}R6P^Aw+q{`!x5pGy zxU!*XZ-HMC!n(V1YD09=dze?bWx_B&t=0sbYFwadn{drqq2e(dlO%4GCE#@oI^lpR zP&D`M1x>!hl7p)|nWv}-$XyUZ?pjx@Ckn$b&cF9UeI1~~c`uHdS!Hm%DM){#GLF`j ziMy^-bW`dQ6GT6?XBo0ei0*HRhg&4kA6!kVdWf&P?(nth4))f}pK2jK*j2&>sW#KW zy_~sIa9&;df$J|he{4Js$1fJgpca{g|Emrmv$f5T@9`KH#A0nl>oqP0{`%4I=#t`} zeCDY%Ee=)zMztWpqPEDRfqDXL%8xA8VvW2LB6LIiHBO{7 zo9QlF9X+?eM9;hq4O?c{1M~AVZ@28jO$BaCo@q#bUkx56Rqki~n~c%h7X8v%fI+zo zf})ItyXx0+6^kUfYYbnmZCAMSl5i;q@YQR=A~O{=AsiCsYO7oOZwg{hyT-uDzD#!?;6>g}~ca zXz6ITH#z?a|>@-7rDwo`?4Pn1-s6xVzOY`Rr}>m9$B)EZGJ?B}U=)1uF9FgJv{0+V;X=Le`x z%#5JyA%kfC9PLg9D;g&HUYTp>y$IAtRVdAQvs1%H!OxT8I#VWvk>=B{2p>)LGSQNW zq5G_0Y_5piF?uf<%Lo@N{tQ6x&E%f7l@b*eZ1*Mzyv1N{DNqY*F0Ue&;A?pGBwXH77Page|ezeil zi=wj8ounJjcY`u2t(DWEi}(5@4@=L+8n=EJhut(?^k;d!G6(t0v_~n87#QR z2X!Mwbza#a{%9q5NX=P_d1s3yaoXiBmiGnvKeMpH;FA5Bvzs11V=S700#2ztcy$Ya zJl9`B)9;H+5p;jf-il7iZ60l!f;=kU<_t+Ti$%6dL9X3{YBEn3@6r?p&-umRUAdgF zF{vWF@4g|`dp}WN#$N9{EN(hHQ`sCcX%&e&Jr5dk+VkaJmwEiV?vv-FfeFkzSLzU3 z6g|?n(=YSah`H6C3;JPpKlSKZv}j15jDA%&AjYP7kJ};7@ynXV4gJ99Cq3$d^YeI1lne{^oRi|qP zUW|13IpzfGXVNTH&8^pBV8=B|@6XY~Y!SSh2kQE^{}8a=A{X4l$Es|~m;BLd>L}J66fI6wmEm>EejFKn}9NOe8G=~{N(H(Xe|;JCWC zcW&T6AnZ(UcLC4Npi4e@?BcE}Jm(c5pqW2cgAaP7lOadK<$auY@n-}ta+}E-$k|O0 zwuNPA>!0SCCm;56XYPbj`e^7-7Q{JM(aUcI8n8zxC$S3mmpM|O#dPVMzmDlP5mT%} zXRhS%${iXIU1=^-c2#$1w&DVj*mbUH@4vgP0n2!;a1nG87MEf|D!Sfy+WV@vi$o!u z7JnGa8yx=Af!3?-(= zu)&=VVK>4%{In}^+GW__I-6xq?RjtKn5IpXSl1ENhy~?;rQd(>hj^4KQtS??tOTa= zD&F?Z`Ze0R@&I|ptz*K*X7S^!1xZj8E{711UM5iWFjqI#r6E$1 zUOmmwJ-KvuUf1&-8Bj$V|BC^HVWzTedd9Gy6|{41lkt(aMc6s~x;mVArD6HC$?aSd zk$ZR;5y02Wl~M#@IN1OYA$lAh4}x}0X>^GZPk)CqJ2an`6bddsSeQ;r2OpAd-WzWm)*xXH*qsbbm0)amSsR^y71@e>OB!Z5$VVyg{6tS3=&i{g zZGeDw{j(opnQylu-=eR5k50rdJ}ouA;49`<@AmjcUETL7AjLI=>9EHZiy^@*@2-lC zC(L&xh^eG?mzvNg`3o_(%$4lA|4D#PXNu?49y?HF5#ENAHkJ-^f3L9L?{U9(2N_N< zPU~$sI>gon=m9NzkTY zXLHXuXW8qHZ8tNPdCs?f>&IJLB*RAxNk83;t+aP0V|prP`YVp~kGj@mWOJsQQQ z{IK1;i6P7$G42kPY!_7Z%-d`=(grL#C142nmCv`KwNQ+U_-GT`%Ft(eDnw(VSM0-X z_^)Qju`DLH+l;7+WPMbAwtK0HVge9-O&2|u19c5NlZou!r2&}=MY~-x1h#a*l zhKqF({hn~t(ag{3bsFV{F}Uu39Rnur#(q9ZEGe(ORqQaV9VIS&>^m6sLo-^3>&rb9FAn%BKxchX@o_ z>l04tebrBwT8*Sv{pDFonD)947VQp)trSBF_ zLU%#Oqke-bq`zDjlV1Nq_pG=3XRQvk+PWG4@R5xMhWRyrK}c$>DPwZoJ(t3SV8VGI z4m%`Iq{g94k#D%Ef&HFb{0(^}o$0>2QflB2uFBF0r2vU&K8j1xBzo9m<*G&$?Xfk0 z;`wp|-#JL*s5w=FRP`0c)ix3gyDS<;Rg?GMFp&c^^XL43ZEpd+Noy7@I+EZpXTOkvI*-1)2bOUC&FC=ll|&EL1biMnwRS%LZ$g5A(lH*o9qB;r=mY|sLAVC%|Gc;Ggiys0LLq6_3%e->_E`P*F zC!JZ|20u7Q_50}ywAx@U2kzJ~p}}I0cim`@%3KH6L7nw*qo!Keh1nDevb!%vbp?D9 z1Yt9~qrr37yz)qn{_wIdLZSfv8zoiw$T{~qKTPl$4`{{GW*V%GFBH8~M*GDc)(}e9 zyW3>|aUu4z-*aB2i~#@`p#7!ZIyOcvL)n{U-ptP7p;b(gdv&<_D_w1nc`&09B#pF~ zdqs`z<@_AI82asP;}bVSe?$a0uA3y&6AD~sC8aD?1bSrRn@T3sB+P^GL+n3Yz;W;p z!!h`?<|HH=4}_3864KQ6Y#D-ExP^%3&D#@NXdC@53{)%(Dhip7jh~?FqY0OJT4`#f zyQgbJ_N{cxCMrG*dwXq7yg^1w7SqiS8QG$_x3|_vgl@{!@BSapkNDH%N-CJjTmw!r z=d~>8tG^vyKTPQ-X37p}f(+pEyjyLd})-%vZzqiAc0+}JFrDwBDau4`= z_fx;Z|EhvelFiY!PmU4F%!k&BHzh-bxLg;taYARcUCf-)>x?b@tj5w=i9oc_Hl)B9 zjr*jySM&i{`7zs_jM$a*CTftu!+H?UzO+Fs+NG*Aw1gLAx<>48Q+{m*D)?w9b=T`zA??6bT4>>gPugC+fyDi4#5V=7uV{fz;{V*qy5*3 zj{H4uaP=R?H7kiO2W@MbU*+IbG$Hx@+q^)cCMW7F^Nb|={K^Xo8u6wP^Pn%GSwjz{ zY9a<}lxTSBfA`sa0k%tP9<5*ae-lGVbHcIHan>OFio=u%6Gt`LE>iDyw+<-xJ zYJV%c-GRx4d;Tpo9hBrOje%BaM>9hY1T4kMiBcdNN0%> zKCmN8HWQXH(Nh1VwASbR{!W!C?$RbLSqZJ9{q`W;Ob^h*-%~u?Ul)yD+1Kq}stA7f zK&Y2-^~5H_IyG-5|3COmP2OY^F=XhlS2F&wiFo_7fW0w#-V zQXTQPtk;0EH#+!1(rte8FGZkJmGbGY z-t%LtqLVvMvIylS91Q@s8v|^4#JEz}rK$GQJ|4uLNwTOZij(uxi|Ya_Qcj>nGU-Xf zcQak9`pM_iG~GLvYB|FxvmMe)MO^J`=KI(^4Dt4|um+e?0e&Wq-NHV+RX2VwWWN>V z84arWf{mSt!)J=%t1mtM)%xQ|{PYwLbi)1c)>7wpX3MfO0)I%AnPD7ST>d04DAH>1 zHAC}$Q=6>|75i{9^%8UF$OKNAMG_n7DDd78XW$fYqs={C3)6{ zQp9o-OJWn({7oeM9zL|My#s?x7|goqKp!wmn5IJYT4a?{HNOmXs+5D}<-?B5O1%=d zG%V%2-zQWy%Lug^Wo2T|q`Oq^0d5}*#$$*Su%%R?jSIRRMf?nGY8T)3b4YG2IJkUV zQ;k-2uR4@u=1?qGyM0sSB;i1O+sfgK-0-fak6(Doc(kr|J*XgGVFs{;URnX;I? z;Uibh)_X(zZ)3iiUrMz&?A&9yO0IKU(jF|EL*geGtS^4$&Z5bDr3zSjkhgPdwoA+m zFTGGAXfJW4#kf}Xs!g7|<-In3_kc`BoBuZB2`msX@7tj$h~qMwM27G}cJd1^n45YY zaj(`ZTI0sP*J0YmZp}Hz+)7DtmcyFf`kOKc(?0tiQrq2>S)*ZT^z7sm%kSVKOVB7{ zt7Cm?OI3IFdBasiqRNH?oa^k~2cFp@7i&rLa_&ABOOS<8s-O|`e}M0erFY+GNPb&i z?!Kwy0{IqQp}TZJl;R``Ly(6FM%ADxHMG*n%2fe5u5;6_Hp zubvhBW88LWEbocp@4rQhy-zjgBTf^jy?f8F)t7!oDe~Dko_@A&lb{Cil3G#Lt%= z@*((pTJ>SX0!bK{_MKWbm78uADjIaJY0xD29)XG&N^pg%A~=;i*DVE}W3tTey#97+ zmhk`;!1}RCvM|I;XyEGZb6kOqP@rX>VGE*Vd83I&-!=LVICW$SE~{Vc)L{h5{ky7i zmri(kxpswOhn5Tx_9%MxgNmOwo)d&?oe4vzPOzO$Yl9=-wy$yev01@JeMP2Icz!^7 z`F^@%jF<^B_J~7T4(%BRh)tCMr|0oZg`E#i6@?`5(#iI}DvQ2NUYi+bw-kQKYt_ECSw4n^Ch;ziu#lc?#+S zA2cwu5&CDklm(1mf+R9dgzpb^4D#A)n6;Ds_6)J&u@Oh+8c^J&q}&> z4H#$91Hy#V&QO18{)U=*>AQ3Wr(dhdM@a-N76vps*`P1A5B}?L1ncLynIQPL{Di+K z7>+(q=X%71yp8NFWeevwy94~Y!SKvgx%EZNQ%cn3ZOJpIpMfH%Y2jJ(bZsP>|C!<$ zZ2$)9{rTdKrYK8~v7)tkEMDXCrD-Da1`f*wv8j3ew>NX{iaGP<1kxpz)dJTj)-M(y6>ftLUXsxG!6ouAHJG7xBj#~ zD)t{nsxSc-`wq5@l;gj5yWY6$2_`raIg4h}K67N8?L4~(fE7ON2&giw@l<%yAM)!~ z!N2LM{ODth30rEo_A7E=L5b-PktNv2?uIsL30DRGH^Fe+m22?1Fi|0ie<_bVVMB5{!_hf78i#n= z8(~NjMGJQfBa+$4;{-6D%(>rw>BJRZZt<8Ky~xg`*8v~LxP_%3>xkz16vHyJawOpF z0=9p-U*n*OG7@eI*h1(Aw)B(5>2$>vTP51V zz>#0p1}loNp5&UB>gB{2g-*0EzS}1}Vw7F({RzKSUZme_tt$@Z1-`KUoI2aIGi@yT zQs@N|uGh|X^4`?L&8iOy{UBfHnzktAk80jL`}Kp8qbEi4)>-Bg zy!!g4&k@CDBu7=yAU)kuZK~`^`~Z&L3)^TY{@HRouPcCYwekA$d)79@LHm=9kbVUx z^5syzrqo<N;vSM*4UL1Kv40s-;2=gpNrQ+*Nt_-w6;< zrH57k1U_^xvy|BD592m+P;e*XF^wo}3I}^fsU{w9w%|Q`@^KLZ9O^fpm2Yh;z}{9r z4=}5*1VD@UQD*RPP_`G?WIM?t(KGYRIN7Gy z*daIW#hWD<&f+k$tWLxzL7gYk`voc$OlA2s_6vz061PkY(xL1){K;EPOI z7X+Q*{AbSgJt90{S5vLZ_Z3Jr2aR^t6oHc8gWPv|mlSO{B2|6GUq0vjR4I9TbuTr# z?Ow;b4C~PqY1^)+mfvV;O%l~R-k&s*N9`)b3@DR_5lhI`5)j z8#|8DG(gm1)6C03eX>b9^yayGo3z?XX(oYg7|quzKHs`OJ0<}&^!3y$lUXw zrp-;bq-%W}@x5mMSS4b@dg44EnL(RTNN?6{_W-2S;N;l>Ww0B3;u-OoaV@gb z;&1)cny~g%1}pMQ3>mDm@az#OsW(_Xpzx;flMh+sKVPIqzG}u^$DZ-A7Ki^W-|I%p zx#0f;gv-jZSd}oPIlT&SUpoI zY9sA$j-^_z_Nb??6h%E9Iy_6xXzzY8?(!SXTrjQ#*#x-_Tp@h{e(HiOMm z(UP6~7Z?4?H)(qH6$9KFdGyJ}(eT-Zvwx_V@#3#yi(XfGz`z8_$)!}=dx*Sm{7(w! zT(EJEhN7gz)yG#f97;+3HK1W@)vI16V^nTImETRMh6q7+FaUptX$@&qa~R2hjR0ci zQ*xDpf$ZDELUOLA86tQ2^zQ#z2O~0VSip&&9Ioev?A7$@rF*>exI-&BNL|v6VR~)4 zSmn_-E{0s52JzXYdF;*p#3wg4NAZCO#46atR)tS&uF=;!LPq25ggh<6HlohVSm0pz za-~-~%zdM!paY=Ply@VIChL6kr-fFYFsDP$5zw{h`*~#YL!ct^%~Cr0$qN|o+L}F_ zBjmSz5!T*cy!91H{61C&^Hs_cv`LdWeaia%kMg?tz7hZH3G8fDP+Ff<#5ST&ghHhE z%yXZ?S+|KA(xOCrW~AC>oju#f`O?|=lFjwHU7|e7OS^cKAh0+Q-ZuT2M1`3X$=2!# z%jV&qP_}XK8PmY1(#%+q&d8T9*4fH?LRn`syGXP#7lnb{5w&|FBrpQhWHE1D*RrJPs~@_xQ1qzm5iF|6lv;B*@FZ zrvbvje;Ax#db!ZSZ*XB4_ZMmJOMIkyplf(oX%d|JY4FD2O#=!NE`1x`=Y>^$=x<=d~niYa-y$ZFA<&-^qcfimvDF?r$W&zmuaeF)p zOr;GqcvM=F;5*=bmax(Dp)A|1_rfj_gCob0uEq~tKu15u;VwN52sS@;`?vYzZDys& z{j8Wcu6`~w%J~k*x24*Bmv$LrLM(O|z2|xh&ZgI!1 z2Ev(C2Jd&5Kv~#lR*|Y!!}M5vdc|kMQMiCxeRP~zL2srmTU#$}$T0a5;-|;%FJ;m- zbmAyfE-^>7YtZhMcF4!%cauwh-Ivuvu0Gw|0Q#=x($%eIkNe@EAtQOsraD{U<)|}4 zX+$^BV-M~>Cx=^|2>Sz+*=h**pTq#SFf{hYxAW@v6g?i0{jm->?<=`Q;>RJ>Y+ z6vV|_n{u^%6=pbry~(tqw${U^OvC zb+!KTIUhlQBOA-42lys1e-z;UgTs zUeY4|@i_a-UrqJ>W657T*92l&#~H}shzlMe67)_^CH~uJTkms}W^5f)ZKIik8Yhwt zT)!f(C+EbTv99(l-e)sy|eGBQNfNyVvd5kxH?sakl zeLT8;gnV|G^Zl2A*!Rmyo{c=V*U}ek;aj`22afq{I`kh3h7Qz(r|fQ7TCaTr`bMdS zU&I;W-^3ZrqvD}bD4o+T!u3X5tEO{x6~TKy-88#F<5^dV-p>jOY@}5Pvj;OnxdVKk zL?p`4Z_I|H#7Nx4D<-|;iABd$BnllLz><<7lj!-P9zt16#Bh_p+DY-&)$^rQG@&L( z|H=(FIQZpETZ!KHAWB$3Dn4yPs33B+q)1)sCOrE=w;C(0NYcAK^(5g_lO*+UHRrdk z;{!WH1=``01(-BCtd1^k`#=D`?(DA}gy$=yC$g#rDr15}M9AseHfWlYPdEZ~% za`iXTk-=8=Az{g9A3d1dv<(|CIXf$o_c{PdOX=9*e(GPCRXJ-WSJ?zIKtfxq6djGm zV~i%C2sXl;q7z257YGZ(u^qWdnEvkco$Vj|(>OuwYomZefth#XfvTUCWU{kNpXKIB zXL_+|u{9K5weW{UsPyGrn@=J8Qx5;xvY~Y&B*DnR-m8E9X8oy-I9(M?G^98l$c`m3 z9Wc9>(g!}l1x^;DFS#m&_0`456chl+d0pfoK}U67zd(qkW3>9+K)g`>uDnj$NYg+u znLl?e)2<~W&f$25&b7)i+@GYdFN;!ceqykGxKg;42ko{zZvEY2e*z-`%fxvbT}+^{ zoOx|}`V_S7RpQylTx~C8J^Mqajq5q|VgG!dk70{6Dx?Y{3QVIGTmYdzp^_hSu&(;Q zvv)&}zP~(db7qXpI13&Wm<*nN91zR8=N(!SMRiWz^EtwC*EXJD_|3-$Xal{!Rr;A_ zHl&_0M|a_$ivi@)R)7{fCaN#KQ$08six2%4l8Ae!$&k7J z!75hI9_9alr+Ky(3Vt;<(WHD+zaq~cNbp>0E}jA3@oOxxqOSo^1rU&R@g>RC(Lso) zs)(aV)ooqI`4G}JxZd`{P}j1b`BSOrH}1-DNlVZ0aemZE$!~TsM;prynHQ}JHyB6 zKDUu0PELZy1*Z)J_`e#E%WPropkTEflW3t}lsfp+ooEozuxT=`qvMO#-7JZBW*1tk zY;~xfeY+41)!V^C2fx_0_`?y>UHVx$WH4Ys;w!Hhv5@vw{NvytcqVvy)h~Zd({s+AAefWCu`EGL;*FXn(_4bJBooZ=~;eb#3{Y&o1coPEp?JMhL z*cusQI`_fR8&aS6_)meTu{(i0Mt8t+S3QZ8eA}!ux zrv>QdW8wdh>i?W2g+emAl-ZLAE<1Xhv;7mC#=FS5WXr$E*-W7vY7KJi;qEemt?WOb zXNt4g{2!89sQs!4vkSk3few8n6~K1Tr>;jND-{nK$ctmixk+twYl+t!j(}}@ka5RM zX;SD%R84vxXFBx0Y5>tV;cVqo=t*GrxN6%N=L<_|tSl3M)u{lONEQ!W5JC~YA0DHy z$e$9AEdp8|+`EyE1ZQxc7;>4wjm*lWbcr{1GK<*IxDKs3T!45e^v2{LlySRg2J!IY zp~(iK)R!}QKJ7InYMrj;8kHmF7N!VTZn^vdKxk~7f$Xu9!2;{zJ06 zg|X_h0?mupuYxQ^SH;$ksAGXL?@St>Dyw+j6)w&PP^W9UXPW^p)G$TkV~(ZL1YdcJ^EHV8vF3 zJMCmtkTHz9_9iU96<;@GL}5F1%}XzEI^^n>mA zqn>zMt(atwXv%Jf$hBgJA1CLn)s{N1)9gQ$=YRbv!WkI8garyrOnU?$f^_}9s?58> z5Za1bg4=cH-k=SomB{ft>zZ2bYulojx1~aV)2ebF8-OWY#(>yJ#+C~U?XlYj`^$VI z>A9677$MHdG>1)A=~)OPvgi<_&~nQD?&=H>t+-d z4X~2rKpU$Nxws7juXc$gT5p`OrG=jNT@~Q@*7T z+Z-cEwf%uS$8w)Lz&A^T6q_8tsT;to41idFL@Bj!`d5K z(q$_Q8V}wHRGV>rrw*T1Y8IM0!#1H1i#$3ed=|LoBrKV@Q05bp!J@D|A!>Ei^P_KqJfhC)KbC z69CL>&B|d1;@Gj*rJKZGEd5}Hg)i@)WO=13pykRhzFggDBN(3w<32&EbKYPQt)TWT zXjREOUBf6B_Q;r#0)!(UD~Mck7g0z0@Ecr~xfI4ylj|Ot;-0U@+#t0fe z7vI_u^W~6S%diBZ%gWK(1kq<<4+huO6nqP3dZpU$7;KK;$Dxk_=6|FZuHKCK31Ies zx1pIU=#q$?jgVZ=b}>;+!alq?d6Z_%Rp??i$p^fx^E0A#=Oi zj^|a@j}Uxv@$<-qRhhB`HFYGm(C++TreQ0@Uos4-f*s{|jPD@lRUtB8GZ(35vLZCb z5yA}NRb9Nbir27kkswa>tTxgtJ4%o|5BWyMeZS+i5kWzGF9M_Q6ThI89FSRYZJoM) zCMy0X8kch_CyrR?8RMhY+iYf-=q)5Wpg&`EiAPU7iD82|x`ME;^dyc!Jz(c*h#@wH zIPBeQqY9U-g>LdDwtuv^=1_(k!A1K^;dSreHa(rJ4Yj&6}SH3XX)Rii_* z&}3%+lYIuUTC2MroOaC|4n>9}1RpuNlkUW#4VP=U?Oznv`XnFK!~sh$TVsIz0F&G=#dT^D006E6}-N6-*_jP0QjW>RfM39o{>k z8k1|Z@e#4ffwEugnd=EAhrOhPb3HidN1a8#>k^7ueI5nxPvLHn;Rcbap&B41 z(Qat$Y`s>Xs!XOcGg#!&$9{tIC~_P?Rk-(-!gkT zmAUa6VK&V+kb*3ADB5>G(rEJZ(~UNG5F$&r8|0fAJ??)(!f(#35*sXeXxi9695P$Q;+sx12>iG72i?wMsRe=hbA z4XB*y+TT(=iWw((cTm3Pq1erKAXdvHmABSsLy&j&#|pmU_SIi2z}jNF$TtgnbNJ?u z&kAWQJoLh4R=%6pmugAdbphO6==@Oj* z@4v$Jgn8ok`ij1N<;~IZbRcceY7Hj9bZ>_fEKSZOiZ{)BkvD=4`}-B1nGqzPe17Ot zy~<8M!-*t=peFL+Zyq6MrEk~N&YIJ1F$+WgcbiD#^0HycMd~pggY% zjL!f4(LDZKL#=XvppYmd@~mO>|J?gk0?1c@{*!X{%kTkO*g=&`$ItbUs&<^V8kp8W zuscQT?!C95%8k7N)>1I(+#N|4F8y2t{oo4$IbFVBh1ik&K*XTR(T^@qP#gO}7Fsrv z=(wjYBNvYhCSp$~odJYAGG^N`$z zN>=uaT}Ee@R{G#E`4yrLI;V<<7Ei{A-7EEdRFMHq$C+2QO#sU`0KA^&~-6ADb`-L05@5NhK>s0IxQ3%z8o^%oK z%V(b$-c?h6_x3Vhb%X?K-*PbTwb7T~4vdbok(gKMdC(w79WQC!CPxuV2W3^&9Vfdp zkIvGBWW%`WmLD4D?0WjmFG&M{vcf6!e6|&#SANco6e;NmnDtRg6!}D1ZKdbufXd$9 z6zr^anDv2Gwl>wjBf-e`!t#(1+d6=< z1ZR2eTLxdq*7|}9G8_JYAE|gH*0^$SMuDsHD)r7ZX7(K!m2=b&H5fa{v`Kjp{X8Bu+5)+c8*{s$|F{7-34!d zRC_m4fa}N)p-#o%{-(-EKvuYym6}xt6Mg6Z1MY#06+&_|x+S=3v&@s`z0%PycV*JG zQ|r%3^t39E$OXSQu#7jWl3Xl^)4thu7ka&55_4{WdskqGxR^czFSdL8{DIlnvma!> zn_}&tRd2+v&OfOgA1#X=oMNWVz3)tvnR(ZWE+c&Uf&3R1PlI+j=l;p~9{|rlFu%(r z0rY>V`YgQx90m+H$ZtFgADGY;mX{APC#*gMg#(`=D_8=~h8;^*sog;34%+#Nzz#VH ztA9`#Oaf!Bf)3NFy~lXEz$@IlLum2EqL;;F)b{m)M5elcxBeJT^T|4pTJIDq>VOg7 zNIKlj#Re1xMqx0yG;msG4p8zS)nlNG&@NOnHre0iP-YYYTniq$#iDd70y?;cC3cXo z5@*l>Mxw|*t`%A4I9fkIAVGqoL|-zIS}8~{umOge(1Dpj3Lhfor~nXte9Ich3_2PD z8i0vYc_8`*Osk0PcpfDxU5CP-0*Wy%VZ|n?^jJlqvBM9t21TumU%XIF*cfFz#7+i< ztGHdkCmR*$CTYUKtjZV?O=L$!nA=e`0;KMU)&_^ABLb zgn9&xX_ztyVhH7T{{T)#vt1&eFkl1GjX1kbkZ~AtIgKyVF6cx%13;lchK02hP8mFy zl*8YvMGUnd>seSse9J=L8z%`bPZ*X9xJ-7Hi8re<*idT(YYr%#u)AC;+E^iIAToec zQZi6pc;BQsT7&k80&Bcb{L7fwHPT|52R{*)0WS`wo}m#SU=flQ(t#}(>6iq8Y>A;b zbBL6~$QN{_090scP=f#*tfa#tF|5(;3g}SF1#1uCZiKhs4FU@cX{4{DG*5zkj4c#s z7YWBfU@?!lpaCNEVr1<5ixzm9C^inH4y$Un#d86{N4_E9(QC<2(l{Pr74Fm^6FTED zpd5(ga)fN8p9o@`T4Z`bxG@Pb-@wB=MhA21AfU#gj_2H>lr0gY9|I^xq5-&R1G2wC zD}fzvTk9S`7BiVz6%;Jw1pNc(8M3R44%*Dn5b$g56nO47;m!z~i~AQ1m_zI{5{1YJ zadSXfL(^z!tSmrSYZ{C^?zSGh!%E^5^AMS%89b8NvFYf7a27Oc2qV#8WU>)6^o8gI z5FnDGULXh$o+}_Z{h~1*ba|bNI?Lxu9ZUS=l ziT@c_0USAAe0L91w^ti6pb0q&tP3xu<{P6De7P(KhJ8At#* zF~~)#uMphbLMG;eLK8)+NZ1fsdQ4J5VpJhh7poB1RgdDvAjS-EFdI(KZv4c%Txt>L{b5SJsLxdA%L0-j)FXd z@;t`o>PJoCI6w`m{{SLVPL;KmVb)B5G(8kk42jR5%6Mgs(6F z2HvH@sZ{C08!%7+JqZmnaiUPrP$8gz1<$At@d02i0vg1}{-ZFF!za(FoIz7RZ&v1D z_kn4W01*5(SVv>+HjC+>F#iAmFm>&)nkHRoh*T{uxY1>BV?x5$K=*5QiWkU2OG=90tsRaCpIv zHd;MqWV>YgLX3%{wzPytNTJdSpjtbUiVbK)L2LsUY$D+?G9+;N5oP8LPmW^80w+gd z0wL~A?{ht1$f&KVBQqq8!Li^>LJaEP<7wRHt}Frz0|5Bca0@{e4_FSa7aDb+*@gR= zMu}*hWs2Ga;1-X&-_XYwN937$S%;jp+8Q_=Dy3p{^n$54BhcJnk+E_5X2&||?95(* zEEC{DbYh*1Owupc2qhV-twY);Uo6#=sR5h3A zUslm+4rIW!K@Hf07>fS@@+nqX9)O!rKlPE!Jdh1;A`4Rl#CMtWL%W|rT|)>9VmF0E zF|fVYx|~lPjQqgh1e3I4;ByWLuWb5G#ly%)v>|`LF&2*PqG4NUb2EM>xq<6(Ueos@ z2hzn+)UmeRkj6a zKyd(}xc*j=04amu$DMlK>jz6}ATCMoyh$S}D})oRSc41%9b75~UT`5Chz>>!AQ3A2 z(H69%{TvHl@UV9=8HZdASPTQ)K>~O%hu`Ob4qn^5zo)}&|i^M*@gc(-ZIRMllFW~WCaVQ5w<3pB#mjPzpx=lI_&_rOkQ&OKOB6PB#lrbgnM8@U{ zC>Ib3Diy4@j`6%f*%7-i6irZ>P}Bp0I-f^kKdDNjf;wg|q)w7@2(M@bL@~4j$~PJd z7w&5TP7E;g-XU2?;J~t|P|$%2g(d_505AfAvMe+KtwlYYe2k|~L$ z9ONFTLMI-c?Jn~UVHALeBqqyrgwg7z{57=n z91X|vSbvoOJNg#a=l~KR;G%gy>o|lEZ_^YZ1|bLt0sH_n%p(RJbRS^=05AfM{Q>nq zGCJZObYkIX`7>^ykPsD&jCr=px-{GU(tKTQ7sDNsrsN#_!lJ?rTVC!e?V001-# z(!B-&A(QmPiQNbO4?^d777!9POd$XyXox=ZLiC|x=~sPY%DqQOK&yZzv7!_!%`OB! zk1&RU>YDH=hy#6*DiaXMv%DA(Kp`yRYt;jl0qzI^6a+~eT{pyYLX;I734 zHW5Ita4I4JUP1jv3I|X^5(F|r5fByxE31l`m~0N3z^arryfCbK97MJB5afECLHr2! zUbnf3Po){f0UTsz0$@U70EZhn2A1zAkTilCaJ@P){y-98gg=so&=8MOAYrDT_5|h! zR06=7R2YZx2C4(}YaI9Fu=#``QODoazoB!p5ajOmm=rCwD9x#tdisq20OK#X&)vEH z<7xCm(64a(!3Wsr`VrsuLO#={2VrlY<_!op64kxI7+OLI{{Y2_p^m~7q(&x?0U84? zfY;nuHW@I<7$Qkj=LkmAhfxkFo~X-sA;>TbFgV1{MjClA0agkDwmbcL5IF$AFLqN{ zaSV=gUqtt){*So0MA%?PYd2ZMJ3AU3#6@6-D3*_3OpHUYM3*R}T?PCqJUL($f8auK zkp?5TNJQyIrU>dHNZkwuQ(C48+$mttVCJ;`8SxFFacKw&iUu((75@OwDZrT!nuXN@ z^H|K(F5g=xr3i#@U5xyQq0&760CHosy3{DtOt^(5WSR35E~2swolM3XY=#wolI5xn zf~QuHJ*@g8n7zC2>AocBQ2U?bnH=cw`>~tMdt!ea;6VZChTZ`&u8_@vUZ8*@f8a=D zM1U}5wlx97AXI?_ZtLg{sKzp*4HO$(!?7k=0GmTRLK-QNLe6Ej!#-o68IO2`B|*ok zPzr(?gV1!3hYzjLXr_FL>TnJW3}$mx4;CZA8;HYyHkrK^kq!)R7L06537DH$l#5&PeV8A`J32MUFE#MS(>5?B1 zj*E>*5LJ!gx@?HtQ2l^+VcL&{FiBww7XJVOARvghL!fLhCPrs10PibSSs$3qVE``X z07*h`pz<8X^ykF=$;tGuYjNpMzqS{4zkX-ZvH|&oepGpWpU4v*NA&su=+XzEHN%V< z_KpsaK?pz*6Jh*B1e63}h?x=QfC7yYp~i&QS1ZC386yfXS}m{{_m(XA4+BW~)*Al+ z1$8HiA#gkTfe;R12x=4oV=&vnfCh>HAHbMaa_4UFWU&-SQvFMV)&>s0U&%1V{{X{d zL(;PfEY=1-rWGCy)Lu20;&=8Ij`#i(4&usjF{{SfZh++a9 zLQs~jAqgKonVd>-5^y0$z(2s5P^t+GsK$KCz{2ZK<6*XWO0l~&rgn@GQGdqICt zX*PhThaUh2<{a@y&;m>t9+?0pBB_+iANXvK(D(Is@dCtQZ~i+rpwK`1r85NyBoj{k zr6SORq+oLtS~Wl(Ljl|hq~jdqvXB`j<~SV0fpE$; z{znBV5Fh{m8bkKSyays6!zV0+VFEvh6$_Rh%^VMw{*d{zXGI@>Or0e~kuX5akeT3v zPyw(102g#BXB3_vm|%@JqgdBoC6iEKVRXpt1)wdd7=g+_c;xZ{P)G(O9UqO@4*|xI z0{|ddYaUP+V$x|sL*^NHV7vh=p`Z_;5tZb>32gqjz&$OujBwoSjg(+`0k@&c000e1 zl>#mdY+JGzu+aGa92m{kH3z@(5Fk_@wCR83XAifB-!= zK;JMTAd5t7V3D+gQVK)}3WG+tAR3e`(gk|o5Rr)v?jj&h6^V&?+j7!5MV5cfQzRc z2knTmrxdXY;WrV`;RXvr_y?L^HxSznp3Bna%A&6o! zBzFD;R)+8Y0F%M0OCu09g(5%$sAbG*gZ}{JjDjE&SPSlJM1)CPE%*=t@J?ze5Xbiq{{Sig z@0~)2>oLizWAU`qn5}bM?jUL%kbTqQ0szW-J9FGj;q0%>$KK_=fgUH%?LRrdPk?m5 zcK!~n*J0G@00qOb*gnj7e#G}Mm1AT{Y#$J$BJBC))(z$`AIL5Q!~TQ>CcsRH0AAiA zh=4I1S{!~oIJ*QxYqkB+Kxb||#TpW(*#1iLM|AWiEUEB)eYZmx4sH?u0Oi5SkOHZI zPr-)KBS^N{@|1^aJU_T-2G}#R_?Q*I8I=o}`I&e!1~;~KFi1`_;ivu~=wbf= zNKJwFD8wipVGeRX@?6>ngjYYV898t8{{V#=cmDw5+FSvy5-dH){{RFyE%H6N?Bi2r zl-)3gIXP?qcoheL5>5aY0$l(b`fP;37bKs)cu{M~C%h}}3)TV2s6X)#eIfik$Nac3 zFq_c(7(P7^Z`Bx(nK^*;Xhz5Wlpp^9j3qIm{{YEnaKB#uWr>8DhQi(v#z%i;OgM<) z8=j^2jzj1KqP>IqMGr6@PN(|z{{Y!T_!2HZ=IfU2{6$oH6dqh7BogjF{W%E(Aci5b zMLl0AmI)(t`$15f1K?7~G5zrT%I@?XLG1qk^Sjat{{Z+%0wI2*p&c-1v=Y7y9w|4x zn1AeWANH7ukj7yGWS}hn0Q$l|^KF0pQRqDX00Myj0RAod3}N8@DPjKr@c|#m(g+wo z{wPsmMT`Fc@`L}x04@*#00II60RsdA0s{d70RaI45g`CEK~Z6GfsqiQvBA;sAmK1T z@larJps@ei00;pA00BQC{{a325%*dY34UBo>RKWs1qp`=Ma z`y+5uX!ivkf8;j*0QoU_4-PdyXu$xgfCa8;Z9}D2J+<{fkX=jli6lWiVHftxe-i%n z_0akF2XBl-Mc1kJ(dRUFY_@3@zHk=Ii6_$0EvE$VKz#^s_>iTx`Y-mLgC=nFRCO4Lp|=yO`+H(mFF|Ao@=w?~zOs0G7*?D@vM&Ogpmk23S`F@S!T?XoBz zWc?C9=1?W5!4k7gYG|KWN%zU|8btI64F!E;q&sg^#|MUfflL7`zPZ+;bFuh7lYuem zyAv5mQ=U4D)((B(A@V&0RbDi%>IA4|U^Hq3$ty>$Ia|n|UUOj;J`GEu z1;?Z!B1P?{(2nt0y6CwHaM|Ji0J$IID4>)m@LFKqzL+QQTQoh_^gixTB0P!p00031 zf11F(Wc^M50Qe(Po=6=ZZNChWuZd|oov)~P$fb;}=bQWs78&IGv&ihdo%hKWf9S?; zVVsNUUtyC&BX#K(^f*jDz}NC$oPe3jsmPW7L6RixK2qZqKSce2{{R$7L7wmc00BYu zBhVWQ>;(5dh>S4BF2hPiWdIQ0B&v#9mx#_d!r-ixD13##jr|^iFaa#)j)BxDfL75M zDM>)INR2&>S6K=KQjuY#4!v4f1>$piIkbG(4_hL zEgg0~sIBLu4Pi6APv0V~f>aWKJ=*^OH!o%TAMgJFuPe-v3}~NxD=*lj`4{g4iDXas zC4zE*{#Ssv6SgZ1A0e~U?Z~~Le%$Ci{Bi^-WBGyU1N@WJg8|_ha3v9u9zOT*#jpE z1f+OmE(D&Mab~?-WRC85NCEBZ7`>int3a|3R7$w;Ac5^&QF!H%owPSYyw))#}5Ja;8002?{017-oet(PnAEyuP&vB%hEi}9kU3HP6DOT%~8u_{ju#zY7=4_=PI znUe7t>HQ8A7C=X%fgqMgW+ejc_r*s|AeQekHlW^FM$ZebFCLuav!R8TA=X4S2D!q7 zgwU`VnnRQ6kL9G2%ETO)XIVSbE-6!loi8*LeVj!^IXxc1gdk|TJ0N9X)j zpaQDE7^=njRdlz&_3M|N+`@h0=k5OhB=o*&8Y3Enc%K*&Y^Dr8-OhOW$%#~woZ%8P zY4*ahUcDdV>IuYQa*~hBoHC3~rz%WPnAGJNYDO4X+eXI<6rgR1ehAHwI)c2_1ihHM z`i1poYi5>YpNSuw1))OxU`B(Khug!3@^L?*O~b^?I;?EW*|a*K9w18Ob%8K-MiT@* znM8;`6of|F2!XQ|0km3@(cmmt?d zGP;7xw7a}DjK)a3DngXJ;U$cMq6q*&tLr_T1p*BOp>B7O?tl(aR7#fdgG@4tp&(LS zgw^W>KobsKT-Ves*c}x*lpEtABLXblvv%H5HdX+YASa`PUrV~Iau^1`M<$>-?bF{IN4etMi>}+q;h0D7J+CX z+n~6V(jZRwWG6|K6QE=iiRA<6j6uHgOO0N2TD=z)KKIAaI0dx7yU{>YS- z&#J$dx6)L+O!0?vPV?piRa7BuvFZ7;cqv>13E(pQbNA4zPpgk&3Fycoj9NW|U5w2=l*1Okwnk!(|&dSFPBqT2I&B$s%a zt)c~%$Xf6$!2Tkx-B$;adcz>YDkCL?t?LdYHlA`S_KozN6HE21pQIUUelO|c?yu`E-`c}@jN9x6sWk22BL7u38fN1>605piy{zB4_2}0cszz8Seo&i zM-V_<9yf#wa0b#__8Ws{I-mr^$p*+p&v<-5BV^df`#AK&$AFxGIP_~@v|s&`)=+vR zIlK0IJNLsv!~0tPAK(&^z8IedCu?BFpD*5=0001hKAyIESAbe{WHi<#DJB4AzRXN- z)eW0)%GVbd0|F!r_XM7hJb!=<2lxuM5cs+<`dZ3`ACd22pK=I^VkQ%&z2hS#kRN<` z?KB2g@+CjOLm(nZj#}vogWNB9A%o0B`9txPm=)_v4`NJeA)L*FK|9psq&SdD4XP5( z@mvyu?a9&8W&jkTl!J~;hQ)D>gCI+og@8aXIqws58WVej)uogvj9~Bt%_6a_dV9zs zr3&&{6D5IB@L{+JihW?b3iM>zL>{8;^L8=_0MrD;a%~(4F^z)VB9z#on%OhPC{k&$ z(+q5)B5}+B?`8rb$vZ@ZW{wXDfh1nL!uSdd0 z4vu8kb+M$LaHBIFNrrn^3=Yt6s32QP7UU>3KB!dXxRE4bA`(?(0F43!EiK8^RvnWM zdk2i1mU(7Oij`yhHObQnyq`uLIQLJ`&PPi6ASFW&Pu9q~Ej}ZVtSf0D_WB@H0JX#> z5f((xwi(*MM12$mU1RGdW7ChKu#h9@;`n7ha(=#tz^g;mpJO~JQ&Y@i7Lbl6%hcDd zH|+q#WNNsXoLyA{4#_VnNfClhP0jBYDT*do2@& zT@bw#g^d-wNa-eUPo{}m@L@TAzG@;;>6O?20BiJo4ZX_t!NZjQ0C9ZpI>r-{DI}Z3 zjjC;oG5waxRKAug{URgj&@gxO`AuMFu?sZyUgE5L4(3$vcIf!5KG7TifCEAPY{o@+ z+@wElKm{&HMEX2<&L!epYLDzcNPnMD*M%VZ$c$-BrEa>zLC_MbfP(qQViMa*;It7iVkywW3j(DP z-ZadRCdJVbGR$voQ(&{in7xFz1D0r4M$?p)H7k_%jaA0Nt(+ z32_aepN#os=KvOwGELq}z~R_jS~y%JxQsQxW12!K<0bq7rL+gIOyO_D6(CRwqOp-% z?rNpCww|(PNdk~*berBdCpB*#BTWZ@V!gFu2JNf|f_4|Q)?9Q8JU!Sp|(m?8p1 zO~l`MCs%}xi2yTKA4S3ercjTyK zCWI{z0@74RSm#66_s&|%fx*G;CP09d0T!yh?cov>p1`H6YmPF4nnYD2H37`mKmCnZ zK|MS^&Oo{&`cDo`L~=SmlUSWG7I&-w!CjllQ%#mJgT;H8JO(`o9>Ilx6;=Q?u68-e ztS_$4Z`G1|52b2lzI<=5p6;XUuUzvRwG^~lPvtJzgWPl?nHBDh9rt=Zd zL-&CmEa*e_Bj}G*JvNVP&Zos&XVN{HJ`P@~I~~{amM#<|#1#xe!7ScDPl7Ex1ha=& zz?wzE5{A2Et=7Doc(xPM6vx`SK*W~BArX^}Ca_sV<+Cm3$}!=wWSvf1DNNBiB>^sP z!K9{=H9?@$#&E4k3nTIZL)Rtm+rgwlQdWzs=S^ZkMzKZhQZdS<07Xp2F({CXg3|gc zavEW%(asYwbsk+P48Kfbssj*HIEQgljY%ZZMLGlknDS-&Q0EfO9^+XfbkrNLLbNyU zf{$O6MHH|`;Eh1z%3kU?%F07|CA|nY4^s^hMaszx&Z25AbD(M%hyZmMIE-)>J6<6~ z_`--IX>5^s$r`Y{8ur6wa0j*s&_zZk_-j#{gt3eW$%-6?96*u@HN!ZG=wl!x+w`_< z0Oi14zA$99K+N)Z`c2^BwW!d_QlLA7_h~+Pt;|DQ?Fdxrz2dxaS{^j zJ_Eyypcx>sFBkNL(z!PiI5>i=NNsTOS$y9*fZ8w1;}H6zT$!M!xNit>Lj{>hAtaMK z%1RS%2n=L$6wY#A3YKy!k*p99=e-dUZHhbANhwjr_jvR&#!P@D0>q+EF#KXdc_;`g z4Ff(D(1e+pZ8Vz3FR(&5OO5ZJq2v@ujGtXY5iCm4{{Ys5fT?ut`o=X{)N+0^SJxf1 zFZFovhhTjt(NDHX-ZR_wZ<+c^NffSS9{&J=gBFla?!VLi75*BBp^E$_$A=rS?K?iC zQ{-`yUAcJM+v3)4XeQOkqEry^O}gVBI$voY3FvYnDQnw*pmS+2XNbkYyA!q4IUw&% z#su<9kWUI|i$afKSgr$0%!Z}}F%C8T*o#8w4Vuc>oe)8)5uXu&BVz-UN%d<9(Yh#P z^96T+F6bg3LyhFyaNEbHSshzI8^roYI|esuDwu83MC&3;SpflZjtJB>^!|Y-(RPO; zV6tbd1~8>CpR6EQcwfd`k_w!PN#C|2$PK-xep$IJ%;0T44818%#=VKjBg&zFShfVI z5)8$8ha`Zc5kI&sWT#OL=2S-PJ~7f{Cdy&0>!65|zGzM^N*3f`k}M&fFOIWDTD=Y^ zo^bm*l;V}~$IdpYn2RiQDMTe0Dt1ttWyUT0oO^PMF5;A=*ykawCh^lK5GrGX63&Z+ zqE_VaM69I1X(GlJ>9yM#^Vqv~aPik7eFz}a5foV7fE%Pw(}z-0L%_lK%VVJUDs13L z{{X-^0%0ew{{R%m#3$L)=$e1y3J@v}g~4J4{)aT=V+hPdCT>1(!U)Aq#xytf#((yo zbcePnp)Qt3&@yeveZ$rL!r|U<2mmM#ss)K7!Z50}U&tumDd!Gp@SLp0>52=;Mw~PSn+n9k$@+laJ^h#K;$&g8QTP z&jkW6!TGT8M5-r0br&W$L=#}vq8&ZnO~NQ*DJTVoX~aN@lw4f0T4KHH9;>~Cosg^6 zBP{@7DrXUDlXy6A1kYwnB(rwhc*!^^q!do56p8yWK*g9W0RqOjVz9MF1kMz^A(Emz zGdY_QVOMimGh}2)OS|&E*jAn1luJOAO!rt70x<-v4j9)MB-KM zD_E(2KnsxN3}qjT$U-2-rGGg$w79|2Hk}@EfFlTSk*>#<61?Fd>Wax@fNMz?>ZIj} z1h))W#)o*#0GcJ(i;hMs zG$%AAeK436HVucKI_nUPr40~}$k#O*%R5^d3S?L14Rrli(#XEL+J3r1kDR+e|7s-VX!j$0imu4;spe1}5XbcSD zFjqd<=IGjC_ME$9)+ssfU!U}2;Vrro-{HUvL(MFlKKK3>p1|ADhqaG5%Tkjgv=g}R z#MVMV8xSBAnCveTOKj+A5}D?1exV5UA%bo~!ZAyA$=K@f}P})GV zFP=;wqa*kJh?as*1H;PmcG~$cLUd$CS)lz6|R<7a22muKZ z*q9F4QR$bw_{9d^E|U)a*&De8fK)@&&Ti64R6tRQo^l`roy?GKs_|6I{{RAiUpS1( zVkNQ{Pu+lfqhZqHyrY8u06FQG2!HN6Q4JIWhW))TKDUzXZ@dCmZ9sXPyI^Nz)NsJSj$%2; zmLoUL8Y;KKvWW;Rie#wCnP`o8dfAQWT$LzlVF<)=p2^_q*5(PgV=WGsWK1#S+l3W4 zyPFu|n8qR~bd#cf99M&dwkCtipK7v2^*J6*z4?mo!WWEsR_ z^<0m%525;59&|lqV%;Y{rmM;`GY{vi1%bE@X~`;r??y+X))hAEaO-++vyN>%V5^3k z#9)#j@u2o2>mgSMAmy)uRWqd>D|tP~012XlJSVn08ybjCikzVzd`d78016`7yv(O0 z28ME&Bz{qoxl&jXNTIJIte*tOPKg_YrWnW5;?XQr>*DgjKuVK*G=5kWO041vLgb(P z%N+v5!VbQ78QSPaP-lnRoB%?;&ul;}N)yGL?8NjyVSFzL@rs!%YceoKoeaFK>Mvvy z&OoZ|8Zrf>*Tz+G{hEp2lNBNw83tAF_+kxuV?+Q>`J9zce5?kNzVK2gK$-*y`?4fL zn?-8x1#cjrgEuY=ssoU+=p}|`xtv-wPjW5KP8C7jIS7>MK;bcv_Tx^mwyej6KXS>P z6MdX?($!;Ku?G3dVkOyR6Z~N*$0_d!l7n!yX_0)?U;Qv1Wj;~#DSX2_R}W52r)Nfl38{J2za;af(xoFghDTW86f~iCeYQmG31lxRx)9`TF{L+z9eTeTM`?&-oKCU;Gw; zqe`*Sjt`cf;eWw`v=e~<3$t;CfFEm!J}^aMM&iyi@@0~av3qJgSR)hD>MX>J_Lr>n z3Z3v@DePoK(H=wX2fk0wX+zx*%p^R!Oa>oICgp;&Jw?2IhIp-IYWm7&LACDCg@RB=bS?c zI7<<25d>|-SFz#oq+HT|@P%$An2EIx$aj#2j0zZByHanAa{~IvgiUX}P1?eR4+M}! zPKd$=Ho*e;HRfKiDWOZU7K#zioU#&$V>H9ROsIJ84p%kDLb z$w~lqu`gTp#~rH6EwhY9Y~&wRgqXCTJxrfddj4`b;v+w&J(mF>O}%rYW5#pCxUr&j z`8gpzsE@MEinu7D9$p!(ETkpI++h}AczVFJxclSo$@&eIZc25>IBe1+B(c?5Gz1X) zb(TcpQmzp&4c=z&sYuGIlcQ=1k~uR2obT=u?`J5V;hzla}6nWZ3K}wX0vZG zMJ3!|a05lJC zk|!c?Oj6JkLjD+3c2k6-rqr)l5U@byLU~0yh`{f!E7B*fn=&X&?x1J*D?Ma`kpxnW zr4XiY$cR}=P!^!H?xzm&01UwjBudo=5-3QeK-!;(uNZcMQQa`H;|!4uguTF%1R>zU z+AEXCapNe6WxALz-yJJl0$5l(tbHX~Rd}9W`3^k_v8VVjl617Fz%QY^0*Ii2V%U~G zaohv85K78s4pOlL|pYW7c@FinxNDQX{YUO=EGlI$Wqm?GAnqlq3Q&BGW(hS8CP z?yALEuow%J`wvDylY}NLW*d+Uiu3^XpCzH|J-UkOM96Uw=LM+1oEckGuaFUA!=Gl_~@>)8`NzT*yYoxYijgX)+9H6;HlvExnzl(K*t6?hd@n zeO)Q6hT(1s*4&*`ea4>0(or9LFr5>HaGPwh@BEcMzrWEVim;(${{X<5W3xUFAB=pw zdcU_A1?Q&EQ)X@n5!D#67BQOCLBBj!E70E&RYQ8-w^n_z|hI7i{3N}yH427dM2?amJk34H;`hcd|-=cUu~d?6+}5P zmC#wPu7hp(K8Vsq_x_^8O4p{&0fPNN#C}%%WXNay7Kte@D3Ecl%;%x@oW9+^IV|P^ z;i^1G!ojl+GH~z&&C25fk95!4nso*;d|jg-3xNaE6mgB40JW%azK75ldZgDl5G+Fo z@3iaAOJH2-N?>yluJO3JMX8y_rPN{@Q$+7x_}%`sUp{e^ttHj1*gqJMlC(T4x6UcL z7E}lZ7&IZ#YX1Q7#q7NA5{urj`k+d{EtV)T>QKvczXmX%b0ET0dY;(*Wy$J@iQcZK z2|!dU8qkaoj!p*4ns+1^>mgJlR-Ubn-kj7zwE(sB5ywg^n?}VvL5lkf^hr}5!vpF` zYPJ}aC@g?7CLz|*D+DGU;~n8N=s+Zo9pQ&FOC_Qts<)gIgsqo9Um zgHLC--!3d+t?in}pl$4b|0K=OQIY1n8XT}Rj zmPX)>9rKTcKm%p7(4O!KhJ$Zql4~5zX5t_K;E!y942DYXipunoL1YOp^NJ*pv4KR` zO~y1|V)3De$%^zXJOsJ14{YG}FvM*U2od!h({rUC!yp?9S`U73#D|K3;5mG`+D&zl zGG9eSbZ|w4g+4Mm0CC^a8Q=Z%0tk?fNY~0cezVa^yY)2t;O1!Bf3pENxkNtrs|u>I z2fcBH2w|k<;*4yfj0vVuo;@<}EPE>tcv7XK>K@EBm=5YR=pLCF&j$4wr~XIK?BctqC|PF+(Sk%UvtUaT!*!eeQ@ z7Y-#dLdyK%DoYnarE8%w#rkr$P7Lr$jh&nK8Cu42uO79nqNiC*) zIBda%Pcpo)m){G)do>Mqo^eP7@Heg2?xo8lPMHzxKpgbz;!{N=fK_?J{W z&5+O()L!J{EL*|J!_Zjt96EAJeWrGrdfp1+WFde_G8|6R+Rm}SsB-&H=i3kRZEj{4 za4)#Y9mSM{=G-D+OmttU)R5(RFlSW)R(S7kmkl(hr^5RXc*uX#r-wKg(X3U{{Vj5$wi*KKiASBja;NuU=RZZZWaNF=rx*f=t)UWrFDXT+(hPHYaJyN z;!lJ*YsG|uXr9R!ZKboVnuLMkT}yqWaBYzZg_bF0X;SAJ05S$YO{fGYVWvTj6qaEL9>utUr3H>u)UP2f+x1?AVn>I3^)|!C3je{ zlB=pvM|l|Xp^Jp`e?b9&2}wUSee#6tob{s7%-$ylcnyL)Vi6M15uFypYphDj3m_^5 zl;8`<-!{_FfY3^L!u$E;B9>@qQIf9goO=EyPbkURf*pNFz622Pi92ZHOpP#sIt4L- z1bo%RAnON4)SM^dNG$pG~d$vW{O2r-bx$ClTW^OT~8<(@UPA}WbQgJ`xa==qMTFk`9lS% z5${3AL-!S08 z5k0q)R|KqRSQ)w26bl(3%%v0@KNy%*BY;I|!R>||h>2om1u*A;4be#Eup~%Iu@9`o zMg_^Z3TK?8BH=JNS|Je3g32p#feg&UK)SYYBoYx9bI;oi^Yvd+!XKx>MW!rE2~`fnq;=l8?;u2ACi#y{yg7`lv+MR!V3++i9DF88ZSrV5~M*hJJ6LI#N@Z9z-0W1izNf32RK|HPO|KPdXbS0 z#M2-qLD$oHC+zd}LVtfa5w+ok@~@UVoN?)tM+wHTU(o)dUe_4$Wd4$HW!NEhp!mJ= zC$I;2n645EMCBm_b4%@yx_xF1&%Qt%H%v+0;Vf{7)Ea zDInq@T?S~U1vD)@=PgAQ9p29JTiNOaSnuj7DE>vhn{H0vEEH9j&5pceVj9$Xs^Xx4zkVb#R(k$jyrB!J>-dHNIK zr(#}Npo)Se%V3|#R3#s2BZp)8cqNC(oJkU3T&}!J7p$7WNvCt^m)+ab)^3<_9L-=y z=wH$a$zBC;_1df(4*;_N06F8Uz^Db)C0hmaiC#+#K|_a6V%dwA8z+Y+&?~tEO>>6A zDH0^?{tSWC@e{U4@rbdR%JM2TkqtkLl8P%FEnMR3a*e4o=5uMmJTWt`557|IE9$`j zM+a5w1jJ#gV=wtnP{yL!Hp|qTZh2YwK(tuk-Mhlr~&uO zLxJI*^paeBm`K8Bat^}o51a#nxzQXuhuX4>s39l{H#JHO>EK|D>e{zd>4w{kA#IS4 z5sP_nTa|koocQ+1Apm0H1PqY-UPz}vfdo#ffAblZvYX?EvYezh+Xo!vL3IsfB_Cp$ zH5)OGG#6eNM&)z0TiwSoI6MG=fWM^w00a6z#vupnaJBF;us?L4Y|xtD*G#Qb{{H}1 zxoZ=e4!%+FW2oj^azurhILMK6SAfJ%6O#*HypT^5SaY|xBQPwaum;mGp7_LQBr=Ac zCUJFS74XLyHbmk=cYhe0r(1xYRW3B42z1+(V}co6q+%q89&?kWs1z6sq8ip)H6~5@ zKX{Q4ay2hLxvvL7N?+S0OG0wFcN zOmx_>2c7_ob2&6A93r83HVF?IUrkdUQVWqZ2tSb** z_?Y8WQMVsf0Z1a|`^JnyCPN;1!SHM~u4jn!%~JOaGDt+5^^Wk&AoGF_Rwr%v#RqNB z^BR`JJz=_{Oi3=zh7n!t=OS*Iz(7>vdnQGWr<25B)^c%&OW3^6SpZmG;`xuH8B+VO zqCo(j440e}pog)y?qyV&-u+w!X?aLYff{Yoz~eY`4-%9K7Lu5P1gjYyTyw;q*EP_y z>I+H0Bx2QOg*=v5d%~eg5;ud4sw#3HmMWMZt|@K3a|%<`|#d9uT$P}UyK-o9jI{JbB*otHY(o}XNnR4etVO_! zMgk@pUZ?GjiBV2QUo&580yC7;oU&`E@t3kCB1!l~;{b}FTyFTR6~(WwCcgNpjDQS} zz6-dpVI#dbs6?Z zU(Z=U&cXP$tHJjSd4?Myn>5Dc=r8!0V)J8oL zY_(O$-RBoaBq5r8rE%$#sA80O4@r$tfF0Ol1TF+$&CP$Qpb;CmX>g1^bTh z=2Wyq^+7!62ml|!;b@Kwv?8Vk#@;&4d|C(;qEC)YUsITz0%Ov$Y%`h5T*V=1tPUih zT;iTsL(87mIGqvvnI>NH`)AI7A@@v}fE+LToMC|N!u8EzLohQdc8t!xg$}V~DPo*R zunYAtE{q8bTEQV0h8W4jM(Q9C%Ck%&K-9J`Go%yW7xzFQtYx3Dk8^LJ z0}5d-F!BP~48BlN=Ne7iWZ5eam6oj#A$Nft4LYolG04_y5EswmC&_w{3Ek|{ILp!r zIylN!nHG<}7()m~R5w4~^J7E1oQ4tc!wDnw**(Af8DuctCRcs~U7^3m827ge;Zf`s z>mlfYHNXy1fZ$@^v~XtAdl|AU<%&oPke1gOnnaXBd36iMf_q`)%+_E4aFsDB2$1A? z8by|FryygBSoi32V-Y0)gvUY~S0-Q613J+Piu5pjC6P%4EgSj@$-uOUg`+(s$0vU0 znG!G>Bhy%!u-i&O$+uO;L(ri()Y*3%jCW_jxg^0Wa|fn8{t%t46bOqmedH|BY*kWO z8TU1lmm^nb}R;f`s5}euyP6pq4qK5tXfGE4id(N_fNR}0~E+Sr~ArB zY$M$>3&s)ZFYYo%X0e8*(-@p*D1eWGGiRXQPSFu_th;x@*U;C)6k{wp9ZK;lnv@dF zK$GJmsj^rTzypaKQL;+W1CYi$CRf#kqDT-E1HE2s2^aM%26M_(cK6;OGO>syOv2t@ zu=v)xQO;Cc4QG-FC&7snnF6)%lMDd-aK-~fFYAcNxN0C!dA0P%fFv?+@8^?pq=QGe zpSB@hIsD8wp-2J81jl2lf0U2OhBc`~h>;yeG(v|KoSBdN-cVM(7cfiHDJHf-{9+bc zRcc4|k}~ICJjpugi;G?eF3|MNIaG<@x1XFANuOhI=e=sN_(U>9qcd{2y+)vu9)*=t zgk?zTx(?4rr+5YE^qU1&bkW8ny5K@9*YtgU(lvx?6+aCbB@@-Nz+f@u*ltF|LyHp> zKB8<9XQ8ZZvxNEgXk*_dKt_?YRJtE59%0O(Ws4|^$X3}*5c2jX$)|b4n2`i$Ie;km z>$%E#M+mGr(h6DloLT<>D?f!8hrsu#MEhlqm?Sd;k4mMt)XMz4QrwH^D zYkxX2OG^_23J7W1)RyPVVgmL3vXEVQV77jsuZX)b;ckOW!w=}1kIcitb4KCHC3pJUh+wu1s`zFp|9)UdAUNZC+F; zF<%ww9unqydeN)>+hw1bu)Fbi$R(K;e*t{vC-2i^?sCVsIXKZRZzS{O^5kw*6SpbA zF$7K(@rcBK>XbZcam2ue%S8>|NR}?E+Q1}6eQ8}@AnlH+5gxk4!I@1!b_vWFsUJZ+ z;_LGBfOgvmc_sLu^M{>x`7;2+r!R(IzZ99eQGtj?m-LO~x}~yRqyQe1>yw)I%G_Oc zWJBdieGV17;|t{03{@XXc|DV-=1_d*__-hDOp2CX{Zq^px6;)~jiN45$Rgj|73OrL`zMN$(aM5w4+;~a}z)7txkKBN4rDs41Y z9gkbRYOXLP5I~mHK2J$8zNw<1!|{$jntV)Q9n&xLs|ifYB0(CmI1@LK^sl@~q5RP{AB9t?;Rk-_sE;Xh(Au}7JaSOis#v0#8n+-DP?r1iO6xdb;}U(td~HOpyvDRGB~l*d^OnglZwvFn5r zmcaWb!-W`!_`(UbnP=N6uc%!=o#n5&khch2({YbZ8X9>=-JYurAEdaRn7q)mI!)59bOB{l@Jd%Td~vwysaDRzeNWuHR*s~2%k zDE|O>iqA5CwrdCchKLlLi0BdPkOfrxE_W596o{;N{{W{SY1w

Te?V8>2H322T6d~5K98N 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

XH$1!8xQ;5IeB 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%0AOHs|Pz7NY^_h(f%HuQ$D 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�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 a3I71`DkCqTNhDYQ0L5xiEB^rUh5y<8>%F@G literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 9c0fb7306..bd84e47cb 100644 --- a/readme.md +++ b/readme.md @@ -1,21 +1,22 @@

- Walter + Agentic

- Agentic recommendations for AI-native products... + AI agent stdlib that works with any AI SDK and LLM

- Build Status + Build Status + NPM MIT License Prettier Code Formatting - Discuss on Twitter

-# @agentic/stdlib +# Agentic -**TODO: this is an active WIP** +> [!WARNING] +> TODO: this project is not published yet and is an active WIP. The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based usage** across any popular AI SDK via simple adaptors. @@ -73,7 +74,6 @@ async function main() { const runner = createAIRunner({ chatModel: new ChatModel({ params: { model: 'gpt-4o', temperature: 0 } - // debug: true }), functions: createDexterFunctions( perigon.functions.pick('search_news_stories'), @@ -92,18 +92,24 @@ async function main() { Here we've exposed 2 functions to the LLM, `search_news_stories` which corresponds to the `PerigonClient.searchStories` method and `serper_google_search` via the `SerperClient.search` method. -All of the SDK adaptors like `createDexterFunctions` are very flexible in what they accept, which is why we can pass an `AIFunctionSet` (like `perigon.functions.pick('search_news_stories')` or `perigon.functions` or `serper.functions`) or an `AIFunctioProvider` (like `perigon` or `serper`) or an individual `AIFunction` (like `perigon.functions.get('search_news_stories')` or `serper.functions.get('serper_google_search')`). You can pass as many or as few of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` sets via `.pick`, `.omit`, and `.map`. +All of the SDK adaptors like `createDexterFunctions` are very flexible in what they accept. `AIFunctionLike` objects include: + +- `AIFunctionSet` - Sets of AI functions (like `perigon.functions.pick('search_news_stories')` or `perigon.functions` or `serper.functions`) +- `AIFunctionsProvider` - Client classes which expose an `AIFunctionSet` via the `.functions` property (like `perigon` or `serper`) +- `AIFunction` - Individual functions (like `perigon.functions.get('search_news_stories')` or `serper.functions.get('serper_google_search')`) + +You can pass as many or as few of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` objects via `.pick`, `.omit`, `.get`, `.map`, etc. The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as lightweight as possible. -## Goals +## Client Goals - clients should be as minimal as possible - clients must use `ky` as a lightweight native fetch wrapper - clients must have a strongly-typed TS DX - clients should expose select methods via the `@aiFunction(...)` decorator - `@aiFunction` methods must use `zod` for input schema validation -- it should be easy to create external clients which follow the `AIFunctioProvider` superclass / `@aiFunction` decorator pattern +- it should be easy to create external clients which follow the `AIFunctionsProvider` superclass / `@aiFunction` decorator pattern - common utility functions for LLM-based function calling should be exported for convenience - clients and AIFunctions should be composable via `AIFunctionSet` - clients must work with all major TS AI SDKs @@ -166,6 +172,6 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## License -PROPRIETARY © [Travis Fischer](https://twitter.com/transitive_bs) +MIT © [Travis Fischer](https://twitter.com/transitive_bs) To stay up to date or learn more, follow [@transitive_bs](https://twitter.com/transitive_bs) on Twitter. From 7f098d1ec32b7c49c0b7d5af3875833db596a528 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 06:31:02 -0500 Subject: [PATCH 50/81] =?UTF-8?q?=F0=9F=92=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/readme.md b/readme.md index bd84e47cb..70bdc30ce 100644 --- a/readme.md +++ b/readme.md @@ -113,12 +113,12 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - common utility functions for LLM-based function calling should be exported for convenience - clients and AIFunctions should be composable via `AIFunctionSet` - clients must work with all major TS AI SDKs - - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/core` + - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/stdlib` - SDK adatptor entrypoints should all be isolated to their own top-level imports - - `@agentic/core/ai-sdk` - - `@agentic/core/dexter` - - `@agentic/core/genkit` - - `@agentic/core/langchain` + - `@agentic/stdlib/ai-sdk` + - `@agentic/stdlib/dexter` + - `@agentic/stdlib/genkit` + - `@agentic/stdlib/langchain` ## Services From 3269e9b67d21ab1c2df61dcc89a2c5f3c3ab5593 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 06:38:59 -0500 Subject: [PATCH 51/81] =?UTF-8?q?=F0=9F=8F=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 10 ++++++++++ pnpm-lock.yaml | 8 ++++++++ src/services/perigon-client.ts | 4 +--- src/tools/calculator.ts | 22 ++++++++++++++++++++++ tsup.config.ts | 3 ++- 5 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 src/tools/calculator.ts diff --git a/package.json b/package.json index 42cd3864d..7728f8bea 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,11 @@ "types": "./dist/sdks/genkit.d.ts", "import": "./dist/sdks/genkit.js", "default": "./dist/sdks/genkit.js" + }, + "./calculator": { + "types": "./dist/tools/calculator.d.ts", + "import": "./dist/tools/calculator.js", + "default": "./dist/tools/calculator.js" } }, "files": [ @@ -81,6 +86,7 @@ "del-cli": "^5.1.0", "dotenv": "^16.4.5", "eslint": "^8.57.0", + "expr-eval": "^2.0.2", "husky": "^9.0.11", "lint-staged": "^15.2.5", "np": "^10.0.5", @@ -99,6 +105,7 @@ "@dexaai/dexter": "^2.0.3", "@genkit-ai/ai": "^0.5.2", "@langchain/core": "^0.2.5", + "expr-eval": "^2.0.2", "ai": "^3.1.22" }, "peerDependenciesMeta": { @@ -111,6 +118,9 @@ "@langchain/core": { "optional": true }, + "expr-eval": { + "optional": true + }, "ai": { "optional": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2da374468..a16bcc452 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,6 +75,9 @@ importers: eslint: specifier: ^8.57.0 version: 8.57.0 + expr-eval: + specifier: ^2.0.2 + version: 2.0.2 husky: specifier: ^9.0.11 version: 9.0.11 @@ -1914,6 +1917,9 @@ packages: resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} engines: {node: '>=18'} + expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} @@ -6519,6 +6525,8 @@ snapshots: exit-hook@4.0.0: {} + expr-eval@2.0.2: {} + express@4.19.2: dependencies: accepts: 1.3.8 diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index b239c9dbd..e378ed1b4 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -106,13 +106,11 @@ export namespace perigon { q: z.string() .describe(`Search query. It may use boolean operators (AND, OR, NOT) and quotes for exact matching. Example search queries: -- AI agents -- Compare the latest predictions and popular opinions on the 2024 US election +- election news - "elon musk" AND tesla - (upcoming release OR launch) AND apple - (Google OR Amazon) AND NOT ("Jeff Bezos" OR Android) - "climate change" -- Crypto* OR Bitcoin NOT Ethereum `), title: z .string() diff --git a/src/tools/calculator.ts b/src/tools/calculator.ts new file mode 100644 index 000000000..bed49c436 --- /dev/null +++ b/src/tools/calculator.ts @@ -0,0 +1,22 @@ +import { Parser } from 'expr-eval' +import { z } from 'zod' + +import { createAIFunction } from '../create-ai-function.js' + +export const CalculatorInputSchema = z.object({ + expr: z.string().describe('mathematical expression to evaluate') +}) +export type CalculatorInput = z.infer + +export const calculator = createAIFunction( + { + name: 'calculator', + description: + 'Computes the result of simple mathematical expressions. Handles basic arithmetic operations like addition, subtraction, multiplication, division, exponentiation, and common functions like sin, cos, abs, exp, and random.', + inputSchema: CalculatorInputSchema + }, + async (input: CalculatorInput) => { + const result: number = Parser.evaluate(input.expr) + return result + } +) diff --git a/tsup.config.ts b/tsup.config.ts index 65b2015c9..30d2242dd 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -6,7 +6,8 @@ export default defineConfig([ 'src/index.ts', 'src/sdks/ai-sdk.ts', 'src/sdks/dexter.ts', - 'src/sdks/genkit.ts' + 'src/sdks/genkit.ts', + 'src/tools/calculator.ts' ], outDir: 'dist', target: 'node18', From 2ae6a2e49a1fb7ba635b2b0a03f14e45e8c873bb Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 06:49:46 -0500 Subject: [PATCH 52/81] =?UTF-8?q?=F0=9F=90=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/people-data-labs-client.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts index dc980eee6..9405500f8 100644 --- a/src/services/people-data-labs-client.ts +++ b/src/services/people-data-labs-client.ts @@ -1,7 +1,7 @@ import defaultKy, { type KyInstance } from 'ky' import pThrottle from 'p-throttle' -import { assert, getEnv, throttleKy } from '../utils.js' +import { assert, getEnv, sanitizeSearchParams, throttleKy } from '../utils.js' /** * TODO: I'm holding off on converting this client to an `AIFunctionsProvider` @@ -515,8 +515,7 @@ export class PeopleDataLabsClient { async companyProfile(options: peopledatalabs.CompanyLookupOptions) { return this.ky .get('company/enrich', { - // @ts-expect-error location is a string[] and searchparams shows a TS error heres - searchParams: { ...options } + searchParams: sanitizeSearchParams({ ...options }) }) .json() } From 6045e2323c712f067b26e503cdfce0a64471d34f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 07:17:55 -0500 Subject: [PATCH 53/81] =?UTF-8?q?=F0=9F=8E=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 9 ++++- pnpm-lock.yaml | 35 +++++++++++++++++ readme.md | 5 ++- src/url-utils.ts | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.ts | 5 +++ 5 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 src/url-utils.ts diff --git a/package.json b/package.json index 7728f8bea..4684a1723 100644 --- a/package.json +++ b/package.json @@ -66,9 +66,14 @@ "@nangohq/node": "^0.39.32", "dedent": "^1.5.3", "delay": "^6.0.0", + "hash-object": "^5.0.1", + "is-relative-url": "^4.0.0", "jsonrepair": "^3.6.1", "ky": "^1.2.4", + "normalize-url": "^8.0.1", + "p-map": "^7.0.2", "p-throttle": "^6.1.0", + "quick-lru": "^7.0.0", "twitter-api-sdk": "^1.2.1", "type-fest": "^4.18.3", "zod": "^3.23.3", @@ -105,8 +110,8 @@ "@dexaai/dexter": "^2.0.3", "@genkit-ai/ai": "^0.5.2", "@langchain/core": "^0.2.5", - "expr-eval": "^2.0.2", - "ai": "^3.1.22" + "ai": "^3.1.22", + "expr-eval": "^2.0.2" }, "peerDependenciesMeta": { "@dexaai/dexter": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a16bcc452..737a2c459 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,15 +20,30 @@ importers: delay: specifier: ^6.0.0 version: 6.0.0 + hash-object: + specifier: ^5.0.1 + version: 5.0.1 + is-relative-url: + specifier: ^4.0.0 + version: 4.0.0 jsonrepair: specifier: ^3.6.1 version: 3.8.0 ky: specifier: ^1.2.4 version: 1.3.0 + normalize-url: + specifier: ^8.0.1 + version: 8.0.1 + p-map: + specifier: ^7.0.2 + version: 7.0.2 p-throttle: specifier: ^6.1.0 version: 6.1.0 + quick-lru: + specifier: ^7.0.0 + version: 7.0.0 twitter-api-sdk: specifier: ^1.2.1 version: 1.2.1 @@ -2320,6 +2335,10 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-any-array@2.0.1: resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} @@ -2492,6 +2511,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-relative-url@4.0.0: + resolution: {integrity: sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==} + engines: {node: '>=14.16'} + is-scoped@3.0.0: resolution: {integrity: sha512-ezxLUq30kiTvP0w/5n9tj4qTOKlrA07Oty1hwTQ+lcqw11x6uc8sp7VRb2OVGRzKfCHZ2A22T5Zsau/Q2Akb0g==} engines: {node: '>=12'} @@ -3529,6 +3552,10 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + quick-lru@7.0.0: + resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + engines: {node: '>=18'} + ramda@0.29.1: resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} @@ -7005,6 +7032,8 @@ snapshots: ipaddr.js@1.9.1: {} + is-absolute-url@4.0.1: {} + is-any-array@2.0.1: {} is-array-buffer@3.0.4: @@ -7140,6 +7169,10 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-relative-url@4.0.0: + dependencies: + is-absolute-url: 4.0.1 + is-scoped@3.0.0: dependencies: scoped-regex: 3.0.0 @@ -8088,6 +8121,8 @@ snapshots: quick-lru@5.1.1: {} + quick-lru@7.0.0: {} + ramda@0.29.1: {} range-parser@1.2.1: {} diff --git a/readme.md b/readme.md index 70bdc30ce..2f8efd13c 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,5 @@

- Agentic + Agentic

@@ -154,7 +154,6 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - instructor-js - TODO - services - - calculator - e2b - search-and-scrape - replicate @@ -166,6 +165,8 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - provide a converter for langchain `DynamicStructuredTool` - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) +- tools + - calculator - tools / chains / flows / runnables - market maps - https://github.com/causaly/zod-validation-error diff --git a/src/url-utils.ts b/src/url-utils.ts new file mode 100644 index 000000000..3fab95a49 --- /dev/null +++ b/src/url-utils.ts @@ -0,0 +1,99 @@ +import isRelativeUrlImpl from 'is-relative-url' +import normalizeUrlImpl, { type Options } from 'normalize-url' +import QuickLRU from 'quick-lru' + +import { hashObject } from './utils.js' + +const protocolAllowList = new Set(['https:', 'http:']) +const normalizedUrlCache = new QuickLRU({ + maxSize: 4000 +}) + +/** + * Checks if a URL is crawlable. + * + * @param url - URL string to check + * @returns whether the URL is crawlable + */ +export function isValidCrawlableUrl(url: string): boolean { + try { + if (!url || isRelativeUrl(url)) { + return false + } + + const parsedUrl = new URL(url) + if (!protocolAllowList.has(parsedUrl.protocol)) { + return false + } + + const normalizedUrl = normalizeUrl(url) + if (!normalizedUrl) { + return false + } + + return true + } catch { + return false + } +} + +export function isRelativeUrl(url: string): boolean { + if (!url || typeof url !== 'string') return false + + return isRelativeUrlImpl(url) && !url.startsWith('//') +} + +/** + * Normalizes a URL string. + * + * @param url - URL string to normalize + * @param options - options for normalization. + * @returns normalized URL string or null if an invalid URL was passed + */ +export function normalizeUrl( + url: string, + options?: Options +): string | undefined { + let normalizedUrl: string | undefined + let cacheKey: string | undefined + + try { + if (!url || isRelativeUrl(url)) { + return + } + + const opts = { + stripWWW: false, + defaultProtocol: 'https', + normalizeProtocol: true, + forceHttps: false, + stripHash: false, + stripTextFragment: true, + removeQueryParameters: [/^utm_\w+/i, 'ref', 'ref_src'], + removeTrailingSlash: true, + removeSingleSlash: true, + removeExplicitPort: true, + sortQueryParameters: true, + ...options + } as Required + + const optionsHash = hashObject(opts) + cacheKey = `${url}-${optionsHash}` + normalizedUrl = normalizedUrlCache.get(cacheKey) + + if (normalizedUrl !== undefined) { + return normalizedUrl + } + + normalizedUrl = normalizeUrlImpl(url, opts) + } catch { + // ignore invalid urls + normalizedUrl = undefined + } + + if (cacheKey) { + normalizedUrlCache.set(cacheKey, normalizedUrl!) + } + + return normalizedUrl +} diff --git a/src/utils.ts b/src/utils.ts index 10ae0b8d9..7d6d0d140 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,6 @@ import type { Jsonifiable } from 'type-fest' import dedent from 'dedent' +import hashObjectImpl from 'hash-object' import type * as types from './types.js' @@ -140,3 +141,7 @@ const dedenter = dedent.withOptions({ escapeSpecialCharacters: true }) export function cleanStringForModel(text: string): string { return dedenter(text).trim() } + +export function hashObject(object: Record): string { + return hashObjectImpl(object, { algorithm: 'sha256' }) +} From 7d11f7632a070230ce6ea26fbac76a1a5dd0292e Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 18:59:44 -0500 Subject: [PATCH 54/81] feat: add wolfram alpha client --- bin/scratch.ts | 22 ++++++--- readme.md | 8 ++- src/services/index.ts | 1 + src/services/wolfram-client.ts | 90 ++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 src/services/wolfram-client.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index 5472bd0ff..aeb792626 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -10,7 +10,8 @@ import restoreCursor from 'restore-cursor' // import { PerigonClient } from '../src/index.js' // import { FirecrawlClient } from '../src/index.js' // import { ExaClient } from '../src/index.js' -import { DiffbotClient } from '../src/index.js' +// import { DiffbotClient } from '../src/index.js' +import { WolframClient } from '../src/index.js' /** * Scratch pad for testing. @@ -65,15 +66,24 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const diffbot = new DiffbotClient() + // const diffbot = new DiffbotClient() + // // const res = await diffbot.analyzeUrl({ + // // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + // // }) + // const res = await diffbot.enhanceEntity({ + // type: 'Person', + // name: 'Kevin Raheja' + // }) + // console.log(JSON.stringify(res, null, 2)) + + const wolfram = new WolframClient() // const res = await diffbot.analyzeUrl({ // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' // }) - const res = await diffbot.enhanceEntity({ - type: 'Person', - name: 'Kevin Raheja' + const res = await wolfram.ask({ + input: 'population of new york city' }) - console.log(JSON.stringify(res, null, 2)) + console.log(res) } try { diff --git a/readme.md b/readme.md index 2f8efd13c..36b44861b 100644 --- a/readme.md +++ b/readme.md @@ -149,24 +149,22 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## TODO - rename this repo to agentic -- change license to MIT - sdks - - instructor-js - TODO - services - e2b - search-and-scrape - replicate - huggingface - - wolfram alpha + - [skyvern](https://github.com/Skyvern-AI/skyvern) - midjourney - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) - provide a converter for langchain `DynamicStructuredTool` - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) -- tools - - calculator + - pull from [activepieces](https://github.com/activepieces/activepieces/tree/main/packages/pieces/community) + - general openapi support ala [workgpt](https://github.com/team-openpm/workgpt) - tools / chains / flows / runnables - market maps - https://github.com/causaly/zod-validation-error diff --git a/src/services/index.ts b/src/services/index.ts index d477b668c..4c15b1112 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -14,3 +14,4 @@ export * from './serper-client.js' export * from './twitter-client.js' export * from './weather-client.js' export * from './wikipedia-client.js' +export * from './wolfram-client.js' diff --git a/src/services/wolfram-client.ts b/src/services/wolfram-client.ts new file mode 100644 index 000000000..faf92102c --- /dev/null +++ b/src/services/wolfram-client.ts @@ -0,0 +1,90 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv } from '../utils.js' + +export namespace wolfram { + export const API_BASE_URL = 'https://www.wolframalpha.com/api/' + + export const AskWolframAlphaOptionsSchema = z.object({ + input: z.string().describe('english query'), + maxchars: z + .number() + .int() + .positive() + .default(6000) + .optional() + .describe('max characters to generate in the response') + }) + export type AskWolframAlphaOptions = z.infer< + typeof AskWolframAlphaOptionsSchema + > +} + +/** + * Wolfram Alpha LLM API client for answering computational, mathematical, and + * scientific questions. + * + * @see https://products.wolframalpha.com/llm-api/documentation + */ +export class WolframClient extends AIFunctionsProvider { + readonly ky: KyInstance + readonly appId: string + readonly apiBaseUrl: string + + constructor({ + appId = getEnv('WOLFRAM_APP_ID'), + apiBaseUrl = wolfram.API_BASE_URL, + ky = defaultKy + }: { + appId?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + appId, + 'WolframClient missing required "appId" (defaults to "WOLFRAM_APP_ID")' + ) + super() + + this.appId = appId + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + headers: { + Authorization: `Bearer ${appId}` + } + }) + } + + @aiFunction({ + name: 'ask_wolfram_alpha', + description: ` +- WolframAlpha understands natural language queries about entities in chemistry, physics, geography, history, art, astronomy, and more. +- WolframAlpha performs mathematical calculations, date and unit conversions, formula solving, etc. +- Convert inputs to simplified keyword queries whenever possible (e.g. convert "how many people live in France" to "France population"). +- Send queries in English only; translate non-English queries before sending, then respond in the original language. +- ALWAYS use this exponent notation: \`6*10^14\`, NEVER \`6e14\`. +- ALWAYS use proper Markdown formatting for all math, scientific, and chemical formulas, symbols, etc.: '$$\n[expression]\n$$' for standalone cases and '( [expression] )' when inline. +- Use ONLY single-letter variable names, with or without integer subscript (e.g., n, n1, n_1). +- Use named physical constants (e.g., 'speed of light') without numerical substitution. +- Include a space between compound units (e.g., "Ω m" for "ohm*meter"). +- To solve for a variable in an equation with units, consider solving a corresponding equation without units; exclude counting units (e.g., books), include genuine units (e.g., kg). +- If a WolframAlpha result is not relevant to the query: + - If Wolfram provides multiple 'Assumptions' for a query, choose the more relevant one(s) without explaining the initial result. If you are unsure, ask the user to choose. + - Re-send the exact same 'input' with NO modifications, and add the 'assumption' parameter, formatted as a list, with the relevant values. + - ONLY simplify or rephrase the initial query if a more relevant 'Assumption' or other input suggestions are not provided. +`.trim(), + inputSchema: wolfram.AskWolframAlphaOptionsSchema + }) + async ask(queryOrOptions: string | wolfram.AskWolframAlphaOptions) { + const options = + typeof queryOrOptions === 'string' + ? { input: queryOrOptions } + : queryOrOptions + + return this.ky.get('v1/llm-api', { searchParams: { ...options } }).text() + } +} From 24857b1b3450240cd8d7aa86bc7a60dc57118e2e Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 19:58:50 -0500 Subject: [PATCH 55/81] feat: add llamaindex sdk adaptor --- examples/llamaindex/weather.ts | 26 + examples/package.json | 1 + package.json | 7 +- pnpm-lock.yaml | 3210 +++++++++++++++++++++++++++++++- readme.md | 4 + src/sdks/llamaindex.ts | 22 + src/tools/calculator.ts | 3 + 7 files changed, 3170 insertions(+), 103 deletions(-) create mode 100644 examples/llamaindex/weather.ts create mode 100644 src/sdks/llamaindex.ts diff --git a/examples/llamaindex/weather.ts b/examples/llamaindex/weather.ts new file mode 100644 index 000000000..f4d2be38f --- /dev/null +++ b/examples/llamaindex/weather.ts @@ -0,0 +1,26 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { OpenAI, OpenAIAgent } from 'llamaindex' + +import { WeatherClient } from '../../src/index.js' +import { createLlamaIndexTools } from '../../src/sdks/llamaindex.js' + +async function main() { + const weather = new WeatherClient() + + const tools = createLlamaIndexTools(weather) + const agent = new OpenAIAgent({ + llm: new OpenAI({ model: 'gpt-4o', temperature: 0 }), + systemPrompt: 'You are a helpful assistant. Be as concise as possible.', + tools + }) + + const response = await agent.chat({ + message: 'What is the weather in San Francisco?' + }) + + console.log(response.response.message.content) +} + +await main() diff --git a/examples/package.json b/examples/package.json index 5e90477da..b25a931e5 100644 --- a/examples/package.json +++ b/examples/package.json @@ -35,6 +35,7 @@ "dotenv": "^16.4.5", "genkitx-openai": "^0.9.0", "langchain": "^0.2.4", + "llamaindex": "^0.3.15", "openai": "^4.47.3", "zod": "^3.23.3" } diff --git a/package.json b/package.json index 4684a1723..7bffa1737 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "expr-eval": "^2.0.2", "husky": "^9.0.11", "lint-staged": "^15.2.5", + "llamaindex": "^0.3.15", "np": "^10.0.5", "npm-run-all2": "^6.2.0", "only-allow": "^1.2.1", @@ -111,7 +112,8 @@ "@genkit-ai/ai": "^0.5.2", "@langchain/core": "^0.2.5", "ai": "^3.1.22", - "expr-eval": "^2.0.2" + "expr-eval": "^2.0.2", + "llamaindex": "^0.3.15" }, "peerDependenciesMeta": { "@dexaai/dexter": { @@ -126,6 +128,9 @@ "expr-eval": { "optional": true }, + "llamaindex": { + "optional": true + }, "ai": { "optional": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 737a2c459..44048163f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ importers: version: 7.0.0 twitter-api-sdk: specifier: ^1.2.1 - version: 1.2.1 + version: 1.2.1(encoding@0.1.13) type-fest: specifier: ^4.18.3 version: 4.18.3 @@ -68,10 +68,10 @@ importers: version: 0.5.2 '@instructor-ai/instructor': specifier: ^1.3.0 - version: 1.3.0(openai@4.47.3)(zod@3.23.8) + version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + version: 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 @@ -80,7 +80,7 @@ importers: version: 20.13.0 ai: specifier: ^3.1.22 - version: 3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) del-cli: specifier: ^5.1.0 version: 5.1.0 @@ -99,6 +99,9 @@ importers: lint-staged: specifier: ^15.2.5 version: 15.2.5 + llamaindex: + specifier: ^0.3.15 + version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5) np: specifier: ^10.0.5 version: 10.0.5(typescript@5.4.5) @@ -149,28 +152,31 @@ importers: version: 0.5.2 '@instructor-ai/instructor': specifier: ^1.3.0 - version: 1.3.0(openai@4.47.3)(zod@3.23.8) + version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + version: 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) '@langchain/openai': specifier: ^0.1.1 - version: 0.1.1(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3)) + version: 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0)) ai: specifier: ^3.1.22 - version: 3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) dotenv: specifier: ^16.4.5 version: 16.4.5 genkitx-openai: specifier: ^0.9.0 - version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2) + version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13) langchain: specifier: ^0.2.4 - version: 0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3) + version: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0) + llamaindex: + specifier: ^0.3.15 + version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5) openai: specifier: ^4.47.3 - version: 4.47.3 + version: 4.47.3(encoding@0.1.13) zod: specifier: ^3.23.3 version: 3.23.8 @@ -200,6 +206,161 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@anthropic-ai/sdk@0.20.9': + resolution: {integrity: sha512-Lq74+DhiEQO6F9/gdVOLmHx57pX45ebK2Q/zH14xYe1157a7QeUVknRqIp0Jz5gQI01o7NKbuv9Dag2uQsLjDg==} + + '@aws-crypto/crc32@3.0.0': + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + + '@aws-crypto/ie11-detection@3.0.0': + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + + '@aws-crypto/sha256-browser@3.0.0': + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + + '@aws-crypto/sha256-js@3.0.0': + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@3.0.0': + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + + '@aws-crypto/util@3.0.0': + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cognito-identity@3.590.0': + resolution: {integrity: sha512-Nfn23x7yZgp1umB+Avvsw9t8XIFWEqNQcpJ10Q8RcI9bQ0SvR4OcnnVsBA0WFL53FVzVM2FAkjNrCMRaSe6xWw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sagemaker@3.590.0': + resolution: {integrity: sha512-PfzwrG12MS0hkBrH9dDRtTpYx2eAlzO9yZtBpz4CuCRToMFbFCga+A8a3pgJoimfwcuGTKjGwmkIx1/sdpsIsg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.590.0': + resolution: {integrity: sha512-3yCLPjq6WFfDpdUJKk/gSz4eAPDTjVknXaveMPi2QoVBCshneOnJsV16uNKlpVF1frTHrrDRfKYmbaVh6nFBvQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso@3.590.0': + resolution: {integrity: sha512-6xbC6oQVJKBRTyXyR3C15ksUsPOyW4p+uCj7dlKYWGJvh4vGTV8KhZKS53oPG8t4f1+OMJWjr5wKuXRoaFsmhQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.590.0': + resolution: {integrity: sha512-f4R1v1LSn4uLYZ5qj4DyL6gp7PXXzJeJsm2seheiJX+53LSF5L7XSDnQVtX1p9Tevv0hp2YUWUTg6QYwIVSuGg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.588.0': + resolution: {integrity: sha512-O1c2+9ce46Z+iiid+W3iC1IvPbfIo5ev9CBi54GdNB9SaI8/3+f8MJcux0D6c9toCF0ArMersN/gp8ek57e9uQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.590.0': + resolution: {integrity: sha512-28vRC0BYaDVWU9AzGBywTRmwiwQfkixfOZGcY6e5J6cRjVoawomvHmC2mJd11SjoDcVLUQF+z4Z9z1ZCr1GcpA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.587.0': + resolution: {integrity: sha512-Hyg/5KFECIk2k5o8wnVEiniV86yVkhn5kzITUydmNGCkXdBFHMHRx6hleQ1bqwJHbBskyu8nbYamzcwymmGwmw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.587.0': + resolution: {integrity: sha512-Su1SRWVRCuR1e32oxX3C1V4c5hpPN20WYcRfdcr2wXwHqSvys5DrnmuCC+JoEnS/zt3adUJhPliTqpfKgSdMrA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.590.0': + resolution: {integrity: sha512-Y5cFciAK38VIvRgZeND7HvFNR32thGtQb8Xop6cMn33FC78uwcRIu9Hc9699XTclCZqz4+Xl1WU+dZ+rnFn2AA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.590.0 + + '@aws-sdk/credential-provider-node@3.590.0': + resolution: {integrity: sha512-Ky38mNFoXobGrDQ11P3dU1e+q1nRJ7eZl8l15KUpvZCe/hOudbxQi/epQrCazD/gRYV2fTyczdLlZzB5ZZ8DhQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.587.0': + resolution: {integrity: sha512-V4xT3iCqkF8uL6QC4gqBJg/2asd/damswP1h9HCfqTllmPWzImS+8WD3VjgTLw5b0KbTy+ZdUhKc0wDnyzkzxg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.590.0': + resolution: {integrity: sha512-v+0j/I+je9okfwXsgmLppmwIE+TuMp5WqLz7r7PHz9KjzLyKaKTDvfllFD+8oPpBqnmOWiJ9qTGPkrfhB7a/fQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.587.0': + resolution: {integrity: sha512-XqIx/I2PG7kyuw3WjAP9wKlxy8IvFJwB8asOFT1xPFoVfZYKIogjG9oLP5YiRtfvDkWIztHmg5MlVv3HdJDGRw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.587.0 + + '@aws-sdk/credential-providers@3.590.0': + resolution: {integrity: sha512-Z4SHk/GCoM5JEJOH3+xr2I7VvPGdeGPHL1cck/UFIN1Fap1wT3uIsTW92Rhru2AvnhQnAPpDUOHO9/hDJk1MDA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-host-header@3.577.0': + resolution: {integrity: sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.577.0': + resolution: {integrity: sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.577.0': + resolution: {integrity: sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.587.0': + resolution: {integrity: sha512-SyDomN+IOrygLucziG7/nOHkjUXES5oH5T7p8AboO8oakMQJdnudNXiYWTicQWO52R51U6CR27rcMPTGeMedYA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/protocol-http@3.374.0': + resolution: {integrity: sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==} + engines: {node: '>=14.0.0'} + deprecated: This package has moved to @smithy/protocol-http + + '@aws-sdk/region-config-resolver@3.587.0': + resolution: {integrity: sha512-93I7IPZtulZQoRK+O20IJ4a1syWwYPzoO2gc3v+/GNZflZPV3QJXuVbIm0pxBsu0n/mzKGUKqSOLPIaN098HcQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/signature-v4@3.374.0': + resolution: {integrity: sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==} + engines: {node: '>=14.0.0'} + deprecated: This package has moved to @smithy/signature-v4 + + '@aws-sdk/token-providers@3.587.0': + resolution: {integrity: sha512-ULqhbnLy1hmJNRcukANBWJmum3BbjXnurLPSFXoGdV0llXYlG55SzIla2VYqdveQEEjmsBuTZdFvXAtNpmS5Zg==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.587.0 + + '@aws-sdk/types@3.577.0': + resolution: {integrity: sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.587.0': + resolution: {integrity: sha512-8I1HG6Em8wQWqKcRW6m358mqebRVNpL8XrrEoT4In7xqkKkmYtHRNVYP6lcmiQh5pZ/c/FXu8dSchuFIWyEtqQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.577.0': + resolution: {integrity: sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==} + + '@aws-sdk/util-user-agent-node@3.587.0': + resolution: {integrity: sha512-Pnl+DUe/bvnbEEDHP3iVJrOtE3HbFJBPgsD6vJ+ml/+IYk1Eq49jEG+EHZdNTPz3SDG0kbp2+7u41MKYJHR/iQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + '@babel/code-frame@7.24.6': resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} @@ -229,10 +390,21 @@ packages: resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@datastax/astra-db-ts@1.2.1': + resolution: {integrity: sha512-d0rptvx8EE8o4BqDvUaF84K6zsy5un0Q6T+UEHpnKzeTH9YK2DvgRmzbVNJOuqDg+iVrL7+xhP1MGOhWQgKFMQ==} + engines: {node: '>=14.0.0'} + '@dexaai/dexter@2.1.0': resolution: {integrity: sha512-3vhTSlpoW0DhQy2DaI3ocoZdw8RxBmsSysrGT0yZP6ZT2zHXlNVzYMj/ffbHmcR2y+VCkESKDJ/Vde4Ytf4agQ==} engines: {node: '>= 18'} @@ -393,6 +565,10 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@fastify/deepmerge@1.3.0': resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} @@ -408,6 +584,14 @@ packages: '@genkit-ai/core@0.5.2': resolution: {integrity: sha512-feAhel5qEdbfPTnBxCVHzfHLCV6WWVN0J5x2Av4AJMl3M04fQYhXmmPqdgTaiaEZ0nUZ1jSxpnn5aTk2U4VV/Q==} + '@google-cloud/vertexai@1.2.0': + resolution: {integrity: sha512-EH0dnoMRIBQzJEEOUWN03eWPSdLBFdsZA/am3eU+qYrnNyY9okUueOajZd79U48KwgFbqoFrCA9yHQ30DgfD8Q==} + engines: {node: '>=18.0.0'} + + '@google/generative-ai@0.11.5': + resolution: {integrity: sha512-DviMgrnljEKh6qkDT2pVFW+NEuVhggqBUoEnyy2PNL7l4ewxXRJubk3PctC9yPl1AdRIlhqP7E076QQt+IWuTg==} + engines: {node: '>=18.0.0'} + '@grpc/grpc-js@1.10.8': resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} engines: {node: '>=12.10.0'} @@ -417,6 +601,17 @@ packages: engines: {node: '>=6'} hasBin: true + '@huggingface/inference@2.7.0': + resolution: {integrity: sha512-u7Fn637Q3f7nUB1tajM4CgzhvoFQkOQr5W5Fm+2wT9ETgGoLBh25BLlYPTJRjAd2WY01s71v0lqAwNvHHCc3mg==} + engines: {node: '>=18'} + + '@huggingface/jinja@0.2.2': + resolution: {integrity: sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==} + engines: {node: '>=18'} + + '@huggingface/tasks@0.10.9': + resolution: {integrity: sha512-KdGnpw7sTLgr9nUwH6NrMHi/6/yBe5HdeXeKWauajseKZXwyrTYwNYIzMnh8/hE7Qa2UnseAdFMpCqe54vGd4A==} + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -486,6 +681,31 @@ packages: resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} + '@llamaindex/cloud@0.0.5': + resolution: {integrity: sha512-8HBSiAZkmX1RvpEM2czEVKqMUCKk7uvMSiDpMGWlEj3MUKBYCh+r8E2TtVhZfU4TunEI7nJRMcVBfXDyFz6Lpw==} + peerDependencies: + node-fetch: ^3.3.2 + peerDependenciesMeta: + node-fetch: + optional: true + + '@llamaindex/env@0.1.3': + resolution: {integrity: sha512-PM9cZ8x6jjdugWG30vBxb9Ju2LFmGY0l0pN7AUXXKULFNytQddx96xHh07pV/juf/WqjhFp75FVAykAlqO/qzQ==} + peerDependencies: + '@aws-crypto/sha256-js': ^5.2.0 + pathe: ^1.1.2 + peerDependenciesMeta: + '@aws-crypto/sha256-js': + optional: true + pathe: + optional: true + + '@mistralai/mistralai@0.2.0': + resolution: {integrity: sha512-mYjE9NovwWdhSXd6KvOgjWUyka2qlxhuohsqhRN4rFtH2MdTDJhAeH3Aqvu3P9q71Xz9oBX2pNWrPVVzkgwZTg==} + + '@mongodb-js/saslprep@1.1.7': + resolution: {integrity: sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==} + '@nangohq/node@0.39.32': resolution: {integrity: sha512-WmruUSZisKIB6Y3PIlhV/IjsPhag0DOqoP3RWZRXeI1MrenuKWRF6z31c+lViqfjTQoxp4KuEwx0QQbxMaztLg==} engines: {node: '>=18.0'} @@ -502,6 +722,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@notionhq/client@2.2.15': + resolution: {integrity: sha512-XhdSY/4B1D34tSco/GION+23GMjaS9S2zszcqYkMHo8RcWInymF6L1x+Gk7EmHdrSxNFva2WM8orhC4BwQCwgw==} + engines: {node: '>=12'} + '@opentelemetry/api-logs@0.49.1': resolution: {integrity: sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==} engines: {node: '>=14'} @@ -663,6 +887,13 @@ packages: resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} engines: {node: '>=14'} + '@petamoriken/float16@3.8.7': + resolution: {integrity: sha512-/Ri4xDDpe12NT6Ex/DRgHzLlobiQXEW/hmG08w1wj/YU7hLemk97c+zHQFp0iZQ9r7YqgLEXZR2sls4HxBf9NA==} + + '@pinecone-database/pinecone@2.2.2': + resolution: {integrity: sha512-gbe/4SowHc64pHIm0kBdgY9hVdzsQnnnpcWviwYMB33gOmsL8brvE8fUSpl1dLDvdyXzKcQkzdBsjCDlqgpdMA==} + engines: {node: '>=14.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -709,6 +940,16 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@qdrant/js-client-rest@1.9.0': + resolution: {integrity: sha512-YiX/IskbRCoAY2ujyPDI6FBcO0ygAS4pgkGaJ7DcrJFh4SZV2XHs+u0KM7mO72RWJn1eJQFF2PQwxG+401xxJg==} + engines: {node: '>=18.0.0', pnpm: '>=8'} + peerDependencies: + typescript: '>=4.7' + + '@qdrant/openapi-typescript-fetch@1.2.6': + resolution: {integrity: sha512-oQG/FejNpItrxRHoyctYvT3rwGZOnK4jr3JdppO/c78ktDvkWiPXPHNsrDf33K9sZdRb6PR7gi4noIapu5q4HA==} + engines: {node: '>=18.0.0', pnpm: '>=8'} + '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] @@ -804,13 +1045,226 @@ packages: zen-observable: optional: true + '@sevinf/maybe@0.5.0': + resolution: {integrity: sha512-ARhyoYDnY1LES3vYI0fiG6e9esWfTNcXcO6+MPJJXcnyMV3bim4lnFt45VXouV7y82F4x3YH8nOQ6VztuvUiWg==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.29.6': + resolution: {integrity: sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ==} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} + '@smithy/abort-controller@3.0.0': + resolution: {integrity: sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==} + engines: {node: '>=16.0.0'} + + '@smithy/config-resolver@3.0.1': + resolution: {integrity: sha512-hbkYJc20SBDz2qqLzttjI/EqXemtmWk0ooRznLsiXp3066KQRTvuKHa7U4jCZCJq6Dozqvy0R1/vNESC9inPJg==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.2.0': + resolution: {integrity: sha512-ygLZSSKgt9bR8HAxR9mK+U5obvAJBr6zlQuhN5soYWx/amjDoQN4dTkydTypgKe6rIbUjTILyLU+W5XFwXr4kg==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.1.0': + resolution: {integrity: sha512-q4A4d38v8pYYmseu/jTS3Z5I3zXlEOe5Obi+EJreVKgSVyWUHOd7/yaVCinC60QG4MRyCs98tcxBH1IMC0bu7Q==} + engines: {node: '>=16.0.0'} + + '@smithy/eventstream-codec@1.1.0': + resolution: {integrity: sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==} + + '@smithy/fetch-http-handler@3.0.1': + resolution: {integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==} + + '@smithy/hash-node@3.0.0': + resolution: {integrity: sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.0': + resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==} + + '@smithy/is-array-buffer@1.1.0': + resolution: {integrity: sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-content-length@3.0.0': + resolution: {integrity: sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.0.1': + resolution: {integrity: sha512-lQ/UOdGD4KM5kLZiAl0q8Qy3dPbynvAXKAdXnYlrA1OpaUwr+neSsVokDZpY6ZVb5Yx8jnus29uv6XWpM9P4SQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.3': + resolution: {integrity: sha512-Wve1qzJb83VEU/6q+/I0cQdAkDnuzELC6IvIBwDzUEiGpKqXgX1v10FUuZGbRS6Ov/P+HHthcAoHOJZQvZNAkA==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.0': + resolution: {integrity: sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.0': + resolution: {integrity: sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.1.0': + resolution: {integrity: sha512-ngfB8QItUfTFTfHMvKuc2g1W60V1urIgZHqD1JNFZC2tTWXahqf2XvKXqcBS7yZqR7GqkQQZy11y/lNOUWzq7Q==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.0.0': + resolution: {integrity: sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.1.0': + resolution: {integrity: sha512-Tj3+oVhqdZgemjCiWjFlADfhvLF4C/uKDuKo7/tlEsRQ9+3emCreR2xndj970QSRSsiCEU8hZW3/8JQu+n5w4Q==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@1.2.0': + resolution: {integrity: sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==} + engines: {node: '>=14.0.0'} + + '@smithy/protocol-http@4.0.0': + resolution: {integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.0': + resolution: {integrity: sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.0': + resolution: {integrity: sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.0': + resolution: {integrity: sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.1.0': + resolution: {integrity: sha512-dAM7wSX0NR3qTNyGVN/nwwpEDzfV9T/3AN2eABExWmda5VqZKSsjlINqomO5hjQWGv+IIkoXfs3u2vGSNz8+Rg==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@1.1.0': + resolution: {integrity: sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==} + engines: {node: '>=14.0.0'} + + '@smithy/signature-v4@3.0.0': + resolution: {integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.1.1': + resolution: {integrity: sha512-tj4Ku7MpzZR8cmVuPcSbrLFVxmptWktmJMwST/uIEq4sarabEdF8CbmQdYB7uJ/X51Qq2EYwnRsoS7hdR4B7rA==} + engines: {node: '>=16.0.0'} + + '@smithy/types@1.2.0': + resolution: {integrity: sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==} + engines: {node: '>=14.0.0'} + + '@smithy/types@3.0.0': + resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.0': + resolution: {integrity: sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@1.1.0': + resolution: {integrity: sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.3': + resolution: {integrity: sha512-3DFON2bvXJAukJe+qFgPV/rorG7ZD3m4gjCXHD1V5z/tgKQp5MCTCLntrd686tX6tj8Uli3lefWXJudNg5WmCA==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.3': + resolution: {integrity: sha512-D0b8GJXecT00baoSQ3Iieu3k3mZ7GY8w1zmg8pdogYrGvWJeLcIclqk2gbkG4K0DaBGWrO6v6r20iwIFfDYrmA==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.0.1': + resolution: {integrity: sha512-ZRT0VCOnKlVohfoABMc8lWeQo/JEFuPWctfNRXgTHbyOVssMOLYFUNWukxxiHRGVAhV+n3c0kPW+zUqckjVPEA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@1.1.0': + resolution: {integrity: sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==} + engines: {node: '>=14.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@1.1.0': + resolution: {integrity: sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==} + engines: {node: '>=14.0.0'} + + '@smithy/util-middleware@3.0.0': + resolution: {integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.0': + resolution: {integrity: sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.0.1': + resolution: {integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@1.1.0': + resolution: {integrity: sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==} + engines: {node: '>=14.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@1.1.0': + resolution: {integrity: sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-waiter@3.0.0': + resolution: {integrity: sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==} + engines: {node: '>=16.0.0'} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -842,6 +1296,15 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.4': + resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} + + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -857,15 +1320,36 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/papaparse@5.3.14': + resolution: {integrity: sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==} + + '@types/pg@8.11.6': + resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} '@types/shimmer@1.0.5': resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/uuid@9.0.8': resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@typescript-eslint/eslint-plugin@7.11.0': resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -971,6 +1455,16 @@ packages: '@vue/shared@3.4.27': resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + '@xenova/transformers@2.17.2': + resolution: {integrity: sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==} + + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + + '@zilliz/milvus2-sdk-node@2.4.2': + resolution: {integrity: sha512-fkPu7XXzfUvHoCnSPVOjqQpWuSnnn9x2NMmmCcIOyRzMeXIsrz4Mf/+M7LUzmT8J9F0Khx65B0rJgCu27YzWQw==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -998,6 +1492,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -1044,6 +1542,9 @@ packages: ajv@8.14.0: resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + already@2.2.1: + resolution: {integrity: sha512-qk6RIVMS/R1yTvBzfIL1T76PsIL7DIVCINoLuFw2YXKLpLtsTobqdChMs8m3OhuPS3CEE3+Ra5ibYiqdyogbsQ==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -1125,6 +1626,9 @@ packages: arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1176,6 +1680,10 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + assemblyai@4.4.5: + resolution: {integrity: sha512-zSOat5+A1De8xolJRIvEJ/KOutTFxxTv8NKvlqnQjeqiKFsPBxeaogXL55j0443IRr1pAoKqDaAeAePzF8ub6w==} + engines: {node: '>=18'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1186,6 +1694,9 @@ packages: async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1206,12 +1717,33 @@ packages: axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.3.1: + resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} + + bare-fs@2.3.1: + resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + + bare-os@2.3.0: + resolution: {integrity: sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.0.1: + resolution: {integrity: sha512-ubLyoDqPnUf5o0kSFp709HC0WRZuxVuh4pbte5eY95Xvx5bdvz07c2JFmXBfqqe60q+9PJ8S4X5GRvmcNSKMxg==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1222,10 +1754,16 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -1245,6 +1783,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bson-objectid@2.0.4: + resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} + + bson@6.7.0: + resolution: {integrity: sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==} + engines: {node: '>=16.20.1'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1282,6 +1830,9 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + callguard@2.0.0: + resolution: {integrity: sha512-I3nd+fuj20FK1qu00ImrbH+II+8ULS6ioYr9igqR1xyqySoqc3DiHEyUM0mkoAdKeLGg2CtGnO8R3VRQX5krpQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1290,6 +1841,10 @@ packages: resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} engines: {node: '>=12'} + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -1336,6 +1891,24 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chromadb@1.7.3: + resolution: {integrity: sha512-3GgvQjpqgk5C89x5EuTDaXKbfrdqYDJ5UVyLQ3ZmwxnpetNc+HhRDGjkvXa5KSvpQ3lmKoyDoqnN4tZepfFkbw==} + engines: {node: '>=14.17.0'} + peerDependencies: + '@google/generative-ai': ^0.1.1 + cohere-ai: ^5.0.0 || ^6.0.0 || ^7.0.0 + openai: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + '@google/generative-ai': + optional: true + cohere-ai: + optional: true + openai: + optional: true + ci-info@4.0.0: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} @@ -1405,6 +1978,13 @@ packages: code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + codsen-utils@1.6.4: + resolution: {integrity: sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==} + engines: {node: '>=14.18.0'} + + cohere-ai@7.10.2: + resolution: {integrity: sha512-Dh1nLugCdSsqQ+PZN+ABRQVQum83udHeBNxC0nJJeIDDzIuEvlpYqXlESPeAnTnjXCjC/glXWBhFDXR5ZbmNrg==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1418,9 +1998,22 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1465,6 +2058,9 @@ packages: core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -1477,6 +2073,9 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1514,6 +2113,9 @@ packages: date-fns@1.30.1: resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1634,6 +2236,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} @@ -1645,6 +2251,9 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + dingbat-to-unicode@1.0.1: + resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1665,9 +2274,15 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + duck@0.1.12: + resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -1687,10 +2302,19 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.16.1: resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} @@ -1932,6 +2556,10 @@ packages: resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} engines: {node: '>=18'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expr-eval@2.0.2: resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} @@ -1939,6 +2567,9 @@ packages: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -1946,6 +2577,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1956,13 +2590,24 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + fetch-h2@3.0.2: + resolution: {integrity: sha512-Lo6UPdMKKc9Ond7yjG2vq0mnocspOLh1oV6+XZdtfdexacvMSz5xm3WoQhTAdoR2+UqPlyMNqcqfecipoD+l/A==} + engines: {node: '>=12'} + figures@1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} engines: {node: '>=0.10.0'} @@ -2003,9 +2648,15 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flatbuffers@1.12.0: + resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} + flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -2029,6 +2680,10 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} + form-data-encoder@4.0.2: + resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} + engines: {node: '>= 18'} + form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -2037,6 +2692,10 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} + formdata-node@6.0.3: + resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} + engines: {node: '>= 18'} + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -2049,6 +2708,16 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@2.1.2: + resolution: {integrity: sha512-9ztMtDZtSKC78V8mev+k31qaTabbmuH5jatdvPBMikrFHvw5BqlYnQIn/WGK3WHeRooSTkRvLa2IPlaHjPq5Sg==} + + fs-promise@2.0.3: + resolution: {integrity: sha512-oDrTLBQAcRd+p/tSRWvqitKegLPsvqr7aehs5N9ILWFM9az5y5Uh71jKdZ/DTMC4Kel7+GNCQyFCx/IftRv8yg==} + deprecated: Use mz or fs-extra^3.0 with Promise Support + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2067,6 +2736,18 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gaxios@6.6.0: + resolution: {integrity: sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + + generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + genkitx-openai@0.9.0: resolution: {integrity: sha512-LyjegcPnq2gaW2Q2SAL6MH3nsujy9eNe+tNMlWPadAIDci+ec5ZzLe1HL/Tk+TK04Uxv+jlndsTPJxCc6o0G5g==} peerDependencies: @@ -2103,6 +2784,9 @@ packages: get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + github-url-from-git@1.5.0: resolution: {integrity: sha512-WWOec4aRI7YAykQ9+BHmzjyNlkfJFG8QLXnDTsLz/kZefq7qkzdfo4p6fkYYMIq1aj+gZcQs/1HQhQh3DPPxlQ==} @@ -2147,6 +2831,10 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + google-auth-library@9.10.0: + resolution: {integrity: sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==} + engines: {node: '>=14'} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -2163,6 +2851,13 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + + guid-typescript@1.0.9: + resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==} + hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -2216,6 +2911,9 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -2227,6 +2925,10 @@ packages: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2247,6 +2949,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2258,6 +2964,9 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -2298,6 +3007,9 @@ packages: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + infobox-parser@3.6.4: + resolution: {integrity: sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw==} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2349,6 +3061,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -2581,12 +3296,18 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + issue-regex@4.1.0: resolution: {integrity: sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2602,6 +3323,12 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-base64@3.7.2: + resolution: {integrity: sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-tiktoken@1.0.12: resolution: {integrity: sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ==} @@ -2621,6 +3348,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2657,6 +3387,9 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -2669,6 +3402,15 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2676,6 +3418,9 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + ky@1.3.0: resolution: {integrity: sha512-QUViPXlgP6NKA57IAPff/aZSmRA6qs9wKxlEpayBorwRZG+x2LG7jD4kXh8lnH3q/gkUr64NyZ7kwErUEZJmlw==} engines: {node: '>=18'} @@ -2868,6 +3613,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lilconfig@3.1.1: resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} engines: {node: '>=14'} @@ -2906,6 +3654,12 @@ packages: resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} engines: {node: '>=6'} + llamaindex@0.3.15: + resolution: {integrity: sha512-ZdaITy8FPNobb1SMpchOZt/YNCA0dUSXF+DW06rI+nL5Blnyr48oZfBuFYtE3n05C+3gBZPxXVmBGfTHCLIIiQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@notionhq/client': ^2.2.15 + load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2921,6 +3675,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -2956,6 +3713,13 @@ packages: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} + logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} @@ -2963,6 +3727,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lop@0.4.1: + resolution: {integrity: sha512-9xyho9why2A2tzm5aIcMWKvzqKsnxrf9B5I+8O30olh6lQU8PH978LqZoI4++37RBgS1Em5i54v1TFs/3wnmXQ==} + loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -2978,12 +3745,24 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@9.1.2: + resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} + engines: {node: 14 || >=16.14} + + magic-bytes.js@1.10.0: + resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} + magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + mammoth@1.7.2: + resolution: {integrity: sha512-MqWU2hcLf1I5QMKyAbfJCvrLxnv5WztrAQyorfZ+WPq7Hk82vZFmvfR2/64ajIPpM4jlq0TXp1xZvp/FFaL1Ug==} + engines: {node: '>=12.0.0'} + hasBin: true + map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -2992,6 +3771,9 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + md-utils-ts@2.0.0: + resolution: {integrity: sha512-sMG6JtX0ebcRMHxYTcmgsh0/m6o8hGdQHFE2OgjvflRZlQM51CGGj/uuk056D+12BlCiW0aTpt/AdlDNtgQiew==} + mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} @@ -2999,6 +3781,9 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} @@ -3088,6 +3873,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + ml-array-mean@1.1.6: resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} @@ -3106,6 +3894,36 @@ packages: module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + mongodb-connection-string-url@3.0.1: + resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + + mongodb@6.7.0: + resolution: {integrity: sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.2.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -3142,6 +3960,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3153,6 +3974,13 @@ packages: resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-abi@3.63.0: + resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -3192,6 +4020,9 @@ packages: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} + notion-md-crawler@1.0.0: + resolution: {integrity: sha512-mdB6zn/i32qO2C7X7wZLDpWvFryO3bPYMuBfFgmTPomnfEtIejdQJNVaZzw2GapM82lfWZ5dfsZp3s3UL4p1Fg==} + np@10.0.5: resolution: {integrity: sha512-Tu270vVvsh92uh6XDXrGS6D94PhzxQYqM8uUxftYVp0B8qXl78dJRYwQ9wfYMOBB9ynlF79eWlUtPUxPzKGddQ==} engines: {git: '>=2.11.0', node: '>=18', npm: '>=9', pnpm: '>=8', yarn: '>=1.7.0'} @@ -3230,6 +4061,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -3261,6 +4096,9 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -3268,6 +4106,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@2.0.1: resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} engines: {node: '>=4'} @@ -3288,6 +4129,19 @@ packages: resolution: {integrity: sha512-M7CJbmv7UCopc0neRKdzfoGWaVZC+xC1925GitKH9EAqYFzX9//25Q7oX4+jw0tiCCj+t5l6VZh8UPH23NZkMA==} hasBin: true + onnx-proto@4.0.4: + resolution: {integrity: sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==} + + onnxruntime-common@1.14.0: + resolution: {integrity: sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==} + + onnxruntime-node@1.14.0: + resolution: {integrity: sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==} + os: [win32, darwin, linux] + + onnxruntime-web@1.14.0: + resolution: {integrity: sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==} + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -3303,6 +4157,9 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + option@0.2.4: + resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3391,6 +4248,12 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + papaparse@5.4.1: + resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3448,9 +4311,62 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} + pdf2json@3.0.5: + resolution: {integrity: sha512-Un1yLbSlk/zfwrltgguskExIioXZlFSFwsyXU0cnBorLywbTbcdzmJJEebh+U2cFCtR7y8nDs5lPHAe7ldxjZg==} + engines: {node: '>=18.12.1', npm: '>=8.19.2'} + hasBin: true + bundledDependencies: + - '@xmldom/xmldom' + periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + pgvector@0.1.8: + resolution: {integrity: sha512-mD6aw+XYJrsuLl3Y8s8gHDDfOZQ9ERtfQPdhvjOrC7eOTM7b6sNkxeZxBhHwUdXMfHmyGWIbwU0QbmSnn7pPmg==} + engines: {node: '>= 12'} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -3479,10 +4395,16 @@ packages: resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} engines: {node: '>=18'} + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + portkey-ai@0.1.16: + resolution: {integrity: sha512-EY4FRp6PZSD75Q1o1qc08DfPNTG9FnkUPN3Z1/lEvaq9iFpSO5UekcagUZaKSVhao311qjBjns+kF0rS9ht7iA==} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -3503,6 +4425,46 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3516,12 +4478,19 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + protobufjs@7.3.0: resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} engines: {node: '>=12.0.0'} @@ -3533,6 +4502,12 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3545,9 +4520,23 @@ packages: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -3556,6 +4545,9 @@ packages: resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} engines: {node: '>=18'} + rake-modified@1.0.8: + resolution: {integrity: sha512-rj/1t+EyI8Ly52eaCeSy5hoNpdNnDlNQ/+jll2DypR6nkuxotMbaupzwbuMSaXzuSL1I2pYVYy7oPus/Ls49ag==} + ramda@0.29.1: resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==} @@ -3563,6 +4555,22 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + ranges-apply@7.0.16: + resolution: {integrity: sha512-4rGJHOyA7qatiMDg3vcETkc/TVBPU86/xZRTXff6o7a2neYLmj0EXUUAlhLVuiWAzTPHDPHOQxtk8EDrIF4ohg==} + engines: {node: '>=14.18.0'} + + ranges-merge@9.0.15: + resolution: {integrity: sha512-hvt4hx0FKIaVfjd1oKx0poL57ljxdL2KHC6bXBrAdsx2iCsH+x7nO/5J0k2veM/isnOcFZKp0ZKkiCjCtzy74Q==} + engines: {node: '>=14.18.0'} + + ranges-push@7.0.15: + resolution: {integrity: sha512-gXpBYQ5Umf3uG6jkJnw5ddok2Xfo5p22rAJBLrqzNKa7qkj3q5AOCoxfRPXEHUVaJutfXc9K9eGXdIzdyQKPkw==} + engines: {node: '>=14.18.0'} + + ranges-sort@6.0.11: + resolution: {integrity: sha512-fhNEG0vGi7bESitNNqNBAfYPdl2efB+1paFlI8BQDCNkruERKuuhG8LkQClDIVqUJLkrmKuOSPQ3xZHqVnVo3Q==} + engines: {node: '>=14.18.0'} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -3609,6 +4617,9 @@ packages: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3664,6 +4675,9 @@ packages: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -3757,6 +4771,9 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3767,6 +4784,10 @@ packages: safe-regex@2.1.1: resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3825,9 +4846,16 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3856,6 +4884,15 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3898,6 +4935,9 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3910,11 +4950,21 @@ packages: spdx-license-ids@3.0.18: resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sswr@2.0.0: resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==} peerDependencies: svelte: ^4.0.0 + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -3925,10 +4975,29 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + streamx@2.18.0: + resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-collapse-leading-whitespace@7.0.7: + resolution: {integrity: sha512-jF9eynJoE6ezTCdYI8Qb02/ij/DlU9ItG93Dty4SWfJeLFrotOr+wH9IRiWHTqO3mjCyqBWEiU3uSTIbxYbAEQ==} + engines: {node: '>=14.18.0'} + + string-left-right@6.0.17: + resolution: {integrity: sha512-nuyIV4D4ivnwT64E0TudmCRg52NfkumuEUilyoOrHb/Z2wEOF5I+9SI6P+veFKqWKZfGpAs6OqKe4nAjujARyw==} + engines: {node: '>=14.18.0'} + + string-strip-html@13.4.8: + resolution: {integrity: sha512-vlcRAtx5DN6zXGUx3EYGFg0/JOQWM65mqLgDaBHviQPP+ovUFzqZ30iQ+674JHWr9wNgnzFGxx9TGipPZMnZXg==} + engines: {node: '>=14.18.0'} + + string-trim-spaces-only@5.0.10: + resolution: {integrity: sha512-MhmjE5jNqb1Ylo+BARPRlsdChGLrnPpAUWrT1VOxo9WhWwKVUU6CbZTfjwKaQPYTGS/wsX/4Zek88FM2rEb5iA==} + engines: {node: '>=14.18.0'} + string-width@1.0.2: resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} engines: {node: '>=0.10.0'} @@ -3964,6 +5033,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4015,6 +5087,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -4073,10 +5148,29 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + terminal-link@3.0.0: resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} engines: {node: '>=12'} + text-decoder@1.1.0: + resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -4087,12 +5181,18 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} tiktoken@1.0.15: resolution: {integrity: sha512-sCsrq/vMWUSEW29CJLNmPvWxlVp7yh2tlkAjpJltIKqp5CKf98ZNpdeHRmAlPVFlGEbswDc6SmI8vz64W/qErw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} @@ -4108,6 +5208,9 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + to-arraybuffer@1.0.1: + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -4120,12 +5223,20 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -4134,6 +5245,10 @@ packages: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -4190,6 +5305,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + twitter-api-sdk@1.2.1: resolution: {integrity: sha512-tNQ6DGYucFk94JlnUMsHCkHg5o1wnCdHh71Y2ukygNVssOdD1gNVjOpaojJrdwbEAhoZvcWdGHerCa55F8HKxQ==} engines: {node: '>=14'} @@ -4250,6 +5368,9 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typed-emitter@2.1.0: + resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -4261,9 +5382,16 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -4272,6 +5400,10 @@ packages: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -4289,6 +5421,12 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-sync-external-store@1.2.2: resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -4305,6 +5443,10 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + uuidv7@0.6.3: + resolution: {integrity: sha512-zV3eW2NlXTsun/aJ7AixxZjH/byQcH/r3J99MI0dDEkU2cJIBJxhEWUHDTpOaLPRNhebPZoeHuykYREkI9HafA==} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -4402,6 +5544,17 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url@13.0.0: + resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} + engines: {node: '>=16'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -4441,6 +5594,21 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} + wikipedia@2.1.2: + resolution: {integrity: sha512-RAYaMpXC9/E873RaSEtlEa8dXK4e0p5k98GKOd210MtkE5emm6fcnwD+N6ZA4cuffjDWagvhaQKtp/mGp2BOVQ==} + engines: {node: '>=10'} + + wink-nlp@2.3.0: + resolution: {integrity: sha512-NcMmlsJavRZgaV4dAjsOQPuXG4v3yLRRssEibfx41lhmwTTOCaQGW7czNC73bDKCq7q4vqGTjX3/MFhK3I76TA==} + + winston-transport@4.7.0: + resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} + engines: {node: '>= 12.0.0'} + + winston@3.13.0: + resolution: {integrity: sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==} + engines: {node: '>= 12.0.0'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -4471,10 +5639,30 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} + xmlbuilder@10.1.1: + resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} + engines: {node: '>=4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4568,6 +5756,513 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@anthropic-ai/sdk@0.20.9(encoding@0.1.13)': + dependencies: + '@types/node': 18.19.33 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + + '@aws-crypto/crc32@3.0.0': + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.577.0 + tslib: 1.14.1 + + '@aws-crypto/ie11-detection@3.0.0': + dependencies: + tslib: 1.14.1 + + '@aws-crypto/sha256-browser@3.0.0': + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@3.0.0': + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.577.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.577.0 + tslib: 2.6.2 + + '@aws-crypto/supports-web-crypto@3.0.0': + dependencies: + tslib: 1.14.1 + + '@aws-crypto/util@3.0.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 + + '@aws-sdk/client-cognito-identity@3.590.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sagemaker@3.590.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.0.0 + tslib: 2.6.2 + uuid: 9.0.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.590.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.590.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.588.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/core@3.588.0': + dependencies: + '@smithy/core': 2.2.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-cognito-identity@3.590.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.590.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-env@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-http@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/node-http-handler': 3.0.0 + '@smithy/property-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-stream': 3.0.1 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-process@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-sso@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + dependencies: + '@aws-sdk/client-sso': 3.590.0 + '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0)': + dependencies: + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + dependencies: + '@aws-sdk/client-cognito-identity': 3.590.0 + '@aws-sdk/client-sso': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-cognito-identity': 3.590.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/middleware-host-header@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-logger@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-recursion-detection@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-user-agent@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/protocol-http@3.374.0': + dependencies: + '@smithy/protocol-http': 1.2.0 + tslib: 2.6.2 + + '@aws-sdk/region-config-resolver@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/signature-v4@3.374.0': + dependencies: + '@smithy/signature-v4': 1.1.0 + tslib: 2.6.2 + + '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.590.0)': + dependencies: + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/types@3.577.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/util-endpoints@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + '@smithy/util-endpoints': 2.0.1 + tslib: 2.6.2 + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.6.2 + + '@aws-sdk/util-user-agent-browser@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + bowser: 2.11.0 + tslib: 2.6.2 + + '@aws-sdk/util-user-agent-node@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.6.2 + '@babel/code-frame@7.24.6': dependencies: '@babel/highlight': 7.24.6 @@ -4598,10 +6293,26 @@ snapshots: '@babel/helper-validator-identifier': 7.24.6 to-fast-properties: 2.0.0 + '@colors/colors@1.6.0': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@dabh/diagnostics@2.0.3': + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + + '@datastax/astra-db-ts@1.2.1': + dependencies: + bson-objectid: 2.0.4 + fetch-h2: 3.0.2 + object-hash: 3.0.0 + typed-emitter: 2.1.0 + uuidv7: 0.6.3 + '@dexaai/dexter@2.1.0': dependencies: '@fastify/deepmerge': 1.3.0 @@ -4713,6 +6424,8 @@ snapshots: '@eslint/js@8.57.0': {} + '@fastify/busboy@2.1.1': {} + '@fastify/deepmerge@1.3.0': {} '@fisch0920/eslint-config@1.3.3(eslint@8.57.0)(typescript@5.4.5)': @@ -4770,6 +6483,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@google-cloud/vertexai@1.2.0(encoding@0.1.13)': + dependencies: + google-auth-library: 9.10.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + '@google/generative-ai@0.11.5': {} + '@grpc/grpc-js@1.10.8': dependencies: '@grpc/proto-loader': 0.7.13 @@ -4782,6 +6504,14 @@ snapshots: protobufjs: 7.3.0 yargs: 17.7.2 + '@huggingface/inference@2.7.0': + dependencies: + '@huggingface/tasks': 0.10.9 + + '@huggingface/jinja@0.2.2': {} + + '@huggingface/tasks@0.10.9': {} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4796,11 +6526,11 @@ snapshots: '@inquirer/figures@1.0.3': {} - '@instructor-ai/instructor@1.3.0(openai@4.47.3)(zod@3.23.8)': + '@instructor-ai/instructor@1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8)': dependencies: - openai: 4.47.3 + openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 - zod-stream: 1.0.3(openai@4.47.3)(zod@3.23.8) + zod-stream: 1.0.3(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) zod-validation-error: 2.1.0(zod@3.23.8) '@isaacs/cliui@8.0.2': @@ -4840,13 +6570,13 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3)': + '@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -4858,13 +6588,13 @@ snapshots: - langchain - openai - '@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3)': + '@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -4876,22 +6606,22 @@ snapshots: - langchain - openai - '@langchain/openai@0.1.1(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))': + '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 - openai: 4.47.3 + openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) transitivePeerDependencies: - encoding - langchain - '@langchain/openai@0.1.1(langchain@0.2.4(openai@4.47.3))': + '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 - openai: 4.47.3 + openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) transitivePeerDependencies: @@ -4899,17 +6629,17 @@ snapshots: - langchain optional: true - '@langchain/textsplitters@0.0.2(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3)': + '@langchain/textsplitters@0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain - openai - '@langchain/textsplitters@0.0.2(langchain@0.2.4(openai@4.47.3))(openai@4.47.3)': + '@langchain/textsplitters@0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -4920,6 +6650,33 @@ snapshots: dependencies: call-bind: 1.0.7 + '@llamaindex/cloud@0.0.5(node-fetch@3.3.2)': + dependencies: + '@types/qs': 6.9.15 + form-data: 4.0.0 + js-base64: 3.7.7 + qs: 6.12.1 + optionalDependencies: + node-fetch: 3.3.2 + + '@llamaindex/env@0.1.3(@aws-crypto/sha256-js@5.2.0)(pathe@1.1.2)': + dependencies: + '@types/lodash': 4.17.4 + '@types/node': 20.13.0 + optionalDependencies: + '@aws-crypto/sha256-js': 5.2.0 + pathe: 1.1.2 + + '@mistralai/mistralai@0.2.0(encoding@0.1.13)': + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + '@mongodb-js/saslprep@1.1.7': + dependencies: + sparse-bitfield: 3.0.3 + '@nangohq/node@0.39.32': dependencies: axios: 1.7.2 @@ -4938,6 +6695,13 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@notionhq/client@2.2.15(encoding@0.1.13)': + dependencies: + '@types/node-fetch': 2.6.11 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + '@opentelemetry/api-logs@0.49.1': dependencies: '@opentelemetry/api': 1.8.0 @@ -5131,6 +6895,15 @@ snapshots: '@opentelemetry/semantic-conventions@1.24.1': {} + '@petamoriken/float16@3.8.7': {} + + '@pinecone-database/pinecone@2.2.2': + dependencies: + '@sinclair/typebox': 0.29.6 + ajv: 8.14.0 + cross-fetch: 3.1.8(encoding@0.1.13) + encoding: 0.1.13 + '@pkgjs/parseargs@0.11.0': optional: true @@ -5163,73 +6936,409 @@ snapshots: '@protobufjs/inquire@1.1.0': {} - '@protobufjs/path@1.1.2': {} + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@qdrant/js-client-rest@1.9.0(typescript@5.4.5)': + dependencies: + '@qdrant/openapi-typescript-fetch': 1.2.6 + '@sevinf/maybe': 0.5.0 + typescript: 5.4.5 + undici: 5.28.4 + + '@qdrant/openapi-typescript-fetch@1.2.6': {} + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + + '@rollup/rollup-android-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + + '@rushstack/eslint-patch@1.10.3': {} + + '@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7)': + dependencies: + any-observable: 0.3.0(rxjs@6.6.7) + optionalDependencies: + rxjs: 6.6.7 + transitivePeerDependencies: + - zenObservable + + '@sevinf/maybe@0.5.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinclair/typebox@0.29.6': {} + + '@sindresorhus/is@5.6.0': {} + + '@smithy/abort-controller@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/config-resolver@3.0.1': + dependencies: + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@smithy/core@2.2.0': + dependencies: + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@smithy/credential-provider-imds@3.1.0': + dependencies: + '@smithy/node-config-provider': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + tslib: 2.6.2 + + '@smithy/eventstream-codec@1.1.0': + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 1.2.0 + '@smithy/util-hex-encoding': 1.1.0 + tslib: 2.6.2 + + '@smithy/fetch-http-handler@3.0.1': + dependencies: + '@smithy/protocol-http': 4.0.0 + '@smithy/querystring-builder': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.2 + + '@smithy/hash-node@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + + '@smithy/invalid-dependency@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/is-array-buffer@1.1.0': + dependencies: + tslib: 2.6.2 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.6.2 + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/middleware-content-length@3.0.0': + dependencies: + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/middleware-endpoint@3.0.1': + dependencies: + '@smithy/middleware-serde': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@smithy/middleware-retry@3.0.3': + dependencies: + '@smithy/node-config-provider': 3.1.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/service-error-classification': 3.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + tslib: 2.6.2 + uuid: 9.0.1 + + '@smithy/middleware-serde@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/middleware-stack@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/node-config-provider@3.1.0': + dependencies: + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/node-http-handler@3.0.0': + dependencies: + '@smithy/abort-controller': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/querystring-builder': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/property-provider@3.1.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/protocol-http@1.2.0': + dependencies: + '@smithy/types': 1.2.0 + tslib: 2.6.2 + + '@smithy/protocol-http@4.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/querystring-builder@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.2 + + '@smithy/querystring-parser@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/service-error-classification@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + + '@smithy/shared-ini-file-loader@3.1.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/signature-v4@1.1.0': + dependencies: + '@smithy/eventstream-codec': 1.1.0 + '@smithy/is-array-buffer': 1.1.0 + '@smithy/types': 1.2.0 + '@smithy/util-hex-encoding': 1.1.0 + '@smithy/util-middleware': 1.1.0 + '@smithy/util-uri-escape': 1.1.0 + '@smithy/util-utf8': 1.1.0 + tslib: 2.6.2 + + '@smithy/signature-v4@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + + '@smithy/smithy-client@3.1.1': + dependencies: + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-stack': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-stream': 3.0.1 + tslib: 2.6.2 + + '@smithy/types@1.2.0': + dependencies: + tslib: 2.6.2 + + '@smithy/types@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/url-parser@3.0.0': + dependencies: + '@smithy/querystring-parser': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 - '@protobufjs/pool@1.1.0': {} + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 - '@protobufjs/utf8@1.1.0': {} + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-android-arm-eabi@4.18.0': - optional: true + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-android-arm64@4.18.0': - optional: true + '@smithy/util-buffer-from@1.1.0': + dependencies: + '@smithy/is-array-buffer': 1.1.0 + tslib: 2.6.2 - '@rollup/rollup-darwin-arm64@4.18.0': - optional: true + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.6.2 - '@rollup/rollup-darwin-x64@4.18.0': - optional: true + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.6.2 - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - optional: true + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - optional: true + '@smithy/util-defaults-mode-browser@3.0.3': + dependencies: + '@smithy/property-provider': 3.1.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + bowser: 2.11.0 + tslib: 2.6.2 - '@rollup/rollup-linux-arm64-gnu@4.18.0': - optional: true + '@smithy/util-defaults-mode-node@3.0.3': + dependencies: + '@smithy/config-resolver': 3.0.1 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + tslib: 2.6.2 - '@rollup/rollup-linux-arm64-musl@4.18.0': - optional: true + '@smithy/util-endpoints@2.0.1': + dependencies: + '@smithy/node-config-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - optional: true + '@smithy/util-hex-encoding@1.1.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - optional: true + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-linux-s390x-gnu@4.18.0': - optional: true + '@smithy/util-middleware@1.1.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-linux-x64-gnu@4.18.0': - optional: true + '@smithy/util-middleware@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 - '@rollup/rollup-linux-x64-musl@4.18.0': - optional: true + '@smithy/util-retry@3.0.0': + dependencies: + '@smithy/service-error-classification': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 - '@rollup/rollup-win32-arm64-msvc@4.18.0': - optional: true + '@smithy/util-stream@3.0.1': + dependencies: + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/node-http-handler': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 - '@rollup/rollup-win32-ia32-msvc@4.18.0': - optional: true + '@smithy/util-uri-escape@1.1.0': + dependencies: + tslib: 2.6.2 - '@rollup/rollup-win32-x64-msvc@4.18.0': - optional: true + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.6.2 - '@rushstack/eslint-patch@1.10.3': {} + '@smithy/util-utf8@1.1.0': + dependencies: + '@smithy/util-buffer-from': 1.1.0 + tslib: 2.6.2 - '@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7)': + '@smithy/util-utf8@2.3.0': dependencies: - any-observable: 0.3.0(rxjs@6.6.7) - optionalDependencies: - rxjs: 6.6.7 - transitivePeerDependencies: - - zenObservable + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.6.2 - '@sinclair/typebox@0.27.8': {} + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.6.2 - '@sindresorhus/is@5.6.0': {} + '@smithy/util-waiter@3.0.0': + dependencies: + '@smithy/abort-controller': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 '@szmarczak/http-timer@5.0.1': dependencies: @@ -5253,6 +7362,14 @@ snapshots: '@types/json5@0.0.29': {} + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.4 + + '@types/lodash@4.17.4': {} + + '@types/long@4.0.2': {} + '@types/minimist@1.2.5': {} '@types/node-fetch@2.6.11': @@ -5270,12 +7387,34 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/papaparse@5.3.14': + dependencies: + '@types/node': 20.13.0 + + '@types/pg@8.11.6': + dependencies: + '@types/node': 20.13.0 + pg-protocol: 1.6.1 + pg-types: 4.0.2 + + '@types/qs@6.9.15': {} + '@types/retry@0.12.0': {} '@types/shimmer@1.0.5': {} + '@types/tough-cookie@4.0.5': {} + + '@types/triple-beam@1.3.5': {} + '@types/uuid@9.0.8': {} + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 @@ -5441,6 +7580,27 @@ snapshots: '@vue/shared@3.4.27': {} + '@xenova/transformers@2.17.2': + dependencies: + '@huggingface/jinja': 0.2.2 + onnxruntime-web: 1.14.0 + sharp: 0.32.6 + optionalDependencies: + onnxruntime-node: 1.14.0 + + '@xmldom/xmldom@0.8.10': {} + + '@zilliz/milvus2-sdk-node@2.4.2': + dependencies: + '@grpc/grpc-js': 1.10.8 + '@grpc/proto-loader': 0.7.13 + '@petamoriken/float16': 3.8.7 + dayjs: 1.11.11 + generic-pool: 3.9.0 + lru-cache: 9.1.2 + protobufjs: 7.3.0 + winston: 3.13.0 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -5462,6 +7622,12 @@ snapshots: acorn@8.11.3: {} + agent-base@7.1.1: + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 @@ -5471,7 +7637,7 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@3.1.22(openai@4.47.3)(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): + ai@3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.8 '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) @@ -5487,7 +7653,7 @@ snapshots: swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) zod-to-json-schema: 3.22.5(zod@3.23.8) optionalDependencies: - openai: 4.47.3 + openai: 4.47.3(encoding@0.1.13) react: 18.3.1 solid-js: 1.8.17 svelte: 4.2.17 @@ -5512,6 +7678,8 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + already@2.2.1: {} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -5565,6 +7733,10 @@ snapshots: arg@4.1.3: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} aria-query@5.3.0: @@ -5649,6 +7821,13 @@ snapshots: arrify@1.0.1: {} + assemblyai@4.4.5: + dependencies: + ws: 8.17.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + assertion-error@2.0.1: {} ast-types-flow@0.0.8: {} @@ -5657,6 +7836,8 @@ snapshots: dependencies: tslib: 2.6.2 + async@3.2.5: {} + asynckit@0.4.0: {} available-typed-arrays@1.0.7: @@ -5681,10 +7862,37 @@ snapshots: dependencies: dequal: 2.0.3 + b4a@1.6.6: {} + balanced-match@1.0.2: {} + bare-events@2.3.1: + optional: true + + bare-fs@2.3.1: + dependencies: + bare-events: 2.3.1 + bare-path: 2.1.3 + bare-stream: 2.0.1 + optional: true + + bare-os@2.3.0: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.3.0 + optional: true + + bare-stream@2.0.1: + dependencies: + streamx: 2.18.0 + optional: true + base64-js@1.5.1: {} + bignumber.js@9.1.2: {} + binary-extensions@2.3.0: {} binary-search@1.3.6: {} @@ -5695,6 +7903,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bluebird@3.4.7: {} + body-parser@1.20.2: dependencies: bytes: 3.1.2 @@ -5712,6 +7922,8 @@ snapshots: transitivePeerDependencies: - supports-color + bowser@2.11.0: {} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 @@ -5743,6 +7955,12 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.0) + bson-objectid@2.0.4: {} + + bson@6.7.0: {} + + buffer-equal-constant-time@1.0.1: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -5783,6 +8001,8 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + callguard@2.0.0: {} + callsites@3.1.0: {} camelcase-keys@7.0.2: @@ -5792,6 +8012,8 @@ snapshots: quick-lru: 5.1.1 type-fest: 1.4.0 + camelcase@4.1.0: {} + camelcase@6.3.0: {} camelcase@7.0.1: {} @@ -5847,6 +8069,19 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + + chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): + dependencies: + cliui: 8.0.1 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + optionalDependencies: + '@google/generative-ai': 0.11.5 + cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13) + openai: 4.47.3(encoding@0.1.13) + transitivePeerDependencies: + - encoding + ci-info@4.0.0: {} cjs-module-lexer@1.3.1: {} @@ -5909,6 +8144,28 @@ snapshots: estree-walker: 3.0.3 periscopic: 3.1.0 + codsen-utils@1.6.4: + dependencies: + rfdc: 1.3.1 + + cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13): + dependencies: + '@aws-sdk/client-sagemaker': 3.590.0 + '@aws-sdk/credential-providers': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/protocol-http': 3.374.0 + '@aws-sdk/signature-v4': 3.374.0 + form-data: 4.0.0 + form-data-encoder: 4.0.2 + formdata-node: 6.0.3 + js-base64: 3.7.2 + node-fetch: 2.7.0(encoding@0.1.13) + qs: 6.11.2 + url-join: 4.0.1 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + - encoding + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -5921,8 +8178,28 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@3.2.1: + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -5962,6 +8239,8 @@ snapshots: dependencies: browserslist: 4.23.0 + core-util-is@1.0.3: {} + cosmiconfig@8.3.6(typescript@5.4.5): dependencies: import-fresh: 3.3.0 @@ -5973,6 +8252,12 @@ snapshots: create-require@1.1.1: {} + cross-fetch@3.1.8(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -6014,6 +8299,8 @@ snapshots: date-fns@1.30.1: {} + dayjs@1.11.11: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -6102,12 +8389,16 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.0.3: {} + diff-match-patch@1.0.5: {} diff-sequences@29.6.3: {} diff@4.0.2: {} + dingbat-to-unicode@1.0.1: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -6126,8 +8417,16 @@ snapshots: dotenv@16.4.5: {} + duck@0.1.12: + dependencies: + underscore: 1.13.6 + eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + ee-first@1.1.1: {} electron-to-chromium@1.4.788: {} @@ -6140,8 +8439,18 @@ snapshots: emoji-regex@9.2.2: {} + enabled@2.0.0: {} + encodeurl@1.0.2: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + enhanced-resolve@5.16.1: dependencies: graceful-fs: 4.2.11 @@ -6552,6 +8861,8 @@ snapshots: exit-hook@4.0.0: {} + expand-template@2.0.3: {} + expr-eval@2.0.2: {} express@4.19.2: @@ -6590,6 +8901,8 @@ snapshots: transitivePeerDependencies: - supports-color + extend@3.0.2: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -6598,6 +8911,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6610,15 +8925,31 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-xml-parser@4.2.5: + dependencies: + strnum: 1.0.5 + fastq@1.17.1: dependencies: reusify: 1.0.4 + fecha@4.2.3: {} + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + fetch-h2@3.0.2: + dependencies: + '@types/tough-cookie': 4.0.5 + already: 2.2.1 + callguard: 2.0.0 + get-stream: 6.0.1 + through2: 4.0.2 + to-arraybuffer: 1.0.1 + tough-cookie: 4.1.4 + figures@1.7.0: dependencies: escape-string-regexp: 1.0.5 @@ -6670,8 +9001,12 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flatbuffers@1.12.0: {} + flatted@3.3.1: {} + fn.name@1.1.0: {} + follow-redirects@1.15.6: {} for-each@0.3.3: @@ -6687,6 +9022,8 @@ snapshots: form-data-encoder@2.1.4: {} + form-data-encoder@4.0.2: {} + form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -6698,6 +9035,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 + formdata-node@6.0.3: {} + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -6706,6 +9045,20 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + + fs-extra@2.1.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + + fs-promise@2.0.3: + dependencies: + any-promise: 1.3.0 + fs-extra: 2.1.2 + mz: 2.7.0 + thenify-all: 1.6.0 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -6722,11 +9075,32 @@ snapshots: functions-have-names@1.2.3: {} - genkitx-openai@0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2): + gaxios@6.6.0(encoding@0.1.13): + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.4 + is-stream: 2.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.0(encoding@0.1.13): + dependencies: + gaxios: 6.6.0(encoding@0.1.13) + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + generic-pool@3.9.0: {} + + genkitx-openai@0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13): dependencies: '@genkit-ai/ai': 0.5.2 '@genkit-ai/core': 0.5.2 - openai: 4.47.3 + openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 transitivePeerDependencies: - encoding @@ -6759,6 +9133,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + github-from-package@0.0.0: {} + github-url-from-git@1.5.0: {} glob-parent@5.1.2: @@ -6820,6 +9196,18 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + google-auth-library@9.10.0(encoding@0.1.13): + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.6.0(encoding@0.1.13) + gcp-metadata: 6.1.0(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -6844,6 +9232,16 @@ snapshots: graphemer@1.4.0: {} + gtoken@7.1.0(encoding@0.1.13): + dependencies: + gaxios: 6.6.0(encoding@0.1.13) + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + guid-typescript@1.0.9: {} + hard-rejection@2.1.0: {} has-ansi@2.0.0: @@ -6889,6 +9287,8 @@ snapshots: dependencies: lru-cache: 10.2.2 + html-entities@2.5.2: {} + http-cache-semantics@4.1.1: {} http-errors@2.0.0: @@ -6904,6 +9304,13 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@7.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -6918,6 +9325,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore-walk@6.0.5: @@ -6926,6 +9337,8 @@ snapshots: ignore@5.3.1: {} + immediate@3.0.6: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -6960,6 +9373,10 @@ snapshots: once: 1.4.0 wrappy: 1.0.2 + infobox-parser@3.6.4: + dependencies: + camelcase: 4.1.0 + inherits@2.0.4: {} ini@1.3.8: {} @@ -7043,6 +9460,8 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 @@ -7224,10 +9643,19 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} + isomorphic-fetch@3.0.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + issue-regex@4.1.0: {} iterator.prototype@1.1.2: @@ -7246,6 +9674,10 @@ snapshots: joycon@3.1.1: {} + js-base64@3.7.2: {} + + js-base64@3.7.7: {} + js-tiktoken@1.0.12: dependencies: base64-js: 1.5.1 @@ -7260,6 +9692,10 @@ snapshots: jsesc@3.0.2: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.1.2 + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -7286,6 +9722,10 @@ snapshots: chalk: 5.3.0 diff-match-patch: 1.0.5 + jsonfile@2.4.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonpointer@5.0.1: {} jsonrepair@3.8.0: {} @@ -7297,25 +9737,45 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + jwa@2.0.0: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.0 + safe-buffer: 5.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 kind-of@6.0.3: {} + kuler@2.0.0: {} + ky@1.3.0: {} - langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3): + langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) - '@langchain/openai': 0.1.1(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3)) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0)) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -7324,23 +9784,32 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@notionhq/client': 2.2.15(encoding@0.1.13) + '@pinecone-database/pinecone': 2.2.2 + assemblyai: 4.4.5 axios: 1.7.2 + chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + fast-xml-parser: 4.2.5 ignore: 5.3.1 + mammoth: 1.7.2 + mongodb: 6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + ws: 8.17.0 transitivePeerDependencies: - encoding - openai - langchain@0.2.4(openai@4.47.3): + langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) - '@langchain/openai': 0.1.1(langchain@0.2.4(openai@4.47.3)) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -7348,6 +9817,8 @@ snapshots: yaml: 2.4.2 zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) + optionalDependencies: + '@notionhq/client': 2.2.15(encoding@0.1.13) transitivePeerDependencies: - encoding - openai @@ -7355,19 +9826,19 @@ snapshots: langchainhub@0.0.11: {} - langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3): - dependencies: + ? langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + : dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3))(openai@4.47.3) - langchain: 0.2.4(axios@1.7.2)(ignore@5.3.1)(openai@4.47.3) - openai: 4.47.3 + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + langchain: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0) + openai: 4.47.3(encoding@0.1.13) - langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3))(langchain@0.2.4(openai@4.47.3))(openai@4.47.3): + langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -7375,9 +9846,9 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(openai@4.47.3))(openai@4.47.3) - langchain: 0.2.4(openai@4.47.3) - openai: 4.47.3 + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + langchain: 0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + openai: 4.47.3(encoding@0.1.13) language-subtag-registry@0.3.23: {} @@ -7394,6 +9865,10 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lie@3.3.0: + dependencies: + immediate: 3.0.6 + lilconfig@3.1.1: {} lines-and-columns@1.2.4: {} @@ -7465,6 +9940,67 @@ snapshots: - zen-observable - zenObservable + llamaindex@0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5): + dependencies: + '@anthropic-ai/sdk': 0.20.9(encoding@0.1.13) + '@aws-crypto/sha256-js': 5.2.0 + '@datastax/astra-db-ts': 1.2.1 + '@google-cloud/vertexai': 1.2.0(encoding@0.1.13) + '@google/generative-ai': 0.11.5 + '@grpc/grpc-js': 1.10.8 + '@huggingface/inference': 2.7.0 + '@llamaindex/cloud': 0.0.5(node-fetch@3.3.2) + '@llamaindex/env': 0.1.3(@aws-crypto/sha256-js@5.2.0)(pathe@1.1.2) + '@mistralai/mistralai': 0.2.0(encoding@0.1.13) + '@notionhq/client': 2.2.15(encoding@0.1.13) + '@pinecone-database/pinecone': 2.2.2 + '@qdrant/js-client-rest': 1.9.0(typescript@5.4.5) + '@types/lodash': 4.17.4 + '@types/papaparse': 5.3.14 + '@types/pg': 8.11.6 + '@xenova/transformers': 2.17.2 + '@zilliz/milvus2-sdk-node': 2.4.2 + ajv: 8.14.0 + assemblyai: 4.4.5 + chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13) + js-tiktoken: 1.0.12 + lodash: 4.17.21 + magic-bytes.js: 1.10.0 + mammoth: 1.7.2 + md-utils-ts: 2.0.0 + mongodb: 6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + notion-md-crawler: 1.0.0(encoding@0.1.13) + openai: 4.47.3(encoding@0.1.13) + papaparse: 5.4.1 + pathe: 1.1.2 + pdf2json: 3.0.5 + pg: 8.12.0 + pgvector: 0.1.8 + portkey-ai: 0.1.16 + rake-modified: 1.0.8 + string-strip-html: 13.4.8 + wikipedia: 2.1.2 + wink-nlp: 2.3.0 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - aws-crt + - bufferutil + - debug + - encoding + - gcp-metadata + - kerberos + - mongodb-client-encryption + - node-fetch + - pg-native + - snappy + - socks + - supports-color + - typescript + - utf-8-validate + load-tsconfig@0.2.5: {} locate-character@3.0.0: {} @@ -7477,6 +10013,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} lodash.merge@4.6.2: {} @@ -7515,12 +10053,29 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + logform@2.6.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + + long@4.0.0: {} + long@5.2.3: {} loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + lop@0.4.1: + dependencies: + duck: 0.1.12 + option: 0.2.4 + underscore: 1.13.6 + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -7533,20 +10088,41 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@9.1.2: {} + + magic-bytes.js@1.10.0: {} + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 make-error@1.3.6: {} + mammoth@1.7.2: + dependencies: + '@xmldom/xmldom': 0.8.10 + argparse: 1.0.10 + base64-js: 1.5.1 + bluebird: 3.4.7 + dingbat-to-unicode: 1.0.1 + jszip: 3.10.1 + lop: 0.4.1 + path-is-absolute: 1.0.1 + underscore: 1.13.6 + xmlbuilder: 10.1.1 + map-obj@1.0.1: {} map-obj@4.3.0: {} + md-utils-ts@2.0.0: {} + mdn-data@2.0.30: {} media-typer@0.3.0: {} + memory-pager@1.5.0: {} + memorystream@0.3.1: {} meow@10.1.5: @@ -7619,6 +10195,8 @@ snapshots: minipass@7.1.2: {} + mkdirp-classic@0.5.3: {} + ml-array-mean@1.1.6: dependencies: ml-array-sum: 1.1.6 @@ -7642,6 +10220,19 @@ snapshots: module-details-from-path@1.0.3: {} + mongodb-connection-string-url@3.0.1: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 13.0.0 + + mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)): + dependencies: + '@mongodb-js/saslprep': 1.1.7 + bson: 6.7.0 + mongodb-connection-string-url: 3.0.1 + optionalDependencies: + '@aws-sdk/credential-providers': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + ms@2.0.0: {} ms@2.1.2: {} @@ -7666,6 +10257,8 @@ snapshots: nanoid@3.3.7: {} + napi-build-utils@1.0.2: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -7674,11 +10267,19 @@ snapshots: dependencies: type-fest: 2.19.0 + node-abi@3.63.0: + dependencies: + semver: 7.6.2 + + node-addon-api@6.1.0: {} + node-domexception@1.0.0: {} - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -7713,6 +10314,13 @@ snapshots: normalize-url@8.0.1: {} + notion-md-crawler@1.0.0(encoding@0.1.13): + dependencies: + '@notionhq/client': 2.2.15(encoding@0.1.13) + md-utils-ts: 2.0.0 + transitivePeerDependencies: + - encoding + np@10.0.5(typescript@5.4.5): dependencies: chalk: 5.3.0 @@ -7794,6 +10402,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + object-inspect@1.13.1: {} object-keys@1.1.1: {} @@ -7836,6 +10446,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + obuf@1.1.2: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -7844,6 +10456,10 @@ snapshots: dependencies: wrappy: 1.0.2 + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + onetime@2.0.1: dependencies: mimic-fn: 1.2.0 @@ -7864,6 +10480,26 @@ snapshots: dependencies: which-pm-runs: 1.1.0 + onnx-proto@4.0.4: + dependencies: + protobufjs: 6.11.4 + + onnxruntime-common@1.14.0: {} + + onnxruntime-node@1.14.0: + dependencies: + onnxruntime-common: 1.14.0 + optional: true + + onnxruntime-web@1.14.0: + dependencies: + flatbuffers: 1.12.0 + guid-typescript: 1.0.9 + long: 4.0.0 + onnx-proto: 4.0.4 + onnxruntime-common: 1.14.0 + platform: 1.3.6 + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -7875,7 +10511,7 @@ snapshots: dependencies: ky: 1.3.0 - openai@4.47.3: + openai@4.47.3(encoding@0.1.13): dependencies: '@types/node': 18.19.33 '@types/node-fetch': 2.6.11 @@ -7883,13 +10519,15 @@ snapshots: agentkeepalive: 4.5.0 form-data-encoder: 1.7.2 formdata-node: 4.4.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) web-streams-polyfill: 3.3.3 transitivePeerDependencies: - encoding openapi-types@12.1.3: {} + option@0.2.4: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -7979,6 +10617,10 @@ snapshots: registry-url: 6.0.1 semver: 7.6.2 + pako@1.0.11: {} + + papaparse@5.4.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -8023,12 +10665,63 @@ snapshots: pathval@2.0.0: {} + pdf2json@3.0.5: {} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.6.4: {} + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.6.2(pg@8.12.0): + dependencies: + pg: 8.12.0 + + pg-protocol@1.6.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.12.0: + dependencies: + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.12.0) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + pgvector@0.1.8: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -8049,8 +10742,14 @@ snapshots: dependencies: find-up-simple: 1.0.0 + platform@1.3.6: {} + pluralize@8.0.0: {} + portkey-ai@0.1.16: + dependencies: + agentkeepalive: 4.5.0 + possible-typed-array-names@1.0.0: {} postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5)): @@ -8067,6 +10766,43 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + postgres-array@2.0.0: {} + + postgres-array@3.0.2: {} + + postgres-bytea@1.0.0: {} + + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + + postgres-date@1.0.7: {} + + postgres-date@2.1.0: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.63.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + prelude-ls@1.2.1: {} prettier@3.3.0: {} @@ -8077,6 +10813,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + process-nextick-args@2.0.1: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -8085,6 +10823,22 @@ snapshots: proto-list@1.2.4: {} + protobufjs@6.11.4: + 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/long': 4.0.2 + '@types/node': 20.13.0 + long: 4.0.0 + protobufjs@7.3.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -8107,6 +10861,13 @@ snapshots: proxy-from-env@1.1.0: {} + psl@1.9.0: {} + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@2.3.1: {} pupa@3.1.0: @@ -8117,16 +10878,52 @@ snapshots: dependencies: side-channel: 1.0.6 + qs@6.11.2: + dependencies: + side-channel: 1.0.6 + + qs@6.12.1: + dependencies: + side-channel: 1.0.6 + + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} + queue-tick@1.0.1: {} + quick-lru@5.1.1: {} quick-lru@7.0.0: {} + rake-modified@1.0.8: + dependencies: + fs-promise: 2.0.3 + lodash: 4.17.21 + ramda@0.29.1: {} range-parser@1.2.1: {} + ranges-apply@7.0.16: + dependencies: + ranges-merge: 9.0.15 + tiny-invariant: 1.3.3 + + ranges-merge@9.0.15: + dependencies: + ranges-push: 7.0.15 + ranges-sort: 6.0.11 + + ranges-push@7.0.15: + dependencies: + codsen-utils: 1.6.4 + ranges-sort: 6.0.11 + string-collapse-leading-whitespace: 7.0.7 + string-trim-spaces-only: 5.0.10 + + ranges-sort@6.0.11: {} + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -8194,6 +10991,16 @@ snapshots: type-fest: 4.18.3 unicorn-magic: 0.1.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -8256,6 +11063,8 @@ snapshots: requireindex@1.2.0: {} + requires-port@1.0.0: {} + resolve-alpn@1.2.1: {} resolve-cwd@3.0.0: @@ -8361,6 +11170,8 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex-test@1.0.3: @@ -8373,6 +11184,8 @@ snapshots: dependencies: regexp-tree: 0.1.27 + safe-stable-stringify@2.4.3: {} + safer-buffer@2.1.2: {} schema-stream@3.1.0(zod@3.23.8): @@ -8443,8 +11256,21 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 6.1.0 + prebuild-install: 7.1.2 + semver: 7.6.2 + simple-get: 4.0.1 + tar-fs: 3.0.6 + tunnel-agent: 0.6.0 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -8468,6 +11294,18 @@ snapshots: signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + slash@3.0.0: {} slash@4.0.0: {} @@ -8505,6 +11343,10 @@ snapshots: dependencies: whatwg-url: 7.1.0 + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -8519,19 +11361,52 @@ snapshots: spdx-license-ids@3.0.18: {} + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + sswr@2.0.0(svelte@4.2.17): dependencies: svelte: 4.2.17 swrev: 4.0.0 + stack-trace@0.0.10: {} + stackback@0.0.2: {} statuses@2.0.1: {} std-env@3.7.0: {} + streamx@2.18.0: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.0 + optionalDependencies: + bare-events: 2.3.1 + string-argv@0.3.2: {} + string-collapse-leading-whitespace@7.0.7: {} + + string-left-right@6.0.17: + dependencies: + codsen-utils: 1.6.4 + rfdc: 1.3.1 + + string-strip-html@13.4.8: + dependencies: + '@types/lodash-es': 4.17.12 + codsen-utils: 1.6.4 + html-entities: 2.5.2 + lodash-es: 4.17.21 + ranges-apply: 7.0.16 + ranges-push: 7.0.15 + string-left-right: 6.0.17 + + string-trim-spaces-only@5.0.10: {} + string-width@1.0.2: dependencies: code-point-at: 1.1.0 @@ -8595,6 +11470,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -8637,6 +11516,8 @@ snapshots: strip-json-comments@3.1.1: {} + strnum@1.0.5: {} + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -8702,11 +11583,46 @@ snapshots: tapable@2.2.1: {} + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-fs@3.0.6: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.1 + bare-path: 2.1.3 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.18.0 + terminal-link@3.0.0: dependencies: ansi-escapes: 5.0.0 supports-hyperlinks: 2.3.0 + text-decoder@1.1.0: + dependencies: + b4a: 1.6.6 + + text-hex@1.0.0: {} + text-table@0.2.0: {} thenify-all@1.6.0: @@ -8717,10 +11633,16 @@ snapshots: dependencies: any-promise: 1.3.0 + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + through@2.3.8: {} tiktoken@1.0.15: {} + tiny-invariant@1.3.3: {} + tinybench@2.8.0: {} tinypool@0.9.0: {} @@ -8731,6 +11653,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + to-arraybuffer@1.0.1: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -8739,16 +11663,29 @@ snapshots: toidentifier@1.0.1: {} + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + tr46@0.0.3: {} tr46@1.0.1: dependencies: punycode: 2.3.1 + tr46@4.1.1: + dependencies: + punycode: 2.3.1 + tree-kill@1.2.2: {} trim-newlines@4.1.1: {} + triple-beam@1.4.1: {} + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 @@ -8814,10 +11751,14 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - twitter-api-sdk@1.2.1: + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + twitter-api-sdk@1.2.1(encoding@0.1.13): dependencies: abort-controller: 3.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -8878,6 +11819,10 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typed-emitter@2.1.0: + optionalDependencies: + rxjs: 7.8.1 + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -8891,14 +11836,22 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + underscore@1.13.6: {} + undici-types@5.26.5: {} + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + unicorn-magic@0.1.0: {} unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 + universalify@0.2.0: {} + unpipe@1.0.0: {} update-browserslist-db@1.0.16(browserslist@4.23.0): @@ -8926,6 +11879,13 @@ snapshots: dependencies: punycode: 2.3.1 + url-join@4.0.1: {} + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 @@ -8936,6 +11896,8 @@ snapshots: uuid@9.0.1: {} + uuidv7@0.6.3: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -9025,6 +11987,15 @@ snapshots: webidl-conversions@4.0.2: {} + webidl-conversions@7.0.0: {} + + whatwg-fetch@3.6.20: {} + + whatwg-url@13.0.0: + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -9089,6 +12060,35 @@ snapshots: dependencies: string-width: 5.1.2 + wikipedia@2.1.2: + dependencies: + axios: 1.7.2 + infobox-parser: 3.6.4 + transitivePeerDependencies: + - debug + + wink-nlp@2.3.0: {} + + winston-transport@4.7.0: + dependencies: + logform: 2.6.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.13.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.6.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.7.0 + word-wrap@1.2.5: {} wrap-ansi@3.0.1: @@ -9129,8 +12129,14 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + ws@8.17.0: {} + xdg-basedir@5.1.0: {} + xmlbuilder@10.1.1: {} + + xtend@4.0.2: {} + y18n@5.0.8: {} yallist@4.0.0: {} @@ -9157,9 +12163,9 @@ snapshots: yocto-queue@1.0.0: {} - zod-stream@1.0.3(openai@4.47.3)(zod@3.23.8): + zod-stream@1.0.3(openai@4.47.3(encoding@0.1.13))(zod@3.23.8): dependencies: - openai: 4.47.3 + openai: 4.47.3(encoding@0.1.13) schema-stream: 3.1.0(zod@3.23.8) zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) diff --git a/readme.md b/readme.md index 36b44861b..1382e28d0 100644 --- a/readme.md +++ b/readme.md @@ -141,10 +141,12 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## AI SDKs +- openai sdk - vercel ai sdk - dexa dexter - firebase genkit - langchain +- llamaindex ## TODO @@ -168,6 +170,8 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - tools / chains / flows / runnables - market maps - https://github.com/causaly/zod-validation-error +- investigate [autotool](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/autotool) +- investigate [data connectors](https://github.com/mendableai/data-connectors) ## License diff --git a/src/sdks/llamaindex.ts b/src/sdks/llamaindex.ts new file mode 100644 index 000000000..82c8a386c --- /dev/null +++ b/src/sdks/llamaindex.ts @@ -0,0 +1,22 @@ +import { FunctionTool } from 'llamaindex' + +import type { AIFunctionLike } from '../types.js' +import { AIFunctionSet } from '../ai-function-set.js' + +/** + * Converts a set of Agentic stdlib AI functions to an array of LlamaIndex- + * compatible tools. + */ +export function createLlamaIndexTools( + ...aiFunctionLikeTools: AIFunctionLike[] +) { + const fns = new AIFunctionSet(aiFunctionLikeTools) + + return fns.map((fn) => + FunctionTool.from(fn.impl, { + name: fn.spec.name, + description: fn.spec.description, + parameters: fn.spec.parameters as any + }) + ) +} diff --git a/src/tools/calculator.ts b/src/tools/calculator.ts index bed49c436..7f7bf7ad5 100644 --- a/src/tools/calculator.ts +++ b/src/tools/calculator.ts @@ -3,6 +3,9 @@ import { z } from 'zod' import { createAIFunction } from '../create-ai-function.js' +// TODO: consider using https://github.com/josdejong/mathjs +// TODO: ensure `expr` is sanitized to not run arbitrary code + export const CalculatorInputSchema = z.object({ expr: z.string().describe('mathematical expression to evaluate') }) From 9e84229c162e4491d4c2feb1e3f3c100e0b970c7 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 22:10:19 -0500 Subject: [PATCH 56/81] feat: add twitter client --- bin/scratch.ts | 23 +- package.json | 25 +- readme.md | 24 +- src/index.ts | 2 +- src/nango.ts | 47 +++ src/services/twitter-client.ts | 111 ------- src/services/twitter/client.ts | 78 +++++ src/services/twitter/error.ts | 32 ++ src/services/twitter/index.ts | 5 + src/services/twitter/twitter-client.ts | 405 +++++++++++++++++++++++++ src/services/twitter/types.ts | 71 +++++ src/services/twitter/utils.ts | 140 +++++++++ tsup.config.ts | 3 + 13 files changed, 835 insertions(+), 131 deletions(-) create mode 100644 src/nango.ts delete mode 100644 src/services/twitter-client.ts create mode 100644 src/services/twitter/client.ts create mode 100644 src/services/twitter/error.ts create mode 100644 src/services/twitter/index.ts create mode 100644 src/services/twitter/twitter-client.ts create mode 100644 src/services/twitter/types.ts create mode 100644 src/services/twitter/utils.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index aeb792626..bdc394d8d 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -11,7 +11,11 @@ import restoreCursor from 'restore-cursor' // import { FirecrawlClient } from '../src/index.js' // import { ExaClient } from '../src/index.js' // import { DiffbotClient } from '../src/index.js' -import { WolframClient } from '../src/index.js' +// import { WolframClient } from '../src/index.js' +import { + createTwitterV2Client, + TwitterClient +} from '../src/services/twitter/index.js' /** * Scratch pad for testing. @@ -76,14 +80,19 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const wolfram = new WolframClient() - // const res = await diffbot.analyzeUrl({ - // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + // const wolfram = new WolframClient() + // const res = await wolfram.ask({ + // input: 'population of new york city' // }) - const res = await wolfram.ask({ - input: 'population of new york city' + // console.log(res) + + const client = await createTwitterV2Client({ + // scopes: ['tweet.read', 'users.read', 'offline.access'] }) - console.log(res) + const twitter = new TwitterClient({ client }) + + const user = await twitter.findUserByUsername({ username: 'transitive_bs' }) + console.log(user) } try { diff --git a/package.json b/package.json index 7bffa1737..fd470dc41 100644 --- a/package.json +++ b/package.json @@ -38,10 +38,25 @@ "import": "./dist/sdks/genkit.js", "default": "./dist/sdks/genkit.js" }, + "./langchain": { + "types": "./dist/sdks/langchain.d.ts", + "import": "./dist/sdks/langchain.js", + "default": "./dist/sdks/langchain.js" + }, + "./llamaindex": { + "types": "./dist/sdks/llamaindex.d.ts", + "import": "./dist/sdks/llamaindex.js", + "default": "./dist/sdks/llamaindex.js" + }, "./calculator": { "types": "./dist/tools/calculator.d.ts", "import": "./dist/tools/calculator.js", "default": "./dist/tools/calculator.js" + }, + "./twitter": { + "types": "./dist/services/twitter/index.d.ts", + "import": "./dist/services/twitter/index.js", + "default": "./dist/services/twitter/index.js" } }, "files": [ @@ -74,7 +89,6 @@ "p-map": "^7.0.2", "p-throttle": "^6.1.0", "quick-lru": "^7.0.0", - "twitter-api-sdk": "^1.2.1", "type-fest": "^4.18.3", "zod": "^3.23.3", "zod-to-json-schema": "^3.23.0" @@ -104,6 +118,7 @@ "ts-node": "^10.9.2", "tsup": "^8.0.2", "tsx": "^4.11.0", + "twitter-api-sdk": "^1.2.1", "typescript": "^5.4.5", "vitest": "2.0.0-beta.3" }, @@ -113,7 +128,8 @@ "@langchain/core": "^0.2.5", "ai": "^3.1.22", "expr-eval": "^2.0.2", - "llamaindex": "^0.3.15" + "llamaindex": "^0.3.15", + "twitter-api-sdk": "^1.2.1" }, "peerDependenciesMeta": { "@dexaai/dexter": { @@ -125,13 +141,16 @@ "@langchain/core": { "optional": true }, + "ai": { + "optional": true + }, "expr-eval": { "optional": true }, "llamaindex": { "optional": true }, - "ai": { + "twitter-api-sdk": { "optional": true } }, diff --git a/readme.md b/readme.md index 1382e28d0..b42e42bdc 100644 --- a/readme.md +++ b/readme.md @@ -116,9 +116,10 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/stdlib` - SDK adatptor entrypoints should all be isolated to their own top-level imports - `@agentic/stdlib/ai-sdk` + - `@agentic/stdlib/langchain` + - `@agentic/stdlib/llamaindex` - `@agentic/stdlib/dexter` - `@agentic/stdlib/genkit` - - `@agentic/stdlib/langchain` ## Services @@ -136,23 +137,28 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - serpapi - serper - twitter (WIP) +- wolfram alpha - weatherapi - wikipedia ## AI SDKs -- openai sdk -- vercel ai sdk -- dexa dexter -- firebase genkit -- langchain -- llamaindex +- OpenAI SDK + - no need for an adaptor; use `AIFunctionSet.specs` or `AIFunctionSet.toolSpecs` +- Vercel AI SDK + - `import { createAISDKTools } from '@agentic/stdlib/ai-sdk'` +- LangChain + - `import { createLangChainTools } from '@agentic/stdlib/langchain'` +- LlamaIndex + - `import { createLlamaIndexTools } from '@agentic/stdlib/llamaindex'` +- Firebase Genkit + - `import { createGenkitTools } from '@agentic/stdlib/genkit'` +- Dexa Dexter + - `import { createDexterFunctions } from '@agentic/stdlib/dexter'` ## TODO - rename this repo to agentic -- sdks - - TODO - services - e2b - search-and-scrape diff --git a/src/index.ts b/src/index.ts index 50edc27c7..d3e155fc1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,9 @@ export * from './ai-function-set.js' export * from './create-ai-function.js' -export * from './create-ai-function.js' export * from './errors.js' export * from './fns.js' export * from './message.js' +export * from './nango.js' export * from './parse-structured-output.js' export * from './services/index.js' export type * from './types.js' diff --git a/src/nango.ts b/src/nango.ts new file mode 100644 index 000000000..3dbb0e6ae --- /dev/null +++ b/src/nango.ts @@ -0,0 +1,47 @@ +import { type Connection, Nango } from '@nangohq/node' + +import { getEnv } from './utils.js' + +// This is intentionally left as a global singleton to avoid re-creating the +// Nango connection instance on successive calls in serverless environments. +let _nango: Nango | null = null + +export function getNango(): Nango { + if (!_nango) { + const secretKey = getEnv('NANGO_SECRET_KEY')?.trim() + if (!secretKey) { + throw new Error(`Missing required "NANGO_SECRET_KEY"`) + } + + _nango = new Nango({ secretKey }) + } + + return _nango +} + +export function validateNangoConnectionOAuthScopes({ + connection, + scopes +}: { + connection: Connection + scopes: string[] +}) { + const connectionScopes = new Set( + connection.credentials.raw.scope.split(' ') + ) + const missingScopes = new Set() + + for (const scope of scopes) { + if (!connectionScopes.has(scope)) { + missingScopes.add(scope) + } + } + + if (missingScopes.size > 0) { + throw new Error( + `Nango connection ${connection.id} is missing required OAuth scopes: ${[ + ...missingScopes.values() + ].join(', ')}` + ) + } +} diff --git a/src/services/twitter-client.ts b/src/services/twitter-client.ts deleted file mode 100644 index 668d9661a..000000000 --- a/src/services/twitter-client.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { Nango } from '@nangohq/node' -import { auth, Client as TwitterClient } from 'twitter-api-sdk' - -import { assert, getEnv } from '../utils.js' - -// The Twitter+Nango client auth connection key -const nangoTwitterProviderConfigKey = 'twitter-v2' - -// The Twitter OAuth2User class requires a client id, which we don't have -// since we're using Nango for auth, so instead we just pass a dummy value -// and allow Nango to handle all auth/refresh/access token management. -const twitterClientId = 'xbot' - -const defaultRequiredTwitterOAuthScopes = new Set([ - 'tweet.read', - 'users.read', - 'offline.access', - 'tweet.write' -]) - -let _nango: Nango | null = null - -function getNango(): Nango { - if (!_nango) { - const secretKey = getEnv('NANGO_SECRET_KEY')?.trim() - if (!secretKey) { - throw new Error(`Missing required "NANGO_SECRET_KEY"`) - } - - _nango = new Nango({ secretKey }) - } - - return _nango -} - -async function getTwitterAuth({ - scopes, - nangoConnectionId, - nangoCallbackUrl -}: { - scopes: Set - nangoConnectionId: string - nangoCallbackUrl: string -}): Promise { - const nango = getNango() - const connection = await nango.getConnection( - nangoTwitterProviderConfigKey, - nangoConnectionId - ) - - // console.debug('nango twitter connection', connection) - // connection.credentials.raw - // { - // token_type: 'bearer', - // expires_in: number, - // access_token: string - // scope: string - // expires_at: string - // } - const connectionScopes = new Set( - connection.credentials.raw.scope.split(' ') - ) - const missingScopes = new Set() - - for (const scope of scopes) { - if (!connectionScopes.has(scope)) { - missingScopes.add(scope) - } - } - - if (missingScopes.size > 0) { - throw new Error( - `Nango connection ${nangoConnectionId} is missing required OAuth scopes: ${[ - ...missingScopes.values() - ].join(', ')}` - ) - } - - const token = connection.credentials.raw - assert(token) - - return new auth.OAuth2User({ - client_id: twitterClientId, - callback: nangoCallbackUrl, - scopes: [...scopes.values()] as any, - token - }) -} - -export async function getTwitterClient({ - scopes = defaultRequiredTwitterOAuthScopes, - nangoConnectionId = getEnv('NANGO_CONNECTION_ID'), - nangoCallbackUrl = getEnv('NANGO_CALLBACK_URL') -}: { - scopes?: Set - nangoConnectionId?: string - nangoCallbackUrl?: string -} = {}): Promise { - assert(nangoConnectionId, 'twitter client missing nangoConnectionId') - assert(nangoCallbackUrl, 'twitter client missing nangoCallbackUrl') - - // NOTE: Nango handles refreshing the oauth access token for us - const twitterAuth = await getTwitterAuth({ - scopes, - nangoConnectionId, - nangoCallbackUrl - }) - - // Twitter API v2 using OAuth 2.0 - return new TwitterClient(twitterAuth) -} diff --git a/src/services/twitter/client.ts b/src/services/twitter/client.ts new file mode 100644 index 000000000..1ba99601d --- /dev/null +++ b/src/services/twitter/client.ts @@ -0,0 +1,78 @@ +import { auth, Client as TwitterV2Client } from 'twitter-api-sdk' + +import { getNango, validateNangoConnectionOAuthScopes } from '../../nango.js' +import { assert, getEnv } from '../../utils.js' + +// Auth new Nango accounts here: https://app.nango.dev/connections + +// The Twitter OAuth2User class requires a client id, which we don't have +// since we're using Nango for auth, so instead we just pass a dummy value +// and allow Nango to handle all auth/refresh/access token management. +const dummyTwitterClientId = 'agentic' + +export const defaultTwitterOAuthScopes = [ + 'tweet.read', + 'users.read', + 'offline.access', + 'tweet.write' +] + +async function createTwitterAuth({ + scopes, + nangoConnectionId, + nangoCallbackUrl, + nangoProviderConfigKey +}: { + scopes: string[] + nangoConnectionId: string + nangoCallbackUrl: string + nangoProviderConfigKey: string +}): Promise { + const nango = getNango() + const connection = await nango.getConnection( + nangoProviderConfigKey, + nangoConnectionId + ) + + validateNangoConnectionOAuthScopes({ + connection, + scopes + }) + + const token = connection.credentials.raw + assert(token) + + return new auth.OAuth2User({ + client_id: dummyTwitterClientId, + callback: nangoCallbackUrl, + scopes: scopes as any[], + token + }) +} + +export async function createTwitterV2Client({ + scopes = defaultTwitterOAuthScopes, + nangoConnectionId = getEnv('NANGO_CONNECTION_ID'), + nangoCallbackUrl = getEnv('NANGO_CALLBACK_URL') ?? + 'https://api.nango.dev/oauth/callback', + nangoProviderConfigKey = 'twitter-v2' +}: { + scopes?: string[] + nangoConnectionId?: string + nangoCallbackUrl?: string + nangoProviderConfigKey?: string +} = {}): Promise { + assert(nangoConnectionId, 'twitter client missing nangoConnectionId') + assert(nangoCallbackUrl, 'twitter client missing nangoCallbackUrl') + + // NOTE: Nango handles refreshing the oauth access token for us + const twitterAuth = await createTwitterAuth({ + scopes, + nangoConnectionId, + nangoCallbackUrl, + nangoProviderConfigKey + }) + + // Twitter API v2 using OAuth 2.0 + return new TwitterV2Client(twitterAuth) +} diff --git a/src/services/twitter/error.ts b/src/services/twitter/error.ts new file mode 100644 index 000000000..4fc8de560 --- /dev/null +++ b/src/services/twitter/error.ts @@ -0,0 +1,32 @@ +export type TwitterErrorType = + | 'twitter:forbidden' + | 'twitter:auth' + | 'twitter:rate-limit' + | 'twitter:unknown' + | 'network' + +export class TwitterError extends Error { + type: TwitterErrorType + isFinal: boolean + status?: number + + constructor( + message: string, + { + type, + isFinal = false, + status, + ...opts + }: ErrorOptions & { + type: TwitterErrorType + isFinal?: boolean + status?: number + } + ) { + super(message, opts) + + this.type = type + this.isFinal = isFinal + this.status = status ?? (opts.cause as any)?.status + } +} diff --git a/src/services/twitter/index.ts b/src/services/twitter/index.ts new file mode 100644 index 000000000..a002d7f40 --- /dev/null +++ b/src/services/twitter/index.ts @@ -0,0 +1,5 @@ +export * from './client.js' +export * from './error.js' +export * from './twitter-client.js' +export type * from './types.js' +export * from './utils.js' diff --git a/src/services/twitter/twitter-client.ts b/src/services/twitter/twitter-client.ts new file mode 100644 index 000000000..7d72c2eb6 --- /dev/null +++ b/src/services/twitter/twitter-client.ts @@ -0,0 +1,405 @@ +import pThrottle from 'p-throttle' +import { z } from 'zod' + +import type * as types from './types.js' +import { aiFunction, AIFunctionsProvider } from '../../fns.js' +import { assert, getEnv } from '../../utils.js' +import { handleKnownTwitterErrors } from './utils.js' + +/** + * This file contains rate-limited wrappers around all of the core Twitter API + * methods that this project uses. + * + * NOTE: Twitter has different API rate limits and quotas per plan, so in order + * to rate-limit effectively, our throttles need to either use the lowest common + * denominator OR vary based on the twitter developer plan you're using. We + * chose to go with the latter. + * + * @see https://developer.twitter.com/en/docs/twitter-api/rate-limits + */ + +type TwitterApiMethod = + | 'createTweet' + | 'usersIdMentions' + | 'findTweetById' + | 'findTweetsById' + | 'findUserById' + | 'findUserByUsername' + +const TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000 +const FIFTEEN_MINUTES_MS = 15 * 60 * 1000 + +const twitterApiRateLimitsByPlan: Record< + types.TwitterApiPlan, + Record< + TwitterApiMethod, + { + readonly limit: number + readonly interval: number + } + > +> = { + free: { + // 50 per 24h per user + // 50 per 24h per app + createTweet: { limit: 50, interval: TWENTY_FOUR_HOURS_MS }, + + // TODO: according to the twitter docs, this shouldn't be allowed on the + // free plan, but it seems to work... + usersIdMentions: { limit: 1, interval: FIFTEEN_MINUTES_MS }, + + // TODO: according to the twitter docs, this shouldn't be allowed on the + // free plan, but it seems to work... + findTweetById: { limit: 1, interval: FIFTEEN_MINUTES_MS }, + + // TODO: according to the twitter docs, this shouldn't be allowed on the + // free plan, but it seems to work... + findTweetsById: { limit: 1, interval: FIFTEEN_MINUTES_MS }, + + findUserById: { limit: 1, interval: FIFTEEN_MINUTES_MS }, + findUserByUsername: { limit: 1, interval: FIFTEEN_MINUTES_MS } + }, + + basic: { + // 100 per 24h per user + // 1667 per 24h per app + createTweet: { limit: 100, interval: TWENTY_FOUR_HOURS_MS }, + + // https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-mentions + // TODO: undocumented + // 180 per 15m per user + // 450 per 15m per app + usersIdMentions: { limit: 180, interval: FIFTEEN_MINUTES_MS }, + + // 15 per 15m per user + // 15 per 15m per app + findTweetById: { limit: 15, interval: FIFTEEN_MINUTES_MS }, + findTweetsById: { limit: 15, interval: FIFTEEN_MINUTES_MS }, + + findUserById: { limit: 100, interval: TWENTY_FOUR_HOURS_MS }, + findUserByUsername: { limit: 100, interval: TWENTY_FOUR_HOURS_MS } + }, + + pro: { + // 100 per 15m per user + // 10k per 24h per app + createTweet: { limit: 100, interval: FIFTEEN_MINUTES_MS }, + + // 180 per 15m per user + // 450 per 15m per app + usersIdMentions: { limit: 180, interval: FIFTEEN_MINUTES_MS }, + + // TODO: why would the per-user rate-limit be less than the per-app one?! + // 900 per 15m per user + // 450 per 15m per app + findTweetById: { limit: 450, interval: FIFTEEN_MINUTES_MS }, + findTweetsById: { limit: 450, interval: FIFTEEN_MINUTES_MS }, + + findUserById: { limit: 300, interval: FIFTEEN_MINUTES_MS }, + findUserByUsername: { limit: 300, interval: FIFTEEN_MINUTES_MS } + }, + + enterprise: { + // NOTE: these are just placeholders; the enterprise plan seems to be + // completely customizable, but it's still useful to define rate limits + // for robustness. These values just 10x those of the pro plan. + createTweet: { limit: 1000, interval: FIFTEEN_MINUTES_MS }, + usersIdMentions: { limit: 1800, interval: FIFTEEN_MINUTES_MS }, + findTweetById: { limit: 4500, interval: FIFTEEN_MINUTES_MS }, + findTweetsById: { limit: 4500, interval: FIFTEEN_MINUTES_MS }, + findUserById: { limit: 3000, interval: FIFTEEN_MINUTES_MS }, + findUserByUsername: { limit: 3000, interval: FIFTEEN_MINUTES_MS } + } +} + +export class TwitterClient extends AIFunctionsProvider { + readonly client: types.TwitterV2Client + readonly twitterApiPlan: types.TwitterApiPlan + + constructor({ + client, + twitterApiPlan = (getEnv('TWITTER_API_PLAN') as types.TwitterApiPlan) ?? + 'free' + }: { + client: types.TwitterV2Client + twitterApiPlan?: types.TwitterApiPlan + }) { + assert( + client, + 'TwitterClient missing required "client" which should be an instance of "twitter-api-sdk" (use `getTwitterV2Client` to initialize the underlying V2 Twitter SDK using Nango OAuth)' + ) + assert(twitterApiPlan, 'TwitterClient missing required "twitterApiPlan"') + + super() + + this.client = client + this.twitterApiPlan = twitterApiPlan + + const twitterApiRateLimits = twitterApiRateLimitsByPlan[twitterApiPlan]! + assert(twitterApiRateLimits, `Invalid twitter api plan: ${twitterApiPlan}`) + + const createTweetThrottle = pThrottle(twitterApiRateLimits.createTweet) + const findTweetByIdThrottle = pThrottle(twitterApiRateLimits.findTweetById) + const findTweetsByIdThrottle = pThrottle( + twitterApiRateLimits.findTweetsById + ) + const findUserByIdThrottle = pThrottle(twitterApiRateLimits.findUserById) + const findUserByUsernameThrottle = pThrottle( + twitterApiRateLimits.findUserByUsername + ) + + this._createTweet = createTweetThrottle(createTweetImpl(this.client)) + this._findTweetById = findTweetByIdThrottle(findTweetByIdImpl(this.client)) + this._findTweetsById = findTweetsByIdThrottle( + findTweetsByIdImpl(this.client) + ) + this._findUserById = findUserByIdThrottle(findUserByIdImpl(this.client)) + this._findUserByUsername = findUserByUsernameThrottle( + findUserByUsernameImpl(this.client) + ) + } + + protected _createTweet: ReturnType + protected _findTweetById: ReturnType + protected _findTweetsById: ReturnType + protected _findUserById: ReturnType + protected _findUserByUsername: ReturnType + + @aiFunction({ + name: 'create_tweet', + description: 'Creates a new tweet', + inputSchema: z.object({ + text: z.string().min(1) + }) + }) + async createTweet( + params: types.CreateTweetParams + ): Promise { + return this._createTweet(params) + } + + @aiFunction({ + name: 'get_tweet_by_id', + description: 'Fetch a tweet by its ID', + inputSchema: z.object({ + id: z.string().min(1) + }) + }) + async findTweetById({ + id, + ...params + }: { id: string } & types.FindTweetByIdParams) { + assert( + this.twitterApiPlan !== 'free', + 'TwitterClient.findTweetById not supported on free plan' + ) + + return this._findTweetById(id, params) + } + + @aiFunction({ + name: 'get_tweets_by_id', + description: 'Fetch an array of tweets by their IDs', + inputSchema: z.object({ + ids: z.array(z.string().min(1)) + }) + }) + async findTweetsById({ ids, ...params }: types.FindTweetsByIdParams) { + assert( + this.twitterApiPlan !== 'free', + 'TwitterClient.findTweetsById not supported on free plan' + ) + + return this._findTweetsById(ids, params) + } + + @aiFunction({ + name: 'get_twitter_user_by_id', + description: 'Fetch a twitter user by ID', + inputSchema: z.object({ + id: z.string().min(1) + }) + }) + async findUserById({ + id, + ...params + }: { id: string } & types.FindUserByIdParams) { + assert( + this.twitterApiPlan !== 'free', + 'TwitterClient.findUserById not supported on free plan' + ) + + return this._findUserById(id, params) + } + + @aiFunction({ + name: 'get_twitter_user_by_username', + description: 'Fetch a twitter user by username', + inputSchema: z.object({ + username: z.string().min(1) + }) + }) + async findUserByUsername({ + username, + ...params + }: { username: string } & types.FindUserByUsernameParams) { + assert( + this.twitterApiPlan !== 'free', + 'TwitterClient.findUserByUsername not supported on free plan' + ) + + return this._findUserByUsername(username, params) + } +} + +const defaultTwitterQueryTweetFields: types.TwitterQueryTweetFields = [ + 'attachments', + 'author_id', + 'conversation_id', + 'created_at', + 'entities', + 'geo', + 'id', + 'in_reply_to_user_id', + 'lang', + 'public_metrics', + 'possibly_sensitive', + 'referenced_tweets', + 'text' + // 'context_annotations', // not needed (way too verbose and noisy) + // 'edit_controls', / not needed + // 'non_public_metrics', // don't have access to + // 'organic_metrics', // don't have access to + // 'promoted_metrics, // don't have access to + // 'reply_settings', / not needed + // 'source', // not needed + // 'withheld' // not needed +] + +const defaultTwitterQueryUserFields: types.TwitterQueryUserFields = [ + 'created_at', + 'description', + 'entities', + 'id', + 'location', + 'name', + 'pinned_tweet_id', + 'profile_image_url', + 'protected', + 'public_metrics', + 'url', + 'username', + 'verified' + // 'most_recent_tweet_id', + // 'verified_type', + // 'withheld' +] + +const defaultTweetQueryParams: types.TweetsQueryOptions = { + // https://developer.twitter.com/en/docs/twitter-api/expansions + expansions: [ + 'author_id', + 'in_reply_to_user_id', + 'referenced_tweets.id', + 'referenced_tweets.id.author_id', + 'entities.mentions.username', + // TODO + 'attachments.media_keys', + 'geo.place_id', + 'attachments.poll_ids' + ], + 'tweet.fields': defaultTwitterQueryTweetFields, + 'user.fields': defaultTwitterQueryUserFields +} + +const defaultUserQueryParams: types.TwitterUserQueryOptions = { + // https://developer.twitter.com/en/docs/twitter-api/expansions + expansions: ['pinned_tweet_id'], + 'tweet.fields': defaultTwitterQueryTweetFields, + 'user.fields': defaultTwitterQueryUserFields +} + +function createTweetImpl(client: types.TwitterV2Client) { + return async ( + params: types.CreateTweetParams + ): Promise => { + try { + const { data: tweet } = await client.tweets.createTweet(params) + + if (!tweet?.id) { + throw new Error('invalid createTweet response') + } + + return tweet + } catch (err: any) { + console.error('error creating tweet', JSON.stringify(err, null, 2)) + + handleKnownTwitterErrors(err, { label: 'creating tweet' }) + throw err + } + } +} + +function findTweetByIdImpl(client: types.TwitterV2Client) { + return async (tweetId: string, params?: types.FindTweetByIdParams) => { + try { + return await client.tweets.findTweetById(tweetId, { + ...defaultTweetQueryParams, + ...params + }) + } catch (err: any) { + handleKnownTwitterErrors(err, { label: `fetching tweet ${tweetId}` }) + throw err + } + } +} + +function findTweetsByIdImpl(client: types.TwitterV2Client) { + return async ( + ids: string[], + params?: Omit + ) => { + try { + return await client.tweets.findTweetsById({ + ...defaultTweetQueryParams, + ...params, + ids + }) + } catch (err: any) { + handleKnownTwitterErrors(err, { label: `fetching ${ids.length} tweets` }) + throw err + } + } +} + +function findUserByIdImpl(client: types.TwitterV2Client) { + return async (userId: string, params?: types.FindUserByIdParams) => { + try { + return await client.users.findUserById(userId, { + ...defaultUserQueryParams, + ...params + }) + } catch (err: any) { + handleKnownTwitterErrors(err, { + label: `fetching user with id ${userId}` + }) + throw err + } + } +} + +function findUserByUsernameImpl(client: types.TwitterV2Client) { + return async (username: string, params?: types.FindUserByUsernameParams) => { + try { + return await client.users.findUserByUsername(username, { + ...defaultUserQueryParams, + ...params + }) + } catch (err: any) { + handleKnownTwitterErrors(err, { + label: `fetching user with username ${username}` + }) + throw err + } + } +} diff --git a/src/services/twitter/types.ts b/src/services/twitter/types.ts new file mode 100644 index 000000000..4ee2893d4 --- /dev/null +++ b/src/services/twitter/types.ts @@ -0,0 +1,71 @@ +import type { AsyncReturnType, Simplify } from 'type-fest' +import { type Client as TwitterV2Client } from 'twitter-api-sdk' + +export { type Client as TwitterV2Client } from 'twitter-api-sdk' + +export type TwitterApiPlan = 'free' | 'basic' | 'pro' | 'enterprise' + +export type TweetsQueryOptions = Simplify< + Pick< + Parameters[0], + 'expansions' | 'tweet.fields' | 'user.fields' + > +> + +export type TwitterUserQueryOptions = Simplify< + Pick< + NonNullable[1]>, + 'expansions' | 'tweet.fields' | 'user.fields' + > +> + +export type TwitterQueryTweetFields = TweetsQueryOptions['tweet.fields'] +export type TwitterQueryUserFields = TweetsQueryOptions['user.fields'] + +export type TwitterUserIdMentionsQueryOptions = Simplify< + NonNullable[1]> +> + +export type CreateTweetParams = Simplify< + Parameters[0] +> + +export type UsersIdMentionsParams = Simplify< + Parameters[1] +> + +export type FindTweetByIdParams = Simplify< + Parameters[1] +> + +export type FindTweetsByIdParams = Simplify< + Parameters[0] +> + +export type FindUserByIdParams = Simplify< + Parameters[1] +> + +export type FindUserByUsernameParams = Simplify< + Parameters[1] +> + +type Unpacked = T extends (infer U)[] ? U : T + +export type Tweet = Simplify< + NonNullable< + Unpacked< + AsyncReturnType['data'] + > + > +> +export type TwitterUser = Simplify< + NonNullable['data']> +> +export type CreatedTweet = Simplify< + NonNullable['data']> +> + +export type TwitterUrl = Simplify< + Unpacked['urls']>> +> diff --git a/src/services/twitter/utils.ts b/src/services/twitter/utils.ts new file mode 100644 index 000000000..a4a97dd0e --- /dev/null +++ b/src/services/twitter/utils.ts @@ -0,0 +1,140 @@ +import type * as types from './types.js' +import { omit } from '../../utils.js' +import { TwitterError } from './error.js' + +/** + * Error handler which takes in an unknown Error object and converts it to a + * structured TwitterError object for a set of common Twitter API errors. + * + * Re-throws the error and will never return. + */ +export function handleKnownTwitterErrors( + err: any, + { label = '' }: { label?: string } = {} +) { + if (err.status === 403) { + // user may have deleted the tweet we're trying to respond to + throw new TwitterError( + err.error?.detail || `error ${label}: 403 forbidden`, + { + type: 'twitter:forbidden', + isFinal: true, + cause: err + } + ) + } else if (err.status === 401) { + throw new TwitterError(`error ${label}: unauthorized`, { + type: 'twitter:auth', + cause: err + }) + } else if (err.status === 400) { + if ( + /value passed for the token was invalid/i.test( + err.error?.error_description + ) + ) { + throw new TwitterError(`error ${label}: invalid auth token`, { + type: 'twitter:auth', + cause: err + }) + } + } else if (err.status === 429) { + throw new TwitterError(`error ${label}: too many requests`, { + type: 'twitter:rate-limit', + cause: err + }) + } else if (err.status === 404) { + throw new TwitterError(err.toString(), { + type: 'twitter:forbidden', + isFinal: true, + cause: err + }) + } + + if (err.status >= 400 && err.status < 500) { + throw new TwitterError( + `error ${label}: ${err.status} ${ + err.error?.description || err.toString() + }`, + { + type: 'twitter:unknown', + isFinal: true, + cause: err + } + ) + } else if (err.status >= 500) { + throw new TwitterError( + `error ${label}: ${err.status} ${ + err.error?.description || err.toString() + }`, + { + type: 'twitter:unknown', + isFinal: false, + cause: err + } + ) + } + + const reason = err.toString().toLowerCase() + + if (reason.includes('fetcherror') || reason.includes('enotfound')) { + throw new TwitterError(err.toString(), { + type: 'network', + cause: err + }) + } + + // Otherwise, propagate the original error + throw err +} + +export function getPrunedTweet( + tweet: Partial +): Partial { + const urls = tweet.entities?.urls + let text = tweet.text + if (text && urls) { + for (const url of urls) { + if (!url.expanded_url || !url.url) continue + text = text!.replaceAll(url.url, url.expanded_url!) + } + } + + return { + ...omit( + tweet, + 'conversation_id', + 'public_metrics', + 'created_at', + 'entities', + 'possibly_sensitive' + ), + text + } +} + +export function getPrunedTwitterUser( + twitterUser: Partial +): Partial { + const urls = twitterUser.entities?.description?.urls + let description = twitterUser.description + if (description && urls) { + for (const url of urls) { + if (!url.expanded_url || !url.url) continue + description = description!.replaceAll(url.url, url.expanded_url!) + } + } + + return { + ...omit( + twitterUser, + 'public_metrics', + 'created_at', + 'verified', + 'protected', + 'url', + 'entities' + ), + description + } +} diff --git a/tsup.config.ts b/tsup.config.ts index 30d2242dd..5fad85e41 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -7,6 +7,9 @@ export default defineConfig([ 'src/sdks/ai-sdk.ts', 'src/sdks/dexter.ts', 'src/sdks/genkit.ts', + 'src/sdks/langchain.ts', + 'src/sdks/llamaindex.ts', + 'src/services/twitter/index.ts', 'src/tools/calculator.ts' ], outDir: 'dist', From b3e589c520c99c0818c0948a211c562947b27fd0 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 22:27:07 -0500 Subject: [PATCH 57/81] =?UTF-8?q?=F0=9F=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 10 +++-- src/services/twitter/twitter-client.ts | 62 +++++++++++++++++++++++--- src/services/twitter/types.ts | 4 ++ 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index bdc394d8d..46fbde35b 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -87,12 +87,14 @@ async function main() { // console.log(res) const client = await createTwitterV2Client({ - // scopes: ['tweet.read', 'users.read', 'offline.access'] + scopes: ['tweet.read', 'users.read', 'offline.access'] }) const twitter = new TwitterClient({ client }) - - const user = await twitter.findUserByUsername({ username: 'transitive_bs' }) - console.log(user) + // const res = await twitter.findUserByUsername({ username: 'transitive_bs' }) + const res = await twitter.searchRecentTweets({ + query: 'open source AI agents' + }) + console.log(res) } try { diff --git a/src/services/twitter/twitter-client.ts b/src/services/twitter/twitter-client.ts index 7d72c2eb6..8c7ac9de0 100644 --- a/src/services/twitter/twitter-client.ts +++ b/src/services/twitter/twitter-client.ts @@ -23,6 +23,7 @@ type TwitterApiMethod = | 'usersIdMentions' | 'findTweetById' | 'findTweetsById' + | 'searchRecentTweets' | 'findUserById' | 'findUserByUsername' @@ -47,15 +48,9 @@ const twitterApiRateLimitsByPlan: Record< // TODO: according to the twitter docs, this shouldn't be allowed on the // free plan, but it seems to work... usersIdMentions: { limit: 1, interval: FIFTEEN_MINUTES_MS }, - - // TODO: according to the twitter docs, this shouldn't be allowed on the - // free plan, but it seems to work... findTweetById: { limit: 1, interval: FIFTEEN_MINUTES_MS }, - - // TODO: according to the twitter docs, this shouldn't be allowed on the - // free plan, but it seems to work... findTweetsById: { limit: 1, interval: FIFTEEN_MINUTES_MS }, - + searchRecentTweets: { limit: 1, interval: FIFTEEN_MINUTES_MS }, findUserById: { limit: 1, interval: FIFTEEN_MINUTES_MS }, findUserByUsername: { limit: 1, interval: FIFTEEN_MINUTES_MS } }, @@ -76,6 +71,10 @@ const twitterApiRateLimitsByPlan: Record< findTweetById: { limit: 15, interval: FIFTEEN_MINUTES_MS }, findTweetsById: { limit: 15, interval: FIFTEEN_MINUTES_MS }, + // 60 per 15m per user + // 60 per 15m per app + searchRecentTweets: { limit: 60, interval: FIFTEEN_MINUTES_MS }, + findUserById: { limit: 100, interval: TWENTY_FOUR_HOURS_MS }, findUserByUsername: { limit: 100, interval: TWENTY_FOUR_HOURS_MS } }, @@ -95,6 +94,11 @@ const twitterApiRateLimitsByPlan: Record< findTweetById: { limit: 450, interval: FIFTEEN_MINUTES_MS }, findTweetsById: { limit: 450, interval: FIFTEEN_MINUTES_MS }, + // TODO: why would the per-user rate-limit be less than the per-app one?! + // 456 per 15m per user + // 300 per 15m per app + searchRecentTweets: { limit: 300, interval: FIFTEEN_MINUTES_MS }, + findUserById: { limit: 300, interval: FIFTEEN_MINUTES_MS }, findUserByUsername: { limit: 300, interval: FIFTEEN_MINUTES_MS } }, @@ -107,6 +111,7 @@ const twitterApiRateLimitsByPlan: Record< usersIdMentions: { limit: 1800, interval: FIFTEEN_MINUTES_MS }, findTweetById: { limit: 4500, interval: FIFTEEN_MINUTES_MS }, findTweetsById: { limit: 4500, interval: FIFTEEN_MINUTES_MS }, + searchRecentTweets: { limit: 3000, interval: FIFTEEN_MINUTES_MS }, findUserById: { limit: 3000, interval: FIFTEEN_MINUTES_MS }, findUserByUsername: { limit: 3000, interval: FIFTEEN_MINUTES_MS } } @@ -143,6 +148,9 @@ export class TwitterClient extends AIFunctionsProvider { const findTweetsByIdThrottle = pThrottle( twitterApiRateLimits.findTweetsById ) + const searchRecentTweetsThrottle = pThrottle( + twitterApiRateLimits.searchRecentTweets + ) const findUserByIdThrottle = pThrottle(twitterApiRateLimits.findUserById) const findUserByUsernameThrottle = pThrottle( twitterApiRateLimits.findUserByUsername @@ -153,6 +161,9 @@ export class TwitterClient extends AIFunctionsProvider { this._findTweetsById = findTweetsByIdThrottle( findTweetsByIdImpl(this.client) ) + this._searchRecentTweets = searchRecentTweetsThrottle( + searchRecentTweetsImpl(this.client) + ) this._findUserById = findUserByIdThrottle(findUserByIdImpl(this.client)) this._findUserByUsername = findUserByUsernameThrottle( findUserByUsernameImpl(this.client) @@ -162,6 +173,7 @@ export class TwitterClient extends AIFunctionsProvider { protected _createTweet: ReturnType protected _findTweetById: ReturnType protected _findTweetsById: ReturnType + protected _searchRecentTweets: ReturnType protected _findUserById: ReturnType protected _findUserByUsername: ReturnType @@ -213,6 +225,26 @@ export class TwitterClient extends AIFunctionsProvider { return this._findTweetsById(ids, params) } + @aiFunction({ + name: 'search_recent_tweets', + description: 'Searches for recent tweets', + inputSchema: z.object({ + query: z.string().min(1), + sort_order: z + .enum(['recency', 'relevancy']) + .default('relevancy') + .optional() + }) + }) + async searchRecentTweets(params: types.SearchRecentTweetsParams) { + assert( + this.twitterApiPlan !== 'free', + 'TwitterClient.searchRecentTweets not supported on free plan' + ) + + return this._searchRecentTweets(params) + } + @aiFunction({ name: 'get_twitter_user_by_id', description: 'Fetch a twitter user by ID', @@ -372,6 +404,22 @@ function findTweetsByIdImpl(client: types.TwitterV2Client) { } } +function searchRecentTweetsImpl(client: types.TwitterV2Client) { + return async (params: types.SearchRecentTweetsParams) => { + try { + return await client.tweets.tweetsRecentSearch({ + ...defaultTweetQueryParams, + ...params + }) + } catch (err: any) { + handleKnownTwitterErrors(err, { + label: `searching tweets query "${params.query}"` + }) + throw err + } + } +} + function findUserByIdImpl(client: types.TwitterV2Client) { return async (userId: string, params?: types.FindUserByIdParams) => { try { diff --git a/src/services/twitter/types.ts b/src/services/twitter/types.ts index 4ee2893d4..18ebbad10 100644 --- a/src/services/twitter/types.ts +++ b/src/services/twitter/types.ts @@ -42,6 +42,10 @@ export type FindTweetsByIdParams = Simplify< Parameters[0] > +export type SearchRecentTweetsParams = Simplify< + Parameters[0] +> + export type FindUserByIdParams = Simplify< Parameters[1] > From bf6ee7c9b25380e2498a0df3350c5daaca85516f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 22:46:47 -0500 Subject: [PATCH 58/81] =?UTF-8?q?=F0=9F=8D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 40 ++++++++++++++++++++-------------------- readme.md | 2 +- src/services/index.ts | 1 - 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 46fbde35b..3b5df8af3 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -8,14 +8,14 @@ import restoreCursor from 'restore-cursor' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' // import { WikipediaClient } from '../src/index.js' // import { PerigonClient } from '../src/index.js' -// import { FirecrawlClient } from '../src/index.js' +import { FirecrawlClient } from '../src/index.js' // import { ExaClient } from '../src/index.js' // import { DiffbotClient } from '../src/index.js' // import { WolframClient } from '../src/index.js' -import { - createTwitterV2Client, - TwitterClient -} from '../src/services/twitter/index.js' +// import { +// createTwitterV2Client, +// TwitterClient +// } from '../src/services/twitter/index.js' /** * Scratch pad for testing. @@ -56,12 +56,12 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - // const firecrawl = new FirecrawlClient() - // const res = await firecrawl.scrapeUrl({ - // // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' - // url: 'https://www.firecrawl.dev' - // }) - // console.log(JSON.stringify(res, null, 2)) + const firecrawl = new FirecrawlClient() + const res = await firecrawl.scrapeUrl({ + // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + url: 'https://www.firecrawl.dev' + }) + console.log(JSON.stringify(res, null, 2)) // const exa = new ExaClient() // const res = await exa.search({ @@ -86,15 +86,15 @@ async function main() { // }) // console.log(res) - const client = await createTwitterV2Client({ - scopes: ['tweet.read', 'users.read', 'offline.access'] - }) - const twitter = new TwitterClient({ client }) - // const res = await twitter.findUserByUsername({ username: 'transitive_bs' }) - const res = await twitter.searchRecentTweets({ - query: 'open source AI agents' - }) - console.log(res) + // const client = await createTwitterV2Client({ + // scopes: ['tweet.read', 'users.read', 'offline.access'] + // }) + // const twitter = new TwitterClient({ client }) + // // const res = await twitter.findUserByUsername({ username: 'transitive_bs' }) + // const res = await twitter.searchRecentTweets({ + // query: 'open source AI agents' + // }) + // console.log(res) } try { diff --git a/readme.md b/readme.md index b42e42bdc..aedced555 100644 --- a/readme.md +++ b/readme.md @@ -136,7 +136,7 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - searxng - serpapi - serper -- twitter (WIP) +- twitter - wolfram alpha - weatherapi - wikipedia diff --git a/src/services/index.ts b/src/services/index.ts index 4c15b1112..72fae17b4 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -11,7 +11,6 @@ export * from './scraper-client.js' export * from './searxng-client.js' export * from './serpapi-client.js' export * from './serper-client.js' -export * from './twitter-client.js' export * from './weather-client.js' export * from './wikipedia-client.js' export * from './wolfram-client.js' From 1c10060651d7996689f3ec10cb2afd55626ddbc9 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 4 Jun 2024 22:58:32 -0500 Subject: [PATCH 59/81] =?UTF-8?q?=E2=98=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/scratch.ts | 5 +++-- src/services/firecrawl-client.ts | 38 +++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 3b5df8af3..a90ef8202 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -58,8 +58,9 @@ async function main() { const firecrawl = new FirecrawlClient() const res = await firecrawl.scrapeUrl({ - // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' - url: 'https://www.firecrawl.dev' + url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + // url: 'https://www.theguardian.com/technology/article/2024/jun/04/openai-google-ai-risks-letter' + // url: 'https://www.firecrawl.dev' }) console.log(JSON.stringify(res, null, 2)) diff --git a/src/services/firecrawl-client.ts b/src/services/firecrawl-client.ts index 134d1d48b..dbb85b589 100644 --- a/src/services/firecrawl-client.ts +++ b/src/services/firecrawl-client.ts @@ -25,10 +25,33 @@ export namespace firecrawl { */ export interface ScrapeResponse { success: boolean - data?: any + data?: Data error?: string } + export interface Data { + content?: string + markdown?: string + html?: string + metadata: Metadata + } + + export interface Metadata { + title: string + description: string + keywords?: string + robots?: string + ogTitle?: string + ogDescription?: string + ogUrl?: string + ogImage?: string + ogLocaleAlternate?: any[] + ogSiteName?: string + sourceURL?: string + modifiedTime?: string + publishedTime?: string + } + /** * Response interface for searching operations. */ @@ -132,9 +155,18 @@ export class FirecrawlClient extends AIFunctionsProvider { } } - return this.ky - .post('v0/scrapeUrl', { json }) + const res = await this.ky + .post('v0/scrape', { json }) .json() + + if (!res.success || !res.data) return res + + if (res.data.markdown) { + delete res.data.html + delete res.data.content + } + + return res } async search( From 71fa4b2e7cd391af37e5c599ef60e9ac8112fb7a Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 01:46:52 -0500 Subject: [PATCH 60/81] feat: add SearchAndCrawl --- examples/dexter/analyze.ts | 30 ++++++++ src/tools/search-and-crawl.ts | 135 ++++++++++++++++++++++++++++++++++ src/url-utils.ts | 79 +++++++++----------- src/utils.ts | 9 ++- 4 files changed, 205 insertions(+), 48 deletions(-) create mode 100644 examples/dexter/analyze.ts create mode 100644 src/tools/search-and-crawl.ts diff --git a/examples/dexter/analyze.ts b/examples/dexter/analyze.ts new file mode 100644 index 000000000..f8df18ec7 --- /dev/null +++ b/examples/dexter/analyze.ts @@ -0,0 +1,30 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { ChatModel, createAIRunner } from '@dexaai/dexter' + +import { DiffbotClient, SerpAPIClient } from '../../src/index.js' +import { createDexterFunctions } from '../../src/sdks/dexter.js' +import { SearchAndCrawl } from '../../src/tools/search-and-crawl.js' + +async function main() { + const serpapi = new SerpAPIClient() + const diffbot = new DiffbotClient() + const searchAndCrawl = new SearchAndCrawl({ serpapi, diffbot }) + + const runner = createAIRunner({ + chatModel: new ChatModel({ + params: { model: 'gpt-4o', temperature: 0 } + // debug: true + }), + functions: createDexterFunctions(searchAndCrawl), + systemMessage: + 'You are a McKinsey analyst who is an expert at writing executive summaries. Always cite your sources and respond using Markdown.' + }) + + const topic = 'the 2024 olympics' + const result = await runner(`Summarize the latest news on ${topic}`) + console.log(result) +} + +await main() diff --git a/src/tools/search-and-crawl.ts b/src/tools/search-and-crawl.ts new file mode 100644 index 000000000..8c29e473e --- /dev/null +++ b/src/tools/search-and-crawl.ts @@ -0,0 +1,135 @@ +import pMap from 'p-map' +import { z } from 'zod' + +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { type diffbot, DiffbotClient } from '../services/diffbot-client.js' +import { SerpAPIClient } from '../services/serpapi-client.js' +import { isValidCrawlableUrl, normalizeUrl } from '../url-utils.js' +import { omit, pick } from '../utils.js' + +export class SearchAndCrawl extends AIFunctionsProvider { + readonly serpapi: SerpAPIClient + readonly diffbot: DiffbotClient + + constructor(opts: { serpapi?: SerpAPIClient; diffbot?: DiffbotClient } = {}) { + super() + + this.serpapi = opts.serpapi ?? new SerpAPIClient() + this.diffbot = opts.diffbot ?? new DiffbotClient() + } + + @aiFunction({ + name: 'search_and_crawl', + description: + 'Uses Google to search the web, crawls the results, and then summarizes the most relevant results.', + inputSchema: z.object({ + query: z.string().describe('search query') + }) + }) + async searchAndCrawl({ + query, + numSearchResults = 3, + maxCrawlDepth = 1, + maxListItems = 3 + }: { + query: string + numSearchResults?: number + maxCrawlDepth?: number + maxListItems?: number + }) { + const crawledUrls = new Set() + + const crawlAndScrape = async ( + url: string | undefined, + { + depth = 0 + }: { + depth?: number + } + ): Promise => { + try { + if (!url) return [] + if (!isValidCrawlableUrl(url)) return [] + if (crawledUrls.has(url)) return [] + + const normalizedUrl = normalizeUrl(url) + if (!normalizedUrl) return [] + if (crawledUrls.has(normalizedUrl)) return [] + + crawledUrls.add(url) + crawledUrls.add(normalizedUrl) + + console.log('\n\n') + const scrapeResult = await this.diffbot.analyzeUrl({ url }) + console.log( + `SearchAndCrawl depth ${depth} - "${url}"`, + pick(scrapeResult, 'type', 'title') + ) + + if (scrapeResult.type !== 'list') { + return [scrapeResult] + } + + if (depth >= maxCrawlDepth) { + return [scrapeResult] + } + + const object = scrapeResult.objects?.[0] + if (!object) return [scrapeResult] + + const items = object.items + ?.filter((item) => item.link) + .slice(0, maxListItems) + if (!items?.length) return [scrapeResult] + + const innerScrapeResults = ( + await pMap( + items, + async (item) => { + const innerScrapeResult = await crawlAndScrape(item.link, { + depth: depth + 1 + }) + return innerScrapeResult + }, + { + concurrency: 4 + } + ) + ).flat() + + return innerScrapeResults + } catch (err) { + console.warn('crawlAndScrape error', url, err) + return [] + } + } + + const searchResponse = await this.serpapi.search({ + q: query, + num: numSearchResults + }) + + console.log(`SearchAndCrawl search results "${query}"`, searchResponse) + const scrapeResults = ( + await pMap( + (searchResponse.organic_results || []).slice(0, numSearchResults), + async (searchResult) => { + return crawlAndScrape(searchResult.link, { + depth: 0 + }) + }, + { + concurrency: 5 + } + ) + ).flat() + + const output = { + ...omit(searchResponse, 'organic_results'), + scrape_results: scrapeResults + } + + console.log(`SearchAndCrawl response for query "${query}"`, output) + return output + } +} diff --git a/src/url-utils.ts b/src/url-utils.ts index 3fab95a49..aabb74982 100644 --- a/src/url-utils.ts +++ b/src/url-utils.ts @@ -1,20 +1,16 @@ import isRelativeUrlImpl from 'is-relative-url' -import normalizeUrlImpl, { type Options } from 'normalize-url' +import normalizeUrlImpl, { + type Options as NormalizeUrlOptions +} from 'normalize-url' import QuickLRU from 'quick-lru' import { hashObject } from './utils.js' const protocolAllowList = new Set(['https:', 'http:']) -const normalizedUrlCache = new QuickLRU({ +const normalizedUrlCache = new QuickLRU({ maxSize: 4000 }) -/** - * Checks if a URL is crawlable. - * - * @param url - URL string to check - * @returns whether the URL is crawlable - */ export function isValidCrawlableUrl(url: string): boolean { try { if (!url || isRelativeUrl(url)) { @@ -43,42 +39,35 @@ export function isRelativeUrl(url: string): boolean { return isRelativeUrlImpl(url) && !url.startsWith('//') } -/** - * Normalizes a URL string. - * - * @param url - URL string to normalize - * @param options - options for normalization. - * @returns normalized URL string or null if an invalid URL was passed - */ export function normalizeUrl( url: string, - options?: Options -): string | undefined { - let normalizedUrl: string | undefined - let cacheKey: string | undefined + options?: NormalizeUrlOptions +): string | null { + let normalizedUrl: string | null | undefined - try { - if (!url || isRelativeUrl(url)) { - return - } + if (!url || isRelativeUrl(url)) { + return null + } + + const opts = { + stripWWW: false, + defaultProtocol: 'https', + normalizeProtocol: true, + forceHttps: false, + stripHash: false, + stripTextFragment: true, + removeQueryParameters: [/^utm_\w+/i, 'ref', 'ref_src'], + removeTrailingSlash: true, + removeSingleSlash: true, + removeExplicitPort: true, + sortQueryParameters: true, + ...options + } as Required + + const optionsHash = hashObject(opts) + const cacheKey = `${url}-${optionsHash}` - const opts = { - stripWWW: false, - defaultProtocol: 'https', - normalizeProtocol: true, - forceHttps: false, - stripHash: false, - stripTextFragment: true, - removeQueryParameters: [/^utm_\w+/i, 'ref', 'ref_src'], - removeTrailingSlash: true, - removeSingleSlash: true, - removeExplicitPort: true, - sortQueryParameters: true, - ...options - } as Required - - const optionsHash = hashObject(opts) - cacheKey = `${url}-${optionsHash}` + try { normalizedUrl = normalizedUrlCache.get(cacheKey) if (normalizedUrl !== undefined) { @@ -86,14 +75,14 @@ export function normalizeUrl( } normalizedUrl = normalizeUrlImpl(url, opts) + if (!normalizeUrl) { + normalizedUrl = null + } } catch { // ignore invalid urls - normalizedUrl = undefined - } - - if (cacheKey) { - normalizedUrlCache.set(cacheKey, normalizedUrl!) + normalizedUrl = null } + normalizedUrlCache.set(cacheKey, normalizedUrl!) return normalizedUrl } diff --git a/src/utils.ts b/src/utils.ts index 7d6d0d140..2f033e8a8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,6 @@ import type { Jsonifiable } from 'type-fest' import dedent from 'dedent' -import hashObjectImpl from 'hash-object' +import hashObjectImpl, { type Options as HashObjectOptions } from 'hash-object' import type * as types from './types.js' @@ -142,6 +142,9 @@ export function cleanStringForModel(text: string): string { return dedenter(text).trim() } -export function hashObject(object: Record): string { - return hashObjectImpl(object, { algorithm: 'sha256' }) +export function hashObject( + object: Record, + options?: HashObjectOptions +): string { + return hashObjectImpl(object, { algorithm: 'sha256', ...options }) } From 512261ff6451354a482e6717361fbb61b30ee504 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 03:07:44 -0500 Subject: [PATCH 61/81] feat: add e2b --- examples/dexter/code-interpreter.ts | 24 +++ package.json | 10 ++ pnpm-lock.yaml | 263 ++++++++++++++++++++++------ readme.md | 6 +- src/tools/e2b.ts | 51 ++++++ src/types.ts | 18 +- tsup.config.ts | 3 +- 7 files changed, 308 insertions(+), 67 deletions(-) create mode 100644 examples/dexter/code-interpreter.ts create mode 100644 src/tools/e2b.ts diff --git a/examples/dexter/code-interpreter.ts b/examples/dexter/code-interpreter.ts new file mode 100644 index 000000000..1bdb59fcf --- /dev/null +++ b/examples/dexter/code-interpreter.ts @@ -0,0 +1,24 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { ChatModel, createAIRunner } from '@dexaai/dexter' + +import { createDexterFunctions } from '../../src/sdks/dexter.js' +import { e2b } from '../../src/tools/e2b.js' + +async function main() { + const runner = createAIRunner({ + chatModel: new ChatModel({ + params: { model: 'gpt-4o', temperature: 0 }, + debug: true + }), + functions: createDexterFunctions(e2b) + }) + + const result = await runner( + 'Visualize a distribution of height of men based on the latest data you know. Also print the median value.' + ) + console.log(result) +} + +await main() diff --git a/package.json b/package.json index fd470dc41..317a0fa3c 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,11 @@ "import": "./dist/tools/calculator.js", "default": "./dist/tools/calculator.js" }, + "./e2b": { + "types": "./dist/tools/e2b.d.ts", + "import": "./dist/tools/e2b.js", + "default": "./dist/tools/e2b.js" + }, "./twitter": { "types": "./dist/services/twitter/index.d.ts", "import": "./dist/services/twitter/index.js", @@ -95,6 +100,7 @@ }, "devDependencies": { "@dexaai/dexter": "^2.0.3", + "@e2b/code-interpreter": "^0.0.7", "@fisch0920/eslint-config": "^1.3.3", "@genkit-ai/ai": "^0.5.2", "@instructor-ai/instructor": "^1.3.0", @@ -124,6 +130,7 @@ }, "peerDependencies": { "@dexaai/dexter": "^2.0.3", + "@e2b/code-interpreter": "^0.0.7", "@genkit-ai/ai": "^0.5.2", "@langchain/core": "^0.2.5", "ai": "^3.1.22", @@ -135,6 +142,9 @@ "@dexaai/dexter": { "optional": true }, + "@e2b/code-interpreter": { + "optional": true + }, "@genkit-ai/ai": { "optional": true }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44048163f..7cf779314 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,9 +44,6 @@ importers: quick-lru: specifier: ^7.0.0 version: 7.0.0 - twitter-api-sdk: - specifier: ^1.2.1 - version: 1.2.1(encoding@0.1.13) type-fest: specifier: ^4.18.3 version: 4.18.3 @@ -60,6 +57,9 @@ importers: '@dexaai/dexter': specifier: ^2.0.3 version: 2.1.0 + '@e2b/code-interpreter': + specifier: ^0.0.7 + version: 0.0.7(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@fisch0920/eslint-config': specifier: ^1.3.3 version: 1.3.3(eslint@8.57.0)(typescript@5.4.5) @@ -71,7 +71,7 @@ importers: version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + version: 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 @@ -101,7 +101,7 @@ importers: version: 15.2.5 llamaindex: specifier: ^0.3.15 - version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5) + version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5)(utf-8-validate@6.0.4) np: specifier: ^10.0.5 version: 10.0.5(typescript@5.4.5) @@ -129,6 +129,9 @@ importers: tsx: specifier: ^4.11.0 version: 4.11.0 + twitter-api-sdk: + specifier: ^1.2.1 + version: 1.2.1(encoding@0.1.13) typescript: specifier: ^5.4.5 version: 5.4.5 @@ -155,10 +158,10 @@ importers: version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + version: 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) '@langchain/openai': specifier: ^0.1.1 - version: 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0)) + version: 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) ai: specifier: ^3.1.22 version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) @@ -170,10 +173,10 @@ importers: version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13) langchain: specifier: ^0.2.4 - version: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0) + version: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) llamaindex: specifier: ^0.3.15 - version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5) + version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5)(utf-8-validate@6.0.4) openai: specifier: ^4.47.3 version: 4.47.3(encoding@0.1.13) @@ -409,6 +412,10 @@ packages: resolution: {integrity: sha512-3vhTSlpoW0DhQy2DaI3ocoZdw8RxBmsSysrGT0yZP6ZT2zHXlNVzYMj/ffbHmcR2y+VCkESKDJ/Vde4Ytf4agQ==} engines: {node: '>= 18'} + '@e2b/code-interpreter@0.0.7': + resolution: {integrity: sha512-e8nAY4zXU2b9nKthqq/pCPlTVD7f01dtzCtvabWmhlx7Wq+AUln14Q1Wf+uRVJXHkwS9BDv2CupdZpUChsjoCA==} + engines: {node: '>=18'} + '@esbuild/aix-ppc64@0.21.4': resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==} engines: {node: '>=12'} @@ -1796,6 +1803,10 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -2277,6 +2288,10 @@ packages: duck@0.1.12: resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} + e2b@0.16.1: + resolution: {integrity: sha512-2L1R/REEB+EezD4Q4MmcXXNATjvCYov2lv/69+PY6V95+wl1PZblIMTYAe7USxX6P6sqANxNs+kXqZr6RvXkSw==} + engines: {node: '>=18'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -3308,6 +3323,11 @@ packages: isomorphic-fetch@3.0.0: resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + issue-regex@4.1.0: resolution: {integrity: sha512-X3HBmm7+Th+l4/kMtqwcHHgELD0Lfl0Ina6S3+grr+mKmTxsrM84NAO1UuRPIxIbGLIl3TCEu45S1kdu21HYbQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3998,6 +4018,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true + node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} @@ -4157,6 +4181,10 @@ packages: openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + openapi-typescript-fetch@1.1.3: + resolution: {integrity: sha512-smLZPck4OkKMNExcw8jMgrMOGgVGx2N/s6DbKL2ftNl77g5HfoGpZGFy79RBzU/EkaO0OZpwBnslfdBfh7ZcWg==} + engines: {node: '>= 12.0.0', npm: '>= 7.0.0'} + option@0.2.4: resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} @@ -4270,6 +4298,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5432,6 +5463,10 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + utf-8-validate@6.0.4: + resolution: {integrity: sha512-xu9GQDeFp+eZ6LnCywXN/zBancWvOpUMzgjLPSjy4BRHSmTelvn2E0DG0o1sTiw5hkCKBHo8rwSKncfRfv2EEQ==} + engines: {node: '>=6.14.2'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -5823,9 +5858,9 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.590.0 '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -5869,9 +5904,9 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.590.0 '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -5916,7 +5951,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.590.0 '@aws-sdk/core': 3.588.0 '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/middleware-host-header': 3.577.0 @@ -6000,6 +6035,51 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/client-sts@3.590.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 @@ -6103,6 +6183,24 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt + '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': + dependencies: + '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': dependencies: '@aws-sdk/credential-provider-env': 3.587.0 @@ -6122,6 +6220,25 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt + '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + '@aws-sdk/credential-provider-process@3.587.0': dependencies: '@aws-sdk/types': 3.577.0 @@ -6332,6 +6449,15 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros + '@e2b/code-interpreter@0.0.7(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + e2b: 0.16.1 + isomorphic-ws: 5.0.0(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@esbuild/aix-ppc64@0.21.4': optional: true @@ -6570,13 +6696,13 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13))': + '@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -6588,13 +6714,13 @@ snapshots: - langchain - openai - '@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -6606,9 +6732,9 @@ snapshots: - langchain - openai - '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))': + '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 @@ -6617,9 +6743,9 @@ snapshots: - encoding - langchain - '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))': + '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 @@ -6629,17 +6755,17 @@ snapshots: - langchain optional: true - '@langchain/textsplitters@0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13))': + '@langchain/textsplitters@0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain - openai - '@langchain/textsplitters@0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/textsplitters@0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -7821,9 +7947,9 @@ snapshots: arrify@1.0.1: {} - assemblyai@4.4.5: + assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4): dependencies: - ws: 8.17.0 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7966,6 +8092,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.1 + optional: true + builtin-modules@3.3.0: {} bundle-name@4.1.0: @@ -8421,6 +8552,18 @@ snapshots: dependencies: underscore: 1.13.6 + e2b@0.16.1: + dependencies: + isomorphic-ws: 5.0.0(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + normalize-path: 3.0.0 + openapi-typescript-fetch: 1.1.3 + path-browserify: 1.0.1 + platform: 1.3.6 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.4 + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -9656,6 +9799,10 @@ snapshots: transitivePeerDependencies: - encoding + isomorphic-ws@5.0.0(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): + dependencies: + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + issue-regex@4.1.0: {} iterator.prototype@1.1.2: @@ -9765,17 +9912,17 @@ snapshots: ky@1.3.0: {} - langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0): + langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) - '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0)) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -9784,32 +9931,32 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@notionhq/client': 2.2.15(encoding@0.1.13) '@pinecone-database/pinecone': 2.2.2 - assemblyai: 4.4.5 + assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) axios: 1.7.2 chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) fast-xml-parser: 4.2.5 ignore: 5.3.1 mammoth: 1.7.2 mongodb: 6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - ws: 8.17.0 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - encoding - openai - langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): + langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) - '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -9819,6 +9966,7 @@ snapshots: zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: '@notionhq/client': 2.2.15(encoding@0.1.13) + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - encoding - openai @@ -9826,7 +9974,7 @@ snapshots: langchainhub@0.0.11: {} - ? langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) + ? langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) : dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -9834,11 +9982,11 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0))(openai@4.47.3(encoding@0.1.13)) - langchain: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5)(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langchain: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) openai: 4.47.3(encoding@0.1.13) - langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)): + langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -9846,8 +9994,8 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(openai@4.47.3(encoding@0.1.13)) - langchain: 0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langchain: 0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) openai: 4.47.3(encoding@0.1.13) language-subtag-registry@0.3.23: {} @@ -9940,7 +10088,7 @@ snapshots: - zen-observable - zenObservable - llamaindex@0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5): + llamaindex@0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5)(utf-8-validate@6.0.4): dependencies: '@anthropic-ai/sdk': 0.20.9(encoding@0.1.13) '@aws-crypto/sha256-js': 5.2.0 @@ -9961,7 +10109,7 @@ snapshots: '@xenova/transformers': 2.17.2 '@zilliz/milvus2-sdk-node': 2.4.2 ajv: 8.14.0 - assemblyai: 4.4.5 + assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13) js-tiktoken: 1.0.12 @@ -10287,6 +10435,9 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build@4.8.1: + optional: true + node-releases@2.0.14: {} normalize-package-data@2.5.0: @@ -10526,6 +10677,8 @@ snapshots: openapi-types@12.1.3: {} + openapi-typescript-fetch@1.1.3: {} + option@0.2.4: {} optionator@0.9.4: @@ -10640,6 +10793,8 @@ snapshots: parseurl@1.3.3: {} + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -11890,6 +12045,11 @@ snapshots: dependencies: react: 18.3.1 + utf-8-validate@6.0.4: + dependencies: + node-gyp-build: 4.8.1 + optional: true + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -12129,7 +12289,10 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - ws@8.17.0: {} + ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.4 xdg-basedir@5.1.0: {} diff --git a/readme.md b/readme.md index aedced555..6f0207b88 100644 --- a/readme.md +++ b/readme.md @@ -141,6 +141,11 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - weatherapi - wikipedia +## Non-service Tools + +- calculator +- search and scrape + ## AI SDKs - OpenAI SDK @@ -161,7 +166,6 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - rename this repo to agentic - services - e2b - - search-and-scrape - replicate - huggingface - [skyvern](https://github.com/Skyvern-AI/skyvern) diff --git a/src/tools/e2b.ts b/src/tools/e2b.ts new file mode 100644 index 000000000..86e38fc6b --- /dev/null +++ b/src/tools/e2b.ts @@ -0,0 +1,51 @@ +import { CodeInterpreter, type ProcessMessage } from '@e2b/code-interpreter' +import { z } from 'zod' + +import { createAIFunction } from '../create-ai-function.js' +import { getEnv } from '../utils.js' + +export const e2b = createAIFunction( + { + name: 'execute_python', + description: ` +Execute python code in a Jupyter notebook cell and returns any result, stdout, stderr, display_data, and error. + +- code has access to the internet and can make api requests +- code has access to the filesystem and can read/write files +- coce can install any pip package (if it exists) if you need to, but the usual packages for data analysis are already preinstalled +- code uses python3 +- code is executed in a secure sandbox environment, so you don't need to worry about safety + `.trim(), + inputSchema: z.object({ + code: z + .string() + .describe('Python code to execute in a single notebook cell.') + }) + }, + async ({ code }) => { + const sandbox = await CodeInterpreter.create({ + apiKey: getEnv('E2B_API_KEY') + }) + + try { + const exec = await sandbox.notebook.execCell(code, { + onStderr: (msg: ProcessMessage) => { + console.warn('[Code Interpreter stderr]', msg) + }, + + onStdout: (stdout: ProcessMessage) => { + console.log('[Code Interpreter stdout]', stdout) + } + }) + + if (exec.error) { + console.error('[Code Interpreter error]', exec.error) + throw new Error(exec.error.value) + } + + return exec.results.map((result) => result.toJSON()) + } finally { + await sandbox.close() + } + } +) diff --git a/src/types.ts b/src/types.ts index 44f2e203a..f4e0b04cd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -47,7 +47,7 @@ export interface AIFunction< > { (input: string | Msg): MaybePromise - /** The Zod schema for the arguments string. */ + /** The Zod schema for the input object. */ inputSchema: InputSchema /** Parse the function arguments from a message. */ @@ -57,18 +57,6 @@ export interface AIFunction< spec: AIFunctionSpec /** The underlying function implementation without any arg parsing or validation. */ - impl: (params: z.infer) => MaybePromise -} - -/** - * A tool meant to be used with LLM function calling. - */ -export interface AITool< - InputSchema extends z.ZodObject = z.ZodObject, - Return = any -> { - function: AIFunction - - /** The tool spec for the OpenAI API `tools` property. */ - spec: AIToolSpec + // TODO: this `any` shouldn't be necessary, but it is for `createAIFunction` results to be assignable to `AIFunctionLike` + impl: (params: z.infer | any) => MaybePromise } diff --git a/tsup.config.ts b/tsup.config.ts index 5fad85e41..672ef7213 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -10,7 +10,8 @@ export default defineConfig([ 'src/sdks/langchain.ts', 'src/sdks/llamaindex.ts', 'src/services/twitter/index.ts', - 'src/tools/calculator.ts' + 'src/tools/calculator.ts', + 'src/tools/e2b.ts' ], outDir: 'dist', target: 'node18', From 98202e5ea60b46be9a41d58f64a4f683b8bb8a44 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 03:09:10 -0500 Subject: [PATCH 62/81] =?UTF-8?q?=F0=9F=8F=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 6f0207b88..a6dc6c6be 100644 --- a/readme.md +++ b/readme.md @@ -144,6 +144,7 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## Non-service Tools - calculator +- e2b (code interpreter) - search and scrape ## AI SDKs @@ -165,7 +166,6 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - rename this repo to agentic - services - - e2b - replicate - huggingface - [skyvern](https://github.com/Skyvern-AI/skyvern) @@ -173,7 +173,6 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) - provide a converter for langchain `DynamicStructuredTool` - - pull from other libs - pull from [nango](https://docs.nango.dev/integrations/overview) - pull from [activepieces](https://github.com/activepieces/activepieces/tree/main/packages/pieces/community) - general openapi support ala [workgpt](https://github.com/team-openpm/workgpt) From 0f296becb4f25058666bb5b89dff3ea94eaa9cca Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 18:57:43 -0500 Subject: [PATCH 63/81] feat: add unofficial midjourney client --- bin/scratch.ts | 23 +++-- src/errors.ts | 2 + src/services/index.ts | 1 + src/services/midjourney-client.ts | 139 ++++++++++++++++++++++++++++++ src/url-utils.test.ts | 31 +++++++ src/utils.ts | 10 +++ 6 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 src/services/midjourney-client.ts create mode 100644 src/url-utils.test.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index a90ef8202..e53f72af7 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -8,7 +8,7 @@ import restoreCursor from 'restore-cursor' // import { ProxycurlClient } from '../src/services/proxycurl-client.js' // import { WikipediaClient } from '../src/index.js' // import { PerigonClient } from '../src/index.js' -import { FirecrawlClient } from '../src/index.js' +// import { FirecrawlClient } from '../src/index.js' // import { ExaClient } from '../src/index.js' // import { DiffbotClient } from '../src/index.js' // import { WolframClient } from '../src/index.js' @@ -16,6 +16,7 @@ import { FirecrawlClient } from '../src/index.js' // createTwitterV2Client, // TwitterClient // } from '../src/services/twitter/index.js' +import { MidjourneyClient } from '../src/index.js' /** * Scratch pad for testing. @@ -56,13 +57,13 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - const firecrawl = new FirecrawlClient() - const res = await firecrawl.scrapeUrl({ - url: 'https://www.bbc.com/news/articles/cp4475gwny1o' - // url: 'https://www.theguardian.com/technology/article/2024/jun/04/openai-google-ai-risks-letter' - // url: 'https://www.firecrawl.dev' - }) - console.log(JSON.stringify(res, null, 2)) + // const firecrawl = new FirecrawlClient() + // const res = await firecrawl.scrapeUrl({ + // url: 'https://www.bbc.com/news/articles/cp4475gwny1o' + // // url: 'https://www.theguardian.com/technology/article/2024/jun/04/openai-google-ai-risks-letter' + // // url: 'https://www.firecrawl.dev' + // }) + // console.log(JSON.stringify(res, null, 2)) // const exa = new ExaClient() // const res = await exa.search({ @@ -96,6 +97,12 @@ async function main() { // query: 'open source AI agents' // }) // console.log(res) + + const midjourney = new MidjourneyClient() + const res = await midjourney.imagine( + 'tiny lil baby kittens playing with an inquisitive AI robot, kawaii, anime' + ) + console.log(JSON.stringify(res, null, 2)) } try { diff --git a/src/errors.ts b/src/errors.ts index d3bdd21d1..d6e43f6ae 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,3 +1,5 @@ export class RetryableError extends Error {} export class ParseError extends RetryableError {} + +export class TimeoutError extends Error {} diff --git a/src/services/index.ts b/src/services/index.ts index 72fae17b4..5e5484c79 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -3,6 +3,7 @@ export * from './dexa-client.js' export * from './diffbot-client.js' export * from './exa-client.js' export * from './firecrawl-client.js' +export * from './midjourney-client.js' export * from './people-data-labs-client.js' export * from './perigon-client.js' export * from './predict-leads-client.js' diff --git a/src/services/midjourney-client.ts b/src/services/midjourney-client.ts new file mode 100644 index 000000000..3609e61b8 --- /dev/null +++ b/src/services/midjourney-client.ts @@ -0,0 +1,139 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { TimeoutError } from '../errors.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, delay, getEnv, pruneNullOrUndefined } from '../utils.js' + +export namespace midjourney { + export const API_BASE_URL = 'https://cl.imagineapi.dev' + + export type JobStatus = 'pending' | 'in-progress' | 'completed' | 'failed' + + export interface ImagineResponse { + data: Job + } + + export interface Job { + id: string + prompt: string + status: JobStatus + user_created: string + date_created: string + results?: string + progress?: string + url?: string + error?: string + upscaled_urls?: string[] + ref?: string + upscaled?: string[] + } +} + +/** + * Unofficial Midjourney API client. + * + * @see https://www.imagineapi.dev + */ +export class MidjourneyClient extends AIFunctionsProvider { + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('MIDJOURNEY_IMAGINE_API_KEY'), + apiBaseUrl = midjourney.API_BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'MidjourneyClient missing required "apiKey" (defaults to "MIDJOURNEY_IMAGINE_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + headers: { + Authorization: `Bearer ${this.apiKey}` + } + }) + } + + @aiFunction({ + name: 'midjourney_create_images', + description: + 'Creates 4 images from a prompt using the Midjourney API. Useful for generating images on the fly.', + inputSchema: z.object({ + prompt: z + .string() + .describe( + 'Simple, short, comma-separated list of phrases which describe the image you want to generate' + ) + }) + }) + async imagine( + promptOrOptions: string | { prompt: string } + ): Promise { + const options = + typeof promptOrOptions === 'string' + ? { prompt: promptOrOptions } + : promptOrOptions + + const res = await this.ky + .post('items/images', { + json: { ...options } + }) + .json() + + return pruneNullOrUndefined(res.data) + } + + async getJobById(jobId: string): Promise { + const res = await this.ky + .get(`items/images/${jobId}`) + .json() + + return pruneNullOrUndefined(res.data) + } + + async waitForJobById( + jobId: string, + { + timeoutMs = 5 * 60 * 1000, // 5 minutes + intervalMs = 1000 + }: { + timeoutMs?: number + intervalMs?: number + } = {} + ) { + const startTimeMs = Date.now() + + function checkForTimeout() { + const elapsedTimeMs = Date.now() - startTimeMs + if (elapsedTimeMs >= timeoutMs) { + throw new TimeoutError( + `MidjourneyClient timeout waiting for job "${jobId}"` + ) + } + } + + do { + checkForTimeout() + + const job = await this.getJobById(jobId) + if (job.status === 'completed' || job.status === 'failed') { + return job + } + + checkForTimeout() + await delay(intervalMs) + } while (true) + } +} diff --git a/src/url-utils.test.ts b/src/url-utils.test.ts new file mode 100644 index 000000000..3523821de --- /dev/null +++ b/src/url-utils.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, test } from 'vitest' + +import { normalizeUrl } from './url-utils.js' + +describe('normalizeUrl', () => { + test('valid urls', async () => { + expect(normalizeUrl('https://www.google.com')).toBe( + 'https://www.google.com' + ) + expect(normalizeUrl('//www.google.com')).toBe('https://www.google.com') + expect(normalizeUrl('https://www.google.com/foo?')).toBe( + 'https://www.google.com/foo' + ) + expect(normalizeUrl('https://www.google.com/?foo=bar&dog=cat')).toBe( + 'https://www.google.com/?dog=cat&foo=bar' + ) + expect(normalizeUrl('https://google.com/abc/123//')).toBe( + 'https://google.com/abc/123' + ) + }) + + test('invalid urls', async () => { + expect(normalizeUrl('/foo')).toBe(null) + expect(normalizeUrl('/foo/bar/baz')).toBe(null) + expect(normalizeUrl('://foo.com')).toBe(null) + expect(normalizeUrl('foo')).toBe(null) + expect(normalizeUrl('')).toBe(null) + expect(normalizeUrl(undefined as unknown as string)).toBe(null) + expect(normalizeUrl(null as unknown as string)).toBe(null) + }) +}) diff --git a/src/utils.ts b/src/utils.ts index 2f033e8a8..dd4404923 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -57,6 +57,16 @@ export function pruneUndefined>( ) as NonNullable } +export function pruneNullOrUndefined>( + obj: T +): NonNullable<{ [K in keyof T]: Exclude }> { + return Object.fromEntries( + Object.entries(obj).filter( + ([, value]) => value !== undefined && value !== null + ) + ) as NonNullable +} + export function getEnv(name: string): string | undefined { try { return typeof process !== 'undefined' From bc12a880a28229f39dd6a69dba5ce6599df9da71 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 20:23:45 -0500 Subject: [PATCH 64/81] =?UTF-8?q?=F0=9F=8D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 +- src/services/midjourney-client.ts | 82 ++++++++++++++++++++++++++----- 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/readme.md b/readme.md index a6dc6c6be..4d70b2d05 100644 --- a/readme.md +++ b/readme.md @@ -128,6 +128,7 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - diffbot - exa - firecrawl (WIP) +- midjourney - people data labs (WIP) - perigon - predict leads @@ -169,7 +170,6 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - replicate - huggingface - [skyvern](https://github.com/Skyvern-AI/skyvern) - - midjourney - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) - provide a converter for langchain `DynamicStructuredTool` diff --git a/src/services/midjourney-client.ts b/src/services/midjourney-client.ts index 3609e61b8..5ce296214 100644 --- a/src/services/midjourney-client.ts +++ b/src/services/midjourney-client.ts @@ -5,6 +5,8 @@ import { TimeoutError } from '../errors.js' import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, delay, getEnv, pruneNullOrUndefined } from '../utils.js' +// TODO: add additional methods for upscaling, variations, etc. + export namespace midjourney { export const API_BASE_URL = 'https://cl.imagineapi.dev' @@ -28,6 +30,12 @@ export namespace midjourney { ref?: string upscaled?: string[] } + + export interface JobOptions { + wait?: boolean + timeoutMs?: number + intervalMs?: number + } } /** @@ -79,12 +87,22 @@ export class MidjourneyClient extends AIFunctionsProvider { }) }) async imagine( - promptOrOptions: string | { prompt: string } + promptOrOptions: + | string + | ({ + prompt: string + } & midjourney.JobOptions) ): Promise { - const options = - typeof promptOrOptions === 'string' - ? { prompt: promptOrOptions } - : promptOrOptions + const { + wait = true, + timeoutMs, + intervalMs, + ...options + } = typeof promptOrOptions === 'string' + ? ({ prompt: promptOrOptions } as { + prompt: string + } & midjourney.JobOptions) + : promptOrOptions const res = await this.ky .post('items/images', { @@ -92,15 +110,56 @@ export class MidjourneyClient extends AIFunctionsProvider { }) .json() - return pruneNullOrUndefined(res.data) + const job = pruneNullOrUndefined(res.data) + if (!wait) { + return job + } + + if (job.status === 'completed' || job.status === 'failed') { + return job + } + + return this.waitForJobById(job.id, { + timeoutMs, + intervalMs + }) } - async getJobById(jobId: string): Promise { + async getJobById( + jobIdOrOptions: + | string + | ({ + jobId: string + } & midjourney.JobOptions) + ): Promise { + const { + jobId, + wait = true, + timeoutMs, + intervalMs + } = typeof jobIdOrOptions === 'string' + ? ({ jobId: jobIdOrOptions } as { + jobId: string + } & midjourney.JobOptions) + : jobIdOrOptions + const res = await this.ky .get(`items/images/${jobId}`) .json() - return pruneNullOrUndefined(res.data) + const job = pruneNullOrUndefined(res.data) + if (!wait) { + return job + } + + if (job.status === 'completed' || job.status === 'failed') { + return job + } + + return this.waitForJobById(job.id, { + timeoutMs, + intervalMs + }) } async waitForJobById( @@ -108,11 +167,8 @@ export class MidjourneyClient extends AIFunctionsProvider { { timeoutMs = 5 * 60 * 1000, // 5 minutes intervalMs = 1000 - }: { - timeoutMs?: number - intervalMs?: number - } = {} - ) { + }: Omit = {} + ): Promise { const startTimeMs = Date.now() function checkForTimeout() { From 963204728c0ba3218a516ecb26cfc6cb31e93b92 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 20:41:27 -0500 Subject: [PATCH 65/81] feat: add bing web search --- bin/scratch.ts | 17 +- readme.md | 1 + src/services/bing-client.ts | 305 ++++++++++++++++++++++++ src/services/clearbit-client.ts | 6 +- src/services/dexa-client.ts | 6 +- src/services/diffbot-client.ts | 10 +- src/services/exa-client.ts | 6 +- src/services/firecrawl-client.ts | 6 +- src/services/index.ts | 1 + src/services/midjourney-client.ts | 6 +- src/services/people-data-labs-client.ts | 6 +- src/services/perigon-client.ts | 4 +- src/services/predict-leads-client.ts | 6 +- src/services/proxycurl-client.ts | 6 +- src/services/scraper-client.ts | 4 +- src/services/searxng-client.ts | 4 +- src/services/serpapi-client.ts | 8 +- src/services/serper-client.ts | 8 +- src/services/weather-client.ts | 6 +- src/services/wikipedia-client.ts | 6 +- src/services/wolfram-client.ts | 6 +- 21 files changed, 371 insertions(+), 57 deletions(-) create mode 100644 src/services/bing-client.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index e53f72af7..e90d70adc 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -16,7 +16,8 @@ import restoreCursor from 'restore-cursor' // createTwitterV2Client, // TwitterClient // } from '../src/services/twitter/index.js' -import { MidjourneyClient } from '../src/index.js' +// import { MidjourneyClient } from '../src/index.js' +import { BingClient } from '../src/index.js' /** * Scratch pad for testing. @@ -98,10 +99,16 @@ async function main() { // }) // console.log(res) - const midjourney = new MidjourneyClient() - const res = await midjourney.imagine( - 'tiny lil baby kittens playing with an inquisitive AI robot, kawaii, anime' - ) + // const midjourney = new MidjourneyClient() + // const res = await midjourney.imagine( + // 'tiny lil baby kittens playing with an inquisitive AI robot, kawaii, anime' + // ) + // console.log(JSON.stringify(res, null, 2)) + + const bing = new BingClient() + const res = await bing.search({ + q: 'world cup 2024 freestyle wrestling news' + }) console.log(JSON.stringify(res, null, 2)) } diff --git a/readme.md b/readme.md index 4d70b2d05..643ad1af3 100644 --- a/readme.md +++ b/readme.md @@ -123,6 +123,7 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## Services +- bing - clearbit - dexa - diffbot diff --git a/src/services/bing-client.ts b/src/services/bing-client.ts new file mode 100644 index 000000000..190f3f3f9 --- /dev/null +++ b/src/services/bing-client.ts @@ -0,0 +1,305 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv, omit } from '../utils.js' + +export namespace bing { + export const API_BASE_URL = 'https://api.bing.microsoft.com' + + export interface SearchQuery { + q: string + mkt?: string + offset?: number + count?: number + safeSearch?: 'Off' | 'Moderate' | 'Strict' + textDecorations?: boolean + textFormat?: 'Raw' | 'HTML' + } + + export interface SearchResponse { + _type: string + entities: Entities + images: Images + places: Places + queryContext: QueryContext + rankingResponse: RankingResponse + relatedSearches: RelatedSearches + videos: Videos + webPages: WebPages + } + + interface Entities { + value: EntitiesValue[] + } + + interface EntitiesValue { + bingId: string + contractualRules: PurpleContractualRule[] + description: string + entityPresentationInfo: EntityPresentationInfo + id: string + image: Image + name: string + webSearchUrl: string + } + + interface PurpleContractualRule { + _type: string + license?: DeepLink + licenseNotice?: string + mustBeCloseToContent: boolean + targetPropertyName: string + text?: string + url?: string + } + + interface DeepLink { + name: string + url: string + } + + interface EntityPresentationInfo { + entityScenario: string + entityTypeHints: string[] + } + + interface Image { + height: number + hostPageUrl: string + name: string + provider: Provider[] + sourceHeight: number + sourceWidth: number + thumbnailUrl: string + width: number + } + + interface Provider { + _type: string + url: string + } + + interface Images { + id: string + isFamilyFriendly: boolean + readLink: string + value: ImagesValue[] + webSearchUrl: string + } + + interface ImagesValue { + contentSize: string + contentUrl: string + encodingFormat: string + height: number + hostPageDisplayUrl: string + hostPageUrl: string + name: string + thumbnail: Thumbnail + thumbnailUrl: string + webSearchUrl: string + width: number + } + + interface Thumbnail { + height: number + width: number + } + + interface Places { + value: PlacesValue[] + } + + interface PlacesValue { + _type: string + address: Address + entityPresentationInfo: EntityPresentationInfo + id: string + name: string + telephone: string + url: string + webSearchUrl: string + } + + interface Address { + addressCountry: string + addressLocality: string + addressRegion: string + neighborhood: string + postalCode: string + } + + interface QueryContext { + askUserForLocation: boolean + originalQuery: string + } + + interface RankingResponse { + mainline: Mainline + sidebar: Mainline + } + + interface Mainline { + items: Item[] + } + + interface Item { + answerType: string + resultIndex?: number + value?: ItemValue + } + + interface ItemValue { + id: string + } + + interface RelatedSearches { + id: string + value: RelatedSearchesValue[] + } + + interface RelatedSearchesValue { + displayText: string + text: string + webSearchUrl: string + } + + interface Videos { + id: string + isFamilyFriendly: boolean + readLink: string + scenario: string + value: VideosValue[] + webSearchUrl: string + } + + interface VideosValue { + allowHttpsEmbed: boolean + allowMobileEmbed: boolean + contentUrl: string + creator: Creator + datePublished: Date + description: string + duration: string + embedHtml: string + encodingFormat: EncodingFormat + height: number + hostPageDisplayUrl: string + hostPageUrl: string + isAccessibleForFree: boolean + isSuperfresh: boolean + motionThumbnailUrl: string + name: string + publisher: Creator[] + thumbnail: Thumbnail + thumbnailUrl: string + viewCount: number + webSearchUrl: string + width: number + } + + interface Creator { + name: string + } + + enum EncodingFormat { + Mp4 = 'mp4' + } + + interface WebPages { + totalEstimatedMatches: number + value: WebPagesValue[] + webSearchUrl: string + } + + interface WebPagesValue { + dateLastCrawled: Date + deepLinks?: DeepLink[] + displayUrl: string + id: string + isFamilyFriendly: boolean + isNavigational: boolean + language: string + name: string + snippet: string + thumbnailUrl?: string + url: string + contractualRules?: FluffyContractualRule[] + } + + interface FluffyContractualRule { + _type: string + license: DeepLink + licenseNotice: string + mustBeCloseToContent: boolean + targetPropertyIndex: number + targetPropertyName: string + } +} + +export class BingClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('BING_API_KEY'), + apiBaseUrl = bing.API_BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'BingClient missing required "apiKey" (defaults to "BING_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl + }) + } + + @aiFunction({ + name: 'bing_web_search', + description: + 'Searches the web using the Bing search engine to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', + inputSchema: z.object({ + q: z.string().describe('search query') + }) + }) + async search(queryOrOpts: string | bing.SearchQuery) { + const defaultQuery: Partial = { + mkt: 'en-US' + } + + const searchParams = + typeof queryOrOpts === 'string' + ? { + ...defaultQuery, + q: queryOrOpts + } + : { + ...defaultQuery, + ...queryOrOpts + } + + // console.log(searchParams) + const res = await this.ky + .get('v7.0/search', { + headers: { + 'Ocp-Apim-Subscription-Key': this.apiKey + }, + searchParams + }) + .json() + + return omit(res, 'rankingResponse') + } +} diff --git a/src/services/clearbit-client.ts b/src/services/clearbit-client.ts index 52337f707..bed94abe9 100644 --- a/src/services/clearbit-client.ts +++ b/src/services/clearbit-client.ts @@ -361,9 +361,9 @@ export namespace clearbit { } export class ClearbitClient { - readonly ky: KyInstance - readonly apiKey: string - readonly _maxPageSize = 100 + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly _maxPageSize = 100 static readonly PersonRoles = [ 'communications', diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index b6a0dacfa..8b6685d15 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -13,9 +13,9 @@ export namespace dexa { } export class DexaClient extends AIFunctionsProvider { - readonly apiKey: string - readonly apiBaseUrl: string - readonly ky: KyInstance + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('DEXA_API_KEY'), diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index 549bd4798..ba2ab8ef8 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -660,12 +660,12 @@ export namespace diffbot { } export class DiffbotClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly kyKnowledgeGraph: KyInstance + protected readonly ky: KyInstance + protected readonly kyKnowledgeGraph: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string - readonly apiKnowledgeGraphBaseUrl: string + protected readonly apiKey: string + protected readonly apiBaseUrl: string + protected readonly apiKnowledgeGraphBaseUrl: string constructor({ apiKey = getEnv('DIFFBOT_API_KEY'), diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index 37d6e2864..e953402a4 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -164,9 +164,9 @@ export namespace exa { } export class ExaClient extends AIFunctionsProvider { - readonly apiKey: string - readonly apiBaseUrl: string - readonly ky: KyInstance + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('EXA_API_KEY'), diff --git a/src/services/firecrawl-client.ts b/src/services/firecrawl-client.ts index dbb85b589..d1afa4389 100644 --- a/src/services/firecrawl-client.ts +++ b/src/services/firecrawl-client.ts @@ -88,9 +88,9 @@ export namespace firecrawl { * @see https://github.com/mendableai/firecrawl */ export class FirecrawlClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('FIRECRAWL_API_KEY'), diff --git a/src/services/index.ts b/src/services/index.ts index 5e5484c79..c27130a48 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,3 +1,4 @@ +export * from './bing-client.js' export * from './clearbit-client.js' export * from './dexa-client.js' export * from './diffbot-client.js' diff --git a/src/services/midjourney-client.ts b/src/services/midjourney-client.ts index 5ce296214..3ddd1e37b 100644 --- a/src/services/midjourney-client.ts +++ b/src/services/midjourney-client.ts @@ -44,9 +44,9 @@ export namespace midjourney { * @see https://www.imagineapi.dev */ export class MidjourneyClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('MIDJOURNEY_IMAGINE_API_KEY'), diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts index 9405500f8..80093b8bd 100644 --- a/src/services/people-data-labs-client.ts +++ b/src/services/people-data-labs-client.ts @@ -450,9 +450,9 @@ export namespace peopledatalabs { * @see https://www.peopledatalabs.com */ export class PeopleDataLabsClient { - readonly ky: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('PEOPLE_DATA_LABS_API_KEY'), diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts index e378ed1b4..729104a13 100644 --- a/src/services/perigon-client.ts +++ b/src/services/perigon-client.ts @@ -626,8 +626,8 @@ export namespace perigon { * @see https://www.goperigon.com/products/news-api */ export class PerigonClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string + protected readonly ky: KyInstance + protected readonly apiKey: string constructor({ apiKey = getEnv('PERIGON_API_KEY'), diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts index 2354fb752..dc8c59b2f 100644 --- a/src/services/predict-leads-client.ts +++ b/src/services/predict-leads-client.ts @@ -476,9 +476,9 @@ export namespace predictleads { } export class PredictLeadsClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string - readonly apiToken: string + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiToken: string constructor({ apiKey = getEnv('PREDICT_LEADS_API_KEY'), diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index ab6e3dbbf..0ed937cef 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -2011,9 +2011,9 @@ export namespace proxycurl { } export class ProxycurlClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('PROXYCURL_API_KEY'), diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts index c71d50e70..0b223ad6f 100644 --- a/src/services/scraper-client.ts +++ b/src/services/scraper-client.ts @@ -40,8 +40,8 @@ export namespace scraper { * proxies and JavaScript rendering if needed. */ export class ScraperClient extends AIFunctionsProvider { - readonly apiBaseUrl: string - readonly ky: KyInstance + protected readonly ky: KyInstance + protected readonly apiBaseUrl: string constructor({ apiBaseUrl = getEnv('SCRAPER_API_BASE_URL'), diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index a19f98dc0..782bda721 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -262,8 +262,8 @@ export namespace searxng { * See [perplexica](https://github.com/ItzCrazyKns/Perplexica/blob/master/docker-compose.yaml) for an example. */ export class SearxngClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly apiBaseUrl: string constructor({ apiBaseUrl = getEnv('SEARXNG_API_BASE_URL'), diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index 659f57763..9e45314f3 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -634,10 +634,10 @@ export namespace serpapi { * @see https://serpapi.com/search-api */ export class SerpAPIClient extends AIFunctionsProvider { - protected ky: KyInstance - protected apiKey: string - protected apiBaseUrl: string - protected params: serpapi.ClientParams + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + protected readonly params: serpapi.ClientParams constructor({ apiKey = getEnv('SERPAPI_API_KEY') ?? getEnv('SERP_API_KEY'), diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 7d0495d7d..8d7aceb81 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -210,10 +210,10 @@ export namespace serper { * @see https://serper.dev */ export class SerperClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string - readonly params: serper.ClientParams + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + protected readonly params: serper.ClientParams constructor({ apiKey = getEnv('SERPER_API_KEY'), diff --git a/src/services/weather-client.ts b/src/services/weather-client.ts index c5cc94abe..c328fae5f 100644 --- a/src/services/weather-client.ts +++ b/src/services/weather-client.ts @@ -75,9 +75,9 @@ export namespace weatherapi { } export class WeatherClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly apiKey: string - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string constructor({ apiKey = getEnv('WEATHER_API_KEY'), diff --git a/src/services/wikipedia-client.ts b/src/services/wikipedia-client.ts index ed044b683..a427020aa 100644 --- a/src/services/wikipedia-client.ts +++ b/src/services/wikipedia-client.ts @@ -97,9 +97,9 @@ export namespace wikipedia { } export class WikipediaClient extends AIFunctionsProvider { - readonly apiBaseUrl: string - readonly apiUserAgent: string - readonly ky: KyInstance + protected readonly ky: KyInstance + protected readonly apiBaseUrl: string + protected readonly apiUserAgent: string constructor({ apiBaseUrl = getEnv('WIKIPEDIA_API_BASE_URL') ?? diff --git a/src/services/wolfram-client.ts b/src/services/wolfram-client.ts index faf92102c..c573bbcee 100644 --- a/src/services/wolfram-client.ts +++ b/src/services/wolfram-client.ts @@ -29,9 +29,9 @@ export namespace wolfram { * @see https://products.wolframalpha.com/llm-api/documentation */ export class WolframClient extends AIFunctionsProvider { - readonly ky: KyInstance - readonly appId: string - readonly apiBaseUrl: string + protected readonly ky: KyInstance + protected readonly appId: string + protected readonly apiBaseUrl: string constructor({ appId = getEnv('WOLFRAM_APP_ID'), From d4aed7badd612e068d4e4e4a7c49b5ff75b9d007 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 20:53:31 -0500 Subject: [PATCH 66/81] feat: add novu client --- readme.md | 5 +- src/services/index.ts | 1 + src/services/novu-client.ts | 161 ++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 src/services/novu-client.ts diff --git a/readme.md b/readme.md index 643ad1af3..dac3ae382 100644 --- a/readme.md +++ b/readme.md @@ -128,8 +128,9 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - dexa - diffbot - exa -- firecrawl (WIP) -- midjourney +- firecrawl +- midjourney (unofficial API) +- novu - people data labs (WIP) - perigon - predict leads diff --git a/src/services/index.ts b/src/services/index.ts index c27130a48..004b57bfa 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -5,6 +5,7 @@ export * from './diffbot-client.js' export * from './exa-client.js' export * from './firecrawl-client.js' export * from './midjourney-client.js' +export * from './novu-client.js' export * from './people-data-labs-client.js' export * from './perigon-client.js' export * from './predict-leads-client.js' diff --git a/src/services/novu-client.ts b/src/services/novu-client.ts new file mode 100644 index 000000000..7d8c80f1e --- /dev/null +++ b/src/services/novu-client.ts @@ -0,0 +1,161 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv } from '../utils.js' + +export namespace novu { + export const API_BASE_URL = 'https://api.novu.co/v1' + + /** + * Novu subscriber object. + */ + export type Subscriber = { + /** + * Unique identifier for the subscriber. This can be any value that is meaningful to your application such as a user ID stored in your database or a unique email address. + */ + subscriberId: string + + /** + * Email address of the subscriber. + */ + email?: string + + /** + * First name of the subscriber. + */ + firstName?: string + + /** + * Last name of the subscriber. + */ + lastName?: string + + /** + * Phone number of the subscriber. + */ + phone?: string + } + + /** + * Response from the Novu API when triggering an event. + * + * @see {@link https://docs.novu.co/api/client-libraries#trigger-event} + */ + export type TriggerEventResponse = { + /** + * Data about the triggered event. + */ + data: { + /** + * Whether the trigger was acknowledged or not. + */ + acknowledged?: boolean + + /** + * Status for trigger. + */ + status?: string + + /** + * Transaction id for trigger. + */ + transactionId?: string + + /** + * In case of an error, this field will contain the error message. + */ + error?: Array + } + } + + /** + * Options for triggering an event in Novu. + */ + export type TriggerOptions = { + /** + * Name of the event to trigger. This should match the name of an existing notification template in Novu. + */ + name: string + + /** + * Payload to use for the event. This will be used to populate any handlebars placeholders in the notification template. + */ + payload: Record + + /** + * List of subscribers to send the notification to. Each subscriber must at least have a unique `subscriberId` to identify them in Novu and, if not already known to Novu, an `email` address or `phone` number depending on the notification template being used. + */ + to: Subscriber[] + } +} + +/** + * Client for interacting with the Novu API, a router for sending notifications + * across different channels like Email, SMS, Chat, In-App, and Push. + * + * @see https://novu.co + */ +export class NovuClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('NOVU_API_KEY'), + apiBaseUrl = novu.API_BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'NovuClient missing required "apiKey" (defaults to "NOVU_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl, + headers: { + Authorization: `ApiKey ${this.apiKey}` + } + }) + } + + /** + * Triggers an event in Novu. + * + * @see https://docs.novu.co/api-reference/events/trigger-event + */ + @aiFunction({ + name: 'novu_trigger_event', + description: + 'Sends a notification to a person given their novu `subscriberId` and an `email` or `phone` number. Useful for sending emails or SMS text messages to people.', + inputSchema: z.object({ + name: z.string(), + // TODO: make this more + payload: z.record(z.any()), + to: z.array( + z.object({ + subscriberId: z.string(), + email: z.string().optional(), + firstName: z.string().optional(), + lastName: z.string().optional(), + phone: z.string().optional() + }) + ) + }) + }) + async triggerEvent(options: novu.TriggerOptions) { + return this.ky + .post('events/trigger', { + json: options + }) + .json() + } +} From 47ac683a313baf7cac7cbe655f0bdd25ef4f3391 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 21:38:05 -0500 Subject: [PATCH 67/81] feat: documenting services --- bin/scratch.ts | 4 +- readme.md | 43 ++++++++++--------- src/services/bing-client.ts | 5 +++ src/services/clearbit-client.ts | 5 +++ src/services/dexa-client.ts | 6 +++ src/services/diffbot-client.ts | 7 +++ src/services/exa-client.ts | 5 +++ src/services/firecrawl-client.ts | 6 +-- src/services/index.ts | 3 +- src/services/midjourney-client.ts | 2 +- src/services/novu-client.ts | 4 +- src/services/predict-leads-client.ts | 7 +++ src/services/proxycurl-client.ts | 7 +++ src/services/scraper-client.ts | 2 + src/services/searxng-client.ts | 20 ++++++++- src/services/serpapi-client.ts | 4 +- src/services/serper-client.ts | 4 +- src/services/wikipedia-client.ts | 5 +++ ...fram-client.ts => wolfram-alpha-client.ts} | 12 +++--- 19 files changed, 111 insertions(+), 40 deletions(-) rename src/services/{wolfram-client.ts => wolfram-alpha-client.ts} (90%) diff --git a/bin/scratch.ts b/bin/scratch.ts index e90d70adc..3252212c2 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -11,7 +11,7 @@ import restoreCursor from 'restore-cursor' // import { FirecrawlClient } from '../src/index.js' // import { ExaClient } from '../src/index.js' // import { DiffbotClient } from '../src/index.js' -// import { WolframClient } from '../src/index.js' +// import { WolframAlphaClient } from '../src/index.js' // import { // createTwitterV2Client, // TwitterClient @@ -83,7 +83,7 @@ async function main() { // }) // console.log(JSON.stringify(res, null, 2)) - // const wolfram = new WolframClient() + // const wolfram = new WolframAlphaClient() // const res = await wolfram.ask({ // input: 'population of new york city' // }) diff --git a/readme.md b/readme.md index dac3ae382..06e19ea7b 100644 --- a/readme.md +++ b/readme.md @@ -123,26 +123,29 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## Services -- bing -- clearbit -- dexa -- diffbot -- exa -- firecrawl -- midjourney (unofficial API) -- novu -- people data labs (WIP) -- perigon -- predict leads -- proxycurl -- scraper -- searxng -- serpapi -- serper -- twitter -- wolfram alpha -- weatherapi -- wikipedia +| Service | Client | Description | +| ------------------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) | `BingClient` | Bing web search | +| [Clearbit](https://dashboard.clearbit.com/docs) | `ClearbitClient` | Resolving and enriching people and company data | +| [Dexa](https://dexa.ai) | `DexaClient` | Answers questions from the world's best podcasters | +| [Diffbot](https://docs.diffbot.com) | `DiffbotClient` | Web page classification and scraping; person and company data enrichment | +| [Exa](https://docs.exa.ai) | `ExaClient` | Web search tailored for LLMs | +| [Firecrawl](https://www.firecrawl.dev) | `FirecrawlClient` | Website scraping and sanitization | +| [Midjourney](https://www.imagineapi.dev) | `MidjourneyClient` | Unofficial Midjourney client for generative images | +| [Novu](https://novu.co) | `NovuClient` | Sending notifications (email, SMS, in-app, push, etc) | +| [People Data Labs](https://www.peopledatalabs.com) | `PeopleDataLabsClient` | People & company data (WIP) | +| [Perigon](https://www.goperigon.com/products/news-api) | `PerigonClient` | Real-time news API and web content data from 140,000+ sources. Structured and enriched by AI, primed for LLMs. | +| [Polygon](https://polygon.io) | `PolygonClient` | Stock market and company financial data | +| [PredictLeads](https://predictleads.com) | `PredictLeadsClient` | In-depth company data including signals like fundraising events, hiring news, product launches, technologies used, etc | +| [Proxycurl](https://nubela.co/proxycurl) | `ProxycurlClient` | People and company data from LinkedIn & Crunchbase | +| Scraper | `ScraperClient` | Scrapes URLs into clean html/markdown/text content (TODO: currently closed beta) | +| [Searxng](https://docs.searxng.org) | `SearxngClient` | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines) | +| [SerpAPI](https://serpapi.com/search-api) | `SerpAPIClient` | Lightweight wrapper around SerpAPI for Google search | +| [Serper](https://serper.dev) | `SerperClient` | Lightweight wrapper around Serper for Google search | +| [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | +| [WeatherAPI](https://api.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location | +| [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries | +| [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation) | `WolframAlphaClient` | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions. | ## Non-service Tools diff --git a/src/services/bing-client.ts b/src/services/bing-client.ts index 190f3f3f9..e48c3704b 100644 --- a/src/services/bing-client.ts +++ b/src/services/bing-client.ts @@ -238,6 +238,11 @@ export namespace bing { } } +/** + * Bing web search client. + * + * @see https://www.microsoft.com/en-us/bing/apis/bing-web-search-api + */ export class BingClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiKey: string diff --git a/src/services/clearbit-client.ts b/src/services/clearbit-client.ts index bed94abe9..a04b5761a 100644 --- a/src/services/clearbit-client.ts +++ b/src/services/clearbit-client.ts @@ -360,6 +360,11 @@ export namespace clearbit { } } +/** + * The Clearbit API helps with resolving and enriching people and company data. + * + * @see https://dashboard.clearbit.com/docs + */ export class ClearbitClient { protected readonly ky: KyInstance protected readonly apiKey: string diff --git a/src/services/dexa-client.ts b/src/services/dexa-client.ts index 8b6685d15..62f89554d 100644 --- a/src/services/dexa-client.ts +++ b/src/services/dexa-client.ts @@ -12,6 +12,12 @@ export namespace dexa { export type AskDexaOptions = z.infer } +/** + * Dexa provides answers from the world's best podcasters. + * + * @note The Dexa API is not yet publicly available. + * @see https://dexa.ai + */ export class DexaClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiKey: string diff --git a/src/services/diffbot-client.ts b/src/services/diffbot-client.ts index ba2ab8ef8..6e2db91d4 100644 --- a/src/services/diffbot-client.ts +++ b/src/services/diffbot-client.ts @@ -659,6 +659,13 @@ export namespace diffbot { } } +/** + * Diffbot provides web page classification and scraping. It also provides + * access to a knowledge graph with the ability to perform person and company + * data enrichment. + * + * @see https://docs.diffbot.com + */ export class DiffbotClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly kyKnowledgeGraph: KyInstance diff --git a/src/services/exa-client.ts b/src/services/exa-client.ts index e953402a4..58d3a0b1d 100644 --- a/src/services/exa-client.ts +++ b/src/services/exa-client.ts @@ -163,6 +163,11 @@ export namespace exa { } } +/** + * Web search tailored for LLMs. + * + * @see https://docs.exa.ai + */ export class ExaClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiKey: string diff --git a/src/services/firecrawl-client.ts b/src/services/firecrawl-client.ts index d1afa4389..1396f263b 100644 --- a/src/services/firecrawl-client.ts +++ b/src/services/firecrawl-client.ts @@ -5,9 +5,6 @@ import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, delay, getEnv } from '../utils.js' import { zodToJsonSchema } from '../zod-to-json-schema.js' -// TODO: Deprioritizing this client for now because the API doesn't seem to be -// stable. - export namespace firecrawl { /** * Generic parameter interface. @@ -84,6 +81,9 @@ export namespace firecrawl { } /** + * Turn websites into LLM-ready data. Crawl and convert any website into clean + * markdown or structured data. + * * @see https://www.firecrawl.dev * @see https://github.com/mendableai/firecrawl */ diff --git a/src/services/index.ts b/src/services/index.ts index 004b57bfa..1eeeb5c62 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -8,6 +8,7 @@ export * from './midjourney-client.js' export * from './novu-client.js' export * from './people-data-labs-client.js' export * from './perigon-client.js' +export * from './polygon-client.js' export * from './predict-leads-client.js' export * from './proxycurl-client.js' export * from './scraper-client.js' @@ -16,4 +17,4 @@ export * from './serpapi-client.js' export * from './serper-client.js' export * from './weather-client.js' export * from './wikipedia-client.js' -export * from './wolfram-client.js' +export * from './wolfram-alpha-client.js' diff --git a/src/services/midjourney-client.ts b/src/services/midjourney-client.ts index 3ddd1e37b..6fad2427e 100644 --- a/src/services/midjourney-client.ts +++ b/src/services/midjourney-client.ts @@ -39,7 +39,7 @@ export namespace midjourney { } /** - * Unofficial Midjourney API client. + * Unofficial Midjourney API client for generative images. * * @see https://www.imagineapi.dev */ diff --git a/src/services/novu-client.ts b/src/services/novu-client.ts index 7d8c80f1e..5cbbe4d17 100644 --- a/src/services/novu-client.ts +++ b/src/services/novu-client.ts @@ -91,8 +91,8 @@ export namespace novu { } /** - * Client for interacting with the Novu API, a router for sending notifications - * across different channels like Email, SMS, Chat, In-App, and Push. + * The Novu API provides a router for sending notifications across different + * channels like Email, SMS, Chat, In-App, and Push. * * @see https://novu.co */ diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts index dc8c59b2f..3973d631e 100644 --- a/src/services/predict-leads-client.ts +++ b/src/services/predict-leads-client.ts @@ -475,6 +475,13 @@ export namespace predictleads { > } +/** + * In-depth company data, including signals like fundraising announcemnts, + * hiring intent, new customers signed, technologies used, product launches, + * location expansions, awards received, etc. + * + * @see https://predictleads.com + */ export class PredictLeadsClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiKey: string diff --git a/src/services/proxycurl-client.ts b/src/services/proxycurl-client.ts index 0ed937cef..b83eccf00 100644 --- a/src/services/proxycurl-client.ts +++ b/src/services/proxycurl-client.ts @@ -2010,6 +2010,13 @@ export namespace proxycurl { export type CompanySearchResult = z.infer } +/** + * Pull rich data about people and companies. + * + * Essentially a wrapper around LinkedIn & Crunchbase. + * + * @see https://nubela.co/proxycurl/ + */ export class ProxycurlClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiKey: string diff --git a/src/services/scraper-client.ts b/src/services/scraper-client.ts index 0b223ad6f..b0719f29b 100644 --- a/src/services/scraper-client.ts +++ b/src/services/scraper-client.ts @@ -38,6 +38,8 @@ export namespace scraper { * * It tries the simplest and fastest methods first, and falls back to slower * proxies and JavaScript rendering if needed. + * + * @note This service is currently available only via a closed beta. */ export class ScraperClient extends AIFunctionsProvider { protected readonly ky: KyInstance diff --git a/src/services/searxng-client.ts b/src/services/searxng-client.ts index 782bda721..69717816d 100644 --- a/src/services/searxng-client.ts +++ b/src/services/searxng-client.ts @@ -255,11 +255,29 @@ export namespace searxng { } /** + * Open source meta search engine capable of searching across many different + * sources and search engines. + * + * The most important search engines are: + * + * - "reddit" (Reddit posts) + * - "google" (Google web search) + * - "google news" (Google News search) + * - "brave" (Brave web search) + * - "arxiv" (academic papers) + * - "genius" (Genius.com for song lyrics) + * - "imdb" (movies and TV shows) + * - "hackernews" (Hacker News) + * - "wikidata" (Wikidata) + * - "wolframalpha" (Wolfram Alpha) + * - "youtube" (YouTube videos) + * - "github" (GitHub code and repositories) + * * @see https://docs.searxng.org * * NOTE: You'll need to run a local instance of Searxng to use this client. * - * See [perplexica](https://github.com/ItzCrazyKns/Perplexica/blob/master/docker-compose.yaml) for an example. + * See [perplexica](https://github.com/ItzCrazyKns/Perplexica/blob/master/docker-compose.yaml) for an example of how to set this up. */ export class SearxngClient extends AIFunctionsProvider { protected readonly ky: KyInstance diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index 9e45314f3..4867f6b41 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -10,7 +10,7 @@ import { assert, getEnv } from '../utils.js' */ export namespace serpapi { - export const BASE_URL = 'https://serpapi.com' + export const API_BASE_URL = 'https://serpapi.com' export type BaseResponse

> = { search_metadata: { @@ -641,7 +641,7 @@ export class SerpAPIClient extends AIFunctionsProvider { constructor({ apiKey = getEnv('SERPAPI_API_KEY') ?? getEnv('SERP_API_KEY'), - apiBaseUrl = serpapi.BASE_URL, + apiBaseUrl = serpapi.API_BASE_URL, ky = defaultKy, ...params }: { diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 8d7aceb81..4ad44ccbf 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -5,7 +5,7 @@ import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv, omit } from '../utils.js' export namespace serper { - export const BASE_URL = 'https://google.serper.dev' + export const API_BASE_URL = 'https://google.serper.dev' export const SearchParamsSchema = z.object({ q: z.string().describe('search query'), @@ -217,7 +217,7 @@ export class SerperClient extends AIFunctionsProvider { constructor({ apiKey = getEnv('SERPER_API_KEY'), - apiBaseUrl = serper.BASE_URL, + apiBaseUrl = serper.API_BASE_URL, ky = defaultKy, ...params }: { diff --git a/src/services/wikipedia-client.ts b/src/services/wikipedia-client.ts index a427020aa..7548d8e3c 100644 --- a/src/services/wikipedia-client.ts +++ b/src/services/wikipedia-client.ts @@ -96,6 +96,11 @@ export namespace wikipedia { } } +/** + * Basic Wikipedia API client for searching wiki pages and resolving page data. + * + * @see https://www.mediawiki.org/wiki/API + */ export class WikipediaClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiBaseUrl: string diff --git a/src/services/wolfram-client.ts b/src/services/wolfram-alpha-client.ts similarity index 90% rename from src/services/wolfram-client.ts rename to src/services/wolfram-alpha-client.ts index c573bbcee..980d51109 100644 --- a/src/services/wolfram-client.ts +++ b/src/services/wolfram-alpha-client.ts @@ -4,7 +4,7 @@ import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' import { assert, getEnv } from '../utils.js' -export namespace wolfram { +export namespace wolframalpha { export const API_BASE_URL = 'https://www.wolframalpha.com/api/' export const AskWolframAlphaOptionsSchema = z.object({ @@ -28,14 +28,14 @@ export namespace wolfram { * * @see https://products.wolframalpha.com/llm-api/documentation */ -export class WolframClient extends AIFunctionsProvider { +export class WolframAlphaClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly appId: string protected readonly apiBaseUrl: string constructor({ appId = getEnv('WOLFRAM_APP_ID'), - apiBaseUrl = wolfram.API_BASE_URL, + apiBaseUrl = wolframalpha.API_BASE_URL, ky = defaultKy }: { appId?: string @@ -44,7 +44,7 @@ export class WolframClient extends AIFunctionsProvider { } = {}) { assert( appId, - 'WolframClient missing required "appId" (defaults to "WOLFRAM_APP_ID")' + 'WolframAlphaClient missing required "appId" (defaults to "WOLFRAM_APP_ID")' ) super() @@ -77,9 +77,9 @@ export class WolframClient extends AIFunctionsProvider { - Re-send the exact same 'input' with NO modifications, and add the 'assumption' parameter, formatted as a list, with the relevant values. - ONLY simplify or rephrase the initial query if a more relevant 'Assumption' or other input suggestions are not provided. `.trim(), - inputSchema: wolfram.AskWolframAlphaOptionsSchema + inputSchema: wolframalpha.AskWolframAlphaOptionsSchema }) - async ask(queryOrOptions: string | wolfram.AskWolframAlphaOptions) { + async ask(queryOrOptions: string | wolframalpha.AskWolframAlphaOptions) { const options = typeof queryOrOptions === 'string' ? { input: queryOrOptions } From 1c6fd8f9ec17636fb888b9552638236b235a4d28 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 21:45:48 -0500 Subject: [PATCH 68/81] =?UTF-8?q?=F0=9F=9A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/readme.md b/readme.md index 06e19ea7b..d2de13ae0 100644 --- a/readme.md +++ b/readme.md @@ -123,29 +123,29 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## Services -| Service | Client | Description | -| ------------------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) | `BingClient` | Bing web search | -| [Clearbit](https://dashboard.clearbit.com/docs) | `ClearbitClient` | Resolving and enriching people and company data | -| [Dexa](https://dexa.ai) | `DexaClient` | Answers questions from the world's best podcasters | -| [Diffbot](https://docs.diffbot.com) | `DiffbotClient` | Web page classification and scraping; person and company data enrichment | -| [Exa](https://docs.exa.ai) | `ExaClient` | Web search tailored for LLMs | -| [Firecrawl](https://www.firecrawl.dev) | `FirecrawlClient` | Website scraping and sanitization | -| [Midjourney](https://www.imagineapi.dev) | `MidjourneyClient` | Unofficial Midjourney client for generative images | -| [Novu](https://novu.co) | `NovuClient` | Sending notifications (email, SMS, in-app, push, etc) | -| [People Data Labs](https://www.peopledatalabs.com) | `PeopleDataLabsClient` | People & company data (WIP) | -| [Perigon](https://www.goperigon.com/products/news-api) | `PerigonClient` | Real-time news API and web content data from 140,000+ sources. Structured and enriched by AI, primed for LLMs. | -| [Polygon](https://polygon.io) | `PolygonClient` | Stock market and company financial data | -| [PredictLeads](https://predictleads.com) | `PredictLeadsClient` | In-depth company data including signals like fundraising events, hiring news, product launches, technologies used, etc | -| [Proxycurl](https://nubela.co/proxycurl) | `ProxycurlClient` | People and company data from LinkedIn & Crunchbase | -| Scraper | `ScraperClient` | Scrapes URLs into clean html/markdown/text content (TODO: currently closed beta) | -| [Searxng](https://docs.searxng.org) | `SearxngClient` | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines) | -| [SerpAPI](https://serpapi.com/search-api) | `SerpAPIClient` | Lightweight wrapper around SerpAPI for Google search | -| [Serper](https://serper.dev) | `SerperClient` | Lightweight wrapper around Serper for Google search | -| [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | -| [WeatherAPI](https://api.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location | -| [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries | -| [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation) | `WolframAlphaClient` | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions. | +| Service | Client | Description | +| ------------------------------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) | `BingClient` | Bing web search. | +| [Clearbit](https://dashboard.clearbit.com/docs) | `ClearbitClient` | Resolving and enriching people and company datae. | +| [Dexa](https://dexa.ai) | `DexaClient` | Answers questions from the world's best podcasters. | +| [Diffbot](https://docs.diffbot.com) | `DiffbotClient` | Web page classification and scraping; person and company data enrichment. | +| [Exa](https://docs.exa.ai) | `ExaClient` | Web search tailored for LLMs. | +| [Firecrawl](https://www.firecrawl.dev) | `FirecrawlClient` | Website scraping and sanitization. | +| [Midjourney](https://www.imagineapi.dev) | `MidjourneyClient` | Unofficial Midjourney client for generative images. | +| [Novu](https://novu.co) | `NovuClient` | Sending notifications (email, SMS, in-app, push, etc). | +| [People Data Labs](https://www.peopledatalabs.com) | `PeopleDataLabsClient` | People & company data (WIP). | +| [Perigon](https://www.goperigon.com/products/news-api) | `PerigonClient` | Real-time news API and web content data from 140,000+ sources. Structured and enriched by AI, primed for LLMs. | +| [Polygon](https://polygon.io) | `PolygonClient` | Stock market and company financial data. | +| [PredictLeads](https://predictleads.com) | `PredictLeadsClient` | In-depth company data including signals like fundraising events, hiring news, product launches, technologies used, etc. | +| [Proxycurl](https://nubela.co/proxycurl) | `ProxycurlClient` | People and company data from LinkedIn & Crunchbase. | +| Scraper | `ScraperClient` | Scrapes URLs into clean html/markdown/text content (TODO: currently closed beta). | +| [Searxng](https://docs.searxng.org) | `SearxngClient` | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines). | +| [SerpAPI](https://serpapi.com/search-api) | `SerpAPIClient` | Lightweight wrapper around SerpAPI for Google search. | +| [Serper](https://serper.dev) | `SerperClient` | Lightweight wrapper around Serper for Google search. | +| [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | +| [WeatherAPI](https://api.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | +| [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries. | +| [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation) | `WolframAlphaClient` | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions. | ## Non-service Tools @@ -171,7 +171,10 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as ## TODO - rename this repo to agentic +- sdks + - modelfusion - services + - perplexity - replicate - huggingface - [skyvern](https://github.com/Skyvern-AI/skyvern) From 4cc64698074771488877152803eb2b69bff3dd49 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 21:46:29 -0500 Subject: [PATCH 69/81] =?UTF-8?q?=F0=9F=93=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/polygon-client.ts | 1099 ++++++++++++++++++++++++++++++++ 1 file changed, 1099 insertions(+) create mode 100644 src/services/polygon-client.ts diff --git a/src/services/polygon-client.ts b/src/services/polygon-client.ts new file mode 100644 index 000000000..5a934a583 --- /dev/null +++ b/src/services/polygon-client.ts @@ -0,0 +1,1099 @@ +import defaultKy, { type KyInstance } from 'ky' + +import { AIFunctionsProvider } from '../fns.js' +import { assert, getEnv } from '../utils.js' + +// TODO: add aiFunction decorator to select methods + +export namespace polygon { + export const API_BASE_URL = 'https://api.polygon.io' + + /** + * Asset classes available on Polygon. + */ + export type ASSET_CLASS = 'stocks' | 'options' | 'crypto' | 'fx' + + /** + * Supported time spans for Polygon's indicator APIs. + */ + export type TIMESPAN = + | 'minute' + | 'hour' + | 'day' + | 'week' + | 'month' + | 'quarter' + | 'year' + + /** + * Supported series types for Polygon's indicator APIs. + */ + export type SERIES_TYPE = 'close' | 'open' | 'high' | 'low' + + /** + * Order types available on Polygon. + */ + export type ORDER_TYPE = 'asc' | 'desc' + + /** + * Input parameters for the aggregates API. + */ + export interface AggregatesInput { + /** The ticker symbol of the stock/equity. */ + ticker: string + + /** The size of the timespan multiplier. */ + multiplier: number + + /** The size of the time window. */ + timespan: TIMESPAN + + /** The start of the aggregate time window. Either a date with the format YYYY-MM-DD or a millisecond timestamp. */ + from: string | number + + /** The end of the aggregate time window. Either a date with the format YYYY-MM-DD or a millisecond timestamp. */ + to: string | number + + /** Whether or not the results are adjusted for splits. By default, results are adjusted. Set this to false to get results that are NOT adjusted for splits. */ + adjusted?: boolean + + /** Sort the results by timestamp. "asc" will return results in ascending order (oldest at the top), "desc" will return results in descending order (newest at the top). */ + sort?: ORDER_TYPE + + /** Limits the number of base aggregates queried to create the aggregate results. Max 50000 and Default 5000. */ + limit?: number + } + + /** + * Output parameters for the aggregates API. + */ + export interface AggregatesOutput { + /** The exchange symbol that this item is traded under. */ + ticker: string + + /** Whether or not this response was adjusted for splits. */ + adjusted: boolean + + /** The number of aggregates (minute or day) used to generate the response. */ + queryCount: number + + /** A request id assigned by the server. */ + request_id: string + + /** The total number of results for this request. */ + resultsCount: number + + /** The status of this request's response. */ + status: string + + /** The results of the query. */ + results: Aggregate[] + + /** If present, this value can be used to fetch the next page of data. */ + next_url?: string + } + + /** + * Input parameters for the grouped daily API. + */ + export type GroupedDailyInput = { + /** The beginning date for the aggregate window. */ + date: string + + /** Whether or not the results are adjusted for splits. By default, results are adjusted. Set this to false to get results that are NOT adjusted for splits. */ + adjusted?: boolean + } + + /** + * Input parameters for the grouped daily API for stocks. + */ + export interface GroupedDailyInputStocks extends GroupedDailyInput { + /** Include OTC securities in the response. Default is false (don't include OTC securities). */ + include_otc?: boolean + } + + /** + * Output parameters for the grouped daily API. + */ + export interface GroupedDailyOutput { + /** Whether or not this response was adjusted for splits. */ + adjusted: boolean + + /** The number of aggregates (minute or day) used to generate the response. */ + queryCount: number + + /** A request id assigned by the server. */ + request_id: string + + /** The total number of results for this request. */ + resultsCount: number + + /** The status of this request's response. */ + status: string + + /** The results of the query. */ + results: AggregateDaily[] + } + + /** + * AggregateDaily parameters. + */ + export interface AggregateDaily extends Aggregate { + /** The exchange symbol that this item is traded under. */ + T: string + } + + /** + * Ticker Details v3 input parameters. + */ + export type TickerDetailsInput = { + /** The ticker symbol of the asset. */ + ticker: string + + /** Specify a point in time to get information about the ticker available on that date (formatted as YYYY-MM-DD). */ + date?: string + } + + /** + * Daily Open/Close input parameters. + */ + export type DailyOpenCloseInput = { + /** The ticker symbol */ + ticker: string + + /** The date of the requested open/close in the format YYYY-MM-DD. */ + date: string + + /** Whether or not the results are adjusted for splits. By default, results are adjusted. */ + adjusted?: boolean + } + + /** + * Result returned by the Daily Open/Close API. + */ + export interface DailyOpenCloseOutput { + /** The close price of the ticker symbol in after-hours trading. */ + afterHours: number + + /** The close price for the symbol in the given time period. */ + close: number + + /** The requested date. */ + from: string + + /** The highest price for the symbol in the given time period. */ + high: number + + /** The lowest price for the symbol in the given time period. */ + low: number + + /** The open price for the symbol in the given time period. */ + open: number + + /** The open price of the ticker symbol in pre-market trading. */ + preMarket: number + + /** The status of this request's response. */ + status: string + + /** The exchange symbol that this item is traded under. */ + symbol: string + + /** The trading volume of the symbol in the given time period. */ + volume: number + } + + /** + * Result returned by the Previous Close API. + */ + export interface PreviousCloseOutput { + /** Whether or not this response was adjusted for splits. */ + adjusted: boolean + + /** The number of aggregates (minute or day) used to generate the response. */ + queryCount: number + + /** A request id assigned by the server. */ + requestId: string + + /** Array of results, each containing details for the symbol in the given time period. */ + results: { + /** The exchange symbol that this item is traded under. */ + T: string + + /** The close price for the symbol in the given time period. */ + c: number + + /** The highest price for the symbol in the given time period. */ + h: number + + /** The lowest price for the symbol in the given time period. */ + l: number + + /** The open price for the symbol in the given time period. */ + o: number + + /** The Unix Msec timestamp for the start of the aggregate window. */ + t: number + + /** The trading volume of the symbol in the given time period. */ + v: number + + /** The volume weighted average price. */ + vw: number + }[] + + /** The total number of results for this request. */ + resultsCount: number + + /** The status of this request's response. */ + status: string + + /** The exchange symbol that this item is traded under. */ + ticker: string + } + + /** + * Result returned by the Ticker Details v3 API. + */ + export interface TickerDetailsOutput { + /** A request id assigned by the server. */ + requestId: string + + /** Detailed results for the specific ticker. */ + results: { + /** Whether the ticker is actively traded. */ + active: boolean + + /** Address of the company. */ + address: { + /** The first line of the company's headquarters address. */ + address1: string + + /** The city of the company's headquarters address. */ + city: string + + /** The postal code of the company's headquarters address. */ + postalCode: string + + /** The state of the company's headquarters address. */ + state: string + } + + /** Branding details of the company. */ + branding: { + /** A link to this ticker's company's icon. Icon's are generally smaller, square images that represent the company at a glance. */ + iconUrl: string + + /** A link to this ticker's company's logo. Note that you must provide an API key when accessing this URL. See the "Authentication" section at the top of this page for more details. */ + logoUrl: string + } + + /** Central Index Key (CIK) of the company. */ + cik: string + + /** Composite Financial Instrument Global Identifier (FIGI). */ + compositeFigi: string + + /** Name of the currency in which the company trades. */ + currencyName: string + + /** Date and time the company was delisted, if applicable. */ + delistedUtc?: string + + /** Description of the company. */ + description: string + + /** The company's homepage URL. */ + homepageUrl: string + + /** The date when the company was listed. */ + listDate: string + + /** Locale of the company. */ + locale: string + + /** Market in which the company trades. */ + market: string + + /** Market capitalization of the company. */ + marketCap: number + + /** Name of the company. */ + name: string + + /** Phone number of the company. */ + phoneNumber: string + + /** The primary exchange on which the company trades. */ + primaryExchange: string + + /** Round lot size for the company's stock. */ + roundLot: number + + /** Share class FIGI. */ + shareClassFigi: string + + /** The number of outstanding shares for the share class. */ + shareClassSharesOutstanding: number + + /** The Standard Industrial Classification (SIC) code of the company. */ + sicCode: string + + /** Description of the SIC code. */ + sicDescription: string + + /** The ticker symbol of the company. */ + ticker: string + + /** The root of the ticker symbol. */ + tickerRoot: string + + /** The suffix of the ticker symbol, if applicable. */ + tickerSuffix?: string + + /** The total number of employees in the company. */ + totalEmployees: number + + /** The type of the ticker (e.g., common stock, preferred stock, etc.). */ + type: string + + /** The number of weighted outstanding shares. */ + weightedSharesOutstanding: number + } + + /** The status of this request's response. */ + status: string + } + + /** + * Input parameters for technical indicators. + */ + export type IndicatorInput = { + /** The ticker symbol for which to get data. */ + ticker: string + + /** Query by timestamp. Either a date with the format YYYY-MM-DD or a millisecond timestamp. */ + timestamp?: string + + /** The size of the aggregate time window. */ + timespan?: TIMESPAN + + /** Whether or not the aggregates are adjusted for splits. By default, aggregates are adjusted. Set this to false to get results that are NOT adjusted for splits. */ + adjusted?: boolean + + /** The window size used to calculate the indicator. i.e. a window size of 10 with daily aggregates would result in a 10 day moving average. */ + window?: number + + /** The price in the aggregate which will be used to calculate the indicator. */ + series_type?: SERIES_TYPE + + /** Whether or not to include the aggregates used to calculate this indicator in the response. */ + expand_underlying?: boolean + + /** The order in which to return the results, ordered by timestamp. */ + order?: ORDER_TYPE + + /** Limit the number of results returned, default is 10 and max is 5000 */ + limit?: number + } + + /** + * Represents an aggregate, which includes data for a given time period. + */ + export interface Aggregate { + /** The close price for the symbol in the given time period. */ + c: number + + /** The highest price for the symbol in the given time period. */ + h: number + + /** The lowest price for the symbol in the given time period. */ + l: number + + /** The number of transactions in the aggregate window. */ + n: number + + /** The open price for the symbol in the given time period. */ + o: number + + /** Whether or not this aggregate is for an OTC ticker. This field will be left off if false. */ + otc?: boolean + + /** The Unix Msec timestamp for the start of the aggregate window. */ + t: number + + /** The trading volume of the symbol in the given time period. */ + v: number + + /** The volume weighted average price. */ + vw?: number + } + + /** + * Represents a value of the indicator, which includes timestamp and value itself. + */ + export interface IndicatorValue { + /** The Unix Msec timestamp from the last aggregate used in this calculation. */ + timestamp: number + + /** The indicator value for this period. */ + value: number + } + + /** + * The output response from the technical indicator API. + */ + export interface IndicatorOutput { + /** If present, this value can be used to fetch the next page of data. */ + next_url: string + + /** A request id assigned by the server. */ + request_id: string + + /** Results object containing underlying aggregates and values array. */ + results: { + /** Underlying object containing aggregates and a URL to fetch underlying data. */ + underlying: { + /** Array of aggregates used for calculation. */ + aggregates: Aggregate[] + + /** The URL which can be used to request the underlying aggregates used in this request. */ + url: string + } + + /** Array of calculated indicator values. */ + values: IndicatorValue[] + } + + /** The status of this request's response. */ + status: string + } + + /** + * Input parameters for the /v3/reference/tickers API. + */ + export type TickerInput = { + /** Specify a ticker symbol. Defaults to empty string which queries all tickers. */ + ticker?: string + + /** Specify the type of the tickers. */ + type?: string + + /** Filter by market type. */ + market?: 'crypto' + + /** Specify the primary exchange of the asset in the ISO code format. */ + exchange?: string + + /** Specify the CUSIP code of the asset you want to search for. */ + cusip?: string + + /** Specify the CIK of the asset you want to search for. */ + cik?: string + + /** Specify a point in time to retrieve tickers available on that date. */ + date?: string + + /** Search for terms within the ticker and/or company name. */ + search?: string + + /** Specify if the tickers returned should be actively traded on the queried date. */ + active?: boolean + + /** Order results based on the sort field. */ + order?: ORDER_TYPE + + /** Limit the number of results returned. */ + limit?: number + + /** Sort field used for ordering. */ + sort?: string + } + + /** + * Represents a ticker that matches the query. + */ + export interface Ticker { + /** Whether or not the asset is actively traded. */ + active: boolean + + /** The CIK number for this ticker. */ + cik: string + + /** The composite OpenFIGI number for this ticker. */ + composite_figi: string + + /** The name of the currency that this asset is traded with. */ + currency_name: string + + /** The last date that the asset was traded. */ + delisted_utc: string + + /** The information is accurate up to this time. */ + last_updated_utc: string + + /** The locale of the asset. */ + locale: 'us' | 'global' + + /** The market type of the asset. */ + market: 'stocks' | 'crypto' | 'fx' | 'otc' | 'indices' + + /** The name of the asset. */ + name: string + + /** The ISO code of the primary listing exchange for this asset. */ + primary_exchange: string + + /** The share Class OpenFIGI number for this ticker. */ + share_class_figi: string + + /** The exchange symbol that this item is traded under. */ + ticker: string + + /** The type of the asset. */ + type: string + } + + /** + * The output response from the /v3/reference/tickers API. + */ + export interface TickerOutput { + /** The total number of results for this request. */ + count: number + + /** If present, this value can be used to fetch the next page of data. */ + next_url: string + + /** A request id assigned by the server. */ + request_id: string + + /** An array of tickers that match your query. */ + results: Ticker[] + + /** The status of this request's response. */ + status: string + } + + /** + * Output parameters for the market status API. + */ + export interface MarketStatusOutput { + /** Whether or not the market is in post-market hours. */ + afterHours: boolean + + /** The status of the crypto and forex markets. */ + currencies: { + /** The status of the crypto market. */ + crypto: string + /** The status of the forex market. */ + fx: string + } + + /** Whether or not the market is in pre-market hours. */ + earlyHours: boolean + + /** The status of the Nasdaq, NYSE and OTC markets. */ + exchanges: { + /** The status of the Nasdaq market. */ + nasdaq: string + /** The status of the NYSE market. */ + nyse: string + /** The status of the OTC market. */ + otc: string + } + + /** The status of the market as a whole. */ + market: string + + /** The current time of the server. */ + serverTime: string + } + + /** + * Output parameters for the market holidays API. + */ + export interface MarketHolidayOutput { + /** The market close time on the holiday (if it's not closed). */ + close?: string + + /** The date of the holiday. */ + date: string + + /** Which market the record is for. */ + exchange: string + + /** The name of the holiday. */ + name: string + + /** The market open time on the holiday (if it's not closed). */ + open?: string + + /** The status of the market on the holiday. */ + status: string + } + + /** + * Input parameters for the ticker types API. + */ + export type TickerTypesInput = { + /** Filter by asset class. */ + asset_class?: ASSET_CLASS + + /** Filter by locale. */ + locale?: string + } + + /** + * Output parameters for the ticker types API. + */ + export interface TickerTypesOutput { + /** The total number of results for this request. */ + count: number + + /** A request ID assigned by the server. */ + request_id: string + + /** The results of the query. */ + results: TickerType[] + + /** The status of this request's response. */ + status: string + } + + /** + * Ticker type parameters. + */ + export interface TickerType { + /** An identifier for a group of similar financial instruments. */ + asset_class: ASSET_CLASS + + /** A code used by Polygon.io to refer to this ticker type. */ + code: string + + /** A short description of this ticker type. */ + description: string + + /** An identifier for a geographical location. */ + locale: string + } + + /** + * Input parameters for the ticker news API. + */ + export type TickerNewsInput = { + /** Ticker symbol to return results for. */ + ticker: string + + /** Date to return results published on, before, or after. */ + published_utc?: string + + /** Order results based on the sort field. */ + order?: ORDER_TYPE + + /** Limit the number of results returned, default is 10 and max is 1000. */ + limit?: number + + /** Sort field used for ordering. */ + sort?: string + } + + /** + * Output parameters for the ticker news API. + */ + export interface TickerNewsOutput { + /** The total number of results for this request. */ + count: number + + /** If present, this value can be used to fetch the next page of data. */ + next_url: string + + /** A request id assigned by the server. */ + request_id: string + + /** The results of the query. */ + results: TickerNews[] + + /** The status of this request's response. */ + status: string + } + + /** + * Ticker news parameters. + */ + export interface TickerNews { + /** The mobile friendly Accelerated Mobile Page (AMP) URL. */ + amp_url?: string + + /** A link to the news article. */ + article_url: string + + /** The article's author. */ + author: string + + /** A description of the article. */ + description?: string + + /** Unique identifier for the article. */ + id: string + + /** The article's image URL. */ + image_url?: string + + /** The keywords associated with the article (which will vary depending on the publishing source). */ + keywords?: string[] + + /** The date the article was published on. */ + published_utc: string + + /** The publisher's details. */ + publisher: Publisher + + /** The ticker symbols associated with the article. */ + tickers: string[] + + /** The title of the news article. */ + title: string + } + + /** + * Publisher parameters. + */ + export interface Publisher { + /** The publisher's homepage favicon URL. */ + favicon_url?: string + + /** The publisher's homepage URL. */ + homepage_url: string + + /** The publisher's logo URL. */ + logo_url: string + + /** The publisher's name. */ + name: string + } + + /** + * Input parameters for the exchanges API. + */ + export type ExchangesInput = { + /** Filter by asset class. */ + asset_class?: ASSET_CLASS + + /** Filter by locale. */ + locale?: string + } + + /** + * Output parameters for the exchanges API. + */ + export interface ExchangesOutput { + /** The total number of results for this request. */ + count: number + + /** A request ID assigned by the server. */ + request_id: string + + /** The results of the query. */ + results: Exchange[] + + /** The status of this request's response. */ + status: string + } + + /** + * Exchange parameters. + */ + export interface Exchange { + /** A commonly used abbreviation for this exchange. */ + acronym?: string + + /** An identifier for a group of similar financial instruments. */ + asset_class: ASSET_CLASS + + /** A unique identifier used by Polygon.io for this exchange. */ + id: number + + /** An identifier for a geographical location. */ + locale: 'us' | 'global' + + /** The Market Identifer Code of this exchange (see ISO 10383). */ + mic: string + + /** Name of this exchange. */ + name: string + + /** The MIC of the entity that operates this exchange. */ + operating_mic: string + + /** The ID used by SIP's to represent this exchange. */ + participant_id?: string + + /** Represents the type of exchange. */ + type: 'exchange' | 'TRF' | 'SIP' + + /** A link to this exchange's website, if one exists. */ + url?: string + } +} + +/** + * Client for the Polygon.io API that lets you query the latest market data + * from all US stock exchanges. You can also find data on company financials, + * stock market holidays, corporate actions, and more. + * + * @see {@link https://polygon.io/docs} + */ +export class PolygonClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('POLYGON_API_KEY'), + apiBaseUrl = polygon.API_BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'PolygonClient missing required "apiKey" (defaults to "POLYGON_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl, + headers: { + Authorization: `Bearer ${this.apiKey}` + } + }) + } + + /** + * Returns detailed information about a single ticker. + * + * @param params - input parameters (`ticker` symbol and optional `date`) + * @returns promise that resolves to detailed information about a single ticker + */ + async tickerDetails(params: polygon.TickerDetailsInput) { + let searchParams + if (params.date) { + searchParams = { + date: params.date + } + } + + return this.ky + .get(`v3/reference/tickers/${params.ticker}`, { + searchParams + }) + .json() + } + + /** + * Returns the open, close and after hours prices of a stock symbol on a certain date. + * + * @param params - input parameters (`ticker` symbol and `date`) + * @returns promise that resolves to the open, close and after hours prices of a stock symbol on a certain date + */ + async dailyOpenClose(params: polygon.DailyOpenCloseInput) { + return this.ky + .get(`v1/open-close/${params.ticker}/${params.date}`, { + searchParams: { + adjusted: params.adjusted ?? true + } + }) + .json() + } + + /** + * Returns the previous day's open, high, low, and close (OHLC) for the specified stock ticker. + * + * @param ticker - ticker symbol of the stock/equity + * @param adjusted - whether or not the results are adjusted for splits + * @returns promise that resolves to the previous day's open, high, low, and close (OHLC) for the specified stock ticker + */ + async previousClose(ticker: string, adjusted = true) { + return this.ky + .get(`v2/aggs/ticker/${ticker}/prev`, { + searchParams: { + adjusted + } + }) + .json() + } + + /** + * Get the simple moving average (SMA) for a ticker symbol over a given time range. + * + * @param params - input parameters + * @returns promise that resolves to the simple moving average (SMA) for a ticker symbol over a given time range + */ + async sma(params: polygon.IndicatorInput) { + return this.ky + .get(`v1/indicators/sma/${params.ticker}`, { + searchParams: params + }) + .json() + } + + /** + * Get the exponential moving average (EMA) for a ticker symbol over a given time range. + * + * @param params - input parameters + * @returns promise that resolves to the exponential moving average (EMA) for a ticker symbol over a given time range + */ + async ema(params: polygon.IndicatorInput) { + return this.ky + .get(`v1/indicators/ema/${params.ticker}`, { + searchParams: params + }) + .json() + } + + /** + * Get moving average convergence/divergence (MACD) for a ticker symbol over a given time range. + * + * @param params - input parameters + * @returns promise that resolves to the moving average convergence/divergence (MACD) for a ticker symbol over a given time range + */ + async macd(params: polygon.IndicatorInput) { + return this.ky + .get(`v1/indicators/ema/${params.ticker}`, { + searchParams: params + }) + .json() + } + + /** + * Get the relative strength index (RSI) for a ticker symbol over a given time range. + * + * @param params - input parameters + * @returns promise that resolves to the relative strength index (RSI) for a ticker symbol over a given time range + */ + async rsi(params: polygon.IndicatorInput) { + return this.ky + .get(`v1/indicators/rsi/${params.ticker}`, { + searchParams: params + }) + .json() + } + + /** + * Query all ticker symbols which are supported by Polygon.io. Currently includes Stocks/Equities, Indices, Forex, and Crypto. + * + * @param params - input parameters to filter the list of ticker symbols + * @returns promise that resolves to a list of ticker symbols and their details + */ + async tickers(params: polygon.TickerInput): Promise { + return this.ky + .get('v3/reference/tickers', { searchParams: params }) + .json() + } + + /** + * List all ticker types that Polygon.io has. + * + * @param params - input parameters (`asset_class` and `locale`) + * @returns promise that resolves to ticker types + */ + async tickerTypes(params: polygon.TickerTypesInput = {}) { + return this.ky + .get('v3/reference/tickers/types', { searchParams: params }) + .json() + } + + /** + * Get the most recent news articles relating to a stock ticker symbol. + * + * @param params - input parameters (`ticker`, `published_utc`, `order`, `limit`, `sort`) + * @returns promise that resolves to ticker news + */ + async tickerNews(params: polygon.TickerNewsInput) { + return this.ky + .get('v2/reference/news', { searchParams: params }) + .json() + } + + /** + * Returns the current trading status of the exchanges and overall financial markets. + * + * @returns promise that resolves to the market status + */ + async marketStatus() { + return this.ky.get('v1/marketstatus/now').json() + } + + /** + * Gets upcoming market holidays and their open/close times. + * + * @returns promise that resolves to an array of market holidays + */ + async marketHolidays(): Promise { + return this.ky + .get('v1/marketstatus/upcoming') + .json() + } + + /** + * List all exchanges that Polygon.io knows about. + * + * @param params - input parameters (`asset_class`, `locale`) + * @returns promise that resolves to list of exchanges + */ + async exchanges(params: polygon.ExchangesInput = {}) { + return this.ky + .get('v3/reference/exchanges', { searchParams: params }) + .json() + } + + /** + * Get aggregate bars for a stock over a given date range in custom time window sizes. + * + * @param params - input parameters + * @returns promise that resolves to list of aggregates + */ + async aggregates(params: polygon.AggregatesInput) { + const { ticker, multiplier, timespan, from, to, ...otherParams } = params + const endpoint = `v2/aggs/ticker/${ticker}/range/${multiplier}/${timespan}/${from}/${to}` + return this.ky + .get(endpoint, { searchParams: otherParams }) + .json() + } + + /** + * Get the daily open, high, low, and close (OHLC) for the entire markets. + * + * @param assetClass - the asset class to get data for + * @param params - input parameters (`date`, `adjusted`, `include_otc`) + * @returns promise that resolves to list of aggregates + */ + async groupedDaily( + assetClass: 'stocks', + params: polygon.GroupedDailyInputStocks + ): Promise + + /** + * Get the daily open, high, low, and close (OHLC) for the entire markets. + * + * @param assetClass - the asset class to get data for + * @param params - input parameters (`date`, `adjusted`) + * @returns promise that resolves to list of aggregates + */ + async groupedDaily( + assetClass: polygon.ASSET_CLASS, + params: polygon.GroupedDailyInput + ) { + const { date, ...otherParams } = params + const endpoint = `v2/aggs/grouped/locale/us/market/${assetClass}/${date}` + return this.ky + .get(endpoint, { searchParams: otherParams }) + .json() + } +} From 0499aa1af452fcceddcb2ae945506a443ec3466b Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 21:50:19 -0500 Subject: [PATCH 70/81] =?UTF-8?q?=F0=9F=94=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/readme.md b/readme.md index d2de13ae0..ab02a2134 100644 --- a/readme.md +++ b/readme.md @@ -79,8 +79,7 @@ async function main() { perigon.functions.pick('search_news_stories'), serper ), - systemMessage: - 'You are a helpful assistant. Be as concise as possible. Respond in markdown. Always cite your sources.' + systemMessage: `You are a helpful assistant. Be as concise as possible.` }) const result = await runner( @@ -102,25 +101,6 @@ You can pass as many or as few of these `AIFunctionLike` objects as you'd like a The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as lightweight as possible. -## Client Goals - -- clients should be as minimal as possible -- clients must use `ky` as a lightweight native fetch wrapper -- clients must have a strongly-typed TS DX -- clients should expose select methods via the `@aiFunction(...)` decorator - - `@aiFunction` methods must use `zod` for input schema validation -- it should be easy to create external clients which follow the `AIFunctionsProvider` superclass / `@aiFunction` decorator pattern -- common utility functions for LLM-based function calling should be exported for convenience -- clients and AIFunctions should be composable via `AIFunctionSet` -- clients must work with all major TS AI SDKs - - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/stdlib` - - SDK adatptor entrypoints should all be isolated to their own top-level imports - - `@agentic/stdlib/ai-sdk` - - `@agentic/stdlib/langchain` - - `@agentic/stdlib/llamaindex` - - `@agentic/stdlib/dexter` - - `@agentic/stdlib/genkit` - ## Services | Service | Client | Description | @@ -168,6 +148,16 @@ The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as - Dexa Dexter - `import { createDexterFunctions } from '@agentic/stdlib/dexter'` +## Client Goals + +- clients should be as minimal as possible +- clients should use `ky` and `zod` where possible +- clients must have a strongly-typed TS DX +- clients should expose select methods via the `@aiFunction(...)` decorator +- clients and AIFunctions should be composable via `AIFunctionSet` +- clients must work with all major TS AI SDKs + - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/stdlib` + ## TODO - rename this repo to agentic From 63dee0610e6db9756d366dfd5bd3b936ae2ce32f Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 22:00:30 -0500 Subject: [PATCH 71/81] =?UTF-8?q?=F0=9F=A5=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index ab02a2134..9346df36f 100644 --- a/readme.md +++ b/readme.md @@ -18,9 +18,9 @@ > [!WARNING] > TODO: this project is not published yet and is an active WIP. -The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based usage** across any popular AI SDK via simple adaptors. +The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based usage** across all of the popular AI SDKs. -For example, all of the stdlib tools like `WeatherClient` can be used both as normal, fully-typed TS SDKs: +For a simple example, `WeatherClient` can be used normally as a TS client: ```ts import { WeatherClient } from '@agentic/stdlib' @@ -34,7 +34,9 @@ const result = await clearbit.getCurrentWeather({ console.log(result) ``` -Or you can use them as a set of LLM-based functions / tools using adaptors specific to each LLM SDK. This example uses [Vercel's AI SDK](https://github.com/vercel/ai): +Or you can use it as a set of LLM-based functions / tools which work with all of the major AI SDKs via adaptors. + +This example uses [Vercel's AI SDK](https://github.com/vercel/ai): ```ts // sdk-specific imports @@ -49,6 +51,7 @@ const weather = new WeatherClient() const result = await generateText({ model: openai('gpt-4o'), + // this is the key line which uses the ai-sdk adaptor tools: createAISDKTools(weather), toolChoice: 'required', prompt: 'What is the weather in San Francisco?' @@ -57,7 +60,9 @@ const result = await generateText({ console.log(result.toolResults[0]) ``` -Let's take a slightly more complicated example which uses multiple clients and selects a subset of their functions using the `pick` method: +You can use all of our hand-crafted stdlib functions with your favorite AI SDK or custom AI SDK – without having to write any glue code! + +Here's a slightly more complex example which uses multiple clients and selects a subset of their functions using the `AIFunctionSet.pick` method: ```ts // sdk-specific imports @@ -89,7 +94,7 @@ async function main() { } ``` -Here we've exposed 2 functions to the LLM, `search_news_stories` which corresponds to the `PerigonClient.searchStories` method and `serper_google_search` via the `SerperClient.search` method. +Here we've exposed 2 functions to the LLM, `search_news_stories` (which implicitly comes from `PerigonClient.searchStories`) and `serper_google_search` (which implicitly comes from `SerperClient.search`). All of the SDK adaptors like `createDexterFunctions` are very flexible in what they accept. `AIFunctionLike` objects include: @@ -97,9 +102,9 @@ All of the SDK adaptors like `createDexterFunctions` are very flexible in what t - `AIFunctionsProvider` - Client classes which expose an `AIFunctionSet` via the `.functions` property (like `perigon` or `serper`) - `AIFunction` - Individual functions (like `perigon.functions.get('search_news_stories')` or `serper.functions.get('serper_google_search')`) -You can pass as many or as few of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` objects via `.pick`, `.omit`, `.get`, `.map`, etc. +You can pass as many of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` objects via `.pick`, `.omit`, `.get`, `.map`, etc. -The SDK-specific imports are all isolated to keep the main `@agentic/stdlib` as lightweight as possible. +All heavy third-party imports are isolated as _optional peer dependencies_ to keep the main `@agentic/stdlib` package as lightweight as possible. ## Services From f510582344ad90ad014335f1ba76cc6d3be7b12b Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Wed, 5 Jun 2024 22:11:11 -0500 Subject: [PATCH 72/81] =?UTF-8?q?=F0=9F=93=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/readme.md b/readme.md index 9346df36f..fa6ca3961 100644 --- a/readme.md +++ b/readme.md @@ -18,9 +18,9 @@ > [!WARNING] > TODO: this project is not published yet and is an active WIP. -The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based usage** across all of the popular AI SDKs. +The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based apps** that work with all of the major AI SDKs (LangChain, LlamaIndex, Vercel AI SDK, OpenAI SDK, etc). -For a simple example, `WeatherClient` can be used normally as a TS client: +For a simple example, stdlib clients like `WeatherClient` can be used normally as a fully-typed TS client: ```ts import { WeatherClient } from '@agentic/stdlib' @@ -34,9 +34,9 @@ const result = await clearbit.getCurrentWeather({ console.log(result) ``` -Or you can use it as a set of LLM-based functions / tools which work with all of the major AI SDKs via adaptors. +Or you can use this same function an LLM-based tool which works across all of the major AI SDKs via adaptors. -This example uses [Vercel's AI SDK](https://github.com/vercel/ai): +Here's an example using [Vercel's AI SDK](https://github.com/vercel/ai): ```ts // sdk-specific imports @@ -60,7 +60,7 @@ const result = await generateText({ console.log(result.toolResults[0]) ``` -You can use all of our hand-crafted stdlib functions with your favorite AI SDK or custom AI SDK – without having to write any glue code! +You can use all of our thoroughly tested stdlib AI functions with your favorite AI SDK – without having to write any glue code! Here's a slightly more complex example which uses multiple clients and selects a subset of their functions using the `AIFunctionSet.pick` method: @@ -94,15 +94,15 @@ async function main() { } ``` -Here we've exposed 2 functions to the LLM, `search_news_stories` (which implicitly comes from `PerigonClient.searchStories`) and `serper_google_search` (which implicitly comes from `SerperClient.search`). +Here we've exposed 2 functions to the LLM, `search_news_stories` (which comes from the `PerigonClient.searchStories` method) and `serper_google_search` (which implicitly comes from the `SerperClient.search` method). -All of the SDK adaptors like `createDexterFunctions` are very flexible in what they accept. `AIFunctionLike` objects include: +All of the SDK adaptors like `createDexterFunctions` accept very flexible in what they accept. `AIFunctionLike` objects include: - `AIFunctionSet` - Sets of AI functions (like `perigon.functions.pick('search_news_stories')` or `perigon.functions` or `serper.functions`) - `AIFunctionsProvider` - Client classes which expose an `AIFunctionSet` via the `.functions` property (like `perigon` or `serper`) -- `AIFunction` - Individual functions (like `perigon.functions.get('search_news_stories')` or `serper.functions.get('serper_google_search')`) +- `AIFunction` - Individual functions (like `perigon.functions.get('search_news_stories')` or `serper.functions.get('serper_google_search')` or AI functions created directly via the `createAIFunction` utility function) -You can pass as many of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` objects via `.pick`, `.omit`, `.get`, `.map`, etc. +You can pass as many of these `AIFunctionLike` objects as you'd like and you can manipulate them as `AIFunctionSet` sets via `.pick`, `.omit`, `.get`, `.map`, etc. All heavy third-party imports are isolated as _optional peer dependencies_ to keep the main `@agentic/stdlib` package as lightweight as possible. From 0ebda1e89a19bebe88b501b85a7939f9102c5db6 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 00:08:11 -0500 Subject: [PATCH 73/81] feat: add slack client --- readme.md | 6 +- src/services/index.ts | 1 + src/services/slack-client.ts | 459 +++++++++++++++++++++++++++++++++++ 3 files changed, 463 insertions(+), 3 deletions(-) create mode 100644 src/services/slack-client.ts diff --git a/readme.md b/readme.md index fa6ca3961..6ed5fbc97 100644 --- a/readme.md +++ b/readme.md @@ -127,6 +127,7 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke | [Searxng](https://docs.searxng.org) | `SearxngClient` | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines). | | [SerpAPI](https://serpapi.com/search-api) | `SerpAPIClient` | Lightweight wrapper around SerpAPI for Google search. | | [Serper](https://serper.dev) | `SerperClient` | Lightweight wrapper around Serper for Google search. | +| [Slack](https://api.slack.com/docs) | `SlackClient` | Send and receive basic Slack messages. | | [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | | [WeatherAPI](https://api.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | | [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries. | @@ -157,10 +158,10 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke - clients should be as minimal as possible - clients should use `ky` and `zod` where possible -- clients must have a strongly-typed TS DX +- clients should have a strongly-typed TS DX - clients should expose select methods via the `@aiFunction(...)` decorator - clients and AIFunctions should be composable via `AIFunctionSet` -- clients must work with all major TS AI SDKs +- clients should work with all major TS AI SDKs - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/stdlib` ## TODO @@ -173,7 +174,6 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke - replicate - huggingface - [skyvern](https://github.com/Skyvern-AI/skyvern) - - unstructured - pull from [langchain](https://github.com/langchain-ai/langchainjs/tree/main/langchain) - provide a converter for langchain `DynamicStructuredTool` - pull from [nango](https://docs.nango.dev/integrations/overview) diff --git a/src/services/index.ts b/src/services/index.ts index 1eeeb5c62..124793095 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -15,6 +15,7 @@ export * from './scraper-client.js' export * from './searxng-client.js' export * from './serpapi-client.js' export * from './serper-client.js' +export * from './slack-client.js' export * from './weather-client.js' export * from './wikipedia-client.js' export * from './wolfram-alpha-client.js' diff --git a/src/services/slack-client.ts b/src/services/slack-client.ts new file mode 100644 index 000000000..fcf638484 --- /dev/null +++ b/src/services/slack-client.ts @@ -0,0 +1,459 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { TimeoutError } from '../errors.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, delay, getEnv } from '../utils.js' + +// TODO: need to expose more aiFunctions + +export namespace slack { + export const API_BASE_URL = 'https://slack.com/api' + + export const DEFAULT_TIMEOUT_MS = 120_000 + export const DEFAULT_INTERVAL_MS = 5000 + + export interface BotProfile { + id: string + app_id: string + name: string + icons: Record + deleted: boolean + updated: number + team_id: string + } + + export interface Replies { + messages: Message[] + has_more: boolean + ok: boolean + response_metadata: ResponseMetadata + } + + export interface Message { + bot_id?: string + client_msg_id?: string + type: string + text: string + user: string + ts: string + app_id?: string + blocks?: Record[] + reply_count?: number + subscribed?: boolean + last_read?: string + unread_count?: number + team?: string + thread_ts: string + parent_user_id?: string + bot_profile?: BotProfile + } + + export interface ResponseMetadata { + next_cursor: string + } + + export type Attachment = { + [key: string]: any + } + + export type Block = { + [key: string]: any + } + + /** + * Parameters for the Slack API's `chat.postMessage` method. + * + * @see {@link https://api.slack.com/methods/chat.postMessage} + */ + export type PostMessageParams = { + /** + * The formatted text of the message to be published. + */ + text: string + + /** + * Channel, private group, or IM channel to send the message to. Can be an encoded ID, or a name. + */ + channel?: string + + /** + * Provide another message's ts value to make this message a reply. Avoid using a reply's ts value; use its parent instead. + */ + thread_ts?: string + + /** + * A JSON-based array of structured attachments, presented as a URL-encoded string. + */ + attachments?: Attachment[] + + /** + * A JSON-based array of structured blocks, presented as a URL-encoded string. + */ + blocks?: Block[] + + /** + * Emoji to use as the icon for this message. Overrides icon_url. + */ + icon_emoji?: string + + /** + * URL to an image to use as the icon for this message. + */ + icon_url?: string + + /** + * If set to true, user group handles (to name just one example) will be linked in the message text. + */ + link_names?: boolean + + /** + * Change how messages are treated (default: 'none'). + */ + parse?: 'full' | 'none' + + /** + * Used in conjunction with thread_ts and indicates whether reply should be made visible to everyone in the channel or conversation. + */ + reply_broadcast?: boolean + + /** + * Pass true to enable unfurling of primarily text-based content. + */ + unfurl_links?: boolean + + /** + * Pass false to disable unfurling of media content. + */ + unfurl_media?: boolean + + /** + * Set your bot's user name. + */ + username?: string + } + + /** + * Parameters for the Slack API's `conversations.history` method. + * + * @see {@link https://api.slack.com/methods/conversations.history} + */ + export type ConversationHistoryParams = { + /** + * The conversation ID to fetch history for. + */ + channel: string + + /** + * Only messages after this Unix timestamp will be included in results (default: `0`). + */ + oldest?: string + + /** + * The cursor value used for pagination of results (default: first page). + */ + cursor?: string + + /** + * Only messages before this Unix timestamp will be included in results (default: now). + */ + latest?: string + + /** + * The maximum number of items to return (default: `100`). + */ + limit?: number + + /** + * Include messages with the oldest or latest timestamps in results. Ignored unless either timestamp is specified (default: `false`). + */ + inclusive?: boolean + + /** + * Return all metadata associated with the messages (default: `false`). + */ + include_all_metadata?: boolean + } + + /** + * Parameters for the Slack API's `conversations.replies` method. + * + * @see {@link https://api.slack.com/methods/conversations.replies} + */ + export type ConversationRepliesParams = { + /** + * The conversation ID to fetch the thread from. + */ + channel: string + + /** + * Unique identifier of either a thread’s parent message or a message in the thread. + * + * ### Notes + * + * - ts must be the timestamp of an existing message with 0 or more replies. + * - If there are no replies then just the single message referenced by ts will return - it is just an ordinary, unthreaded message. + */ + ts: string + + /** + * The cursor value used for pagination of results. + * Set this to the `next_cursor` attribute returned by a previous request's response_metadata. + */ + cursor?: string + + /** + * Only messages before this Unix timestamp will be included in results. + */ + latest?: string + + /** + * Only messages after this Unix timestamp will be included in results. + */ + oddest?: string + + /** + * The maximum number of items to return. + * Fewer than the requested number of items may be returned, even if the end of the users list hasn't been reached. + */ + limit?: number + + /** + * Include messages with the oldest or latest timestamps in results. Ignored unless either timestamp is specified. + */ + inclusive?: boolean + + /** + * Return all metadata associated with this message. + */ + include_thread_metadata?: boolean + } + + export type SendAndWaitOptions = { + /** + * The text of the message to send. + */ + text: string + + /** + * The ID of the channel to send the message to. + */ + channel?: string + + /** + * The timeout in milliseconds to wait for a reply before throwing an error. + */ + timeoutMs?: number + + /** + * The interval in milliseconds to poll for replies. + */ + intervalMs?: number + + /** + * A function to validate the reply message. If the function returns `true`, the reply is considered valid and the function will return the message. If the function returns `false`, the reply is considered invalid and the function will continue to wait for a reply until the timeout is reached. + */ + validate?: (message: Message) => boolean + + /** + * A stop signal from an [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController), which can be used to abort retrying. More specifically, when `AbortController.abort(reason)` is called, the function will throw an error with the `reason` argument as the error message. + */ + stopSignal?: AbortSignal + } +} + +/** + * Minimal Slack API client for sending and receiving Slack messages. + * + * @see https://api.slack.com/docs + */ +export class SlackClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly defaultChannel?: string + + constructor({ + apiKey = getEnv('SLACK_API_KEY'), + apiBaseUrl = slack.API_BASE_URL, + defaultChannel = getEnv('SLACK_DEFAULT_CHANNEL'), + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + defaultChannel?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'SlackClient missing required "apiKey" (defaults to "SLACK_API_KEY")' + ) + + super() + + this.defaultChannel = defaultChannel + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + headers: { + Authorization: `Bearer ${apiKey}` + } + }) + } + + /** + * Sends a message to a channel. + */ + @aiFunction({ + name: 'slack_send_message', + description: 'Sends a slack message to a slack channel', + inputSchema: z.object({ + text: z + .string() + .describe('Formatted text of the message to be published.'), + channel: z + .string() + .describe( + 'Channel, private group, or IM channel to send the message to. Can be an encoded ID, or a name.' + ) + }) + }) + public async sendMessage(options: slack.PostMessageParams) { + if (!options.channel && !this.defaultChannel) { + throw new Error('Error no channel specified') + } + + return this.ky + .post('chat.postMessage', { + json: { + channel: this.defaultChannel, + ...options + } + }) + .json() + } + + /** + * Fetches a conversation's history of messages and events. + */ + public async fetchConversationHistory( + options: slack.ConversationHistoryParams + ) { + return this.ky + .get('conversations.history', { + searchParams: options + }) + .json() + } + + /** + * Fetches replies to a message in a channel. + */ + protected async fetchReplies(options: slack.ConversationRepliesParams) { + return this.ky + .get('conversations.replies', { + searchParams: options + }) + .json() + } + + /** + * Returns a list of messages that were sent in a channel after a given + * timestamp both directly and in threads. + */ + private async fetchCandidates(channel: string, ts: string) { + const history = await this.fetchConversationHistory({ channel }) + const directReplies = await this.fetchReplies({ channel, ts }) + + let candidates: slack.Message[] = [] + + if (directReplies.ok) { + candidates = candidates.concat(directReplies.messages) + } + + if (history.ok) { + candidates = candidates.concat(history.messages) + } + + // Filter out older messages before the message was sent and drop bot messages: + candidates = candidates.filter( + (message) => message.ts > ts && !message.bot_id + ) + + // Sort by timestamp so that the most recent messages come first: + candidates.sort((a, b) => { + return Number.parseFloat(b.ts) - Number.parseFloat(a.ts) + }) + + return candidates + } + + /** + * Sends a message to a channel and waits for a reply to the message, which + * is returned if it passes validation. + */ + public async sendMessageAndWaitForReply({ + text, + channel = this.defaultChannel, + timeoutMs = slack.DEFAULT_TIMEOUT_MS, + intervalMs = slack.DEFAULT_INTERVAL_MS, + validate = () => true, + stopSignal + }: slack.SendAndWaitOptions) { + if (!channel) { + throw new Error('SlackClient missing required "channel"') + } + + let aborted = false + stopSignal?.addEventListener( + 'abort', + () => { + aborted = true + }, + { once: true } + ) + + const res = await this.sendMessage({ text, channel }) + + if (!res.ts) { + throw new Error('Missing ts in response') + } + + const start = Date.now() + let nUserMessages = 0 + + do { + if (aborted) { + const reason = stopSignal?.reason || 'Aborted waiting for reply' + + if (reason instanceof Error) { + throw reason + } else { + throw new TypeError(reason) + } + } + + const candidates = await this.fetchCandidates(channel, res.ts) + + if (candidates.length > 0) { + const candidate = candidates[0]! + + if (validate(candidate)) { + return candidate + } + + if (nUserMessages !== candidates.length) { + await this.sendMessage({ + text: `Invalid response: ${candidate.text}. Please try again following the instructions.`, + channel, + thread_ts: candidate.ts + }) + } + + nUserMessages = candidates.length + } + + await delay(intervalMs) + } while (Date.now() - start < timeoutMs) + + throw new TimeoutError('SlackClient timed out waiting for reply') + } +} From ff54a42efddee2e29be2f74f34cfb90d5353ea4a Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 00:27:30 -0500 Subject: [PATCH 74/81] feat: add twilio client --- readme.md | 3 +- src/services/index.ts | 1 + src/services/twilio-client.ts | 567 ++++++++++++++++++++++++++++++++++ 3 files changed, 570 insertions(+), 1 deletion(-) create mode 100644 src/services/twilio-client.ts diff --git a/readme.md b/readme.md index 6ed5fbc97..298d265ca 100644 --- a/readme.md +++ b/readme.md @@ -127,7 +127,8 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke | [Searxng](https://docs.searxng.org) | `SearxngClient` | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines). | | [SerpAPI](https://serpapi.com/search-api) | `SerpAPIClient` | Lightweight wrapper around SerpAPI for Google search. | | [Serper](https://serper.dev) | `SerperClient` | Lightweight wrapper around Serper for Google search. | -| [Slack](https://api.slack.com/docs) | `SlackClient` | Send and receive basic Slack messages. | +| [Slack](https://api.slack.com/docs) | `SlackClient` | Send and receive Slack messages. | +| [Twilio](https://www.twilio.com/docs/conversations/api) | `TwilioClient` | Twilio conversation API to send and receive SMS messages. | | [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | | [WeatherAPI](https://api.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | | [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries. | diff --git a/src/services/index.ts b/src/services/index.ts index 124793095..7918783a4 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -16,6 +16,7 @@ export * from './searxng-client.js' export * from './serpapi-client.js' export * from './serper-client.js' export * from './slack-client.js' +export * from './twilio-client.js' export * from './weather-client.js' export * from './wikipedia-client.js' export * from './wolfram-alpha-client.js' diff --git a/src/services/twilio-client.ts b/src/services/twilio-client.ts new file mode 100644 index 000000000..b8b618c3c --- /dev/null +++ b/src/services/twilio-client.ts @@ -0,0 +1,567 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { TimeoutError } from '../errors.js' +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, delay, getEnv } from '../utils.js' + +export namespace twilio { + export const CONVERSATION_API_BASE_URL = 'https://conversations.twilio.com/v1' + + export const DEFAULT_TIMEOUT_MS = 1_800_000 + export const DEFAULT_INTERVAL_MS = 5000 + export const DEFAULT_BOT_NAME = 'agentic' + + /** + * Twilio recommends keeping SMS messages to a length of 320 characters or less, so we'll use that as the maximum. + * + * @see {@link https://support.twilio.com/hc/en-us/articles/360033806753-Maximum-Message-Length-with-Twilio-Programmable-Messaging} + */ + export const SMS_LENGTH_SOFT_LIMIT = 320 + export const SMS_LENGTH_HARD_LIMIT = 1600 + + export interface Conversation { + unique_name?: string + date_updated: Date + friendly_name: string + timers: null + account_sid: string + url: string + state: string + date_created: Date + messaging_service_sid: string + sid: string + attributes: string + bindings: null + chat_service_sid: string + links: ConversationLinks + } + + export interface ConversationLinks { + participants: string + messages: string + webhooks: string + } + + export interface ConversationMessage { + body: string + index: number + author: string + date_updated: Date + media: null + participant_sid: string | null + conversation_sid: string + account_sid: string + delivery: null + url: string + date_created: Date + content_sid: string | null + sid: string + attributes: string + links: { + delivery_receipts: string + } + } + + export interface ConversationParticipant { + last_read_message_index: null + date_updated: Date + last_read_timestamp: null + conversation_sid: string + account_sid: string + url: string + date_created: Date + role_sid: string + sid: string + attributes: string + identity?: string + messaging_binding: ConversationMessagingBinding + } + + export interface ConversationMessagingBinding { + proxy_address: string + type: string + address: string + } + + export interface ConversationMessages { + messages: ConversationMessage[] + meta: { + page: number + page_size: number + first_page_url: string + previous_page_url: string | null + url: string + next_page_url: string | null + key: string + } + } + + /** + * Participant Conversation Resource. + * + * This interface represents a participant in a conversation, along with the conversation details. + */ + export interface ParticipantConversation { + /** The unique ID of the Account responsible for this conversation. */ + account_sid: string + + /** The unique ID of the Conversation Service this conversation belongs to. */ + chat_service_sid: string + + /** The unique ID of the Participant. */ + participant_sid: string + + /** The unique string that identifies the conversation participant as Conversation User. */ + participant_user_sid: string + + /** + * A unique string identifier for the conversation participant as Conversation User. + * This parameter is non-null if (and only if) the participant is using the Conversations SDK to communicate. + */ + participant_identity: string + + /** + * Information about how this participant exchanges messages with the conversation. + * A JSON parameter consisting of type and address fields of the participant. + */ + participant_messaging_binding: object + + /** The unique ID of the Conversation this Participant belongs to. */ + conversation_sid: string + + /** An application-defined string that uniquely identifies the Conversation resource. */ + conversation_unique_name: string + + /** The human-readable name of this conversation, limited to 256 characters. */ + conversation_friendly_name: string + + /** + * An optional string metadata field you can use to store any data you wish. + * The string value must contain structurally valid JSON if specified. + */ + conversation_attributes: string + + /** The date that this conversation was created, given in ISO 8601 format. */ + conversation_date_created: string + + /** The date that this conversation was last updated, given in ISO 8601 format. */ + conversation_date_updated: string + + /** Identity of the creator of this Conversation. */ + conversation_created_by: string + + /** The current state of this User Conversation. One of inactive, active or closed. */ + conversation_state: 'inactive' | 'active' | 'closed' + + /** Timer date values representing state update for this conversation. */ + conversation_timers: object + + /** Contains absolute URLs to access the participant and conversation of this conversation. */ + links: { participant: string; conversation: string } + } + + export type SendAndWaitOptions = { + /** + * The recipient's phone number in E.164 format (e.g. +14565551234). + */ + recipientPhoneNumber?: string + + /** + * The text of the message to send (or an array of strings to send as separate messages). + */ + text: string | string[] + + /** + * Friendly name of the conversation. + */ + name: string + + /** + * The timeout in milliseconds to wait for a reply before throwing an error. + */ + timeoutMs?: number + + /** + * The interval in milliseconds to poll for replies. + */ + intervalMs?: number + + /** + * A function to validate the reply message. If the function returns `true`, the reply is considered valid and the function will return the message. If the function returns `false`, the reply is considered invalid and the function will continue to wait for a reply until the timeout is reached. + */ + validate?: (message: ConversationMessage) => boolean + + /** + * A stop signal from an [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController), which can be used to abort retrying. More specifically, when `AbortController.abort(reason)` is called, the function will throw an error with the `reason` argument as the error message. + */ + stopSignal?: AbortSignal + } + + /** + * Chunks a string into an array of chunks. + * + * @param text - string to chunk + * @param maxLength - maximum length of each chunk + * + * @returns array of chunks + */ + export function chunkString(text: string, maxLength: number): string[] { + const words = text.split(' ') + const chunks: string[] = [] + let chunk = '' + + for (const word of words) { + if (word.length > maxLength) { + // Truncate the word if it's too long and indicate that it was truncated: + chunks.push(word.slice(0, Math.max(0, maxLength - 3)) + '...') + } else if ((chunk + ' ' + word).length > maxLength) { + chunks.push(chunk.trim()) + chunk = word + } else { + chunk += (chunk ? ' ' : '') + word + } + } + + if (chunk) { + chunks.push(chunk.trim()) + } + + return chunks + } + + /** + * Chunks an array of strings into an array of chunks while preserving + * existing sections. + * + * @param textSections - array of strings to chunk + * @param maxLength - maximum length of each chunk + * + * @returns array of chunks + */ + export function chunkMultipleStrings( + textSections: string[], + maxLength: number + ): string[] { + return textSections.flatMap((section) => chunkString(section, maxLength)) + } +} + +/** + * A client for interacting with the Twilio Conversations API to send automated + * messages and wait for replies. + * + * @see {@link https://www.twilio.com/docs/conversations/api} + */ +export class TwilioClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly phoneNumber: string + protected readonly botName: string + protected readonly defaultRecipientPhoneNumber?: string + + constructor({ + accountSid = getEnv('TWILIO_ACCOUNT_SID'), + authToken = getEnv('TWILIO_AUTH_TOKEN'), + phoneNumber = getEnv('TWILIO_PHONE_NUMBER'), + defaultRecipientPhoneNumber = getEnv( + 'TWILIO_DEFAULT_RECIPIENT_PHONE_NUMBER' + ), + apiBaseUrl = twilio.CONVERSATION_API_BASE_URL, + botName = twilio.DEFAULT_BOT_NAME, + ky = defaultKy + }: { + accountSid?: string + authToken?: string + phoneNumber?: string + defaultRecipientPhoneNumber?: string + apiBaseUrl?: string + botName?: string + ky?: KyInstance + } = {}) { + assert( + accountSid, + 'TwilioClient missing required "accountSid" (defaults to "TWILIO_ACCOUNT_SID")' + ) + assert( + authToken, + 'TwilioClient missing required "authToken" (defaults to "TWILIO_AUTH_TOKEN")' + ) + assert( + phoneNumber, + 'TwilioClient missing required "phoneNumber" (defaults to "TWILIO_PHONE_NUMBER")' + ) + super() + + if (defaultRecipientPhoneNumber) { + this.defaultRecipientPhoneNumber = defaultRecipientPhoneNumber + } + + this.botName = botName + this.phoneNumber = phoneNumber + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + headers: { + Authorization: + 'Basic ' + + Buffer.from(`${accountSid}:${authToken}`).toString('base64'), + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + } + + /** + * Deletes a conversation and all its messages. + */ + async deleteConversation(conversationSid: string) { + return this.ky.delete(`Conversations/${conversationSid}`) + } + + /** + * Removes a participant from a conversation. + */ + async removeParticipant({ + conversationSid, + participantSid + }: { + conversationSid: string + participantSid: string + }) { + return this.ky.delete( + `Conversations/${conversationSid}/Participants/${participantSid}` + ) + } + + /** + * Fetches all conversations a participant as identified by their phone number is a part of. + */ + async findParticipantConversations(participantPhoneNumber: string) { + const encodedPhoneNumber = encodeURIComponent(participantPhoneNumber) + return this.ky + .get(`ParticipantConversations?Address=${encodedPhoneNumber}`) + .json<{ conversations: twilio.ParticipantConversation[] }>() + } + + /** + * Creates a new conversation. + */ + async createConversation(friendlyName: string) { + const params = new URLSearchParams() + params.set('FriendlyName', friendlyName) + return this.ky + .post('Conversations', { + body: params + }) + .json() + } + + /** + * Adds a participant to a conversation. + */ + async addParticipant({ + conversationSid, + recipientPhoneNumber + }: { + conversationSid: string + recipientPhoneNumber: string + }) { + const params = new URLSearchParams() + params.set('MessagingBinding.Address', recipientPhoneNumber) + params.set('MessagingBinding.ProxyAddress', this.phoneNumber) + return this.ky + .post(`Conversations/${conversationSid}/Participants`, { + body: params + }) + .json() + } + + /** + * Chunks a long text message into smaller parts and sends them as separate messages. + */ + async sendTextWithChunking({ + conversationSid, + text + }: { + conversationSid: string + text: string | string[] + maxChunkLength?: number + }) { + let chunks + if (Array.isArray(text)) { + chunks = twilio.chunkMultipleStrings(text, twilio.SMS_LENGTH_SOFT_LIMIT) + } else { + chunks = twilio.chunkString(text, twilio.SMS_LENGTH_SOFT_LIMIT) + } + + const out: twilio.ConversationMessage[] = [] + for (const chunk of chunks) { + const sent = await this.sendMessage({ + conversationSid, + text: chunk + }) + out.push(sent) + } + + return out + } + + /** + * Posts a message to a conversation. + */ + @aiFunction({ + name: 'twilio_send_message', + description: + 'Sends an text SMS message via the Twilio Conversation API to a specific conversation.', + inputSchema: z.object({ + text: z + .string() + .describe( + 'Text of the SMS content to sent. Must be brief as SMS has strict character limits.' + ), + conversationSid: z + .string() + .describe('ID of the Twilio Conversation to the send the emssage to.') + }) + }) + async sendMessage({ + conversationSid, + text + }: { + conversationSid: string + text: string + }) { + // Truncate the text if it exceeds the hard limit and add an ellipsis: + if (text.length > twilio.SMS_LENGTH_HARD_LIMIT) { + text = + text.slice(0, Math.max(0, twilio.SMS_LENGTH_HARD_LIMIT - 3)) + '...' + } + + const params = new URLSearchParams() + params.set('Body', text) + params.set('Author', this.botName) + return this.ky + .post(`Conversations/${conversationSid}/Messages`, { + body: params + }) + .json() + } + + /** + * Fetches all messages in a conversation. + */ + @aiFunction({ + name: 'twilio_get_messages', + description: + 'Retrieves all SMS messages contained within a specific Twilio Conversation.', + inputSchema: z.object({ + conversationSid: z + .string() + .describe( + 'ID of the Twilio Conversation to the retrieve the messages for.' + ) + }) + }) + async fetchMessages( + conversationSidOrOptions: string | { conversationSid: string } + ) { + const conversationSid = + typeof conversationSidOrOptions === 'string' + ? conversationSidOrOptions + : conversationSidOrOptions.conversationSid + + return this.ky + .get(`Conversations/${conversationSid}/Messages`) + .json() + } + + /** + * Sends a SMS to a recipient and waits for a reply to the message, which is returned if it passes validation. + */ + public async sendAndWaitForReply({ + text, + name, + recipientPhoneNumber = this.defaultRecipientPhoneNumber, + timeoutMs = twilio.DEFAULT_TIMEOUT_MS, + intervalMs = twilio.DEFAULT_INTERVAL_MS, + validate = () => true, + stopSignal + }: twilio.SendAndWaitOptions) { + if (!recipientPhoneNumber) { + throw new Error( + 'TwilioClient error missing required "recipientPhoneNumber"' + ) + } + + let aborted = false + stopSignal?.addEventListener( + 'abort', + () => { + aborted = true + }, + { once: true } + ) + + const { sid: conversationSid } = await this.createConversation(name) + + // Find and remove participant from conversation they are currently in, if any: + const { conversations } = + await this.findParticipantConversations(recipientPhoneNumber) + + for (const conversation of conversations) { + await this.removeParticipant({ + conversationSid: conversation.conversation_sid, + participantSid: conversation.participant_sid + }) + } + + const { sid: participantSid } = await this.addParticipant({ + conversationSid, + recipientPhoneNumber + }) + await this.sendTextWithChunking({ conversationSid, text }) + + const start = Date.now() + let nUserMessages = 0 + + do { + if (aborted) { + await this.removeParticipant({ conversationSid, participantSid }) + const reason = stopSignal?.reason || 'Aborted waiting for reply' + + if (reason instanceof Error) { + throw reason + } else { + throw new TypeError(reason) + } + } + + const response = await this.fetchMessages(conversationSid) + const candidates = response.messages.filter( + (message) => message.author !== this.botName + ) + + if (candidates.length > 0) { + const candidate = candidates.at(-1)! + + if (candidate && validate(candidate)) { + await this.removeParticipant({ conversationSid, participantSid }) + return candidate + } + + if (nUserMessages !== candidates.length) { + await this.sendMessage({ + text: `Invalid response: ${candidate.body}. Please try again with a valid response format.`, + conversationSid + }) + } + + nUserMessages = candidates.length + } + + await delay(intervalMs) + } while (Date.now() - start < timeoutMs) + + await this.removeParticipant({ conversationSid, participantSid }) + throw new TimeoutError('Twilio timeout waiting for reply') + } +} From 074e2ef07104a42ab9e73c979a225d166be1bbc4 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 00:29:30 -0500 Subject: [PATCH 75/81] =?UTF-8?q?=F0=9F=92=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 298d265ca..f101ca984 100644 --- a/readme.md +++ b/readme.md @@ -27,7 +27,7 @@ import { WeatherClient } from '@agentic/stdlib' const weather = new WeatherClient() // (requires `WEATHER_API_KEY` env var) -const result = await clearbit.getCurrentWeather({ +const result = await weather.getCurrentWeather({ q: 'San Francisco' }) From 1961a26b4bf3b8116b70f23142f2e3c4427cdcb2 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 00:40:38 -0500 Subject: [PATCH 76/81] =?UTF-8?q?=F0=9F=A5=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 15 +++++++-------- src/services/weather-client.ts | 7 ++++++- src/tools/e2b.ts | 5 +++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/readme.md b/readme.md index f101ca984..73ca460ec 100644 --- a/readme.md +++ b/readme.md @@ -3,7 +3,7 @@

- AI agent stdlib that works with any AI SDK and LLM + AI agent stdlib that works with any TypeScript AI SDK and LLM

@@ -18,9 +18,9 @@ > [!WARNING] > TODO: this project is not published yet and is an active WIP. -The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based apps** that work with all of the major AI SDKs (LangChain, LlamaIndex, Vercel AI SDK, OpenAI SDK, etc). +The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based apps** and that work with all of the major AI SDKs (LangChain, LlamaIndex, Vercel AI SDK, OpenAI SDK, etc). -For a simple example, stdlib clients like `WeatherClient` can be used normally as a fully-typed TS client: +For example, stdlib clients like `WeatherClient` can be used normally as a fully-typed TS client: ```ts import { WeatherClient } from '@agentic/stdlib' @@ -30,7 +30,6 @@ const weather = new WeatherClient() // (requires `WEATHER_API_KEY` env var) const result = await weather.getCurrentWeather({ q: 'San Francisco' }) - console.log(result) ``` @@ -111,9 +110,11 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke | Service | Client | Description | | ------------------------------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) | `BingClient` | Bing web search. | +| [Calculator](https://github.com/silentmatt/expr-eval) | `calculator` | Basic calculator for simple mathematical expressions. | | [Clearbit](https://dashboard.clearbit.com/docs) | `ClearbitClient` | Resolving and enriching people and company datae. | | [Dexa](https://dexa.ai) | `DexaClient` | Answers questions from the world's best podcasters. | | [Diffbot](https://docs.diffbot.com) | `DiffbotClient` | Web page classification and scraping; person and company data enrichment. | +| [E2B](https://e2b.dev) | `e2b` | Hosted Python code intrepreter sandbox which is really useful for data analysis, flexible code execution, and advanced reasoning on-the-fly. | | [Exa](https://docs.exa.ai) | `ExaClient` | Web search tailored for LLMs. | | [Firecrawl](https://www.firecrawl.dev) | `FirecrawlClient` | Website scraping and sanitization. | | [Midjourney](https://www.imagineapi.dev) | `MidjourneyClient` | Unofficial Midjourney client for generative images. | @@ -130,14 +131,12 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke | [Slack](https://api.slack.com/docs) | `SlackClient` | Send and receive Slack messages. | | [Twilio](https://www.twilio.com/docs/conversations/api) | `TwilioClient` | Twilio conversation API to send and receive SMS messages. | | [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | -| [WeatherAPI](https://api.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | +| [WeatherAPI](https://www.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | | [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries. | | [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation) | `WolframAlphaClient` | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions. | -## Non-service Tools +## Compound Tools -- calculator -- e2b (code interpreter) - search and scrape ## AI SDKs diff --git a/src/services/weather-client.ts b/src/services/weather-client.ts index c328fae5f..cde8dbd58 100644 --- a/src/services/weather-client.ts +++ b/src/services/weather-client.ts @@ -74,6 +74,11 @@ export namespace weatherapi { } } +/** + * Simple Weather API client for accessing weather data based on location. + * + * @see https://www.weatherapi.com + */ export class WeatherClient extends AIFunctionsProvider { protected readonly ky: KyInstance protected readonly apiKey: string @@ -107,7 +112,7 @@ export class WeatherClient extends AIFunctionsProvider { q: z .string() .describe( - 'Location to get the weather for. May be a city name, zipcode, IP address, or lat/lng coordinates. Example: "London"' + 'Location to get the weather for. Can be a city name, zipcode, IP address, or lat/lng coordinates. Example: "London"' ) }) }) diff --git a/src/tools/e2b.ts b/src/tools/e2b.ts index 86e38fc6b..f4a20a15f 100644 --- a/src/tools/e2b.ts +++ b/src/tools/e2b.ts @@ -4,6 +4,11 @@ import { z } from 'zod' import { createAIFunction } from '../create-ai-function.js' import { getEnv } from '../utils.js' +/** + * E2B Python code interpreter sandbox. + * + * @see https://e2b.dev + */ export const e2b = createAIFunction( { name: 'execute_python', From f7d6fae425f07e15387b38c8d1f481277bbddbb2 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 02:22:26 -0500 Subject: [PATCH 77/81] feat: add tavily client --- bin/scratch.ts | 17 +++- pnpm-lock.yaml | 78 +++++---------- readme.md | 1 + src/services/index.ts | 1 + src/services/serpapi-client.ts | 2 +- src/services/serper-client.ts | 2 +- src/services/tavily-client.ts | 172 +++++++++++++++++++++++++++++++++ 7 files changed, 210 insertions(+), 63 deletions(-) create mode 100644 src/services/tavily-client.ts diff --git a/bin/scratch.ts b/bin/scratch.ts index 3252212c2..3d447c09f 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -2,6 +2,7 @@ import 'dotenv/config' import restoreCursor from 'restore-cursor' +import { TavilyClient } from 'tavily' // import { SearxngClient } from '../src/services/searxng-client.js' // import { ClearbitClient } from '../src/index.js' @@ -17,7 +18,7 @@ import restoreCursor from 'restore-cursor' // TwitterClient // } from '../src/services/twitter/index.js' // import { MidjourneyClient } from '../src/index.js' -import { BingClient } from '../src/index.js' +// import { BingClient } from '../src/index.js' /** * Scratch pad for testing. @@ -105,10 +106,16 @@ async function main() { // ) // console.log(JSON.stringify(res, null, 2)) - const bing = new BingClient() - const res = await bing.search({ - q: 'world cup 2024 freestyle wrestling news' - }) + // const bing = new BingClient() + // const res = await bing.search({ + // q: 'world cup 2024 freestyle wrestling news' + // }) + // console.log(JSON.stringify(res, null, 2)) + + const tavily = new TavilyClient() + const res = await tavily.search( + 'when do experts predict that OpenAI will release GPT-5?' + ) console.log(JSON.stringify(res, null, 2)) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7cf779314..164f38206 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5858,7 +5858,7 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/core': 3.588.0 '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -5904,7 +5904,7 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/core': 3.588.0 '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -5951,9 +5951,9 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -6035,58 +6035,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.590.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/middleware-host-header': 3.577.0 - '@aws-sdk/middleware-logger': 3.577.0 - '@aws-sdk/middleware-recursion-detection': 3.577.0 - '@aws-sdk/middleware-user-agent': 3.587.0 - '@aws-sdk/region-config-resolver': 3.587.0 - '@aws-sdk/types': 3.577.0 - '@aws-sdk/util-endpoints': 3.587.0 - '@aws-sdk/util-user-agent-browser': 3.577.0 - '@aws-sdk/util-user-agent-node': 3.587.0 - '@smithy/config-resolver': 3.0.1 - '@smithy/core': 2.2.0 - '@smithy/fetch-http-handler': 3.0.1 - '@smithy/hash-node': 3.0.0 - '@smithy/invalid-dependency': 3.0.0 - '@smithy/middleware-content-length': 3.0.0 - '@smithy/middleware-endpoint': 3.0.1 - '@smithy/middleware-retry': 3.0.3 - '@smithy/middleware-serde': 3.0.0 - '@smithy/middleware-stack': 3.0.0 - '@smithy/node-config-provider': 3.1.0 - '@smithy/node-http-handler': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.1.1 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.3 - '@smithy/util-defaults-mode-node': 3.0.3 - '@smithy/util-endpoints': 2.0.1 - '@smithy/util-middleware': 3.0.0 - '@smithy/util-retry': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.590.0 '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -6172,7 +6127,7 @@ snapshots: '@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 '@smithy/property-provider': 3.1.0 @@ -6182,10 +6137,11 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt + optional: true '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': dependencies: - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0 @@ -6208,7 +6164,7 @@ snapshots: '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 '@smithy/property-provider': 3.1.0 @@ -6219,6 +6175,7 @@ snapshots: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' - aws-crt + optional: true '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': dependencies: @@ -6260,6 +6217,15 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + optional: true + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0)': dependencies: '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) @@ -6276,8 +6242,8 @@ snapshots: '@aws-sdk/credential-provider-cognito-identity': 3.590.0 '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) @@ -9931,7 +9897,7 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@notionhq/client': 2.2.15(encoding@0.1.13) '@pinecone-database/pinecone': 2.2.2 assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) diff --git a/readme.md b/readme.md index 73ca460ec..64cfac835 100644 --- a/readme.md +++ b/readme.md @@ -129,6 +129,7 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke | [SerpAPI](https://serpapi.com/search-api) | `SerpAPIClient` | Lightweight wrapper around SerpAPI for Google search. | | [Serper](https://serper.dev) | `SerperClient` | Lightweight wrapper around Serper for Google search. | | [Slack](https://api.slack.com/docs) | `SlackClient` | Send and receive Slack messages. | +| [Tavily](https://tavily.com) | `TavilyClient` | Web search API tailored for LLMs. 🔥 | | [Twilio](https://www.twilio.com/docs/conversations/api) | `TwilioClient` | Twilio conversation API to send and receive SMS messages. | | [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | | [WeatherAPI](https://www.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | diff --git a/src/services/index.ts b/src/services/index.ts index 7918783a4..ade608615 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -16,6 +16,7 @@ export * from './searxng-client.js' export * from './serpapi-client.js' export * from './serper-client.js' export * from './slack-client.js' +export * from './tavily-client.js' export * from './twilio-client.js' export * from './weather-client.js' export * from './wikipedia-client.js' diff --git a/src/services/serpapi-client.ts b/src/services/serpapi-client.ts index 4867f6b41..19af9dae8 100644 --- a/src/services/serpapi-client.ts +++ b/src/services/serpapi-client.ts @@ -667,7 +667,7 @@ export class SerpAPIClient extends AIFunctionsProvider { @aiFunction({ name: 'serpapi_google_search', description: - 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', + 'Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.', inputSchema: z.object({ q: z.string().describe('search query'), num: z diff --git a/src/services/serper-client.ts b/src/services/serper-client.ts index 4ad44ccbf..f7e6d12b5 100644 --- a/src/services/serper-client.ts +++ b/src/services/serper-client.ts @@ -247,7 +247,7 @@ export class SerperClient extends AIFunctionsProvider { @aiFunction({ name: 'serper_google_search', description: - 'Uses Google Search to return the most relevant web pages for a given query. Can also be used to find up-to-date news and information about many topics.', + 'Uses Google Search to return the most relevant web pages for a given query. Useful for finding up-to-date news and information about any topic.', inputSchema: serper.GeneralSearchSchema.pick({ q: true, num: true, diff --git a/src/services/tavily-client.ts b/src/services/tavily-client.ts new file mode 100644 index 000000000..83a4e8bad --- /dev/null +++ b/src/services/tavily-client.ts @@ -0,0 +1,172 @@ +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { aiFunction, AIFunctionsProvider } from '../fns.js' +import { assert, getEnv, pruneNullOrUndefined } from '../utils.js' + +export namespace tavily { + export const API_BASE_URL = 'https://api.tavily.com' + + export interface SearchOptions { + /** Search query. (required) */ + query: string + + /** The depth of the search. It can be basic or advanced. Default is basic for quick results and advanced for indepth high quality results but longer response time. Advanced calls equals 2 requests. */ + search_depth?: 'basic' | 'advanced' + + /** Include a synthesized answer in the search results. Default is `false`. */ + include_answer?: boolean + + /** Include a list of query related images in the response. Default is `false`. */ + include_images?: boolean + + /** Include raw content in the search results. Default is `false`. */ + include_raw_content?: boolean + + /** The number of maximum search results to return. Default is `5`. */ + max_results?: number + + /** A list of domains to specifically include in the search results. Default is `undefined`, which includes all domains. */ + include_domains?: string[] + + /** A list of domains to specifically exclude from the search results. Default is `undefined`, which doesn't exclude any domains. */ + exclude_domains?: string[] + } + + export interface SearchResponse { + /** The search query. */ + query: string + + /** A list of sorted search results ranked by relevancy. */ + results: SearchResult[] + + /** The answer to your search query. */ + answer?: string + + /** A list of query related image urls. */ + images?: string[] + + /** A list of suggested research follow up questions related to original query. */ + follow_up_questions?: string[] + + /** How long it took to generate a response. */ + response_time: string + } + + export interface SearchResult { + /** The url of the search result. */ + url: string + + /** The title of the search result page. */ + title: string + + /** + * The most query related content from the scraped url. We use proprietary AI and algorithms to extract only the most relevant content from each url, to optimize for context quality and size. + */ + content: string + + /** The parsed and cleaned HTML of the site. For now includes parsed text only. */ + raw_content?: string + + /** The relevance score of the search result. */ + score: string + } +} + +/** + * Tavily provides a web search API tailored for LLMs. + * + * @see https://tavily.com + */ +export class TavilyClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('TAVILY_API_KEY'), + apiBaseUrl = tavily.API_BASE_URL, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'TavilyClient missing required "apiKey" (defaults to "TAVILY_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl + }) + } + + /** + * Searches the web for pages relevant to the given query and summarizes the results. + */ + @aiFunction({ + name: 'tavily_web_search', + description: + 'Searches the web to find the most relevant pages for a given query and summarizes the results. Very useful for finding up-to-date news and information about any topic.', + inputSchema: z.object({ + query: z + .string() + .describe('The query to search for. Accepts any Google search query.'), + search_depth: z + .enum(['basic', 'advanced']) + .optional() + .describe( + 'How deep of a search to perform. Use "basic" for quick results and "advanced" for slower, in-depth results.' + ), + include_answer: z + .boolean() + .optional() + .describe( + 'Whether or not to include an answer summary in the results.' + ), + include_images: z + .boolean() + .optional() + .describe('Whether or not to include images in the results.'), + max_results: z + .number() + .int() + .positive() + .default(5) + .optional() + .describe('Max number of search results to return.') + // include_domains: z + // .array(z.string()) + // .optional() + // .describe( + // 'List of domains to specifically include in the search results.' + // ), + // exclude_domains: z + // .array(z.string()) + // .optional() + // .describe( + // 'List of domains to specifically exclude from the search results.' + // ) + }) + }) + async search(queryOrOpts: string | tavily.SearchOptions) { + const options = + typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts + + const res = await this.ky + .post('search', { + json: { + ...options, + api_key: this.apiKey + } + }) + .json() + + return pruneNullOrUndefined(res).results?.map(pruneNullOrUndefined) + } +} From 594c8a0053d8026f5106bf58a38d9b5777a4f303 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 02:30:28 -0500 Subject: [PATCH 78/81] fix: tavity output bug --- bin/scratch.ts | 9 +++++---- src/services/tavily-client.ts | 5 ++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/bin/scratch.ts b/bin/scratch.ts index 3d447c09f..2d503e86f 100644 --- a/bin/scratch.ts +++ b/bin/scratch.ts @@ -2,7 +2,6 @@ import 'dotenv/config' import restoreCursor from 'restore-cursor' -import { TavilyClient } from 'tavily' // import { SearxngClient } from '../src/services/searxng-client.js' // import { ClearbitClient } from '../src/index.js' @@ -19,6 +18,7 @@ import { TavilyClient } from 'tavily' // } from '../src/services/twitter/index.js' // import { MidjourneyClient } from '../src/index.js' // import { BingClient } from '../src/index.js' +import { TavilyClient } from '../src/index.js' /** * Scratch pad for testing. @@ -113,9 +113,10 @@ async function main() { // console.log(JSON.stringify(res, null, 2)) const tavily = new TavilyClient() - const res = await tavily.search( - 'when do experts predict that OpenAI will release GPT-5?' - ) + const res = await tavily.search({ + query: 'when do experts predict that OpenAI will release GPT-5?', + include_answer: true + }) console.log(JSON.stringify(res, null, 2)) } diff --git a/src/services/tavily-client.ts b/src/services/tavily-client.ts index 83a4e8bad..021707e33 100644 --- a/src/services/tavily-client.ts +++ b/src/services/tavily-client.ts @@ -167,6 +167,9 @@ export class TavilyClient extends AIFunctionsProvider { }) .json() - return pruneNullOrUndefined(res).results?.map(pruneNullOrUndefined) + return pruneNullOrUndefined({ + ...res, + results: res.results?.map(pruneNullOrUndefined) + }) } } From efa568f54d2f756b4934d9d5ced3295df6f3dece Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Thu, 6 Jun 2024 18:55:19 -0500 Subject: [PATCH 79/81] =?UTF-8?q?=F0=9F=92=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 24 +++++++++++++++--------- src/services/tavily-client.ts | 15 +++++++++++++-- src/tools/search-and-crawl.ts | 5 ++++- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/readme.md b/readme.md index 64cfac835..0868f1b27 100644 --- a/readme.md +++ b/readme.md @@ -3,7 +3,7 @@

- AI agent stdlib that works with any TypeScript AI SDK and LLM + AI agent stdlib that works with any LLM and TypeScript AI SDK

@@ -15,12 +15,12 @@ # Agentic -> [!WARNING] +> [!WARNING] > TODO: this project is not published yet and is an active WIP. The goal of this project is to create a **set of standard AI functions / tools** which are **optimized for both normal TS-usage as well as LLM-based apps** and that work with all of the major AI SDKs (LangChain, LlamaIndex, Vercel AI SDK, OpenAI SDK, etc). -For example, stdlib clients like `WeatherClient` can be used normally as a fully-typed TS client: +For example, stdlib clients like `WeatherClient` can be used as normal TS classes: ```ts import { WeatherClient } from '@agentic/stdlib' @@ -33,9 +33,9 @@ const result = await weather.getCurrentWeather({ console.log(result) ``` -Or you can use this same function an LLM-based tool which works across all of the major AI SDKs via adaptors. +Or you can use them as LLM-based tools where the LLM decides when and how to invoke the underlying functions for you. -Here's an example using [Vercel's AI SDK](https://github.com/vercel/ai): +This works across all of the major AI SDKs via adaptors. Here's an example using [Vercel's AI SDK](https://github.com/vercel/ai): ```ts // sdk-specific imports @@ -50,7 +50,7 @@ const weather = new WeatherClient() const result = await generateText({ model: openai('gpt-4o'), - // this is the key line which uses the ai-sdk adaptor + // this is the key line which uses the `@agentic/stdlib/ai-sdk` adaptor tools: createAISDKTools(weather), toolChoice: 'required', prompt: 'What is the weather in San Francisco?' @@ -59,7 +59,7 @@ const result = await generateText({ console.log(result.toolResults[0]) ``` -You can use all of our thoroughly tested stdlib AI functions with your favorite AI SDK – without having to write any glue code! +You can use our standard library of thoroughly tested AI functions with your favorite AI SDK – without having to write any glue code! Here's a slightly more complex example which uses multiple clients and selects a subset of their functions using the `AIFunctionSet.pick` method: @@ -72,6 +72,7 @@ import { createDexterFunctions } from '@agentic/stdlib/dexter' import { PerigonClient, SerperClient } from '@agentic/stdlib' async function main() { + // Perigon is a news API and Serper is a Google search API const perigon = new PerigonClient() const serper = new SerperClient() @@ -131,14 +132,16 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke | [Slack](https://api.slack.com/docs) | `SlackClient` | Send and receive Slack messages. | | [Tavily](https://tavily.com) | `TavilyClient` | Web search API tailored for LLMs. 🔥 | | [Twilio](https://www.twilio.com/docs/conversations/api) | `TwilioClient` | Twilio conversation API to send and receive SMS messages. | -| [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. | +| [Twitter](https://developer.x.com/en/docs/twitter-api) | `TwitterClient` | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. Uses [Nango](https://www.nango.dev) for OAuth support. | | [WeatherAPI](https://www.weatherapi.com) | `WeatherClient` | Basic access to current weather data based on location. | | [Wikipedia](https://www.mediawiki.org/wiki/API) | `WikipediaClient` | Wikipedia page search and summaries. | | [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation) | `WolframAlphaClient` | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions. | +Note that many of these clients expose multiple AI functions. + ## Compound Tools -- search and scrape +- `SearchAndCrawl` ## AI SDKs @@ -161,6 +164,7 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke - clients should use `ky` and `zod` where possible - clients should have a strongly-typed TS DX - clients should expose select methods via the `@aiFunction(...)` decorator + - `inputSchema` zod schemas should be as minimal as possible with descriptions prompt engineered specifically for use with LLMs - clients and AIFunctions should be composable via `AIFunctionSet` - clients should work with all major TS AI SDKs - SDK adaptors should be as lightweight as possible and be optional peer dependencies of `@agentic/stdlib` @@ -171,7 +175,9 @@ All heavy third-party imports are isolated as _optional peer dependencies_ to ke - sdks - modelfusion - services + - [phantombuster](https://phantombuster.com) - perplexity + - valtown - replicate - huggingface - [skyvern](https://github.com/Skyvern-AI/skyvern) diff --git a/src/services/tavily-client.ts b/src/services/tavily-client.ts index 021707e33..957747575 100644 --- a/src/services/tavily-client.ts +++ b/src/services/tavily-client.ts @@ -1,12 +1,19 @@ import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' import { z } from 'zod' import { aiFunction, AIFunctionsProvider } from '../fns.js' -import { assert, getEnv, pruneNullOrUndefined } from '../utils.js' +import { assert, getEnv, pruneNullOrUndefined, throttleKy } from '../utils.js' export namespace tavily { export const API_BASE_URL = 'https://api.tavily.com' + // Allow up to 20 requests per minute by default. + export const throttle = pThrottle({ + limit: 20, + interval: 60 * 1000 + }) + export interface SearchOptions { /** Search query. (required) */ query: string @@ -86,10 +93,12 @@ export class TavilyClient extends AIFunctionsProvider { constructor({ apiKey = getEnv('TAVILY_API_KEY'), apiBaseUrl = tavily.API_BASE_URL, + throttle = true, ky = defaultKy }: { apiKey?: string apiBaseUrl?: string + throttle?: boolean ky?: KyInstance } = {}) { assert( @@ -101,7 +110,9 @@ export class TavilyClient extends AIFunctionsProvider { this.apiKey = apiKey this.apiBaseUrl = apiBaseUrl - this.ky = ky.extend({ + const throttledKy = throttle ? throttleKy(ky, tavily.throttle) : ky + + this.ky = throttledKy.extend({ prefixUrl: this.apiBaseUrl }) } diff --git a/src/tools/search-and-crawl.ts b/src/tools/search-and-crawl.ts index 8c29e473e..db5866ad4 100644 --- a/src/tools/search-and-crawl.ts +++ b/src/tools/search-and-crawl.ts @@ -7,6 +7,9 @@ import { SerpAPIClient } from '../services/serpapi-client.js' import { isValidCrawlableUrl, normalizeUrl } from '../url-utils.js' import { omit, pick } from '../utils.js' +// TODO: allow `search` tool to support other search clients +// (e.g. Bing, Exa, Searxng, Serper, Tavily) + export class SearchAndCrawl extends AIFunctionsProvider { readonly serpapi: SerpAPIClient readonly diffbot: DiffbotClient @@ -21,7 +24,7 @@ export class SearchAndCrawl extends AIFunctionsProvider { @aiFunction({ name: 'search_and_crawl', description: - 'Uses Google to search the web, crawls the results, and then summarizes the most relevant results.', + 'Uses Google to search the web, crawls the results, and then summarizes the most relevant results. Useful for creating in-depth summaries of topics along with sources.', inputSchema: z.object({ query: z.string().describe('search query') }) From 2ff3065b473f7a4f712d74b10ff6a832508737d7 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 7 Jun 2024 00:18:06 -0500 Subject: [PATCH 80/81] feat: add browserbase example and update deps --- examples/ai-sdk/browserbase.ts | 26 + package.json | 21 +- pnpm-lock.yaml | 1895 ++++++++++++++++++++++++++++---- readme.md | 17 +- src/fns.ts | 30 +- src/symbol-polyfill.ts | 29 - src/utils.ts | 2 +- 7 files changed, 1732 insertions(+), 288 deletions(-) create mode 100644 examples/ai-sdk/browserbase.ts delete mode 100644 src/symbol-polyfill.ts diff --git a/examples/ai-sdk/browserbase.ts b/examples/ai-sdk/browserbase.ts new file mode 100644 index 000000000..e3faba4f2 --- /dev/null +++ b/examples/ai-sdk/browserbase.ts @@ -0,0 +1,26 @@ +#!/usr/bin/env node +import 'dotenv/config' + +import { openai } from '@ai-sdk/openai' +import { Browserbase, BrowserbaseAISDK } from '@browserbasehq/sdk' +import { generateText } from 'ai' + +async function main() { + const browserbase = new Browserbase() + + const browserTool = BrowserbaseAISDK(browserbase, { textContent: true }) + console.log(browserTool.parameters) + + const result = await generateText({ + model: openai('gpt-4o'), + tools: { browserTool }, + toolChoice: 'required', + temperature: 0, + system: 'You are a helpful assistant. Be as concise as possible.', + prompt: 'What is the weather in San Francisco?' + }) + + console.log(result.toolResults[0]) +} + +await main() diff --git a/package.json b/package.json index 317a0fa3c..650ead213 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ ], "scripts": { "preinstall": "npx only-allow pnpm", - "build": "tsc", + "build": "tsup", "clean": "del dist", "prebuild": "run-s clean", "predev": "run-s clean", @@ -83,7 +83,7 @@ "test:unit": "vitest run" }, "dependencies": { - "@nangohq/node": "^0.39.32", + "@nangohq/node": "^0.39.33", "dedent": "^1.5.3", "delay": "^6.0.0", "hash-object": "^5.0.1", @@ -94,36 +94,37 @@ "p-map": "^7.0.2", "p-throttle": "^6.1.0", "quick-lru": "^7.0.0", - "type-fest": "^4.18.3", + "type-fest": "^4.19.0", "zod": "^3.23.3", "zod-to-json-schema": "^3.23.0" }, "devDependencies": { + "@browserbasehq/sdk": "^1.2.1", "@dexaai/dexter": "^2.0.3", "@e2b/code-interpreter": "^0.0.7", "@fisch0920/eslint-config": "^1.3.3", "@genkit-ai/ai": "^0.5.2", "@instructor-ai/instructor": "^1.3.0", - "@langchain/core": "^0.2.5", + "@langchain/core": "^0.2.6", "@total-typescript/ts-reset": "^0.5.1", - "@types/node": "^20.13.0", - "ai": "^3.1.22", + "@types/node": "^20.14.2", + "ai": "^3.1.30", "del-cli": "^5.1.0", "dotenv": "^16.4.5", "eslint": "^8.57.0", "expr-eval": "^2.0.2", "husky": "^9.0.11", "lint-staged": "^15.2.5", - "llamaindex": "^0.3.15", + "llamaindex": "^0.3.16", "np": "^10.0.5", "npm-run-all2": "^6.2.0", "only-allow": "^1.2.1", "openai-fetch": "^2.0.3", - "prettier": "^3.2.5", + "prettier": "^3.3.1", "restore-cursor": "^5.0.0", "ts-node": "^10.9.2", - "tsup": "^8.0.2", - "tsx": "^4.11.0", + "tsup": "^8.1.0", + "tsx": "^4.13.0", "twitter-api-sdk": "^1.2.1", "typescript": "^5.4.5", "vitest": "2.0.0-beta.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 164f38206..01c046be6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: .: dependencies: '@nangohq/node': - specifier: ^0.39.32 - version: 0.39.32 + specifier: ^0.39.33 + version: 0.39.33 dedent: specifier: ^1.5.3 version: 1.5.3 @@ -45,8 +45,8 @@ importers: specifier: ^7.0.0 version: 7.0.0 type-fest: - specifier: ^4.18.3 - version: 4.18.3 + specifier: ^4.19.0 + version: 4.19.0 zod: specifier: ^3.23.3 version: 3.23.8 @@ -54,6 +54,9 @@ importers: specifier: ^3.23.0 version: 3.23.0(zod@3.23.8) devDependencies: + '@browserbasehq/sdk': + specifier: ^1.2.1 + version: 1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@dexaai/dexter': specifier: ^2.0.3 version: 2.1.0 @@ -68,19 +71,19 @@ importers: version: 0.5.2 '@instructor-ai/instructor': specifier: ^1.3.0 - version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) + version: 1.3.0(openai@4.49.0(encoding@0.1.13))(zod@3.23.8) '@langchain/core': - specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + specifier: ^0.2.6 + version: 0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 '@types/node': - specifier: ^20.13.0 - version: 20.13.0 + specifier: ^20.14.2 + version: 20.14.2 ai: - specifier: ^3.1.22 - version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + specifier: ^3.1.30 + version: 3.1.30(openai@4.49.0(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) del-cli: specifier: ^5.1.0 version: 5.1.0 @@ -100,8 +103,8 @@ importers: specifier: ^15.2.5 version: 15.2.5 llamaindex: - specifier: ^0.3.15 - version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5)(utf-8-validate@6.0.4) + specifier: ^0.3.16 + version: 0.3.16(@aws-sdk/credential-providers@3.592.0)(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4) np: specifier: ^10.0.5 version: 10.0.5(typescript@5.4.5) @@ -115,20 +118,20 @@ importers: specifier: ^2.0.3 version: 2.0.3 prettier: - specifier: ^3.2.5 - version: 3.3.0 + specifier: ^3.3.1 + version: 3.3.1 restore-cursor: specifier: ^5.0.0 version: 5.0.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.13.0)(typescript@5.4.5) + version: 10.9.2(@types/node@20.14.2)(typescript@5.4.5) tsup: - specifier: ^8.0.2 - version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5))(typescript@5.4.5) + specifier: ^8.1.0 + version: 8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(typescript@5.4.5) tsx: - specifier: ^4.11.0 - version: 4.11.0 + specifier: ^4.13.0 + version: 4.13.0 twitter-api-sdk: specifier: ^1.2.1 version: 1.2.1(encoding@0.1.13) @@ -137,7 +140,7 @@ importers: version: 5.4.5 vitest: specifier: 2.0.0-beta.3 - version: 2.0.0-beta.3(@types/node@20.13.0) + version: 2.0.0-beta.3(@types/node@20.14.2) examples: dependencies: @@ -158,13 +161,13 @@ importers: version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) '@langchain/core': specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + version: 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) '@langchain/openai': specifier: ^0.1.1 - version: 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + version: 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) ai: specifier: ^3.1.22 - version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -173,10 +176,10 @@ importers: version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13) langchain: specifier: ^0.2.4 - version: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + version: 0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) llamaindex: specifier: ^0.3.15 - version: 0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5)(utf-8-validate@6.0.4) + version: 0.3.15(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4) openai: specifier: ^4.47.3 version: 4.47.3(encoding@0.1.13) @@ -201,6 +204,19 @@ packages: zod: optional: true + '@ai-sdk/provider-utils@0.0.13': + resolution: {integrity: sha512-cB2dPm9flj+yin5sjBLFcXdW8sZtAXLE/OLKgz9uHpHM55s7mnwZrDGfO6ot/ukHTxDDJunZLW7qSjgK/u0F1g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider@0.0.10': + resolution: {integrity: sha512-NzkrtREQpHID1cTqY/C4CI30PVOaXWKYytDR2EcytmFgnP7Z6+CrGIA/YCnNhYAuUm6Nx+nGpRL/Hmyrv7NYzg==} + engines: {node: '>=18'} + '@ai-sdk/provider@0.0.8': resolution: {integrity: sha512-+gcMvyPUDfDXV9caN3CG5Le0M5K4CjqTdMV1ODg/AosApQiJW9ByN5imJPdI043zVdt+HS9WG+s0j4am7ca4bg==} engines: {node: '>=18'} @@ -212,6 +228,9 @@ packages: '@anthropic-ai/sdk@0.20.9': resolution: {integrity: sha512-Lq74+DhiEQO6F9/gdVOLmHx57pX45ebK2Q/zH14xYe1157a7QeUVknRqIp0Jz5gQI01o7NKbuv9Dag2uQsLjDg==} + '@anthropic-ai/sdk@0.21.1': + resolution: {integrity: sha512-fqdt74RTdplnaFOYhwNjjK/Ec09Dqv9ekYr7PuC6GdhV1RWkziqbpJBewn42CYYqCr92JeX6g+IXVgXmq9l7XQ==} + '@aws-crypto/crc32@3.0.0': resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} @@ -241,6 +260,10 @@ packages: resolution: {integrity: sha512-Nfn23x7yZgp1umB+Avvsw9t8XIFWEqNQcpJ10Q8RcI9bQ0SvR4OcnnVsBA0WFL53FVzVM2FAkjNrCMRaSe6xWw==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-cognito-identity@3.592.0': + resolution: {integrity: sha512-mk3JOBsk5hlrLTZFuoGIhFKFflOdxqMKmOgyUFs5+gBLuH0/lN3wNWJxk+BiY1nHzkxhBND1hDHc5dvZRugBJA==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-sagemaker@3.590.0': resolution: {integrity: sha512-PfzwrG12MS0hkBrH9dDRtTpYx2eAlzO9yZtBpz4CuCRToMFbFCga+A8a3pgJoimfwcuGTKjGwmkIx1/sdpsIsg==} engines: {node: '>=16.0.0'} @@ -249,22 +272,42 @@ packages: resolution: {integrity: sha512-3yCLPjq6WFfDpdUJKk/gSz4eAPDTjVknXaveMPi2QoVBCshneOnJsV16uNKlpVF1frTHrrDRfKYmbaVh6nFBvQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso-oidc@3.592.0': + resolution: {integrity: sha512-11Zvm8nm0s/UF3XCjzFRpQU+8FFVW5rcr3BHfnH6xAe5JEoN6bJN/n+wOfnElnjek+90hh+Qc7s141AMrCjiiw==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.590.0': resolution: {integrity: sha512-6xbC6oQVJKBRTyXyR3C15ksUsPOyW4p+uCj7dlKYWGJvh4vGTV8KhZKS53oPG8t4f1+OMJWjr5wKuXRoaFsmhQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.592.0': + resolution: {integrity: sha512-w+SuW47jQqvOC7fonyjFjsOh3yjqJ+VpWdVrmrl0E/KryBE7ho/Wn991Buf/EiHHeJikoWgHsAIPkBH29+ntdA==} + engines: {node: '>=16.0.0'} + '@aws-sdk/client-sts@3.590.0': resolution: {integrity: sha512-f4R1v1LSn4uLYZ5qj4DyL6gp7PXXzJeJsm2seheiJX+53LSF5L7XSDnQVtX1p9Tevv0hp2YUWUTg6QYwIVSuGg==} engines: {node: '>=16.0.0'} + '@aws-sdk/client-sts@3.592.0': + resolution: {integrity: sha512-KUrOdszZfcrlpKr4dpdkGibZ/qq3Lnfu1rjv1U+V1QJQ9OuMo9J3sDWpWV9tigNqY0aGllarWH5cJbz9868W/w==} + engines: {node: '>=16.0.0'} + '@aws-sdk/core@3.588.0': resolution: {integrity: sha512-O1c2+9ce46Z+iiid+W3iC1IvPbfIo5ev9CBi54GdNB9SaI8/3+f8MJcux0D6c9toCF0ArMersN/gp8ek57e9uQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/core@3.592.0': + resolution: {integrity: sha512-gLPMXR/HXDP+9gXAt58t7gaMTvRts9i6Q7NMISpkGF54wehskl5WGrbdtHJFylrlJ5BQo3XVY6i661o+EuR1wg==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.590.0': resolution: {integrity: sha512-28vRC0BYaDVWU9AzGBywTRmwiwQfkixfOZGcY6e5J6cRjVoawomvHmC2mJd11SjoDcVLUQF+z4Z9z1ZCr1GcpA==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.592.0': + resolution: {integrity: sha512-uHiMPCkFhZOhlSfKgVqPhMdruiOuVkLUn07gQqvxHYhFKkEOPV+6BZbPKBwBTXr8TIREztQzCMPswa5pGk2zbQ==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-env@3.587.0': resolution: {integrity: sha512-Hyg/5KFECIk2k5o8wnVEiniV86yVkhn5kzITUydmNGCkXdBFHMHRx6hleQ1bqwJHbBskyu8nbYamzcwymmGwmw==} engines: {node: '>=16.0.0'} @@ -279,10 +322,20 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.590.0 + '@aws-sdk/credential-provider-ini@3.592.0': + resolution: {integrity: sha512-3kG6ngCIOPbLJZZ3RV+NsU7HVK6vX1+1DrPJKj9fVlPYn7IXsk8NAaUT5885yC7+jKizjv0cWLrLKvAJV5gfUA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.592.0 + '@aws-sdk/credential-provider-node@3.590.0': resolution: {integrity: sha512-Ky38mNFoXobGrDQ11P3dU1e+q1nRJ7eZl8l15KUpvZCe/hOudbxQi/epQrCazD/gRYV2fTyczdLlZzB5ZZ8DhQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-node@3.592.0': + resolution: {integrity: sha512-BguihBGTrEjVBQ07hm+ZsO29eNJaxwBwUZMftgGAm2XcMIEClNPfm5hydxu2BmA4ouIJQJ6nG8pNYghEumM+Aw==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-process@3.587.0': resolution: {integrity: sha512-V4xT3iCqkF8uL6QC4gqBJg/2asd/damswP1h9HCfqTllmPWzImS+8WD3VjgTLw5b0KbTy+ZdUhKc0wDnyzkzxg==} engines: {node: '>=16.0.0'} @@ -291,6 +344,10 @@ packages: resolution: {integrity: sha512-v+0j/I+je9okfwXsgmLppmwIE+TuMp5WqLz7r7PHz9KjzLyKaKTDvfllFD+8oPpBqnmOWiJ9qTGPkrfhB7a/fQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-sso@3.592.0': + resolution: {integrity: sha512-fYFzAdDHKHvhtufPPtrLdSv8lO6GuW3em6n3erM5uFdpGytNpjXvr3XGokIsuXcNkETAY/Xihg+G9ksNE8WJxQ==} + engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-web-identity@3.587.0': resolution: {integrity: sha512-XqIx/I2PG7kyuw3WjAP9wKlxy8IvFJwB8asOFT1xPFoVfZYKIogjG9oLP5YiRtfvDkWIztHmg5MlVv3HdJDGRw==} engines: {node: '>=16.0.0'} @@ -301,6 +358,10 @@ packages: resolution: {integrity: sha512-Z4SHk/GCoM5JEJOH3+xr2I7VvPGdeGPHL1cck/UFIN1Fap1wT3uIsTW92Rhru2AvnhQnAPpDUOHO9/hDJk1MDA==} engines: {node: '>=16.0.0'} + '@aws-sdk/credential-providers@3.592.0': + resolution: {integrity: sha512-fHAt001Aemiy9p8VtLKWiPQ36g1YgiLC1pm31W+WmKxU663dbt2yYTIAyVOB1nQC7HrVCOZEg2FU0TtuZt/wXQ==} + engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.577.0': resolution: {integrity: sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==} engines: {node: '>=16.0.0'} @@ -368,20 +429,24 @@ packages: resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.6': - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.6': resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.6': resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.6': - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true @@ -389,10 +454,13 @@ packages: resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.6': - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} + '@browserbasehq/sdk@1.2.1': + resolution: {integrity: sha512-2fEyseWDGQnhJzoUuyUzXXVykG2cfgEnSpzm1iYVwfgpdqGbiEsMbcw6/HfUUXWSMrm/GZEnlHHqVIRa92x2Ng==} + '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} @@ -599,6 +667,10 @@ packages: resolution: {integrity: sha512-DviMgrnljEKh6qkDT2pVFW+NEuVhggqBUoEnyy2PNL7l4ewxXRJubk3PctC9yPl1AdRIlhqP7E076QQt+IWuTg==} engines: {node: '>=18.0.0'} + '@google/generative-ai@0.12.0': + resolution: {integrity: sha512-krWjurjEUHSFhCX4lGHMOhbnpBfYZGU31mpHpPBQwcfWm0T+/+wxC4UCAJfkxxc3/HvGJVG8r4AqrffaeDHDlA==} + engines: {node: '>=18.0.0'} + '@grpc/grpc-js@1.10.8': resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} engines: {node: '>=12.10.0'} @@ -676,14 +748,26 @@ packages: resolution: {integrity: sha512-tMaKRFVewFn8crQwlbXGjT7hlMdX1yXHap1ebBx7Bb2C3C9AeZ+sXbX11m27yamypNlVVegwUcisw3YCaDkZJA==} engines: {node: '>=18'} + '@langchain/core@0.2.6': + resolution: {integrity: sha512-YB9F0vdi/PcgBLSKtDwQ3gV6w4xVfk4ph0U43Okz2dAapKfBkVVB0rzr/afYUt/WHs864MuaO8uLN64egSDtIA==} + engines: {node: '>=18'} + '@langchain/openai@0.1.1': resolution: {integrity: sha512-0M7GOA7+dPMQATn8UrYBUp0tWxBJjsJEdRPf+MhDD4jdK70qfC6tBbB/lrT0HchVnz5GFE7az4EUtSh8LiUgzA==} engines: {node: '>=18'} + '@langchain/openai@0.1.2': + resolution: {integrity: sha512-giydNZyEzUBrjZrmQRfnc2SI0+TyAjaVMd8wMKq8O4X/Y3BJd0LFlfD+3MM6Lyu/qaphZ1Ycfr7XR5hY0EcGqQ==} + engines: {node: '>=18'} + '@langchain/textsplitters@0.0.2': resolution: {integrity: sha512-6bQOuYHTGYlkgPY/8M5WPq4nnXZpEysGzRopQCYjg2WLcEoIPUMMrXsAaNNdvU3BOeMrhin8izvpDPD165hX6Q==} engines: {node: '>=18'} + '@langchain/textsplitters@0.0.3': + resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==} + engines: {node: '>=18'} + '@ljharb/through@2.3.13': resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} @@ -710,11 +794,14 @@ packages: '@mistralai/mistralai@0.2.0': resolution: {integrity: sha512-mYjE9NovwWdhSXd6KvOgjWUyka2qlxhuohsqhRN4rFtH2MdTDJhAeH3Aqvu3P9q71Xz9oBX2pNWrPVVzkgwZTg==} + '@mistralai/mistralai@0.4.0': + resolution: {integrity: sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==} + '@mongodb-js/saslprep@1.1.7': resolution: {integrity: sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==} - '@nangohq/node@0.39.32': - resolution: {integrity: sha512-WmruUSZisKIB6Y3PIlhV/IjsPhag0DOqoP3RWZRXeI1MrenuKWRF6z31c+lViqfjTQoxp4KuEwx0QQbxMaztLg==} + '@nangohq/node@0.39.33': + resolution: {integrity: sha512-TkwH6pRsTT4ORZAc/ZEjnI8fHXJx068sXFa1X0oUwclZiSXP50Dd7z6vdHiEYGjsi+k7BGYOlQTLCQqJsMHGrg==} engines: {node: '>=18.0'} '@nodelib/fs.scandir@2.1.5': @@ -947,6 +1034,11 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@puppeteer/browsers@2.2.3': + resolution: {integrity: sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==} + engines: {node: '>=18'} + hasBin: true + '@qdrant/js-client-rest@1.9.0': resolution: {integrity: sha512-YiX/IskbRCoAY2ujyPDI6FBcO0ygAS4pgkGaJ7DcrJFh4SZV2XHs+u0KM7mO72RWJn1eJQFF2PQwxG+401xxJg==} engines: {node: '>=18.0.0', pnpm: '>=8'} @@ -1276,6 +1368,9 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@total-typescript/ts-reset@0.5.1': resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==} @@ -1318,11 +1413,11 @@ packages: '@types/node-fetch@2.6.11': resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - '@types/node@18.19.33': - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + '@types/node@18.19.34': + resolution: {integrity: sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==} - '@types/node@20.13.0': - resolution: {integrity: sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==} + '@types/node@20.14.2': + resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1357,6 +1452,9 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@7.11.0': resolution: {integrity: sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -1535,6 +1633,30 @@ packages: zod: optional: true + ai@3.1.30: + resolution: {integrity: sha512-6o3ttMqhO81y+8tibrvH+Z+38e5lM2O50sM8F1YBCYietZzFjkAg0VL/400lruyyzPjcxcGhGdBUBLe83iRxHg==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 + solid-js: ^1.7.7 + svelte: ^3.0.0 || ^4.0.0 + vue: ^3.3.4 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + solid-js: + optional: true + svelte: + optional: true + vue: + optional: true + zod: + optional: true + ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} peerDependencies: @@ -1549,6 +1671,9 @@ packages: ajv@8.14.0: resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + already@2.2.1: resolution: {integrity: sha512-qk6RIVMS/R1yTvBzfIL1T76PsIL7DIVCINoLuFw2YXKLpLtsTobqdChMs8m3OhuPS3CEE3+Ra5ibYiqdyogbsQ==} @@ -1698,6 +1823,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} @@ -1748,6 +1877,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} @@ -1797,6 +1930,9 @@ packages: resolution: {integrity: sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==} engines: {node: '>=16.20.1'} + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -1920,6 +2056,26 @@ packages: openai: optional: true + chromadb@1.8.1: + resolution: {integrity: sha512-NpbYydbg4Uqt/9BXKgkZXn0fqpsh2Z1yjhkhKH+rcHMoq0pwI18BFSU2QU7Fk/ZypwGefW2AvqyE/3ZJIgy4QA==} + engines: {node: '>=14.17.0'} + peerDependencies: + '@google/generative-ai': ^0.1.1 + cohere-ai: ^5.0.0 || ^6.0.0 || ^7.0.0 + openai: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + '@google/generative-ai': + optional: true + cohere-ai: + optional: true + openai: + optional: true + + chromium-bidi@0.5.19: + resolution: {integrity: sha512-UA6zL77b7RYCjJkZBsZ0wlvCTD+jTjllZ8f6wdO4buevXgTZYjV+XLB9CiEa2OuuTGGTLnI7eN9I60YxuALGQg==} + peerDependencies: + devtools-protocol: '*' + ci-info@4.0.0: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} @@ -1996,6 +2152,9 @@ packages: cohere-ai@7.10.2: resolution: {integrity: sha512-Dh1nLugCdSsqQ+PZN+ABRQVQum83udHeBNxC0nJJeIDDzIuEvlpYqXlESPeAnTnjXCjC/glXWBhFDXR5ZbmNrg==} + cohere-ai@7.9.5: + resolution: {integrity: sha512-tr8LUR3Q46agFpfEwaYwzYO4qAuN0/R/8YroG4bc86LadOacBAabctZUq0zfCdLiL7gB4yWJs4QCzfpRH3rQuw==} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2109,6 +2268,10 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -2143,6 +2306,15 @@ packages: supports-color: optional: true + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.3.5: resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} @@ -2218,6 +2390,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + del-cli@5.1.0: resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} engines: {node: '>=14.16'} @@ -2251,6 +2427,9 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + devtools-protocol@0.0.1286932: + resolution: {integrity: sha512-wu58HMQll9voDjR4NlPyoDEw1syfzaBNHymMMZ/QOXiHRNluOnDgu9hp1yHOKYoMlxCh4lSSiugLITe6Fvu1eA==} + diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} @@ -2400,6 +2579,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-config-prettier@9.1.0: resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -2519,6 +2703,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} @@ -2589,6 +2778,11 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2609,9 +2803,16 @@ packages: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true + fast-xml-parser@4.4.0: + resolution: {integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==} + hasBin: true + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} @@ -2726,6 +2927,10 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + fs-extra@2.1.2: resolution: {integrity: sha512-9ztMtDZtSKC78V8mev+k31qaTabbmuH5jatdvPBMikrFHvw5BqlYnQIn/WGK3WHeRooSTkRvLa2IPlaHjPq5Sg==} @@ -2784,6 +2989,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2799,6 +3008,10 @@ packages: get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-uri@6.0.3: + resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + engines: {node: '>= 14'} + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -2936,6 +3149,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -3058,6 +3275,10 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -3335,8 +3556,8 @@ packages: iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - jackspeak@3.1.2: - resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} joycon@3.1.1: @@ -3359,6 +3580,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -3410,6 +3634,9 @@ packages: jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -3601,81 +3828,243 @@ packages: youtubei.js: optional: true - langchainhub@0.0.11: - resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} - - langsmith@0.1.30: - resolution: {integrity: sha512-g8f10H1iiRjCweXJjgM3Y9xl6ApCa1OThDvc0BlSDLVrGVPy1on9wT39vAzYkeadC7oG48p7gfpGlYH3kLkJ9Q==} + langchain@0.2.5: + resolution: {integrity: sha512-H5WL0NanCdQ+tzoeEt7Fyz9YGdR3wbfDvfQrJvxAO95istKo5JraRh24dzyvqxM9439xwRMNaMIpMwsyqtWDtQ==} + engines: {node: '>=18'} peerDependencies: - '@langchain/core': '*' - langchain: '*' - openai: '*' + '@aws-sdk/client-s3': ^3.310.0 + '@aws-sdk/client-sagemaker-runtime': ^3.310.0 + '@aws-sdk/client-sfn': ^3.310.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@gomomento/sdk-web': ^1.51.1 + '@mendable/firecrawl-js': ^0.0.13 + '@notionhq/client': ^2.2.10 + '@pinecone-database/pinecone': '*' + '@supabase/supabase-js': ^2.10.0 + '@vercel/kv': ^0.2.3 + '@xata.io/client': ^0.28.0 + apify-client: ^2.7.1 + assemblyai: ^4.0.0 + axios: '*' + cheerio: ^1.0.0-rc.12 + chromadb: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + d3-dsv: ^2.0.0 + epub2: ^3.0.1 + faiss-node: '*' + fast-xml-parser: '*' + handlebars: ^4.7.8 + html-to-text: ^9.0.5 + ignore: ^5.2.0 + ioredis: ^5.3.2 + jsdom: '*' + mammoth: ^1.6.0 + mongodb: '>=5.2.0' + node-llama-cpp: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + pdf-parse: 1.1.1 + peggy: ^3.0.2 + playwright: ^1.32.1 + puppeteer: ^19.7.2 + pyodide: ^0.24.1 + redis: ^4.6.4 + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.12 + weaviate-ts-client: '*' + web-auth-library: ^1.0.3 + ws: ^8.14.2 + youtube-transcript: ^1.0.6 + youtubei.js: ^9.1.0 peerDependenciesMeta: - '@langchain/core': + '@aws-sdk/client-s3': optional: true - langchain: + '@aws-sdk/client-sagemaker-runtime': optional: true - openai: + '@aws-sdk/client-sfn': optional: true - - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - - latest-version@7.0.0: - resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} - engines: {node: '>=14.16'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lint-staged@15.2.5: - resolution: {integrity: sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==} - engines: {node: '>=18.12.0'} - hasBin: true - - listr-input@0.2.1: - resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==} - engines: {node: '>=6'} - - listr-silent-renderer@1.1.1: - resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==} - engines: {node: '>=4'} - - listr-update-renderer@0.5.0: - resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} - engines: {node: '>=6'} - peerDependencies: - listr: ^0.14.2 - - listr-verbose-renderer@0.5.0: - resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} - engines: {node: '>=4'} - - listr2@8.2.1: - resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} - engines: {node: '>=18.0.0'} - - listr@0.14.3: - resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} - engines: {node: '>=6'} - - llamaindex@0.3.15: - resolution: {integrity: sha512-ZdaITy8FPNobb1SMpchOZt/YNCA0dUSXF+DW06rI+nL5Blnyr48oZfBuFYtE3n05C+3gBZPxXVmBGfTHCLIIiQ==} + '@aws-sdk/credential-provider-node': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@gomomento/sdk-web': + optional: true + '@mendable/firecrawl-js': + optional: true + '@notionhq/client': + optional: true + '@pinecone-database/pinecone': + optional: true + '@supabase/supabase-js': + optional: true + '@vercel/kv': + optional: true + '@xata.io/client': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + axios: + optional: true + cheerio: + optional: true + chromadb: + optional: true + convex: + optional: true + couchbase: + optional: true + d3-dsv: + optional: true + epub2: + optional: true + faiss-node: + optional: true + fast-xml-parser: + optional: true + handlebars: + optional: true + html-to-text: + optional: true + ignore: + optional: true + ioredis: + optional: true + jsdom: + optional: true + mammoth: + optional: true + mongodb: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + peggy: + optional: true + playwright: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + youtube-transcript: + optional: true + youtubei.js: + optional: true + + langchainhub@0.0.11: + resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} + + langsmith@0.1.30: + resolution: {integrity: sha512-g8f10H1iiRjCweXJjgM3Y9xl6ApCa1OThDvc0BlSDLVrGVPy1on9wT39vAzYkeadC7oG48p7gfpGlYH3kLkJ9Q==} + peerDependencies: + '@langchain/core': '*' + langchain: '*' + openai: '*' + peerDependenciesMeta: + '@langchain/core': + optional: true + langchain: + optional: true + openai: + optional: true + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.5: + resolution: {integrity: sha512-j+DfX7W9YUvdzEZl3Rk47FhDF6xwDBV5wwsCPw6BwWZVPYJemusQmvb9bRsW23Sqsaa+vRloAWogbK4BUuU2zA==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr-input@0.2.1: + resolution: {integrity: sha512-oa8iVG870qJq+OuuMK3DjGqFcwsK1SDu+kULp9kEq09TY231aideIZenr3lFOQdASpAr6asuyJBbX62/a3IIhg==} + engines: {node: '>=6'} + + listr-silent-renderer@1.1.1: + resolution: {integrity: sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==} + engines: {node: '>=4'} + + listr-update-renderer@0.5.0: + resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} + engines: {node: '>=6'} + peerDependencies: + listr: ^0.14.2 + + listr-verbose-renderer@0.5.0: + resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} + engines: {node: '>=4'} + + listr2@8.2.1: + resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} + engines: {node: '>=18.0.0'} + + listr@0.14.3: + resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} + engines: {node: '>=6'} + + llamaindex@0.3.15: + resolution: {integrity: sha512-ZdaITy8FPNobb1SMpchOZt/YNCA0dUSXF+DW06rI+nL5Blnyr48oZfBuFYtE3n05C+3gBZPxXVmBGfTHCLIIiQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@notionhq/client': ^2.2.15 + + llamaindex@0.3.16: + resolution: {integrity: sha512-k2ltnJ3t1TeR8r9iy3FeuDLPAFBBdjYClfuUtsT6QiSaGYS132nbha+0FbBvrW/5KyXlXCtz/8Can8ObwHybjQ==} engines: {node: '>=18.0.0'} peerDependencies: '@notionhq/client': ^2.2.15 @@ -3765,6 +4154,10 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + lru-cache@9.1.2: resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} engines: {node: 14 || >=16.14} @@ -3893,6 +4286,9 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -3990,6 +4386,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + new-github-release-url@2.0.0: resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4178,6 +4578,10 @@ packages: resolution: {integrity: sha512-470d4ibH5kizXflCzgur22GpM4nOjrg7WQ9jTOa3dNKEn248oBy4+pjOyfcFR4V4YUn/YlDNjp6h83PbviCCKQ==} hasBin: true + openai@4.49.0: + resolution: {integrity: sha512-/UkrBSej5ejZ4vnOFoeFefX7erjp4k3+xoLKkswjLEvgBU9QtCnOUgsfpvHkzTzgDXpqPMCzyQHQXWsgiq2xPw==} + hasBin: true + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} @@ -4272,6 +4676,14 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} @@ -4349,6 +4761,16 @@ packages: bundledDependencies: - '@xmldom/xmldom' + pdf2json@3.1.3: + resolution: {integrity: sha512-cGP2MIz7v+w/b4vgg0OPKqhT21L/CZ73+RNmXKbKjgtnVJt2e00AqI6NZyMTp6GL6sY+r0NJOZb9gL3g37yuew==} + engines: {node: '>=18.12.1', npm: '>=8.19.2'} + hasBin: true + bundledDependencies: + - '@xmldom/xmldom' + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -4500,8 +4922,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.3.0: - resolution: {integrity: sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==} + prettier@3.3.1: + resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} engines: {node: '>=14'} hasBin: true @@ -4512,6 +4934,10 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -4530,6 +4956,10 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -4547,6 +4977,10 @@ packages: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} + puppeteer-core@22.10.0: + resolution: {integrity: sha512-I54J4Vy4I07UHsgB1QSmuFoF7KNQjJWcvFBPhtY+ezMdBfwgGDr8dzYrJa11aPgP9kxIUHjhktcMmmfJkOAtTw==} + engines: {node: '>=18'} + qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -4846,6 +5280,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.2: resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} @@ -4944,6 +5383,18 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.3: + resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} + engines: {node: '>= 14'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solid-js@1.8.17: resolution: {integrity: sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==} @@ -4962,6 +5413,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -4988,11 +5443,19 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sswr@2.0.0: resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==} peerDependencies: svelte: ^4.0.0 + sswr@2.1.0: + resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -5146,8 +5609,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte@4.2.17: - resolution: {integrity: sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==} + svelte@4.2.18: + resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==} engines: {node: '>=16'} swr-store@0.10.6: @@ -5182,6 +5645,9 @@ packages: tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@3.0.5: + resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + tar-fs@3.0.6: resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} @@ -5312,8 +5778,11 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsup@8.0.2: - resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsup@8.1.0: + resolution: {integrity: sha512-UFdfCAXukax+U6KzeTNO2kAARHcWxmKsnvSPXUcfA1D+kU05XDccCrkffCQpFaWDsZfV0jMyTsxU39VfCp6EOg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -5331,8 +5800,8 @@ packages: typescript: optional: true - tsx@4.11.0: - resolution: {integrity: sha512-vzGGELOgAupsNVssAmZjbUDfdm/pWP4R+Kg8TVdsonxbXk0bEpE1qh0yV6/QxUVXaVlNemgcPajGdJJ82n3stg==} + tsx@4.13.0: + resolution: {integrity: sha512-kNY70P2aLMdVBii1Err5ENxDhQ6Vz2PbQGX68DcvzY2/PWK5NLBO6vI7lPr1/2xG3IKSt2MN+KOAyWDQSRlbCA==} engines: {node: '>=18.0.0'} hasBin: true @@ -5375,8 +5844,8 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - type-fest@4.18.3: - resolution: {integrity: sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==} + type-fest@4.19.0: + resolution: {integrity: sha512-CN2l+hWACRiejlnr68vY0/7734Kzu+9+TOslUXbSCQ1ruY9XIHDBSceVXCcHm/oXrdzhtLMMdJEKfemf1yXiZQ==} engines: {node: '>=16'} type-is@1.6.18: @@ -5413,6 +5882,9 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} @@ -5435,6 +5907,10 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -5458,6 +5934,9 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + use-sync-external-store@1.2.2: resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -5710,6 +6189,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.4.3: + resolution: {integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -5722,6 +6206,9 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -5762,6 +6249,9 @@ packages: peerDependencies: zod: ^3.18.0 + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -5782,6 +6272,19 @@ snapshots: optionalDependencies: zod: 3.23.8 + '@ai-sdk/provider-utils@0.0.13(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.10 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider@0.0.10': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/provider@0.0.8': dependencies: json-schema: 0.4.0 @@ -5793,7 +6296,20 @@ snapshots: '@anthropic-ai/sdk@0.20.9(encoding@0.1.13)': dependencies: - '@types/node': 18.19.33 + '@types/node': 18.19.34 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + + '@anthropic-ai/sdk@0.21.1(encoding@0.1.13)': + dependencies: + '@types/node': 18.19.34 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -5858,7 +6374,7 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.590.0 '@aws-sdk/core': 3.588.0 '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -5899,14 +6415,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sagemaker@3.590.0': + '@aws-sdk/client-cognito-identity@3.592.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/client-sso-oidc': 3.592.0 + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/core': 3.592.0 + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -5941,17 +6457,17 @@ snapshots: '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.0.0 - tslib: 2.6.2 - uuid: 9.0.1 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt + optional: true - '@aws-sdk/client-sso-oidc@3.590.0': + '@aws-sdk/client-sagemaker@3.590.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/client-sts': 3.590.0 '@aws-sdk/core': 3.588.0 '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -5988,7 +6504,99 @@ snapshots: '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 + '@smithy/util-waiter': 3.0.0 tslib: 2.6.2 + uuid: 9.0.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.590.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.592.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/core': 3.592.0 + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt @@ -6035,7 +6643,50 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + '@aws-sdk/client-sso@3.592.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.592.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.590.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 @@ -6077,10 +6728,100 @@ snapshots: '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.590.0 + '@aws-sdk/core': 3.588.0 + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt + '@aws-sdk/client-sts@3.592.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.592.0 + '@aws-sdk/core': 3.592.0 + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.587.0 + '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.587.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.587.0 + '@smithy/config-resolver': 3.0.1 + '@smithy/core': 2.2.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.1 + '@smithy/middleware-retry': 3.0.3 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.1.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.3 + '@smithy/util-defaults-mode-node': 3.0.3 + '@smithy/util-endpoints': 2.0.1 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + '@aws-sdk/core@3.588.0': dependencies: '@smithy/core': 2.2.0 @@ -6091,6 +6832,16 @@ snapshots: fast-xml-parser: 4.2.5 tslib: 2.6.2 + '@aws-sdk/core@3.592.0': + dependencies: + '@smithy/core': 2.2.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/smithy-client': 3.1.1 + '@smithy/types': 3.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.3 + '@aws-sdk/credential-provider-cognito-identity@3.590.0': dependencies: '@aws-sdk/client-cognito-identity': 3.590.0 @@ -6101,6 +6852,17 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-cognito-identity@3.592.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.592.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - aws-crt + optional: true + '@aws-sdk/credential-provider-env@3.587.0': dependencies: '@aws-sdk/types': 3.577.0 @@ -6137,11 +6899,10 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - optional: true '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': dependencies: - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.590.0 '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0 @@ -6157,6 +6918,80 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt + '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + + '@aws-sdk/credential-provider-ini@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0)': + dependencies: + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-ini@3.592.0(@aws-sdk/client-sts@3.592.0)': + dependencies: + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0 + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': dependencies: '@aws-sdk/credential-provider-env': 3.587.0 @@ -6175,7 +7010,6 @@ snapshots: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' - aws-crt - optional: true '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': dependencies: @@ -6196,6 +7030,84 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt + '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + optional: true + + '@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sts@3.592.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0 + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + optional: true + '@aws-sdk/credential-provider-process@3.587.0': dependencies: '@aws-sdk/types': 3.577.0 @@ -6217,6 +7129,46 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt + '@aws-sdk/credential-provider-sso@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)': + dependencies: + '@aws-sdk/client-sso': 3.590.0 + '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-sso@3.592.0': + dependencies: + '@aws-sdk/client-sso': 3.592.0 + '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + + '@aws-sdk/credential-provider-sso@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)': + dependencies: + '@aws-sdk/client-sso': 3.592.0 + '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': dependencies: '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) @@ -6224,17 +7176,24 @@ snapshots: '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - optional: true '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0)': dependencies: - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.592.0)': + dependencies: + '@aws-sdk/client-sts': 3.592.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 tslib: 2.6.2 - '@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + '@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)': dependencies: '@aws-sdk/client-cognito-identity': 3.590.0 '@aws-sdk/client-sso': 3.590.0 @@ -6242,10 +7201,10 @@ snapshots: '@aws-sdk/credential-provider-cognito-identity': 3.590.0 '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 @@ -6256,6 +7215,52 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt + '@aws-sdk/credential-providers@3.592.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.592.0 + '@aws-sdk/client-sso': 3.592.0 + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/credential-provider-cognito-identity': 3.592.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0 + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + + '@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)': + dependencies: + '@aws-sdk/client-cognito-identity': 3.592.0 + '@aws-sdk/client-sso': 3.592.0 + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/credential-provider-cognito-identity': 3.592.0 + '@aws-sdk/credential-provider-env': 3.587.0 + '@aws-sdk/credential-provider-http': 3.587.0 + '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-process': 3.587.0 + '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.1.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + optional: true + '@aws-sdk/middleware-host-header@3.577.0': dependencies: '@aws-sdk/types': 3.577.0 @@ -6312,6 +7317,15 @@ snapshots: '@smithy/types': 3.0.0 tslib: 2.6.2 + '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.592.0)': + dependencies: + '@aws-sdk/client-sso-oidc': 3.592.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/shared-ini-file-loader': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + '@aws-sdk/types@3.577.0': dependencies: '@smithy/types': 3.0.0 @@ -6351,10 +7365,12 @@ snapshots: '@babel/highlight': 7.24.6 picocolors: 1.0.1 - '@babel/helper-string-parser@7.24.6': {} + '@babel/helper-string-parser@7.24.7': {} '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/highlight@7.24.6': dependencies: '@babel/helper-validator-identifier': 7.24.6 @@ -6362,20 +7378,29 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.24.6': + '@babel/parser@7.24.7': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 '@babel/runtime@7.24.6': dependencies: regenerator-runtime: 0.14.1 - '@babel/types@7.24.6': + '@babel/types@7.24.7': dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)': + dependencies: + puppeteer-core: 22.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + zod: 3.23.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@colors/colors@1.6.0': {} '@cspotcode/source-map-support@0.8.1': @@ -6550,7 +7575,7 @@ snapshots: dependencies: '@genkit-ai/core': 0.5.2 '@opentelemetry/api': 1.8.0 - '@types/node': 20.13.0 + '@types/node': 20.14.2 json5: 2.2.3 node-fetch: 3.3.2 zod: 3.23.8 @@ -6584,6 +7609,8 @@ snapshots: '@google/generative-ai@0.11.5': {} + '@google/generative-ai@0.12.0': {} + '@grpc/grpc-js@1.10.8': dependencies: '@grpc/proto-loader': 0.7.13 @@ -6625,6 +7652,13 @@ snapshots: zod-stream: 1.0.3(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) zod-validation-error: 2.1.0(zod@3.23.8) + '@instructor-ai/instructor@1.3.0(openai@4.49.0(encoding@0.1.13))(zod@3.23.8)': + dependencies: + openai: 4.49.0(encoding@0.1.13) + zod: 3.23.8 + zod-stream: 1.0.3(openai@4.49.0(encoding@0.1.13))(zod@3.23.8) + zod-validation-error: 2.1.0(zod@3.23.8) + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6662,13 +7696,13 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -6680,13 +7714,13 @@ snapshots: - langchain - openai - '@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/core@0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -6698,9 +7732,9 @@ snapshots: - langchain - openai - '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': + '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 openai: 4.47.3(encoding@0.1.13) zod: 3.23.8 @@ -6709,11 +7743,11 @@ snapshots: - encoding - langchain - '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': + '@langchain/openai@0.1.2(encoding@0.1.13)(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) js-tiktoken: 1.0.12 - openai: 4.47.3(encoding@0.1.13) + openai: 4.49.0(encoding@0.1.13) zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) transitivePeerDependencies: @@ -6721,17 +7755,17 @@ snapshots: - langchain optional: true - '@langchain/textsplitters@0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/textsplitters@0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain - openai - '@langchain/textsplitters@0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/textsplitters@0.0.3(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -6754,7 +7788,7 @@ snapshots: '@llamaindex/env@0.1.3(@aws-crypto/sha256-js@5.2.0)(pathe@1.1.2)': dependencies: '@types/lodash': 4.17.4 - '@types/node': 20.13.0 + '@types/node': 20.14.2 optionalDependencies: '@aws-crypto/sha256-js': 5.2.0 pathe: 1.1.2 @@ -6765,11 +7799,17 @@ snapshots: transitivePeerDependencies: - encoding + '@mistralai/mistralai@0.4.0(encoding@0.1.13)': + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + '@mongodb-js/saslprep@1.1.7': dependencies: sparse-bitfield: 3.0.3 - '@nangohq/node@0.39.32': + '@nangohq/node@0.39.33': dependencies: axios: 1.7.2 transitivePeerDependencies: @@ -7034,6 +8074,19 @@ snapshots: '@protobufjs/utf8@1.1.0': {} + '@puppeteer/browsers@2.2.3': + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.4.0 + semver: 7.6.0 + tar-fs: 3.0.5 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + '@qdrant/js-client-rest@1.9.0(typescript@5.4.5)': dependencies: '@qdrant/openapi-typescript-fetch': 1.2.6 @@ -7436,6 +8489,8 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@total-typescript/ts-reset@0.5.1': {} '@tsconfig/node10@1.0.11': {} @@ -7466,14 +8521,14 @@ snapshots: '@types/node-fetch@2.6.11': dependencies: - '@types/node': 20.13.0 + '@types/node': 18.19.34 form-data: 4.0.0 - '@types/node@18.19.33': + '@types/node@18.19.34': dependencies: undici-types: 5.26.5 - '@types/node@20.13.0': + '@types/node@20.14.2': dependencies: undici-types: 5.26.5 @@ -7481,11 +8536,11 @@ snapshots: '@types/papaparse@5.3.14': dependencies: - '@types/node': 20.13.0 + '@types/node': 20.14.2 '@types/pg@8.11.6': dependencies: - '@types/node': 20.13.0 + '@types/node': 20.14.2 pg-protocol: 1.6.1 pg-types: 4.0.2 @@ -7507,6 +8562,11 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.14.2 + optional: true + '@typescript-eslint/eslint-plugin@7.11.0(@typescript-eslint/parser@7.11.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 @@ -7621,7 +8681,7 @@ snapshots: '@vue/compiler-core@3.4.27': dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.24.7 '@vue/shared': 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 @@ -7634,7 +8694,7 @@ snapshots: '@vue/compiler-sfc@3.4.27': dependencies: - '@babel/parser': 7.24.6 + '@babel/parser': 7.24.7 '@vue/compiler-core': 3.4.27 '@vue/compiler-dom': 3.4.27 '@vue/compiler-ssr': 3.4.27 @@ -7729,7 +8789,7 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): + ai@3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.8 '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) @@ -7739,7 +8799,7 @@ snapshots: nanoid: 3.3.6 secure-json-parse: 2.7.0 solid-swr-store: 0.10.7(solid-js@1.8.17)(swr-store@0.10.6) - sswr: 2.0.0(svelte@4.2.17) + sswr: 2.0.0(svelte@4.2.18) swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) @@ -7748,7 +8808,30 @@ snapshots: openai: 4.47.3(encoding@0.1.13) react: 18.3.1 solid-js: 1.8.17 - svelte: 4.2.17 + svelte: 4.2.18 + vue: 3.4.27(typescript@5.4.5) + zod: 3.23.8 + + ai@3.1.30(openai@4.49.0(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 0.0.10 + '@ai-sdk/provider-utils': 0.0.13(zod@3.23.8) + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + solid-swr-store: 0.10.7(solid-js@1.8.17)(swr-store@0.10.6) + sswr: 2.1.0(svelte@4.2.18) + swr: 2.2.0(react@18.3.1) + swr-store: 0.10.6 + swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) + zod-to-json-schema: 3.22.5(zod@3.23.8) + optionalDependencies: + openai: 4.49.0(encoding@0.1.13) + react: 18.3.1 + solid-js: 1.8.17 + svelte: 4.2.18 vue: 3.4.27(typescript@5.4.5) zod: 3.23.8 @@ -7770,6 +8853,13 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.16.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + already@2.2.1: {} ansi-align@3.0.1: @@ -7924,6 +9014,10 @@ snapshots: ast-types-flow@0.0.8: {} + ast-types@0.13.4: + dependencies: + tslib: 2.6.2 + async-mutex@0.5.0: dependencies: tslib: 2.6.2 @@ -7983,6 +9077,8 @@ snapshots: base64-js@1.5.1: {} + basic-ftp@5.0.5: {} + bignumber.js@9.1.2: {} binary-extensions@2.3.0: {} @@ -8051,6 +9147,8 @@ snapshots: bson@6.7.0: {} + buffer-crc32@0.2.13: {} + buffer-equal-constant-time@1.0.1: {} buffer@5.7.1: @@ -8168,16 +9266,46 @@ snapshots: chownr@1.1.4: {} - chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): + chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): + dependencies: + cliui: 8.0.1 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + optionalDependencies: + '@google/generative-ai': 0.11.5 + cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13) + openai: 4.47.3(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): dependencies: cliui: 8.0.1 isomorphic-fetch: 3.0.0(encoding@0.1.13) optionalDependencies: '@google/generative-ai': 0.11.5 - cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13) + cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13) openai: 4.47.3(encoding@0.1.13) transitivePeerDependencies: - encoding + optional: true + + chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)): + dependencies: + cliui: 8.0.1 + isomorphic-fetch: 3.0.0(encoding@0.1.13) + optionalDependencies: + '@google/generative-ai': 0.12.0 + cohere-ai: 7.9.5(encoding@0.1.13) + openai: 4.49.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + chromium-bidi@0.5.19(devtools-protocol@0.0.1286932): + dependencies: + devtools-protocol: 0.0.1286932 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.22.4 ci-info@4.0.0: {} @@ -8245,10 +9373,10 @@ snapshots: dependencies: rfdc: 1.3.1 - cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13): + cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13): dependencies: '@aws-sdk/client-sagemaker': 3.590.0 - '@aws-sdk/credential-providers': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-providers': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) '@aws-sdk/protocol-http': 3.374.0 '@aws-sdk/signature-v4': 3.374.0 form-data: 4.0.0 @@ -8263,6 +9391,16 @@ snapshots: - aws-crt - encoding + cohere-ai@7.9.5(encoding@0.1.13): + dependencies: + form-data: 4.0.0 + js-base64: 3.7.2 + node-fetch: 2.7.0(encoding@0.1.13) + qs: 6.11.2 + url-join: 4.0.1 + transitivePeerDependencies: + - encoding + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -8376,6 +9514,8 @@ snapshots: data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@6.0.2: {} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -8406,6 +9546,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.3.5: dependencies: ms: 2.1.2 @@ -8460,6 +9604,12 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + del-cli@5.1.0: dependencies: del: 7.1.0 @@ -8488,6 +9638,8 @@ snapshots: detect-libc@2.0.3: {} + devtools-protocol@0.0.1286932: {} + diff-match-patch@1.0.5: {} diff-sequences@29.6.3: {} @@ -8701,6 +9853,14 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -8916,6 +10076,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.5.0: dependencies: estraverse: 5.3.0 @@ -9018,6 +10180,16 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + extract-zip@2.0.1: + dependencies: + debug: 4.3.5 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -9038,10 +10210,19 @@ snapshots: dependencies: strnum: 1.0.5 + fast-xml-parser@4.4.0: + dependencies: + strnum: 1.0.5 + optional: true + fastq@1.17.1: dependencies: reusify: 1.0.4 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -9156,6 +10337,12 @@ snapshots: fs-constants@1.0.0: {} + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@2.1.2: dependencies: graceful-fs: 4.2.11 @@ -9228,6 +10415,10 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -9242,6 +10433,15 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.3: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.3.5 + fs-extra: 11.2.0 + transitivePeerDependencies: + - supports-color + github-from-package@0.0.0: {} github-url-from-git@1.5.0: {} @@ -9257,7 +10457,7 @@ snapshots: glob@10.4.1: dependencies: foreground-child: 3.1.1 - jackspeak: 3.1.2 + jackspeak: 3.4.0 minimatch: 9.0.4 minipass: 7.1.2 path-scurry: 1.11.1 @@ -9380,7 +10580,7 @@ snapshots: decircular: 0.1.1 is-obj: 3.0.0 sort-keys: 5.0.0 - type-fest: 4.18.3 + type-fest: 4.19.0 hasown@2.0.2: dependencies: @@ -9408,6 +10608,13 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -9556,6 +10763,11 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + ipaddr.js@1.9.1: {} is-absolute-url@4.0.1: {} @@ -9779,7 +10991,7 @@ snapshots: reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - jackspeak@3.1.2: + jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -9801,6 +11013,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@1.1.0: {} + jsesc@0.5.0: {} jsesc@3.0.2: {} @@ -9839,6 +11053,12 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsonpointer@5.0.1: {} jsonrepair@3.8.0: {} @@ -9878,17 +11098,17 @@ snapshots: ky@1.3.0: {} - langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): + langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) - '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 @@ -9897,40 +11117,42 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@browserbasehq/sdk': 1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@notionhq/client': 2.2.15(encoding@0.1.13) '@pinecone-database/pinecone': 2.2.2 assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) axios: 1.7.2 - chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) - fast-xml-parser: 4.2.5 + chromadb: 1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + fast-xml-parser: 4.4.0 ignore: 5.3.1 mammoth: 1.7.2 - mongodb: 6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + mongodb: 6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3) ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - encoding - openai - langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): + langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) - '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) + '@langchain/openai': 0.1.2(encoding@0.1.13)(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + '@langchain/textsplitters': 0.0.3(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 9.0.1 - yaml: 2.4.2 + yaml: 2.4.3 zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: + '@browserbasehq/sdk': 1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@notionhq/client': 2.2.15(encoding@0.1.13) ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: @@ -9940,7 +11162,7 @@ snapshots: langchainhub@0.0.11: {} - ? langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + ? langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) : dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -9948,11 +11170,11 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) - langchain: 0.2.4(@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.2.5)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langchain: 0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) openai: 4.47.3(encoding@0.1.13) - langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)): + langsmith@0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)): dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -9960,9 +11182,9 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) - langchain: 0.2.4(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - openai: 4.47.3(encoding@0.1.13) + '@langchain/core': 0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) + langchain: 0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + openai: 4.49.0(encoding@0.1.13) language-subtag-registry@0.3.23: {} @@ -10054,7 +11276,7 @@ snapshots: - zen-observable - zenObservable - llamaindex@0.3.15(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(typescript@5.4.5)(utf-8-validate@6.0.4): + llamaindex@0.3.15(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4): dependencies: '@anthropic-ai/sdk': 0.20.9(encoding@0.1.13) '@aws-crypto/sha256-js': 5.2.0 @@ -10076,14 +11298,14 @@ snapshots: '@zilliz/milvus2-sdk-node': 2.4.2 ajv: 8.14.0 assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) - chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) - cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.590.0)(encoding@0.1.13) + chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13) js-tiktoken: 1.0.12 lodash: 4.17.21 magic-bytes.js: 1.10.0 mammoth: 1.7.2 md-utils-ts: 2.0.0 - mongodb: 6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + mongodb: 6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3) notion-md-crawler: 1.0.0(encoding@0.1.13) openai: 4.47.3(encoding@0.1.13) papaparse: 5.4.1 @@ -10115,6 +11337,65 @@ snapshots: - typescript - utf-8-validate + llamaindex@0.3.16(@aws-sdk/credential-providers@3.592.0)(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4): + dependencies: + '@anthropic-ai/sdk': 0.21.1(encoding@0.1.13) + '@aws-crypto/sha256-js': 5.2.0 + '@datastax/astra-db-ts': 1.2.1 + '@google-cloud/vertexai': 1.2.0(encoding@0.1.13) + '@google/generative-ai': 0.12.0 + '@grpc/grpc-js': 1.10.8 + '@huggingface/inference': 2.7.0 + '@llamaindex/cloud': 0.0.5(node-fetch@3.3.2) + '@llamaindex/env': 0.1.3(@aws-crypto/sha256-js@5.2.0)(pathe@1.1.2) + '@mistralai/mistralai': 0.4.0(encoding@0.1.13) + '@notionhq/client': 2.2.15(encoding@0.1.13) + '@pinecone-database/pinecone': 2.2.2 + '@qdrant/js-client-rest': 1.9.0(typescript@5.4.5) + '@types/lodash': 4.17.4 + '@types/papaparse': 5.3.14 + '@types/pg': 8.11.6 + '@xenova/transformers': 2.17.2 + '@zilliz/milvus2-sdk-node': 2.4.2 + ajv: 8.16.0 + assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) + chromadb: 1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)) + cohere-ai: 7.9.5(encoding@0.1.13) + js-tiktoken: 1.0.12 + lodash: 4.17.21 + magic-bytes.js: 1.10.0 + mammoth: 1.7.2 + md-utils-ts: 2.0.0 + mongodb: 6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3) + notion-md-crawler: 1.0.0(encoding@0.1.13) + openai: 4.49.0(encoding@0.1.13) + papaparse: 5.4.1 + pathe: 1.1.2 + pdf2json: 3.1.3 + pg: 8.12.0 + pgvector: 0.1.8 + portkey-ai: 0.1.16 + rake-modified: 1.0.8 + string-strip-html: 13.4.8 + wikipedia: 2.1.2 + wink-nlp: 2.3.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bufferutil + - debug + - encoding + - gcp-metadata + - kerberos + - mongodb-client-encryption + - node-fetch + - pg-native + - snappy + - socks + - supports-color + - typescript + - utf-8-validate + load-tsconfig@0.2.5: {} locate-character@3.0.0: {} @@ -10202,6 +11483,8 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + lru-cache@9.1.2: {} magic-bytes.js@1.10.0: {} @@ -10309,6 +11592,8 @@ snapshots: minipass@7.1.2: {} + mitt@3.0.1: {} + mkdirp-classic@0.5.3: {} ml-array-mean@1.1.6: @@ -10339,13 +11624,23 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.7.0(@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)): + mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3): + dependencies: + '@mongodb-js/saslprep': 1.1.7 + bson: 6.7.0 + mongodb-connection-string-url: 3.0.1 + optionalDependencies: + '@aws-sdk/credential-providers': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) + socks: 2.8.3 + + mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3): dependencies: '@mongodb-js/saslprep': 1.1.7 bson: 6.7.0 mongodb-connection-string-url: 3.0.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/credential-providers': 3.592.0 + socks: 2.8.3 ms@2.0.0: {} @@ -10377,6 +11672,8 @@ snapshots: negotiator@0.6.3: {} + netmask@2.0.2: {} + new-github-release-url@2.0.0: dependencies: type-fest: 2.19.0 @@ -10630,7 +11927,20 @@ snapshots: openai@4.47.3(encoding@0.1.13): dependencies: - '@types/node': 18.19.33 + '@types/node': 18.19.34 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + + openai@4.49.0(encoding@0.1.13): + dependencies: + '@types/node': 18.19.34 '@types/node-fetch': 2.6.11 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -10729,6 +12039,24 @@ snapshots: p-try@2.2.0: {} + pac-proxy-agent@7.0.1: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.1 + debug: 4.3.5 + get-uri: 6.0.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.3 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json@8.1.1: dependencies: got: 12.6.1 @@ -10755,7 +12083,7 @@ snapshots: dependencies: '@babel/code-frame': 7.24.6 index-to-position: 0.1.2 - type-fest: 4.18.3 + type-fest: 4.19.0 parseurl@1.3.3: {} @@ -10788,6 +12116,10 @@ snapshots: pdf2json@3.0.5: {} + pdf2json@3.1.3: {} + + pend@1.2.0: {} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 @@ -10873,13 +12205,13 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5)): dependencies: lilconfig: 3.1.1 - yaml: 2.4.2 + yaml: 2.4.3 optionalDependencies: postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.13.0)(typescript@5.4.5) + ts-node: 10.9.2(@types/node@20.14.2)(typescript@5.4.5) postcss@8.4.38: dependencies: @@ -10926,7 +12258,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.3.0: {} + prettier@3.3.1: {} pretty-format@29.7.0: dependencies: @@ -10936,6 +12268,8 @@ snapshots: process-nextick-args@2.0.1: {} + progress@2.0.3: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -10957,7 +12291,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 - '@types/node': 20.13.0 + '@types/node': 20.14.2 long: 4.0.0 protobufjs@7.3.0: @@ -10972,7 +12306,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.13.0 + '@types/node': 20.14.2 long: 5.2.3 proxy-addr@2.0.7: @@ -10980,6 +12314,19 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.4.0: + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.3 + transitivePeerDependencies: + - supports-color + proxy-from-env@1.1.0: {} psl@1.9.0: {} @@ -10995,6 +12342,18 @@ snapshots: dependencies: escape-goat: 4.0.0 + puppeteer-core@22.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): + dependencies: + '@puppeteer/browsers': 2.2.3 + chromium-bidi: 0.5.19(devtools-protocol@0.0.1286932) + debug: 4.3.4 + devtools-protocol: 0.0.1286932 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + qs@6.11.0: dependencies: side-channel: 1.0.6 @@ -11076,7 +12435,7 @@ snapshots: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 - type-fest: 4.18.3 + type-fest: 4.19.0 read-pkg-up@7.0.1: dependencies: @@ -11109,7 +12468,7 @@ snapshots: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.1 parse-json: 8.1.0 - type-fest: 4.18.3 + type-fest: 4.19.0 unicorn-magic: 0.1.0 readable-stream@2.3.8: @@ -11326,6 +12685,10 @@ snapshots: semver@6.3.1: {} + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + semver@7.6.2: {} send@0.18.0: @@ -11443,6 +12806,21 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.3: + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + solid-js@1.8.17: dependencies: csstype: 3.1.3 @@ -11460,6 +12838,9 @@ snapshots: source-map-js@1.2.0: {} + source-map@0.6.1: + optional: true + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -11486,9 +12867,16 @@ snapshots: sprintf-js@1.0.3: {} - sswr@2.0.0(svelte@4.2.17): + sprintf-js@1.1.3: {} + + sswr@2.0.0(svelte@4.2.18): + dependencies: + svelte: 4.2.18 + swrev: 4.0.0 + + sswr@2.1.0(svelte@4.2.18): dependencies: - svelte: 4.2.17 + svelte: 4.2.18 swrev: 4.0.0 stack-trace@0.0.10: {} @@ -11666,7 +13054,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte@4.2.17: + svelte@4.2.18: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.4.15 @@ -11711,6 +13099,14 @@ snapshots: pump: 3.0.0 tar-stream: 2.2.0 + tar-fs@3.0.5: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.1 + bare-path: 2.1.3 + tar-fs@3.0.6: dependencies: pump: 3.0.0 @@ -11813,14 +13209,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5): + ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.13.0 + '@types/node': 20.14.2 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -11842,7 +13238,9 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5))(typescript@5.4.5): + tslib@2.6.3: {} + + tsup@8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(typescript@5.4.5): dependencies: bundle-require: 4.2.1(esbuild@0.21.4) cac: 6.7.14 @@ -11852,7 +13250,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.13.0)(typescript@5.4.5)) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5)) resolve-from: 5.0.0 rollup: 4.18.0 source-map: 0.8.0-beta.0 @@ -11865,7 +13263,7 @@ snapshots: - supports-color - ts-node - tsx@4.11.0: + tsx@4.13.0: dependencies: esbuild: 0.21.4 get-tsconfig: 4.7.5 @@ -11901,7 +13299,7 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.18.3: {} + type-fest@4.19.0: {} type-is@1.6.18: dependencies: @@ -11957,6 +13355,11 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + underscore@1.13.6: {} undici-types@5.26.5: {} @@ -11973,6 +13376,8 @@ snapshots: universalify@0.2.0: {} + universalify@2.0.1: {} + unpipe@1.0.0: {} update-browserslist-db@1.0.16(browserslist@4.23.0): @@ -12007,6 +13412,8 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + urlpattern-polyfill@10.0.0: {} + use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 @@ -12035,13 +13442,13 @@ snapshots: vary@1.1.2: {} - vite-node@2.0.0-beta.3(@types/node@20.13.0): + vite-node@2.0.0-beta.3(@types/node@20.14.2): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.2.12(@types/node@20.13.0) + vite: 5.2.12(@types/node@20.14.2) transitivePeerDependencies: - '@types/node' - less @@ -12052,16 +13459,16 @@ snapshots: - supports-color - terser - vite@5.2.12(@types/node@20.13.0): + vite@5.2.12(@types/node@20.14.2): dependencies: esbuild: 0.21.4 postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: - '@types/node': 20.13.0 + '@types/node': 20.14.2 fsevents: 2.3.3 - vitest@2.0.0-beta.3(@types/node@20.13.0): + vitest@2.0.0-beta.3(@types/node@20.14.2): dependencies: '@vitest/expect': 2.0.0-beta.3 '@vitest/runner': 2.0.0-beta.3 @@ -12077,11 +13484,11 @@ snapshots: std-env: 3.7.0 tinybench: 2.8.0 tinypool: 0.9.0 - vite: 5.2.12(@types/node@20.13.0) - vite-node: 2.0.0-beta.3(@types/node@20.13.0) + vite: 5.2.12(@types/node@20.14.2) + vite-node: 2.0.0-beta.3(@types/node@20.14.2) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.13.0 + '@types/node': 20.14.2 transitivePeerDependencies: - less - lightningcss @@ -12272,6 +13679,8 @@ snapshots: yaml@2.4.2: {} + yaml@2.4.3: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -12286,6 +13695,11 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -12299,6 +13713,13 @@ snapshots: zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-stream@1.0.3(openai@4.49.0(encoding@0.1.13))(zod@3.23.8): + dependencies: + openai: 4.49.0(encoding@0.1.13) + schema-stream: 3.1.0(zod@3.23.8) + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + zod-to-json-schema@3.22.5(zod@3.23.8): dependencies: zod: 3.23.8 @@ -12315,4 +13736,6 @@ snapshots: dependencies: zod: 3.23.8 + zod@3.22.4: {} + zod@3.23.8: {} diff --git a/readme.md b/readme.md index 0868f1b27..bc7727f12 100644 --- a/readme.md +++ b/readme.md @@ -175,6 +175,7 @@ Note that many of these clients expose multiple AI functions. - sdks - modelfusion - services + - browserbase - [phantombuster](https://phantombuster.com) - perplexity - valtown @@ -186,14 +187,22 @@ Note that many of these clients expose multiple AI functions. - pull from [nango](https://docs.nango.dev/integrations/overview) - pull from [activepieces](https://github.com/activepieces/activepieces/tree/main/packages/pieces/community) - general openapi support ala [workgpt](https://github.com/team-openpm/workgpt) -- tools / chains / flows / runnables +- compound tools / chains / flows / runnables - market maps -- https://github.com/causaly/zod-validation-error +- incorporate [zod-validation-error](https://github.com/causaly/zod-validation-error) - investigate [autotool](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/autotool) - investigate [data connectors](https://github.com/mendableai/data-connectors) +## Contributors + +- [Travis Fischer](https://x.com/transitive_bs) +- [Kevin Raheja](https://x.com/crabfisher) +- [David Zhang](https://x.com/dzhng) +- [Philipp Burckhardt](https://x.com/burckhap) +- [Riley Tomasek](https://x.com/rileytomasek) + ## License -MIT © [Travis Fischer](https://twitter.com/transitive_bs) +MIT © [Travis Fischer](https://x.com/transitive_bs) -To stay up to date or learn more, follow [@transitive_bs](https://twitter.com/transitive_bs) on Twitter. +To stay up to date or learn more, follow [@transitive_bs](https://x.com/transitive_bs) on Twitter. diff --git a/src/fns.ts b/src/fns.ts index 55422f710..7f420da50 100644 --- a/src/fns.ts +++ b/src/fns.ts @@ -1,5 +1,3 @@ -import './symbol-polyfill.js' - import type { z } from 'zod' import type * as types from './types.js' @@ -14,6 +12,27 @@ export interface PrivateAIFunctionMetadata { methodName: string } +// Polyfill for `Symbol.metadata` +// https://github.com/microsoft/TypeScript/issues/53461 +declare global { + interface SymbolConstructor { + readonly metadata: unique symbol + } +} + +;(Symbol as any).metadata ??= Symbol.for('Symbol.metadata') + +const _metadata = Object.create(null) + +if (typeof Symbol === 'function' && Symbol.metadata) { + Object.defineProperty(globalThis, Symbol.metadata, { + enumerable: true, + configurable: true, + writable: true, + value: _metadata + }) +} + export abstract class AIFunctionsProvider { private _functions?: AIFunctionSet @@ -72,6 +91,7 @@ export function aiFunction< if (!context.metadata.invocables) { context.metadata.invocables = [] } + ;(context.metadata.invocables as PrivateAIFunctionMetadata[]).push({ name: name ?? methodName, description, @@ -79,12 +99,6 @@ export function aiFunction< methodName }) - // console.log({ - // name, - // methodName, - // context - // }) - context.addInitializer(function () { ;(this as any)[methodName] = (this as any)[methodName].bind(this) }) diff --git a/src/symbol-polyfill.ts b/src/symbol-polyfill.ts deleted file mode 100644 index 82fe04c91..000000000 --- a/src/symbol-polyfill.ts +++ /dev/null @@ -1,29 +0,0 @@ -// https://github.com/microsoft/TypeScript/issues/53461 -// symbol-polyfill.ts - -declare global { - interface SymbolConstructor { - readonly metadata: unique symbol - } -} - -;(Symbol as any).metadata ??= Symbol.for('Symbol.metadata') - -const _metadata = Object.create(null) - -if (typeof Symbol === 'function' && Symbol.metadata) { - Object.defineProperty(globalThis, Symbol.metadata, { - enumerable: true, - configurable: true, - writable: true, - value: _metadata - }) -} - -// export {}; -// declare global { -// interface SymbolConstructor { -// readonly metadata: unique symbol -// } -// } -// (Symbol as any).metadata ??= Symbol.for("Symbol.metadata") diff --git a/src/utils.ts b/src/utils.ts index dd4404923..3cd4b82b6 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -122,7 +122,7 @@ export function sanitizeSearchParams( } return [[key, String(value)]] - }) + }) as [string, string][] ) } From a79b04399c10383f6e01b58e24fe69ad2040c444 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Fri, 7 Jun 2024 00:42:55 -0500 Subject: [PATCH 81/81] feat: update example imports --- examples/ai-sdk/weather.ts | 5 +- examples/dexter/analyze.ts | 6 +- examples/dexter/code-interpreter.ts | 5 +- examples/dexter/election-news.ts | 5 +- examples/dexter/weather.ts | 5 +- examples/genkit/weather.ts | 5 +- examples/langchain/weather.ts | 5 +- examples/llamaindex/weather.ts | 5 +- examples/openai/weather.ts | 3 +- examples/package.json | 21 +- examples/tsconfig.json | 2 +- package.json | 6 +- pnpm-lock.yaml | 1826 ++++++--------------------- src/index.ts | 1 + 14 files changed, 413 insertions(+), 1487 deletions(-) diff --git a/examples/ai-sdk/weather.ts b/examples/ai-sdk/weather.ts index 0ef7ae4b3..1fb6e3fd8 100644 --- a/examples/ai-sdk/weather.ts +++ b/examples/ai-sdk/weather.ts @@ -1,12 +1,11 @@ #!/usr/bin/env node import 'dotenv/config' +import { WeatherClient } from '@agentic/stdlib' +import { createAISDKTools } from '@agentic/stdlib/ai-sdk' import { openai } from '@ai-sdk/openai' import { generateText } from 'ai' -import { WeatherClient } from '../../src/index.js' -import { createAISDKTools } from '../../src/sdks/ai-sdk.js' - async function main() { const weather = new WeatherClient() diff --git a/examples/dexter/analyze.ts b/examples/dexter/analyze.ts index f8df18ec7..ec03b3bff 100644 --- a/examples/dexter/analyze.ts +++ b/examples/dexter/analyze.ts @@ -1,12 +1,10 @@ #!/usr/bin/env node import 'dotenv/config' +import { DiffbotClient, SearchAndCrawl, SerpAPIClient } from '@agentic/stdlib' +import { createDexterFunctions } from '@agentic/stdlib/dexter' import { ChatModel, createAIRunner } from '@dexaai/dexter' -import { DiffbotClient, SerpAPIClient } from '../../src/index.js' -import { createDexterFunctions } from '../../src/sdks/dexter.js' -import { SearchAndCrawl } from '../../src/tools/search-and-crawl.js' - async function main() { const serpapi = new SerpAPIClient() const diffbot = new DiffbotClient() diff --git a/examples/dexter/code-interpreter.ts b/examples/dexter/code-interpreter.ts index 1bdb59fcf..ffd1e2545 100644 --- a/examples/dexter/code-interpreter.ts +++ b/examples/dexter/code-interpreter.ts @@ -1,11 +1,10 @@ #!/usr/bin/env node import 'dotenv/config' +import { createDexterFunctions } from '@agentic/stdlib/dexter' +import { e2b } from '@agentic/stdlib/e2b' import { ChatModel, createAIRunner } from '@dexaai/dexter' -import { createDexterFunctions } from '../../src/sdks/dexter.js' -import { e2b } from '../../src/tools/e2b.js' - async function main() { const runner = createAIRunner({ chatModel: new ChatModel({ diff --git a/examples/dexter/election-news.ts b/examples/dexter/election-news.ts index a19fa50b6..64ea15225 100644 --- a/examples/dexter/election-news.ts +++ b/examples/dexter/election-news.ts @@ -1,11 +1,10 @@ #!/usr/bin/env node import 'dotenv/config' +import { PerigonClient, SerperClient } from '@agentic/stdlib' +import { createDexterFunctions } from '@agentic/stdlib/dexter' import { ChatModel, createAIRunner } from '@dexaai/dexter' -import { PerigonClient, SerperClient } from '../../src/index.js' -import { createDexterFunctions } from '../../src/sdks/dexter.js' - async function main() { const perigon = new PerigonClient() const serper = new SerperClient() diff --git a/examples/dexter/weather.ts b/examples/dexter/weather.ts index e762d3f6c..1b995af58 100644 --- a/examples/dexter/weather.ts +++ b/examples/dexter/weather.ts @@ -1,11 +1,10 @@ #!/usr/bin/env node import 'dotenv/config' +import { WeatherClient } from '@agentic/stdlib' +import { createDexterFunctions } from '@agentic/stdlib/dexter' import { ChatModel, createAIRunner } from '@dexaai/dexter' -import { WeatherClient } from '../../src/index.js' -import { createDexterFunctions } from '../../src/sdks/dexter.js' - async function main() { const weather = new WeatherClient() diff --git a/examples/genkit/weather.ts b/examples/genkit/weather.ts index 7f6557fa9..859f55cb9 100644 --- a/examples/genkit/weather.ts +++ b/examples/genkit/weather.ts @@ -1,13 +1,12 @@ #!/usr/bin/env node import 'dotenv/config' +import { WeatherClient } from '@agentic/stdlib' +import { createGenkitTools } from '@agentic/stdlib/genkit' import { generate } from '@genkit-ai/ai' import { configureGenkit } from '@genkit-ai/core' import { gpt4o, openAI } from 'genkitx-openai' -import { WeatherClient } from '../../src/index.js' -import { createGenkitTools } from '../../src/sdks/genkit.js' - async function main() { const weather = new WeatherClient() diff --git a/examples/langchain/weather.ts b/examples/langchain/weather.ts index 112c90af4..61205bbd0 100644 --- a/examples/langchain/weather.ts +++ b/examples/langchain/weather.ts @@ -1,13 +1,12 @@ #!/usr/bin/env node import 'dotenv/config' +import { WeatherClient } from '@agentic/stdlib' +import { createLangChainTools } from '@agentic/stdlib/langchain' import { ChatPromptTemplate } from '@langchain/core/prompts' import { ChatOpenAI } from '@langchain/openai' import { AgentExecutor, createToolCallingAgent } from 'langchain/agents' -import { WeatherClient } from '../../src/index.js' -import { createLangChainTools } from '../../src/sdks/langchain.js' - async function main() { const weather = new WeatherClient() diff --git a/examples/llamaindex/weather.ts b/examples/llamaindex/weather.ts index f4d2be38f..970cc8052 100644 --- a/examples/llamaindex/weather.ts +++ b/examples/llamaindex/weather.ts @@ -1,11 +1,10 @@ #!/usr/bin/env node import 'dotenv/config' +import { WeatherClient } from '@agentic/stdlib' +import { createLlamaIndexTools } from '@agentic/stdlib/llamaindex' import { OpenAI, OpenAIAgent } from 'llamaindex' -import { WeatherClient } from '../../src/index.js' -import { createLlamaIndexTools } from '../../src/sdks/llamaindex.js' - async function main() { const weather = new WeatherClient() diff --git a/examples/openai/weather.ts b/examples/openai/weather.ts index 6b11ccbc5..66a3ca106 100644 --- a/examples/openai/weather.ts +++ b/examples/openai/weather.ts @@ -1,10 +1,9 @@ #!/usr/bin/env node import 'dotenv/config' +import { assert, WeatherClient } from '@agentic/stdlib' import OpenAI from 'openai' -import { assert, WeatherClient } from '../../src/index.js' - async function main() { const weather = new WeatherClient() const openai = new OpenAI() diff --git a/examples/package.json b/examples/package.json index b25a931e5..4e65fa49e 100644 --- a/examples/package.json +++ b/examples/package.json @@ -24,19 +24,20 @@ "test:typecheck": "tsc --noEmit" }, "dependencies": { - "@ai-sdk/openai": "^0.0.18", - "@dexaai/dexter": "^2.0.3", + "@agentic/stdlib": "workspace:*", + "@ai-sdk/openai": "^0.0.24", + "@dexaai/dexter": "^2.1.0", "@genkit-ai/ai": "^0.5.2", "@genkit-ai/core": "^0.5.2", "@instructor-ai/instructor": "^1.3.0", - "@langchain/core": "^0.2.5", - "@langchain/openai": "^0.1.1", - "ai": "^3.1.22", + "@langchain/core": "^0.2.6", + "@langchain/openai": "^0.1.2", + "ai": "^3.1.30", "dotenv": "^16.4.5", - "genkitx-openai": "^0.9.0", - "langchain": "^0.2.4", - "llamaindex": "^0.3.15", - "openai": "^4.47.3", - "zod": "^3.23.3" + "genkitx-openai": "^0.10.0", + "langchain": "^0.2.5", + "llamaindex": "^0.3.16", + "openai": "^4.49.0", + "zod": "^3.23.8" } } diff --git a/examples/tsconfig.json b/examples/tsconfig.json index e46af6401..157591203 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "../tsconfig.json", - "include": ["ai-sdk", "dexter"] + "include": ["ai-sdk", "dexter", "genkit", "langchain", "llamaindex", "openai"] } diff --git a/package.json b/package.json index 650ead213..2cc002408 100644 --- a/package.json +++ b/package.json @@ -133,10 +133,10 @@ "@dexaai/dexter": "^2.0.3", "@e2b/code-interpreter": "^0.0.7", "@genkit-ai/ai": "^0.5.2", - "@langchain/core": "^0.2.5", - "ai": "^3.1.22", + "@langchain/core": "^0.2.6", + "ai": "^3.1.30", "expr-eval": "^2.0.2", - "llamaindex": "^0.3.15", + "llamaindex": "^0.3.16", "twitter-api-sdk": "^1.2.1" }, "peerDependenciesMeta": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 01c046be6..78dfb98a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,11 +144,14 @@ importers: examples: dependencies: + '@agentic/stdlib': + specifier: workspace:* + version: link:.. '@ai-sdk/openai': - specifier: ^0.0.18 - version: 0.0.18(zod@3.23.8) + specifier: ^0.0.24 + version: 0.0.24(zod@3.23.8) '@dexaai/dexter': - specifier: ^2.0.3 + specifier: ^2.1.0 version: 2.1.0 '@genkit-ai/ai': specifier: ^0.5.2 @@ -158,51 +161,42 @@ importers: version: 0.5.2 '@instructor-ai/instructor': specifier: ^1.3.0 - version: 1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) + version: 1.3.0(openai@4.49.0(encoding@0.1.13))(zod@3.23.8) '@langchain/core': - specifier: ^0.2.5 - version: 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + specifier: ^0.2.6 + version: 0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) '@langchain/openai': - specifier: ^0.1.1 - version: 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + specifier: ^0.1.2 + version: 0.1.2(encoding@0.1.13)(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) ai: - specifier: ^3.1.22 - version: 3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) + specifier: ^3.1.30 + version: 3.1.30(openai@4.49.0(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8) dotenv: specifier: ^16.4.5 version: 16.4.5 genkitx-openai: - specifier: ^0.9.0 - version: 0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13) + specifier: ^0.10.0 + version: 0.10.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13) langchain: - specifier: ^0.2.4 - version: 0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + specifier: ^0.2.5 + version: 0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) llamaindex: - specifier: ^0.3.15 - version: 0.3.15(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4) + specifier: ^0.3.16 + version: 0.3.16(@aws-sdk/credential-providers@3.592.0)(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4) openai: - specifier: ^4.47.3 - version: 4.47.3(encoding@0.1.13) + specifier: ^4.49.0 + version: 4.49.0(encoding@0.1.13) zod: - specifier: ^3.23.3 + specifier: ^3.23.8 version: 3.23.8 packages: - '@ai-sdk/openai@0.0.18': - resolution: {integrity: sha512-5iJ+/mbns0uLbNpACMYGUONUqQmqGJYrPbQvmGC+XVD4DZLvyZqBi0NDoQguOrZTz6u5O7rl51o9PDO+bEtmcA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - - '@ai-sdk/provider-utils@0.0.11': - resolution: {integrity: sha512-JRDrqL2FGDmLh+a4R5qbS8UrWN9Lt7DpDIY1x6owgXjXkz3Umm1czs1X32VlL0M1dpoSxu4hGBFtXd56+kDzXA==} + '@ai-sdk/openai@0.0.24': + resolution: {integrity: sha512-uLqisEHe6Xp45KXnxdTnwdq8UBJwU345GUdoR4QD/yhLWnoJZf9YSltIyWxaHIcrm4acLCxD5xoy+4L9jwXbBQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 - peerDependenciesMeta: - zod: - optional: true '@ai-sdk/provider-utils@0.0.13': resolution: {integrity: sha512-cB2dPm9flj+yin5sjBLFcXdW8sZtAXLE/OLKgz9uHpHM55s7mnwZrDGfO6ot/ukHTxDDJunZLW7qSjgK/u0F1g==} @@ -217,23 +211,13 @@ packages: resolution: {integrity: sha512-NzkrtREQpHID1cTqY/C4CI30PVOaXWKYytDR2EcytmFgnP7Z6+CrGIA/YCnNhYAuUm6Nx+nGpRL/Hmyrv7NYzg==} engines: {node: '>=18'} - '@ai-sdk/provider@0.0.8': - resolution: {integrity: sha512-+gcMvyPUDfDXV9caN3CG5Le0M5K4CjqTdMV1ODg/AosApQiJW9ByN5imJPdI043zVdt+HS9WG+s0j4am7ca4bg==} - engines: {node: '>=18'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@anthropic-ai/sdk@0.20.9': - resolution: {integrity: sha512-Lq74+DhiEQO6F9/gdVOLmHx57pX45ebK2Q/zH14xYe1157a7QeUVknRqIp0Jz5gQI01o7NKbuv9Dag2uQsLjDg==} - '@anthropic-ai/sdk@0.21.1': resolution: {integrity: sha512-fqdt74RTdplnaFOYhwNjjK/Ec09Dqv9ekYr7PuC6GdhV1RWkziqbpJBewn42CYYqCr92JeX6g+IXVgXmq9l7XQ==} - '@aws-crypto/crc32@3.0.0': - resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} - '@aws-crypto/ie11-detection@3.0.0': resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} @@ -256,54 +240,26 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.590.0': - resolution: {integrity: sha512-Nfn23x7yZgp1umB+Avvsw9t8XIFWEqNQcpJ10Q8RcI9bQ0SvR4OcnnVsBA0WFL53FVzVM2FAkjNrCMRaSe6xWw==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-cognito-identity@3.592.0': resolution: {integrity: sha512-mk3JOBsk5hlrLTZFuoGIhFKFflOdxqMKmOgyUFs5+gBLuH0/lN3wNWJxk+BiY1nHzkxhBND1hDHc5dvZRugBJA==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sagemaker@3.590.0': - resolution: {integrity: sha512-PfzwrG12MS0hkBrH9dDRtTpYx2eAlzO9yZtBpz4CuCRToMFbFCga+A8a3pgJoimfwcuGTKjGwmkIx1/sdpsIsg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/client-sso-oidc@3.590.0': - resolution: {integrity: sha512-3yCLPjq6WFfDpdUJKk/gSz4eAPDTjVknXaveMPi2QoVBCshneOnJsV16uNKlpVF1frTHrrDRfKYmbaVh6nFBvQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.592.0': resolution: {integrity: sha512-11Zvm8nm0s/UF3XCjzFRpQU+8FFVW5rcr3BHfnH6xAe5JEoN6bJN/n+wOfnElnjek+90hh+Qc7s141AMrCjiiw==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso@3.590.0': - resolution: {integrity: sha512-6xbC6oQVJKBRTyXyR3C15ksUsPOyW4p+uCj7dlKYWGJvh4vGTV8KhZKS53oPG8t4f1+OMJWjr5wKuXRoaFsmhQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso@3.592.0': resolution: {integrity: sha512-w+SuW47jQqvOC7fonyjFjsOh3yjqJ+VpWdVrmrl0E/KryBE7ho/Wn991Buf/EiHHeJikoWgHsAIPkBH29+ntdA==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.590.0': - resolution: {integrity: sha512-f4R1v1LSn4uLYZ5qj4DyL6gp7PXXzJeJsm2seheiJX+53LSF5L7XSDnQVtX1p9Tevv0hp2YUWUTg6QYwIVSuGg==} - engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.592.0': resolution: {integrity: sha512-KUrOdszZfcrlpKr4dpdkGibZ/qq3Lnfu1rjv1U+V1QJQ9OuMo9J3sDWpWV9tigNqY0aGllarWH5cJbz9868W/w==} engines: {node: '>=16.0.0'} - '@aws-sdk/core@3.588.0': - resolution: {integrity: sha512-O1c2+9ce46Z+iiid+W3iC1IvPbfIo5ev9CBi54GdNB9SaI8/3+f8MJcux0D6c9toCF0ArMersN/gp8ek57e9uQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/core@3.592.0': resolution: {integrity: sha512-gLPMXR/HXDP+9gXAt58t7gaMTvRts9i6Q7NMISpkGF54wehskl5WGrbdtHJFylrlJ5BQo3XVY6i661o+EuR1wg==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.590.0': - resolution: {integrity: sha512-28vRC0BYaDVWU9AzGBywTRmwiwQfkixfOZGcY6e5J6cRjVoawomvHmC2mJd11SjoDcVLUQF+z4Z9z1ZCr1GcpA==} - engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.592.0': resolution: {integrity: sha512-uHiMPCkFhZOhlSfKgVqPhMdruiOuVkLUn07gQqvxHYhFKkEOPV+6BZbPKBwBTXr8TIREztQzCMPswa5pGk2zbQ==} engines: {node: '>=16.0.0'} @@ -316,22 +272,12 @@ packages: resolution: {integrity: sha512-Su1SRWVRCuR1e32oxX3C1V4c5hpPN20WYcRfdcr2wXwHqSvys5DrnmuCC+JoEnS/zt3adUJhPliTqpfKgSdMrA==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-ini@3.590.0': - resolution: {integrity: sha512-Y5cFciAK38VIvRgZeND7HvFNR32thGtQb8Xop6cMn33FC78uwcRIu9Hc9699XTclCZqz4+Xl1WU+dZ+rnFn2AA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.590.0 - '@aws-sdk/credential-provider-ini@3.592.0': resolution: {integrity: sha512-3kG6ngCIOPbLJZZ3RV+NsU7HVK6vX1+1DrPJKj9fVlPYn7IXsk8NAaUT5885yC7+jKizjv0cWLrLKvAJV5gfUA==} engines: {node: '>=16.0.0'} peerDependencies: '@aws-sdk/client-sts': ^3.592.0 - '@aws-sdk/credential-provider-node@3.590.0': - resolution: {integrity: sha512-Ky38mNFoXobGrDQ11P3dU1e+q1nRJ7eZl8l15KUpvZCe/hOudbxQi/epQrCazD/gRYV2fTyczdLlZzB5ZZ8DhQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-node@3.592.0': resolution: {integrity: sha512-BguihBGTrEjVBQ07hm+ZsO29eNJaxwBwUZMftgGAm2XcMIEClNPfm5hydxu2BmA4ouIJQJ6nG8pNYghEumM+Aw==} engines: {node: '>=16.0.0'} @@ -340,10 +286,6 @@ packages: resolution: {integrity: sha512-V4xT3iCqkF8uL6QC4gqBJg/2asd/damswP1h9HCfqTllmPWzImS+8WD3VjgTLw5b0KbTy+ZdUhKc0wDnyzkzxg==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-sso@3.590.0': - resolution: {integrity: sha512-v+0j/I+je9okfwXsgmLppmwIE+TuMp5WqLz7r7PHz9KjzLyKaKTDvfllFD+8oPpBqnmOWiJ9qTGPkrfhB7a/fQ==} - engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-sso@3.592.0': resolution: {integrity: sha512-fYFzAdDHKHvhtufPPtrLdSv8lO6GuW3em6n3erM5uFdpGytNpjXvr3XGokIsuXcNkETAY/Xihg+G9ksNE8WJxQ==} engines: {node: '>=16.0.0'} @@ -354,10 +296,6 @@ packages: peerDependencies: '@aws-sdk/client-sts': ^3.587.0 - '@aws-sdk/credential-providers@3.590.0': - resolution: {integrity: sha512-Z4SHk/GCoM5JEJOH3+xr2I7VvPGdeGPHL1cck/UFIN1Fap1wT3uIsTW92Rhru2AvnhQnAPpDUOHO9/hDJk1MDA==} - engines: {node: '>=16.0.0'} - '@aws-sdk/credential-providers@3.592.0': resolution: {integrity: sha512-fHAt001Aemiy9p8VtLKWiPQ36g1YgiLC1pm31W+WmKxU663dbt2yYTIAyVOB1nQC7HrVCOZEg2FU0TtuZt/wXQ==} engines: {node: '>=16.0.0'} @@ -378,20 +316,10 @@ packages: resolution: {integrity: sha512-SyDomN+IOrygLucziG7/nOHkjUXES5oH5T7p8AboO8oakMQJdnudNXiYWTicQWO52R51U6CR27rcMPTGeMedYA==} engines: {node: '>=16.0.0'} - '@aws-sdk/protocol-http@3.374.0': - resolution: {integrity: sha512-9WpRUbINdGroV3HiZZIBoJvL2ndoWk39OfwxWs2otxByppJZNN14bg/lvCx5e8ggHUti7IBk5rb0nqQZ4m05pg==} - engines: {node: '>=14.0.0'} - deprecated: This package has moved to @smithy/protocol-http - '@aws-sdk/region-config-resolver@3.587.0': resolution: {integrity: sha512-93I7IPZtulZQoRK+O20IJ4a1syWwYPzoO2gc3v+/GNZflZPV3QJXuVbIm0pxBsu0n/mzKGUKqSOLPIaN098HcQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/signature-v4@3.374.0': - resolution: {integrity: sha512-2xLJvSdzcZZAg0lsDLUAuSQuihzK0dcxIK7WmfuJeF7DGKJFmp9czQmz5f3qiDz6IDQzvgK1M9vtJSVCslJbyQ==} - engines: {node: '>=14.0.0'} - deprecated: This package has moved to @smithy/signature-v4 - '@aws-sdk/token-providers@3.587.0': resolution: {integrity: sha512-ULqhbnLy1hmJNRcukANBWJmum3BbjXnurLPSFXoGdV0llXYlG55SzIla2VYqdveQEEjmsBuTZdFvXAtNpmS5Zg==} engines: {node: '>=16.0.0'} @@ -663,10 +591,6 @@ packages: resolution: {integrity: sha512-EH0dnoMRIBQzJEEOUWN03eWPSdLBFdsZA/am3eU+qYrnNyY9okUueOajZd79U48KwgFbqoFrCA9yHQ30DgfD8Q==} engines: {node: '>=18.0.0'} - '@google/generative-ai@0.11.5': - resolution: {integrity: sha512-DviMgrnljEKh6qkDT2pVFW+NEuVhggqBUoEnyy2PNL7l4ewxXRJubk3PctC9yPl1AdRIlhqP7E076QQt+IWuTg==} - engines: {node: '>=18.0.0'} - '@google/generative-ai@0.12.0': resolution: {integrity: sha512-krWjurjEUHSFhCX4lGHMOhbnpBfYZGU31mpHpPBQwcfWm0T+/+wxC4UCAJfkxxc3/HvGJVG8r4AqrffaeDHDlA==} engines: {node: '>=18.0.0'} @@ -744,26 +668,14 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@langchain/core@0.2.5': - resolution: {integrity: sha512-tMaKRFVewFn8crQwlbXGjT7hlMdX1yXHap1ebBx7Bb2C3C9AeZ+sXbX11m27yamypNlVVegwUcisw3YCaDkZJA==} - engines: {node: '>=18'} - '@langchain/core@0.2.6': resolution: {integrity: sha512-YB9F0vdi/PcgBLSKtDwQ3gV6w4xVfk4ph0U43Okz2dAapKfBkVVB0rzr/afYUt/WHs864MuaO8uLN64egSDtIA==} engines: {node: '>=18'} - '@langchain/openai@0.1.1': - resolution: {integrity: sha512-0M7GOA7+dPMQATn8UrYBUp0tWxBJjsJEdRPf+MhDD4jdK70qfC6tBbB/lrT0HchVnz5GFE7az4EUtSh8LiUgzA==} - engines: {node: '>=18'} - '@langchain/openai@0.1.2': resolution: {integrity: sha512-giydNZyEzUBrjZrmQRfnc2SI0+TyAjaVMd8wMKq8O4X/Y3BJd0LFlfD+3MM6Lyu/qaphZ1Ycfr7XR5hY0EcGqQ==} engines: {node: '>=18'} - '@langchain/textsplitters@0.0.2': - resolution: {integrity: sha512-6bQOuYHTGYlkgPY/8M5WPq4nnXZpEysGzRopQCYjg2WLcEoIPUMMrXsAaNNdvU3BOeMrhin8izvpDPD165hX6Q==} - engines: {node: '>=18'} - '@langchain/textsplitters@0.0.3': resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==} engines: {node: '>=18'} @@ -791,9 +703,6 @@ packages: pathe: optional: true - '@mistralai/mistralai@0.2.0': - resolution: {integrity: sha512-mYjE9NovwWdhSXd6KvOgjWUyka2qlxhuohsqhRN4rFtH2MdTDJhAeH3Aqvu3P9q71Xz9oBX2pNWrPVVzkgwZTg==} - '@mistralai/mistralai@0.4.0': resolution: {integrity: sha512-KmFzNro1RKxIFh19J3osmUQhucefBBauMXN5fa9doG6dT9OHR/moBvvn+riVlR7c0AVfuxO8Dfa03AyLYYzbyg==} @@ -828,17 +737,21 @@ packages: resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@opentelemetry/context-async-hooks@1.22.0': resolution: {integrity: sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.9.0' - '@opentelemetry/context-async-hooks@1.24.1': - resolution: {integrity: sha512-R5r6DO4kgEOVBxFXhXjwospLQkv+sYxwCfjvoZBe7Zm6KKXAV9kDSJhi/D1BweowdZmO+sdbENLs374gER8hpQ==} + '@opentelemetry/context-async-hooks@1.25.0': + resolution: {integrity: sha512-sBW313mnMyFg0cp/40BRzrZBWG+581s2j5gIsa5fgGadswyILk4mNFATsqrCOpAx945RDuZ2B7ThQLgor9OpfA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' '@opentelemetry/core@1.22.0': resolution: {integrity: sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==} @@ -846,11 +759,11 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.9.0' - '@opentelemetry/core@1.24.1': - resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} + '@opentelemetry/core@1.25.0': + resolution: {integrity: sha512-n0B3s8rrqGrasTgNkXLKXzN0fXo+6IYP7M5b7AMsrZM33f/y6DS6kJ0Btd7SespASWq8bgL3taLo0oe0vB52IQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' '@opentelemetry/exporter-trace-otlp-grpc@0.49.1': resolution: {integrity: sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==} @@ -924,11 +837,11 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.9.0' - '@opentelemetry/resources@1.24.1': - resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} + '@opentelemetry/resources@1.25.0': + resolution: {integrity: sha512-iHjydPMYJ+Li1auveJCq2rp5U2h6Mhq8BidiyE0jfVlDTFyR1ny8AfJHfmFzJ/RAM8vT8L7T21kcmGybxZC7lQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' '@opentelemetry/sdk-logs@0.49.1': resolution: {integrity: sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==} @@ -943,11 +856,11 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.9.0' - '@opentelemetry/sdk-metrics@1.24.1': - resolution: {integrity: sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==} + '@opentelemetry/sdk-metrics@1.25.0': + resolution: {integrity: sha512-IF+Sv4VHgBr/BPMKabl+GouJIhEqAOexCHgXVTISdz3q9P9H/uA8ScCF+22gitQ69aFtESbdYOV+Fen5+avQng==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' + '@opentelemetry/api': '>=1.3.0 <1.10.0' '@opentelemetry/sdk-node@0.49.1': resolution: {integrity: sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==} @@ -961,11 +874,11 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.9.0' - '@opentelemetry/sdk-trace-base@1.24.1': - resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} + '@opentelemetry/sdk-trace-base@1.25.0': + resolution: {integrity: sha512-6+g2fiRQUG39guCsKVeY8ToeuUf3YUnPkN6DXRA1qDmFLprlLvZm9cS6+chgbW70cZJ406FTtSCDnJwxDC5sGQ==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/api': '>=1.0.0 <1.10.0' '@opentelemetry/sdk-trace-node@1.22.0': resolution: {integrity: sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==} @@ -977,8 +890,8 @@ packages: resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.24.1': - resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} + '@opentelemetry/semantic-conventions@1.25.0': + resolution: {integrity: sha512-M+kkXKRAIAiAP6qYyesfrC5TOmDpDVtsxuGfPcqd9B/iBrac+E14jYwrgm0yZBUIbIP2OnqC3j+UgkXLm1vxUQ==} engines: {node: '>=14'} '@petamoriken/float16@3.8.7': @@ -1173,9 +1086,6 @@ packages: resolution: {integrity: sha512-q4A4d38v8pYYmseu/jTS3Z5I3zXlEOe5Obi+EJreVKgSVyWUHOd7/yaVCinC60QG4MRyCs98tcxBH1IMC0bu7Q==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-codec@1.1.0': - resolution: {integrity: sha512-3tEbUb8t8an226jKB6V/Q2XU/J53lCwCzULuBPEaF4JjSh+FlCMp7TmogE/Aij5J9DwlsZ4VAD/IRDuQ/0ZtMw==} - '@smithy/fetch-http-handler@3.0.1': resolution: {integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==} @@ -1186,10 +1096,6 @@ packages: '@smithy/invalid-dependency@3.0.0': resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==} - '@smithy/is-array-buffer@1.1.0': - resolution: {integrity: sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==} - engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} @@ -1230,10 +1136,6 @@ packages: resolution: {integrity: sha512-Tj3+oVhqdZgemjCiWjFlADfhvLF4C/uKDuKo7/tlEsRQ9+3emCreR2xndj970QSRSsiCEU8hZW3/8JQu+n5w4Q==} engines: {node: '>=16.0.0'} - '@smithy/protocol-http@1.2.0': - resolution: {integrity: sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==} - engines: {node: '>=14.0.0'} - '@smithy/protocol-http@4.0.0': resolution: {integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==} engines: {node: '>=16.0.0'} @@ -1254,10 +1156,6 @@ packages: resolution: {integrity: sha512-dAM7wSX0NR3qTNyGVN/nwwpEDzfV9T/3AN2eABExWmda5VqZKSsjlINqomO5hjQWGv+IIkoXfs3u2vGSNz8+Rg==} engines: {node: '>=16.0.0'} - '@smithy/signature-v4@1.1.0': - resolution: {integrity: sha512-fDo3m7YqXBs7neciOePPd/X9LPm5QLlDMdIC4m1H6dgNLnXfLMFNIxEfPyohGA8VW9Wn4X8lygnPSGxDZSmp0Q==} - engines: {node: '>=14.0.0'} - '@smithy/signature-v4@3.0.0': resolution: {integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==} engines: {node: '>=16.0.0'} @@ -1266,10 +1164,6 @@ packages: resolution: {integrity: sha512-tj4Ku7MpzZR8cmVuPcSbrLFVxmptWktmJMwST/uIEq4sarabEdF8CbmQdYB7uJ/X51Qq2EYwnRsoS7hdR4B7rA==} engines: {node: '>=16.0.0'} - '@smithy/types@1.2.0': - resolution: {integrity: sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==} - engines: {node: '>=14.0.0'} - '@smithy/types@3.0.0': resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==} engines: {node: '>=16.0.0'} @@ -1288,10 +1182,6 @@ packages: resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} - '@smithy/util-buffer-from@1.1.0': - resolution: {integrity: sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==} - engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} @@ -1316,18 +1206,10 @@ packages: resolution: {integrity: sha512-ZRT0VCOnKlVohfoABMc8lWeQo/JEFuPWctfNRXgTHbyOVssMOLYFUNWukxxiHRGVAhV+n3c0kPW+zUqckjVPEA==} engines: {node: '>=16.0.0'} - '@smithy/util-hex-encoding@1.1.0': - resolution: {integrity: sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==} - engines: {node: '>=14.0.0'} - '@smithy/util-hex-encoding@3.0.0': resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} - '@smithy/util-middleware@1.1.0': - resolution: {integrity: sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==} - engines: {node: '>=14.0.0'} - '@smithy/util-middleware@3.0.0': resolution: {integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==} engines: {node: '>=16.0.0'} @@ -1340,18 +1222,10 @@ packages: resolution: {integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==} engines: {node: '>=16.0.0'} - '@smithy/util-uri-escape@1.1.0': - resolution: {integrity: sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==} - engines: {node: '>=14.0.0'} - '@smithy/util-uri-escape@3.0.0': resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} engines: {node: '>=16.0.0'} - '@smithy/util-utf8@1.1.0': - resolution: {integrity: sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==} - engines: {node: '>=14.0.0'} - '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} @@ -1360,10 +1234,6 @@ packages: resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} engines: {node: '>=16.0.0'} - '@smithy/util-waiter@3.0.0': - resolution: {integrity: sha512-+fEXJxGDLCoqRKVSmo0auGxaqbiCo+8oph+4auefYjaNxjOLKSY2MxVQfRzo65PaZv4fr+5lWg+au7vSuJJ/zw==} - engines: {node: '>=16.0.0'} - '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -1609,30 +1479,6 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@3.1.22: - resolution: {integrity: sha512-Vgy490Q6p6pZ39VrRzL9ovr2N1YPsR+KvWNs+n73VAQoGBZtU/vwiiWrFU9LHXGhB9X+EBfQD0vixnTDS2dJWA==} - engines: {node: '>=18'} - peerDependencies: - openai: ^4.42.0 - react: ^18 || ^19 - solid-js: ^1.7.7 - svelte: ^3.0.0 || ^4.0.0 - vue: ^3.3.4 - zod: ^3.0.0 - peerDependenciesMeta: - openai: - optional: true - react: - optional: true - solid-js: - optional: true - svelte: - optional: true - vue: - optional: true - zod: - optional: true - ai@3.1.30: resolution: {integrity: sha512-6o3ttMqhO81y+8tibrvH+Z+38e5lM2O50sM8F1YBCYietZzFjkAg0VL/400lruyyzPjcxcGhGdBUBLe83iRxHg==} engines: {node: '>=18'} @@ -2041,21 +1887,6 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chromadb@1.7.3: - resolution: {integrity: sha512-3GgvQjpqgk5C89x5EuTDaXKbfrdqYDJ5UVyLQ3ZmwxnpetNc+HhRDGjkvXa5KSvpQ3lmKoyDoqnN4tZepfFkbw==} - engines: {node: '>=14.17.0'} - peerDependencies: - '@google/generative-ai': ^0.1.1 - cohere-ai: ^5.0.0 || ^6.0.0 || ^7.0.0 - openai: ^3.0.0 || ^4.0.0 - peerDependenciesMeta: - '@google/generative-ai': - optional: true - cohere-ai: - optional: true - openai: - optional: true - chromadb@1.8.1: resolution: {integrity: sha512-NpbYydbg4Uqt/9BXKgkZXn0fqpsh2Z1yjhkhKH+rcHMoq0pwI18BFSU2QU7Fk/ZypwGefW2AvqyE/3ZJIgy4QA==} engines: {node: '>=14.17.0'} @@ -2149,9 +1980,6 @@ packages: resolution: {integrity: sha512-PDyvQ5f2PValmqZZIJATimcokDt4JjIev8cKbZgEOoZm+U1IJDYuLeTcxZPQdep99R/X0RIlQ6ReQgPOVnPbNw==} engines: {node: '>=14.18.0'} - cohere-ai@7.10.2: - resolution: {integrity: sha512-Dh1nLugCdSsqQ+PZN+ABRQVQum83udHeBNxC0nJJeIDDzIuEvlpYqXlESPeAnTnjXCjC/glXWBhFDXR5ZbmNrg==} - cohere-ai@7.9.5: resolution: {integrity: sha512-tr8LUR3Q46agFpfEwaYwzYO4qAuN0/R/8YroG4bc86LadOacBAabctZUq0zfCdLiL7gB4yWJs4QCzfpRH3rQuw==} @@ -2896,10 +2724,6 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data-encoder@4.0.2: - resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} - engines: {node: '>= 18'} - form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} @@ -2908,10 +2732,6 @@ packages: resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} engines: {node: '>= 12.20'} - formdata-node@6.0.3: - resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} - engines: {node: '>= 18'} - formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -2968,8 +2788,8 @@ packages: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} - genkitx-openai@0.9.0: - resolution: {integrity: sha512-LyjegcPnq2gaW2Q2SAL6MH3nsujy9eNe+tNMlWPadAIDci+ec5ZzLe1HL/Tk+TK04Uxv+jlndsTPJxCc6o0G5g==} + genkitx-openai@0.10.0: + resolution: {integrity: sha512-99GFTd9DMZua59L6v7LipM0HPPaFaaelGKPsscHOoi7L3V1oc7BBPdvr5XO6Vceasb2Hda13OLeCdu5VIP0Jgg==} peerDependencies: '@genkit-ai/ai': ^0.5.0 '@genkit-ai/core': ^0.5.0 @@ -3672,8 +3492,8 @@ packages: resolution: {integrity: sha512-QUViPXlgP6NKA57IAPff/aZSmRA6qs9wKxlEpayBorwRZG+x2LG7jD4kXh8lnH3q/gkUr64NyZ7kwErUEZJmlw==} engines: {node: '>=18'} - langchain@0.2.4: - resolution: {integrity: sha512-zBsBuNREn/3IlWvIQqhQ2iqf6JJhyjjsB1Db/keDkcgThPI3EcblC1pqAXU2BIKHmpNUkHBR2bAUok5+xtgOcw==} + langchain@0.2.5: + resolution: {integrity: sha512-H5WL0NanCdQ+tzoeEt7Fyz9YGdR3wbfDvfQrJvxAO95istKo5JraRh24dzyvqxM9439xwRMNaMIpMwsyqtWDtQ==} engines: {node: '>=18'} peerDependencies: '@aws-sdk/client-s3': ^3.310.0 @@ -3828,177 +3648,21 @@ packages: youtubei.js: optional: true - langchain@0.2.5: - resolution: {integrity: sha512-H5WL0NanCdQ+tzoeEt7Fyz9YGdR3wbfDvfQrJvxAO95istKo5JraRh24dzyvqxM9439xwRMNaMIpMwsyqtWDtQ==} - engines: {node: '>=18'} + langchainhub@0.0.11: + resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} + + langsmith@0.1.30: + resolution: {integrity: sha512-g8f10H1iiRjCweXJjgM3Y9xl6ApCa1OThDvc0BlSDLVrGVPy1on9wT39vAzYkeadC7oG48p7gfpGlYH3kLkJ9Q==} peerDependencies: - '@aws-sdk/client-s3': ^3.310.0 - '@aws-sdk/client-sagemaker-runtime': ^3.310.0 - '@aws-sdk/client-sfn': ^3.310.0 - '@aws-sdk/credential-provider-node': ^3.388.0 - '@azure/storage-blob': ^12.15.0 - '@browserbasehq/sdk': '*' - '@gomomento/sdk': ^1.51.1 - '@gomomento/sdk-core': ^1.51.1 - '@gomomento/sdk-web': ^1.51.1 - '@mendable/firecrawl-js': ^0.0.13 - '@notionhq/client': ^2.2.10 - '@pinecone-database/pinecone': '*' - '@supabase/supabase-js': ^2.10.0 - '@vercel/kv': ^0.2.3 - '@xata.io/client': ^0.28.0 - apify-client: ^2.7.1 - assemblyai: ^4.0.0 - axios: '*' - cheerio: ^1.0.0-rc.12 - chromadb: '*' - convex: ^1.3.1 - couchbase: ^4.3.0 - d3-dsv: ^2.0.0 - epub2: ^3.0.1 - faiss-node: '*' - fast-xml-parser: '*' - handlebars: ^4.7.8 - html-to-text: ^9.0.5 - ignore: ^5.2.0 - ioredis: ^5.3.2 - jsdom: '*' - mammoth: ^1.6.0 - mongodb: '>=5.2.0' - node-llama-cpp: '*' - notion-to-md: ^3.1.0 - officeparser: ^4.0.4 - pdf-parse: 1.1.1 - peggy: ^3.0.2 - playwright: ^1.32.1 - puppeteer: ^19.7.2 - pyodide: ^0.24.1 - redis: ^4.6.4 - sonix-speech-recognition: ^2.1.1 - srt-parser-2: ^1.2.3 - typeorm: ^0.3.12 - weaviate-ts-client: '*' - web-auth-library: ^1.0.3 - ws: ^8.14.2 - youtube-transcript: ^1.0.6 - youtubei.js: ^9.1.0 + '@langchain/core': '*' + langchain: '*' + openai: '*' peerDependenciesMeta: - '@aws-sdk/client-s3': - optional: true - '@aws-sdk/client-sagemaker-runtime': - optional: true - '@aws-sdk/client-sfn': - optional: true - '@aws-sdk/credential-provider-node': - optional: true - '@azure/storage-blob': - optional: true - '@browserbasehq/sdk': - optional: true - '@gomomento/sdk': - optional: true - '@gomomento/sdk-core': - optional: true - '@gomomento/sdk-web': - optional: true - '@mendable/firecrawl-js': - optional: true - '@notionhq/client': - optional: true - '@pinecone-database/pinecone': - optional: true - '@supabase/supabase-js': - optional: true - '@vercel/kv': - optional: true - '@xata.io/client': - optional: true - apify-client: - optional: true - assemblyai: - optional: true - axios: - optional: true - cheerio: - optional: true - chromadb: - optional: true - convex: - optional: true - couchbase: - optional: true - d3-dsv: - optional: true - epub2: - optional: true - faiss-node: - optional: true - fast-xml-parser: - optional: true - handlebars: - optional: true - html-to-text: - optional: true - ignore: - optional: true - ioredis: - optional: true - jsdom: - optional: true - mammoth: + '@langchain/core': optional: true - mongodb: + langchain: optional: true - node-llama-cpp: - optional: true - notion-to-md: - optional: true - officeparser: - optional: true - pdf-parse: - optional: true - peggy: - optional: true - playwright: - optional: true - puppeteer: - optional: true - pyodide: - optional: true - redis: - optional: true - sonix-speech-recognition: - optional: true - srt-parser-2: - optional: true - typeorm: - optional: true - weaviate-ts-client: - optional: true - web-auth-library: - optional: true - ws: - optional: true - youtube-transcript: - optional: true - youtubei.js: - optional: true - - langchainhub@0.0.11: - resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} - - langsmith@0.1.30: - resolution: {integrity: sha512-g8f10H1iiRjCweXJjgM3Y9xl6ApCa1OThDvc0BlSDLVrGVPy1on9wT39vAzYkeadC7oG48p7gfpGlYH3kLkJ9Q==} - peerDependencies: - '@langchain/core': '*' - langchain: '*' - openai: '*' - peerDependenciesMeta: - '@langchain/core': - optional: true - langchain: - optional: true - openai: + openai: optional: true language-subtag-registry@0.3.23: @@ -4057,12 +3721,6 @@ packages: resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} engines: {node: '>=6'} - llamaindex@0.3.15: - resolution: {integrity: sha512-ZdaITy8FPNobb1SMpchOZt/YNCA0dUSXF+DW06rI+nL5Blnyr48oZfBuFYtE3n05C+3gBZPxXVmBGfTHCLIIiQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@notionhq/client': ^2.2.15 - llamaindex@0.3.16: resolution: {integrity: sha512-k2ltnJ3t1TeR8r9iy3FeuDLPAFBBdjYClfuUtsT6QiSaGYS132nbha+0FbBvrW/5KyXlXCtz/8Can8ObwHybjQ==} engines: {node: '>=18.0.0'} @@ -4574,10 +4232,6 @@ packages: resolution: {integrity: sha512-3Kv2lRgld3MYj+TaSgDBb8YnYEVdn601U+I1y0oZs4bCaPINEZXgcQAQAUGFmFVFpG4vU2Jr6ZAKiF5ZlmM5Fg==} engines: {node: '>=18'} - openai@4.47.3: - resolution: {integrity: sha512-470d4ibH5kizXflCzgur22GpM4nOjrg7WQ9jTOa3dNKEn248oBy4+pjOyfcFR4V4YUn/YlDNjp6h83PbviCCKQ==} - hasBin: true - openai@4.49.0: resolution: {integrity: sha512-/UkrBSej5ejZ4vnOFoeFefX7erjp4k3+xoLKkswjLEvgBU9QtCnOUgsfpvHkzTzgDXpqPMCzyQHQXWsgiq2xPw==} hasBin: true @@ -4754,13 +4408,6 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - pdf2json@3.0.5: - resolution: {integrity: sha512-Un1yLbSlk/zfwrltgguskExIioXZlFSFwsyXU0cnBorLywbTbcdzmJJEebh+U2cFCtR7y8nDs5lPHAe7ldxjZg==} - engines: {node: '>=18.12.1', npm: '>=8.19.2'} - hasBin: true - bundledDependencies: - - '@xmldom/xmldom' - pdf2json@3.1.3: resolution: {integrity: sha512-cGP2MIz7v+w/b4vgg0OPKqhT21L/CZ73+RNmXKbKjgtnVJt2e00AqI6NZyMTp6GL6sY+r0NJOZb9gL3g37yuew==} engines: {node: '>=18.12.1', npm: '>=8.19.2'} @@ -5446,11 +5093,6 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sswr@2.0.0: - resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==} - peerDependencies: - svelte: ^4.0.0 - sswr@2.1.0: resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} peerDependencies: @@ -6257,19 +5899,10 @@ packages: snapshots: - '@ai-sdk/openai@0.0.18(zod@3.23.8)': - dependencies: - '@ai-sdk/provider': 0.0.8 - '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) - zod: 3.23.8 - - '@ai-sdk/provider-utils@0.0.11(zod@3.23.8)': + '@ai-sdk/openai@0.0.24(zod@3.23.8)': dependencies: - '@ai-sdk/provider': 0.0.8 - eventsource-parser: 1.1.2 - nanoid: 3.3.6 - secure-json-parse: 2.7.0 - optionalDependencies: + '@ai-sdk/provider': 0.0.10 + '@ai-sdk/provider-utils': 0.0.13(zod@3.23.8) zod: 3.23.8 '@ai-sdk/provider-utils@0.0.13(zod@3.23.8)': @@ -6285,28 +5918,11 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/provider@0.0.8': - dependencies: - json-schema: 0.4.0 - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@anthropic-ai/sdk@0.20.9(encoding@0.1.13)': - dependencies: - '@types/node': 18.19.34 - '@types/node-fetch': 2.6.11 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - web-streams-polyfill: 3.3.3 - transitivePeerDependencies: - - encoding - '@anthropic-ai/sdk@0.21.1(encoding@0.1.13)': dependencies: '@types/node': 18.19.34 @@ -6320,15 +5936,10 @@ snapshots: transitivePeerDependencies: - encoding - '@aws-crypto/crc32@3.0.0': - dependencies: - '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.577.0 - tslib: 1.14.1 - '@aws-crypto/ie11-detection@3.0.0': dependencies: tslib: 1.14.1 + optional: true '@aws-crypto/sha256-browser@3.0.0': dependencies: @@ -6340,12 +5951,14 @@ snapshots: '@aws-sdk/util-locate-window': 3.568.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 + optional: true '@aws-crypto/sha256-js@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 '@aws-sdk/types': 3.577.0 tslib: 1.14.1 + optional: true '@aws-crypto/sha256-js@5.2.0': dependencies: @@ -6356,12 +5969,14 @@ snapshots: '@aws-crypto/supports-web-crypto@3.0.0': dependencies: tslib: 1.14.1 + optional: true '@aws-crypto/util@3.0.0': dependencies: '@aws-sdk/types': 3.577.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 + optional: true '@aws-crypto/util@5.2.0': dependencies: @@ -6369,14 +5984,14 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 - '@aws-sdk/client-cognito-identity@3.590.0': + '@aws-sdk/client-cognito-identity@3.592.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/client-sso-oidc': 3.592.0 + '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/core': 3.592.0 + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -6411,15 +6026,15 @@ snapshots: '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt + optional: true - '@aws-sdk/client-cognito-identity@3.592.0': + '@aws-sdk/client-sso-oidc@3.592.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/client-sts': 3.592.0 '@aws-sdk/core': 3.592.0 '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) @@ -6462,14 +6077,11 @@ snapshots: - aws-crt optional: true - '@aws-sdk/client-sagemaker@3.590.0': + '@aws-sdk/client-sso@3.592.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/client-sts': 3.590.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/core': 3.592.0 '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -6504,19 +6116,18 @@ snapshots: '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.0.0 - tslib: 2.6.2 - uuid: 9.0.1 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt + optional: true - '@aws-sdk/client-sso-oidc@3.590.0': + '@aws-sdk/client-sts@3.592.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.590.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/client-sso-oidc': 3.592.0 + '@aws-sdk/core': 3.592.0 + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -6551,17 +6162,18 @@ snapshots: '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - aws-crt + optional: true - '@aws-sdk/client-sso-oidc@3.592.0': + '@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.592.0 + '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/core': 3.592.0 - '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -6598,352 +6210,61 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' - aws-crt + optional: true - '@aws-sdk/client-sso@3.590.0': + '@aws-sdk/core@3.592.0': dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/middleware-host-header': 3.577.0 - '@aws-sdk/middleware-logger': 3.577.0 - '@aws-sdk/middleware-recursion-detection': 3.577.0 - '@aws-sdk/middleware-user-agent': 3.587.0 - '@aws-sdk/region-config-resolver': 3.587.0 - '@aws-sdk/types': 3.577.0 - '@aws-sdk/util-endpoints': 3.587.0 - '@aws-sdk/util-user-agent-browser': 3.577.0 - '@aws-sdk/util-user-agent-node': 3.587.0 - '@smithy/config-resolver': 3.0.1 '@smithy/core': 2.2.0 - '@smithy/fetch-http-handler': 3.0.1 - '@smithy/hash-node': 3.0.0 - '@smithy/invalid-dependency': 3.0.0 - '@smithy/middleware-content-length': 3.0.0 - '@smithy/middleware-endpoint': 3.0.1 - '@smithy/middleware-retry': 3.0.3 - '@smithy/middleware-serde': 3.0.0 - '@smithy/middleware-stack': 3.0.0 - '@smithy/node-config-provider': 3.1.0 - '@smithy/node-http-handler': 3.0.0 '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 '@smithy/smithy-client': 3.1.1 '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.3 - '@smithy/util-defaults-mode-node': 3.0.3 - '@smithy/util-endpoints': 2.0.1 - '@smithy/util-middleware': 3.0.0 - '@smithy/util-retry': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + fast-xml-parser: 4.2.5 + tslib: 2.6.3 + optional: true - '@aws-sdk/client-sso@3.592.0': + '@aws-sdk/credential-provider-cognito-identity@3.592.0': dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/core': 3.592.0 - '@aws-sdk/middleware-host-header': 3.577.0 - '@aws-sdk/middleware-logger': 3.577.0 - '@aws-sdk/middleware-recursion-detection': 3.577.0 - '@aws-sdk/middleware-user-agent': 3.587.0 - '@aws-sdk/region-config-resolver': 3.587.0 + '@aws-sdk/client-cognito-identity': 3.592.0 '@aws-sdk/types': 3.577.0 - '@aws-sdk/util-endpoints': 3.587.0 - '@aws-sdk/util-user-agent-browser': 3.577.0 - '@aws-sdk/util-user-agent-node': 3.587.0 - '@smithy/config-resolver': 3.0.1 - '@smithy/core': 2.2.0 - '@smithy/fetch-http-handler': 3.0.1 - '@smithy/hash-node': 3.0.0 - '@smithy/invalid-dependency': 3.0.0 - '@smithy/middleware-content-length': 3.0.0 - '@smithy/middleware-endpoint': 3.0.1 - '@smithy/middleware-retry': 3.0.3 - '@smithy/middleware-serde': 3.0.0 - '@smithy/middleware-stack': 3.0.0 - '@smithy/node-config-provider': 3.1.0 - '@smithy/node-http-handler': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.1.1 + '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.3 - '@smithy/util-defaults-mode-node': 3.0.3 - '@smithy/util-endpoints': 2.0.1 - '@smithy/util-middleware': 3.0.0 - '@smithy/util-retry': 3.0.0 - '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 transitivePeerDependencies: - aws-crt + optional: true - '@aws-sdk/client-sts@3.590.0': + '@aws-sdk/credential-provider-env@3.587.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.1.0 + '@smithy/types': 3.0.0 + tslib: 2.6.3 + optional: true + + '@aws-sdk/credential-provider-http@3.587.0': dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/middleware-host-header': 3.577.0 - '@aws-sdk/middleware-logger': 3.577.0 - '@aws-sdk/middleware-recursion-detection': 3.577.0 - '@aws-sdk/middleware-user-agent': 3.587.0 - '@aws-sdk/region-config-resolver': 3.587.0 '@aws-sdk/types': 3.577.0 - '@aws-sdk/util-endpoints': 3.587.0 - '@aws-sdk/util-user-agent-browser': 3.577.0 - '@aws-sdk/util-user-agent-node': 3.587.0 - '@smithy/config-resolver': 3.0.1 - '@smithy/core': 2.2.0 '@smithy/fetch-http-handler': 3.0.1 - '@smithy/hash-node': 3.0.0 - '@smithy/invalid-dependency': 3.0.0 - '@smithy/middleware-content-length': 3.0.0 - '@smithy/middleware-endpoint': 3.0.1 - '@smithy/middleware-retry': 3.0.3 - '@smithy/middleware-serde': 3.0.0 - '@smithy/middleware-stack': 3.0.0 - '@smithy/node-config-provider': 3.1.0 '@smithy/node-http-handler': 3.0.0 + '@smithy/property-provider': 3.1.0 '@smithy/protocol-http': 4.0.0 '@smithy/smithy-client': 3.1.1 '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.3 - '@smithy/util-defaults-mode-node': 3.0.3 - '@smithy/util-endpoints': 2.0.1 - '@smithy/util-middleware': 3.0.0 - '@smithy/util-retry': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt + '@smithy/util-stream': 3.0.1 + tslib: 2.6.3 + optional: true - '@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': + '@aws-sdk/credential-provider-ini@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))': dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/core': 3.588.0 - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/middleware-host-header': 3.577.0 - '@aws-sdk/middleware-logger': 3.577.0 - '@aws-sdk/middleware-recursion-detection': 3.577.0 - '@aws-sdk/middleware-user-agent': 3.587.0 - '@aws-sdk/region-config-resolver': 3.587.0 - '@aws-sdk/types': 3.577.0 - '@aws-sdk/util-endpoints': 3.587.0 - '@aws-sdk/util-user-agent-browser': 3.577.0 - '@aws-sdk/util-user-agent-node': 3.587.0 - '@smithy/config-resolver': 3.0.1 - '@smithy/core': 2.2.0 - '@smithy/fetch-http-handler': 3.0.1 - '@smithy/hash-node': 3.0.0 - '@smithy/invalid-dependency': 3.0.0 - '@smithy/middleware-content-length': 3.0.0 - '@smithy/middleware-endpoint': 3.0.1 - '@smithy/middleware-retry': 3.0.3 - '@smithy/middleware-serde': 3.0.0 - '@smithy/middleware-stack': 3.0.0 - '@smithy/node-config-provider': 3.1.0 - '@smithy/node-http-handler': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.1.1 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.3 - '@smithy/util-defaults-mode-node': 3.0.3 - '@smithy/util-endpoints': 2.0.1 - '@smithy/util-middleware': 3.0.0 - '@smithy/util-retry': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/client-sts@3.592.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.592.0 - '@aws-sdk/core': 3.592.0 - '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/middleware-host-header': 3.577.0 - '@aws-sdk/middleware-logger': 3.577.0 - '@aws-sdk/middleware-recursion-detection': 3.577.0 - '@aws-sdk/middleware-user-agent': 3.587.0 - '@aws-sdk/region-config-resolver': 3.587.0 - '@aws-sdk/types': 3.577.0 - '@aws-sdk/util-endpoints': 3.587.0 - '@aws-sdk/util-user-agent-browser': 3.577.0 - '@aws-sdk/util-user-agent-node': 3.587.0 - '@smithy/config-resolver': 3.0.1 - '@smithy/core': 2.2.0 - '@smithy/fetch-http-handler': 3.0.1 - '@smithy/hash-node': 3.0.0 - '@smithy/invalid-dependency': 3.0.0 - '@smithy/middleware-content-length': 3.0.0 - '@smithy/middleware-endpoint': 3.0.1 - '@smithy/middleware-retry': 3.0.3 - '@smithy/middleware-serde': 3.0.0 - '@smithy/middleware-stack': 3.0.0 - '@smithy/node-config-provider': 3.1.0 - '@smithy/node-http-handler': 3.0.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.1.1 - '@smithy/types': 3.0.0 - '@smithy/url-parser': 3.0.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.3 - '@smithy/util-defaults-mode-node': 3.0.3 - '@smithy/util-endpoints': 2.0.1 - '@smithy/util-middleware': 3.0.0 - '@smithy/util-retry': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.6.3 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.588.0': - dependencies: - '@smithy/core': 2.2.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/signature-v4': 3.0.0 - '@smithy/smithy-client': 3.1.1 - '@smithy/types': 3.0.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.2 - - '@aws-sdk/core@3.592.0': - dependencies: - '@smithy/core': 2.2.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/signature-v4': 3.0.0 - '@smithy/smithy-client': 3.1.1 - '@smithy/types': 3.0.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.3 - - '@aws-sdk/credential-provider-cognito-identity@3.590.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.590.0 - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-cognito-identity@3.592.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.592.0 - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.3 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/credential-provider-env@3.587.0': - dependencies: - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-http@3.587.0': - dependencies: - '@aws-sdk/types': 3.577.0 - '@smithy/fetch-http-handler': 3.0.1 - '@smithy/node-http-handler': 3.0.0 - '@smithy/property-provider': 3.1.0 - '@smithy/protocol-http': 4.0.0 - '@smithy/smithy-client': 3.1.1 - '@smithy/types': 3.0.0 - '@smithy/util-stream': 3.0.1 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': - dependencies: - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': - dependencies: - '@aws-sdk/client-sts': 3.590.0 - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': - dependencies: - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': - dependencies: - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) + '@aws-sdk/client-sts': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 '@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 '@smithy/property-provider': 3.1.0 @@ -6972,91 +6293,16 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - - '@aws-sdk/credential-provider-ini@3.592.0(@aws-sdk/client-sts@3.592.0)': - dependencies: - '@aws-sdk/client-sts': 3.592.0 - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.592.0 - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.3 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt optional: true - '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': - dependencies: - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0)(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': - dependencies: - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': + '@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))': dependencies: '@aws-sdk/credential-provider-env': 3.587.0 '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)) '@aws-sdk/credential-provider-process': 3.587.0 '@aws-sdk/credential-provider-sso': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) + '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.1.0 '@smithy/property-provider': 3.1.0 @@ -7087,73 +6333,15 @@ snapshots: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' - aws-crt - - '@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sts@3.592.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.592.0 - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.3 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt optional: true '@aws-sdk/credential-provider-process@3.587.0': dependencies: - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-sso@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)': - dependencies: - '@aws-sdk/client-sso': 3.590.0 - '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-sso@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)': - dependencies: - '@aws-sdk/client-sso': 3.590.0 - '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-sso@3.592.0': - dependencies: - '@aws-sdk/client-sso': 3.592.0 - '@aws-sdk/token-providers': 3.587.0(@aws-sdk/client-sso-oidc@3.590.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0 '@smithy/types': 3.0.0 tslib: 2.6.3 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt optional: true '@aws-sdk/credential-provider-sso@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)': @@ -7168,22 +6356,16 @@ snapshots: transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt + optional: true - '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0))': - dependencies: - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.590.0)': + '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))': dependencies: - '@aws-sdk/client-sts': 3.590.0 + '@aws-sdk/client-sts': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/credential-provider-web-identity@3.587.0(@aws-sdk/client-sts@3.592.0)': dependencies: @@ -7191,54 +6373,10 @@ snapshots: '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/credential-providers@3.590.0(@aws-sdk/client-sso-oidc@3.592.0)': - dependencies: - '@aws-sdk/client-cognito-identity': 3.590.0 - '@aws-sdk/client-sso': 3.590.0 - '@aws-sdk/client-sts': 3.590.0(@aws-sdk/client-sso-oidc@3.590.0) - '@aws-sdk/credential-provider-cognito-identity': 3.590.0 - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/credential-provider-node': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.590.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-providers@3.592.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.592.0 - '@aws-sdk/client-sso': 3.592.0 - '@aws-sdk/client-sts': 3.592.0 - '@aws-sdk/credential-provider-cognito-identity': 3.592.0 - '@aws-sdk/credential-provider-env': 3.587.0 - '@aws-sdk/credential-provider-http': 3.587.0 - '@aws-sdk/credential-provider-ini': 3.592.0(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/credential-provider-process': 3.587.0 - '@aws-sdk/credential-provider-sso': 3.592.0 - '@aws-sdk/credential-provider-web-identity': 3.587.0(@aws-sdk/client-sts@3.592.0) - '@aws-sdk/types': 3.577.0 - '@smithy/credential-provider-imds': 3.1.0 - '@smithy/property-provider': 3.1.0 - '@smithy/types': 3.0.0 tslib: 2.6.3 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt optional: true - '@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)': + '@aws-sdk/credential-providers@3.592.0': dependencies: '@aws-sdk/client-cognito-identity': 3.592.0 '@aws-sdk/client-sso': 3.592.0 @@ -7266,20 +6404,23 @@ snapshots: '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/middleware-logger@3.577.0': dependencies: '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/middleware-recursion-detection@3.577.0': dependencies: '@aws-sdk/types': 3.577.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/middleware-user-agent@3.587.0': dependencies: @@ -7287,12 +6428,8 @@ snapshots: '@aws-sdk/util-endpoints': 3.587.0 '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/protocol-http@3.374.0': - dependencies: - '@smithy/protocol-http': 1.2.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/region-config-resolver@3.587.0': dependencies: @@ -7301,21 +6438,8 @@ snapshots: '@smithy/types': 3.0.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 - - '@aws-sdk/signature-v4@3.374.0': - dependencies: - '@smithy/signature-v4': 1.1.0 - tslib: 2.6.2 - - '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.590.0)': - dependencies: - '@aws-sdk/client-sso-oidc': 3.590.0 - '@aws-sdk/types': 3.577.0 - '@smithy/property-provider': 3.1.0 - '@smithy/shared-ini-file-loader': 3.1.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.592.0)': dependencies: @@ -7324,7 +6448,8 @@ snapshots: '@smithy/property-provider': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/types@3.577.0': dependencies: @@ -7336,29 +6461,34 @@ snapshots: '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 '@smithy/util-endpoints': 2.0.1 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/util-locate-window@3.568.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/util-user-agent-browser@3.577.0': dependencies: '@aws-sdk/types': 3.577.0 '@smithy/types': 3.0.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/util-user-agent-node@3.587.0': dependencies: '@aws-sdk/types': 3.577.0 '@smithy/node-config-provider': 3.1.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@aws-sdk/util-utf8-browser@3.259.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@babel/code-frame@7.24.6': dependencies: @@ -7584,14 +6714,14 @@ snapshots: '@genkit-ai/core@0.5.2': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/context-async-hooks': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-node': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.8.0) - ajv: 8.14.0 - ajv-formats: 3.0.1(ajv@8.14.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.0(@opentelemetry/api@1.9.0) + ajv: 8.16.0 + ajv-formats: 3.0.1(ajv@8.16.0) async-mutex: 0.5.0 express: 4.19.2 json-schema: 0.4.0 @@ -7607,8 +6737,6 @@ snapshots: - encoding - supports-color - '@google/generative-ai@0.11.5': {} - '@google/generative-ai@0.12.0': {} '@grpc/grpc-js@1.10.8': @@ -7645,13 +6773,6 @@ snapshots: '@inquirer/figures@1.0.3': {} - '@instructor-ai/instructor@1.3.0(openai@4.47.3(encoding@0.1.13))(zod@3.23.8)': - dependencies: - openai: 4.47.3(encoding@0.1.13) - zod: 3.23.8 - zod-stream: 1.0.3(openai@4.47.3(encoding@0.1.13))(zod@3.23.8) - zod-validation-error: 2.1.0(zod@3.23.8) - '@instructor-ai/instructor@1.3.0(openai@4.49.0(encoding@0.1.13))(zod@3.23.8)': dependencies: openai: 4.49.0(encoding@0.1.13) @@ -7696,13 +6817,13 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} - '@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/core@0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13))': dependencies: ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.12 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) ml-distance: 4.0.1 mustache: 4.2.0 p-queue: 6.6.2 @@ -7732,11 +6853,11 @@ snapshots: - langchain - openai - '@langchain/openai@0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': + '@langchain/openai@0.1.2(encoding@0.1.13)(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) js-tiktoken: 1.0.12 - openai: 4.47.3(encoding@0.1.13) + openai: 4.49.0(encoding@0.1.13) zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) transitivePeerDependencies: @@ -7755,9 +6876,9 @@ snapshots: - langchain optional: true - '@langchain/textsplitters@0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13))': + '@langchain/textsplitters@0.0.3(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13))': dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) js-tiktoken: 1.0.12 transitivePeerDependencies: - langchain @@ -7793,12 +6914,6 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 pathe: 1.1.2 - '@mistralai/mistralai@0.2.0(encoding@0.1.13)': - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - '@mistralai/mistralai@0.4.0(encoding@0.1.13)': dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -7836,68 +6951,70 @@ snapshots: '@opentelemetry/api-logs@0.49.1': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/api@1.8.0': {} - '@opentelemetry/context-async-hooks@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks@1.24.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/context-async-hooks@1.25.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 - '@opentelemetry/core@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/core@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.22.0 - '@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/core@1.25.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/semantic-conventions': 1.24.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.25.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/exporter-trace-otlp-grpc@0.49.1(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.10.8 - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - - '@opentelemetry/exporter-trace-otlp-http@0.49.1(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - - '@opentelemetry/exporter-trace-otlp-proto@0.49.1(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-proto-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - - '@opentelemetry/exporter-zipkin@1.22.0(@opentelemetry/api@1.8.0)': - dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.49.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.49.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-proto-exporter-base': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@1.22.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.22.0 - '@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/instrumentation@0.49.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.49.1 '@types/shimmer': 1.0.5 import-in-the-middle: 1.7.1 @@ -7907,125 +7024,125 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/otlp-exporter-base@0.49.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/otlp-grpc-exporter-base@0.49.1(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.10.8 - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.9.0) protobufjs: 7.3.0 - '@opentelemetry/otlp-proto-exporter-base@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/otlp-proto-exporter-base@0.49.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.9.0) protobufjs: 7.3.0 - '@opentelemetry/otlp-transformer@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/otlp-transformer@0.49.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.49.1 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/propagator-b3@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/propagator-jaeger@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/resources@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.22.0 - '@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/resources@1.25.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.24.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.0 - '@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.49.1 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) lodash.merge: 4.6.2 - '@opentelemetry/sdk-metrics@1.24.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-metrics@1.25.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.0(@opentelemetry/api@1.9.0) lodash.merge: 4.6.2 - '@opentelemetry/sdk-node@0.49.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-node@0.49.1(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 + '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.49.1 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/exporter-trace-otlp-http': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/exporter-zipkin': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-node': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.49.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.22.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.22.0 transitivePeerDependencies: - supports-color - '@opentelemetry/sdk-trace-base@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-trace-base@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.22.0 - '@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-trace-base@1.25.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) - '@opentelemetry/semantic-conventions': 1.24.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.0 - '@opentelemetry/sdk-trace-node@1.22.0(@opentelemetry/api@1.8.0)': + '@opentelemetry/sdk-trace-node@1.22.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/api': 1.8.0 - '@opentelemetry/context-async-hooks': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/propagator-b3': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/propagator-jaeger': 1.22.0(@opentelemetry/api@1.8.0) - '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.9.0) semver: 7.6.2 '@opentelemetry/semantic-conventions@1.22.0': {} - '@opentelemetry/semantic-conventions@1.24.1': {} + '@opentelemetry/semantic-conventions@1.25.0': {} '@petamoriken/float16@3.8.7': {} @@ -8165,7 +7282,8 @@ snapshots: '@smithy/abort-controller@3.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/config-resolver@3.0.1': dependencies: @@ -8173,7 +7291,8 @@ snapshots: '@smithy/types': 3.0.0 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/core@2.2.0': dependencies: @@ -8184,7 +7303,8 @@ snapshots: '@smithy/smithy-client': 3.1.1 '@smithy/types': 3.0.0 '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/credential-provider-imds@3.1.0': dependencies: @@ -8192,14 +7312,8 @@ snapshots: '@smithy/property-provider': 3.1.0 '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 - tslib: 2.6.2 - - '@smithy/eventstream-codec@1.1.0': - dependencies: - '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 1.2.0 - '@smithy/util-hex-encoding': 1.1.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/fetch-http-handler@3.0.1': dependencies: @@ -8207,23 +7321,22 @@ snapshots: '@smithy/querystring-builder': 3.0.0 '@smithy/types': 3.0.0 '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/hash-node@3.0.0': dependencies: '@smithy/types': 3.0.0 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/invalid-dependency@3.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@smithy/is-array-buffer@1.1.0': - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/is-array-buffer@2.2.0': dependencies: @@ -8231,13 +7344,15 @@ snapshots: '@smithy/is-array-buffer@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/middleware-content-length@3.0.0': dependencies: '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/middleware-endpoint@3.0.1': dependencies: @@ -8247,7 +7362,8 @@ snapshots: '@smithy/types': 3.0.0 '@smithy/url-parser': 3.0.0 '@smithy/util-middleware': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/middleware-retry@3.0.3': dependencies: @@ -8258,25 +7374,29 @@ snapshots: '@smithy/types': 3.0.0 '@smithy/util-middleware': 3.0.0 '@smithy/util-retry': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 uuid: 9.0.1 + optional: true '@smithy/middleware-serde@3.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/middleware-stack@3.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/node-config-provider@3.1.0': dependencies: '@smithy/property-provider': 3.1.0 '@smithy/shared-ini-file-loader': 3.1.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/node-http-handler@3.0.0': dependencies: @@ -8284,53 +7404,44 @@ snapshots: '@smithy/protocol-http': 4.0.0 '@smithy/querystring-builder': 3.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/property-provider@3.1.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@smithy/protocol-http@1.2.0': - dependencies: - '@smithy/types': 1.2.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/protocol-http@4.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/querystring-builder@3.0.0': dependencies: '@smithy/types': 3.0.0 '@smithy/util-uri-escape': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/querystring-parser@3.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/service-error-classification@3.0.0': dependencies: '@smithy/types': 3.0.0 + optional: true '@smithy/shared-ini-file-loader@3.1.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@smithy/signature-v4@1.1.0': - dependencies: - '@smithy/eventstream-codec': 1.1.0 - '@smithy/is-array-buffer': 1.1.0 - '@smithy/types': 1.2.0 - '@smithy/util-hex-encoding': 1.1.0 - '@smithy/util-middleware': 1.1.0 - '@smithy/util-uri-escape': 1.1.0 - '@smithy/util-utf8': 1.1.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/signature-v4@3.0.0': dependencies: @@ -8340,7 +7451,8 @@ snapshots: '@smithy/util-middleware': 3.0.0 '@smithy/util-uri-escape': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/smithy-client@3.1.1': dependencies: @@ -8349,11 +7461,8 @@ snapshots: '@smithy/protocol-http': 4.0.0 '@smithy/types': 3.0.0 '@smithy/util-stream': 3.0.1 - tslib: 2.6.2 - - '@smithy/types@1.2.0': - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/types@3.0.0': dependencies: @@ -8363,26 +7472,25 @@ snapshots: dependencies: '@smithy/querystring-parser': 3.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-body-length-browser@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-body-length-node@3.0.0': dependencies: - tslib: 2.6.2 - - '@smithy/util-buffer-from@1.1.0': - dependencies: - '@smithy/is-array-buffer': 1.1.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-buffer-from@2.2.0': dependencies: @@ -8392,11 +7500,13 @@ snapshots: '@smithy/util-buffer-from@3.0.0': dependencies: '@smithy/is-array-buffer': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-config-provider@3.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-defaults-mode-browser@3.0.3': dependencies: @@ -8404,7 +7514,8 @@ snapshots: '@smithy/smithy-client': 3.1.1 '@smithy/types': 3.0.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-defaults-mode-node@3.0.3': dependencies: @@ -8414,36 +7525,33 @@ snapshots: '@smithy/property-provider': 3.1.0 '@smithy/smithy-client': 3.1.1 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-endpoints@2.0.1': dependencies: '@smithy/node-config-provider': 3.1.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 - - '@smithy/util-hex-encoding@1.1.0': - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-hex-encoding@3.0.0': dependencies: - tslib: 2.6.2 - - '@smithy/util-middleware@1.1.0': - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-middleware@3.0.0': dependencies: '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-retry@3.0.0': dependencies: '@smithy/service-error-classification': 3.0.0 '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-stream@3.0.1': dependencies: @@ -8454,20 +7562,13 @@ snapshots: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-hex-encoding': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 - - '@smithy/util-uri-escape@1.1.0': - dependencies: - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-uri-escape@3.0.0': dependencies: - tslib: 2.6.2 - - '@smithy/util-utf8@1.1.0': - dependencies: - '@smithy/util-buffer-from': 1.1.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@smithy/util-utf8@2.3.0': dependencies: @@ -8477,13 +7578,8 @@ snapshots: '@smithy/util-utf8@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.2 - - '@smithy/util-waiter@3.0.0': - dependencies: - '@smithy/abort-controller': 3.0.0 - '@smithy/types': 3.0.0 - tslib: 2.6.2 + tslib: 2.6.3 + optional: true '@szmarczak/http-timer@5.0.1': dependencies: @@ -8789,29 +7885,6 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@3.1.22(openai@4.47.3(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): - dependencies: - '@ai-sdk/provider': 0.0.8 - '@ai-sdk/provider-utils': 0.0.11(zod@3.23.8) - eventsource-parser: 1.1.2 - json-schema: 0.4.0 - jsondiffpatch: 0.6.0 - nanoid: 3.3.6 - secure-json-parse: 2.7.0 - solid-swr-store: 0.10.7(solid-js@1.8.17)(swr-store@0.10.6) - sswr: 2.0.0(svelte@4.2.18) - swr: 2.2.0(react@18.3.1) - swr-store: 0.10.6 - swrv: 1.0.4(vue@3.4.27(typescript@5.4.5)) - zod-to-json-schema: 3.22.5(zod@3.23.8) - optionalDependencies: - openai: 4.47.3(encoding@0.1.13) - react: 18.3.1 - solid-js: 1.8.17 - svelte: 4.2.18 - vue: 3.4.27(typescript@5.4.5) - zod: 3.23.8 - ai@3.1.30(openai@4.49.0(encoding@0.1.13))(react@18.3.1)(solid-js@1.8.17)(svelte@4.2.18)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.10 @@ -8835,9 +7908,9 @@ snapshots: vue: 3.4.27(typescript@5.4.5) zod: 3.23.8 - ajv-formats@3.0.1(ajv@8.14.0): + ajv-formats@3.0.1(ajv@8.16.0): optionalDependencies: - ajv: 8.14.0 + ajv: 8.16.0 ajv@6.12.6: dependencies: @@ -9020,7 +8093,7 @@ snapshots: async-mutex@0.5.0: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 async@3.2.5: {} @@ -9110,7 +8183,8 @@ snapshots: transitivePeerDependencies: - supports-color - bowser@2.11.0: {} + bowser@2.11.0: + optional: true boxen@7.1.1: dependencies: @@ -9266,29 +8340,6 @@ snapshots: chownr@1.1.4: {} - chromadb@1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): - dependencies: - cliui: 8.0.1 - isomorphic-fetch: 3.0.0(encoding@0.1.13) - optionalDependencies: - '@google/generative-ai': 0.11.5 - cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13) - openai: 4.47.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)): - dependencies: - cliui: 8.0.1 - isomorphic-fetch: 3.0.0(encoding@0.1.13) - optionalDependencies: - '@google/generative-ai': 0.11.5 - cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13) - openai: 4.47.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - optional: true - chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)): dependencies: cliui: 8.0.1 @@ -9373,24 +8424,6 @@ snapshots: dependencies: rfdc: 1.3.1 - cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13): - dependencies: - '@aws-sdk/client-sagemaker': 3.590.0 - '@aws-sdk/credential-providers': 3.590.0(@aws-sdk/client-sso-oidc@3.592.0) - '@aws-sdk/protocol-http': 3.374.0 - '@aws-sdk/signature-v4': 3.374.0 - form-data: 4.0.0 - form-data-encoder: 4.0.2 - formdata-node: 6.0.3 - js-base64: 3.7.2 - node-fetch: 2.7.0(encoding@0.1.13) - qs: 6.11.2 - url-join: 4.0.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - encoding - cohere-ai@7.9.5(encoding@0.1.13): dependencies: form-data: 4.0.0 @@ -10209,6 +9242,7 @@ snapshots: fast-xml-parser@4.2.5: dependencies: strnum: 1.0.5 + optional: true fast-xml-parser@4.4.0: dependencies: @@ -10312,8 +9346,6 @@ snapshots: form-data-encoder@2.1.4: {} - form-data-encoder@4.0.2: {} - form-data@4.0.0: dependencies: asynckit: 0.4.0 @@ -10325,8 +9357,6 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 4.0.0-beta.3 - formdata-node@6.0.3: {} - formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -10392,11 +9422,11 @@ snapshots: generic-pool@3.9.0: {} - genkitx-openai@0.9.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13): + genkitx-openai@0.10.0(@genkit-ai/ai@0.5.2)(@genkit-ai/core@0.5.2)(encoding@0.1.13): dependencies: '@genkit-ai/ai': 0.5.2 '@genkit-ai/core': 0.5.2 - openai: 4.47.3(encoding@0.1.13) + openai: 4.49.0(encoding@0.1.13) zod: 3.23.8 transitivePeerDependencies: - encoding @@ -11098,36 +10128,36 @@ snapshots: ky@1.3.0: {} - langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): + langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)): dependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) - '@langchain/openai': 0.1.1(encoding@0.1.13)(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) - '@langchain/textsplitters': 0.0.2(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + '@langchain/core': 0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) + '@langchain/openai': 0.1.2(encoding@0.1.13)(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))) + '@langchain/textsplitters': 0.0.3(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) binary-extensions: 2.3.0 js-tiktoken: 1.0.12 js-yaml: 4.1.0 jsonpointer: 5.0.1 langchainhub: 0.0.11 - langsmith: 0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + langsmith: 0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) ml-distance: 4.0.1 openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 9.0.1 - yaml: 2.4.2 + yaml: 2.4.3 zod: 3.23.8 zod-to-json-schema: 3.23.0(zod@3.23.8) optionalDependencies: - '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)) + '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)) '@browserbasehq/sdk': 1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) '@notionhq/client': 2.2.15(encoding@0.1.13) '@pinecone-database/pinecone': 2.2.2 assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) axios: 1.7.2 - chromadb: 1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) + chromadb: 1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)) fast-xml-parser: 4.4.0 ignore: 5.3.1 mammoth: 1.7.2 - mongodb: 6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3) + mongodb: 6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3) ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) transitivePeerDependencies: - encoding @@ -11162,7 +10192,7 @@ snapshots: langchainhub@0.0.11: {} - ? langsmith@0.1.30(@langchain/core@0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)))(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) + ? langsmith@0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) : dependencies: '@types/uuid': 9.0.8 commander: 10.0.1 @@ -11170,9 +10200,9 @@ snapshots: p-retry: 4.6.2 uuid: 9.0.1 optionalDependencies: - '@langchain/core': 0.2.5(langchain@0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.47.3(encoding@0.1.13)) - langchain: 0.2.4(@aws-sdk/credential-provider-node@3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.590.0(@aws-sdk/client-sso-oidc@3.590.0)))(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3))(openai@4.47.3(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - openai: 4.47.3(encoding@0.1.13) + '@langchain/core': 0.2.6(langchain@0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)) + langchain: 0.2.5(@aws-sdk/credential-provider-node@3.592.0)(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(@pinecone-database/pinecone@2.2.2)(assemblyai@4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4))(axios@1.7.2)(chromadb@1.8.1(@google/generative-ai@0.12.0)(cohere-ai@7.9.5(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13)))(encoding@0.1.13)(fast-xml-parser@4.4.0)(ignore@5.3.1)(mammoth@1.7.2)(mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3))(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + openai: 4.49.0(encoding@0.1.13) langsmith@0.1.30(@langchain/core@0.2.6(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)))(langchain@0.2.5(@browserbasehq/sdk@1.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))(@notionhq/client@2.2.15(encoding@0.1.13))(encoding@0.1.13)(openai@4.49.0(encoding@0.1.13))(ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(openai@4.49.0(encoding@0.1.13)): dependencies: @@ -11276,67 +10306,6 @@ snapshots: - zen-observable - zenObservable - llamaindex@0.3.15(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4): - dependencies: - '@anthropic-ai/sdk': 0.20.9(encoding@0.1.13) - '@aws-crypto/sha256-js': 5.2.0 - '@datastax/astra-db-ts': 1.2.1 - '@google-cloud/vertexai': 1.2.0(encoding@0.1.13) - '@google/generative-ai': 0.11.5 - '@grpc/grpc-js': 1.10.8 - '@huggingface/inference': 2.7.0 - '@llamaindex/cloud': 0.0.5(node-fetch@3.3.2) - '@llamaindex/env': 0.1.3(@aws-crypto/sha256-js@5.2.0)(pathe@1.1.2) - '@mistralai/mistralai': 0.2.0(encoding@0.1.13) - '@notionhq/client': 2.2.15(encoding@0.1.13) - '@pinecone-database/pinecone': 2.2.2 - '@qdrant/js-client-rest': 1.9.0(typescript@5.4.5) - '@types/lodash': 4.17.4 - '@types/papaparse': 5.3.14 - '@types/pg': 8.11.6 - '@xenova/transformers': 2.17.2 - '@zilliz/milvus2-sdk-node': 2.4.2 - ajv: 8.14.0 - assemblyai: 4.4.5(bufferutil@4.0.8)(utf-8-validate@6.0.4) - chromadb: 1.7.3(@google/generative-ai@0.11.5)(cohere-ai@7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13))(encoding@0.1.13)(openai@4.47.3(encoding@0.1.13)) - cohere-ai: 7.10.2(@aws-sdk/client-sso-oidc@3.592.0)(encoding@0.1.13) - js-tiktoken: 1.0.12 - lodash: 4.17.21 - magic-bytes.js: 1.10.0 - mammoth: 1.7.2 - md-utils-ts: 2.0.0 - mongodb: 6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3) - notion-md-crawler: 1.0.0(encoding@0.1.13) - openai: 4.47.3(encoding@0.1.13) - papaparse: 5.4.1 - pathe: 1.1.2 - pdf2json: 3.0.5 - pg: 8.12.0 - pgvector: 0.1.8 - portkey-ai: 0.1.16 - rake-modified: 1.0.8 - string-strip-html: 13.4.8 - wikipedia: 2.1.2 - wink-nlp: 2.3.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/credential-providers' - - '@mongodb-js/zstd' - - aws-crt - - bufferutil - - debug - - encoding - - gcp-metadata - - kerberos - - mongodb-client-encryption - - node-fetch - - pg-native - - snappy - - socks - - supports-color - - typescript - - utf-8-validate - llamaindex@0.3.16(@aws-sdk/credential-providers@3.592.0)(@notionhq/client@2.2.15(encoding@0.1.13))(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@3.3.2)(socks@2.8.3)(typescript@5.4.5)(utf-8-validate@6.0.4): dependencies: '@anthropic-ai/sdk': 0.21.1(encoding@0.1.13) @@ -11624,15 +10593,6 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 13.0.0 - mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0(@aws-sdk/client-sso-oidc@3.592.0))(socks@2.8.3): - dependencies: - '@mongodb-js/saslprep': 1.1.7 - bson: 6.7.0 - mongodb-connection-string-url: 3.0.1 - optionalDependencies: - '@aws-sdk/credential-providers': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0) - socks: 2.8.3 - mongodb@6.7.0(@aws-sdk/credential-providers@3.592.0)(socks@2.8.3): dependencies: '@mongodb-js/saslprep': 1.1.7 @@ -11925,19 +10885,6 @@ snapshots: dependencies: ky: 1.3.0 - openai@4.47.3(encoding@0.1.13): - dependencies: - '@types/node': 18.19.34 - '@types/node-fetch': 2.6.11 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - web-streams-polyfill: 3.3.3 - transitivePeerDependencies: - - encoding - openai@4.49.0(encoding@0.1.13): dependencies: '@types/node': 18.19.34 @@ -12114,8 +11061,6 @@ snapshots: pathval@2.0.0: {} - pdf2json@3.0.5: {} - pdf2json@3.1.3: {} pend@1.2.0: {} @@ -12869,11 +11814,6 @@ snapshots: sprintf-js@1.1.3: {} - sswr@2.0.0(svelte@4.2.18): - dependencies: - svelte: 4.2.18 - swrev: 4.0.0 - sswr@2.1.0(svelte@4.2.18): dependencies: svelte: 4.2.18 @@ -13025,7 +11965,8 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.0.5: + optional: true sucrase@3.35.0: dependencies: @@ -13706,13 +12647,6 @@ snapshots: yocto-queue@1.0.0: {} - zod-stream@1.0.3(openai@4.47.3(encoding@0.1.13))(zod@3.23.8): - dependencies: - openai: 4.47.3(encoding@0.1.13) - schema-stream: 3.1.0(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.23.0(zod@3.23.8) - zod-stream@1.0.3(openai@4.49.0(encoding@0.1.13))(zod@3.23.8): dependencies: openai: 4.49.0(encoding@0.1.13) diff --git a/src/index.ts b/src/index.ts index d3e155fc1..f5e89ccd0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ export * from './message.js' export * from './nango.js' export * from './parse-structured-output.js' export * from './services/index.js' +export * from './tools/search-and-crawl.js' export type * from './types.js' export * from './utils.js' export * from './zod-to-json-schema.js'