├── .dockerignore ├── .env.example ├── .eslintignore ├── .eslintrc.cjs ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug-report.yml │ ├── config.yml │ └── feature-request.yml ├── pull_request_template.md ├── spelling │ ├── check_spelling.py │ └── known_words_corpus.txt └── workflows │ ├── ci.yml │ ├── deploy-production.yml │ ├── deploy-staging-revamp.yml │ ├── deploy-staging.yml │ ├── pr-title-linting.yml │ └── spellcheck.yml ├── .gitignore ├── .gitmodules ├── .nvmrc ├── .prettierignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DEVELOPING.md ├── Dockerfile ├── LICENSE ├── README.md ├── SECURITY.md ├── components ├── api-endpoint.tsx ├── chat │ ├── chat-window.tsx │ ├── chat-with-us.tsx │ ├── custome-code-blocks.tsx │ └── mark-down-render.tsx ├── code.tsx ├── components.module.css ├── dark-logo.tsx ├── error-404.tsx ├── examples-mdx.tsx ├── feature-guide-tabs.tsx ├── feedback.tsx ├── footer.module.css ├── footer.tsx ├── grid-view.tsx ├── grid.module.css ├── guide-mdx.tsx ├── info-card.tsx ├── info-image-card-png.tsx ├── info-image-card.tsx ├── landing-page.tsx ├── landing.module.css ├── last-updated.tsx ├── logo.tsx ├── mdx.tsx ├── package-version.tsx ├── tab.module.css └── tooltip.tsx ├── next-env.d.ts ├── next.config.js ├── package.json ├── pages ├── 404.mdx ├── _app.js ├── _meta.json ├── api │ ├── chat.ts │ ├── feedback.ts │ ├── last-updated.ts │ ├── newsletter.ts │ └── search.ts ├── concepts.mdx └── index.mdx ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── poetry.lock ├── postcss.config.js ├── public ├── Logo.png ├── assets │ ├── agentverse_chat.svg │ ├── agentverse_deployhost.svg │ ├── agentverse_marketplace.svg │ ├── agentverse_templates.svg │ ├── flockx_integrations.svg │ ├── flockx_knowledgemanagement.svg │ ├── hover.svg │ ├── icon_agenticsearch.svg │ ├── icon_almanac.svg │ ├── icon_chatprotocol.svg │ ├── icon_cosmpy.svg │ ├── icon_ledger.svg │ ├── icon_mailbox.svg │ ├── icon_multiagentsystem.svg │ ├── icon_ragagent.svg │ ├── icon_wallet.svg │ ├── iconlogo_agentverse.svg │ ├── iconlogo_asione.svg │ ├── iconlogo_flockx.svg │ ├── opne-new-tab-icon.svg │ └── solana.svg ├── docs-logo.svg └── favicon.png ├── pyproject.toml ├── scripts ├── build-img-revamp.py └── build-img.py ├── src ├── icons │ ├── footer-icons.tsx │ ├── main-page-icons.tsx │ ├── os-icons.tsx │ └── shared-icons.tsx ├── images │ ├── agentverse │ │ └── explorer │ │ │ └── agentverse-explorer_1.png │ ├── concepts │ │ ├── about │ │ │ └── Dark-high-level-system-diagram.svg │ │ ├── ai-agents │ │ │ ├── Dark_agents_interacting.svg │ │ │ ├── Dark_decentralised_network.svg │ │ │ ├── dark_public_and_private_agents.svg │ │ │ └── fetpayment.png │ │ ├── ai-engine │ │ │ ├── dark_ai_with_personal_data.svg │ │ │ ├── dark_hotel_tasks_go_through_the_engine_to_representative_agents.svg │ │ │ ├── dark_human_text_in.svg │ │ │ ├── dark_system_diagram_ai_engine.svg │ │ │ ├── hotel_tasks_go_through_the_engine_to_representative_agents.png │ │ │ └── system_diagram_ai_engine.png │ │ └── tech │ │ │ ├── I1.png │ │ │ ├── I1.svg │ │ │ └── I2.svg │ ├── dark-an-agent-for-everyone.svg │ ├── dark-hosting-name-service_1.svg │ ├── dark-mailroom.svg │ ├── dark-scaling-hosting.svg │ ├── fetch_logo_only_white.svg │ ├── flockx_collab.png │ ├── flockx_nocodeagentstudio.png │ ├── guides │ │ └── agentverse │ │ │ └── agentverse_intro.png │ ├── landing │ │ ├── leading │ │ │ ├── 1.jpg │ │ │ ├── 2.jpg │ │ │ ├── 3.jpg │ │ │ ├── 4.jpg │ │ │ └── asi1.svg │ │ └── leaves.png │ ├── mailroom.png │ └── scaling-hosting.png ├── index.css ├── lib │ └── fetch-json.ts ├── styles │ └── tailwind.css └── svgs │ ├── agent-functions.svg │ ├── agentverse-getstarted.svg │ ├── ai-engine.svg │ ├── almanac.svg │ ├── analytics.svg │ ├── api-agents.svg │ ├── build-chatai.svg │ ├── build-your-agent.svg │ ├── communicate.svg │ ├── context-control.svg │ ├── cosmpy.svg │ ├── courses-background.svg │ ├── courses-stack-second.svg │ ├── courses-stack.svg │ ├── crewai.svg │ ├── dark-build-agent.svg │ ├── dark-course-stack.svg │ ├── dark-crew-ai.svg │ ├── dark-ethereum.svg │ ├── dark-executable.svg │ ├── dark-fast-api.svg │ ├── dark-fetch-logo.svg │ ├── dark-langchain.svg │ ├── dark-openai.svg │ ├── dark-system-diagram.svg │ ├── dark-tech-stack.svg │ ├── delta-v.svg │ ├── desktop │ ├── 404.svg │ ├── footer_left_bottom.svg │ ├── footer_left_top.svg │ ├── footer_right_green.svg │ ├── footer_right_purple.svg │ ├── header_left.svg │ ├── header_right.svg │ └── search-icon.svg │ ├── docs-logo.svg │ ├── ethereum.svg │ ├── executable.svg │ ├── explorer.svg │ ├── external-link.svg │ ├── fastapi.svg │ ├── fetch-logo.svg │ ├── hosting.svg │ ├── internal-link.svg │ ├── langchain.svg │ ├── ledger.svg │ ├── logo.svg │ ├── mac.svg │ ├── mailbox.svg │ ├── mobile │ ├── footer_left_bottom.svg │ ├── footer_right_green.svg │ ├── footer_right_purple.svg │ └── footer_top.svg │ ├── openai.svg │ ├── profile.svg │ ├── revenue.svg │ ├── stack.svg │ ├── synergy.svg │ ├── system-diagram.svg │ ├── tech-stack.svg │ ├── ubuntu.svg │ ├── wallet.svg │ └── windows.svg ├── styles ├── globals.css ├── hamburger.css └── typesetting-article.css ├── tailwind.config.js ├── test.mdx ├── theme.config.tsx ├── theme └── fetch-ai-docs │ ├── components │ ├── anchor.tsx │ ├── banner.tsx │ ├── breadcrumb.tsx │ ├── collapse.tsx │ ├── footer.tsx │ ├── head.tsx │ ├── highlight-matches.tsx │ ├── index.ts │ ├── input.tsx │ ├── instant-algolia-search.tsx │ ├── match-sorter-search.tsx │ ├── nav-links.tsx │ ├── navbar.tsx │ ├── not-found.tsx │ ├── search-model.tsx │ ├── search.tsx │ ├── select.tsx │ ├── server-side-error.tsx │ ├── sidebar.tsx │ ├── skip-nav.tsx │ ├── theme-switcher.tsx │ └── toc.tsx │ ├── constants.tsx │ ├── contexts │ ├── active-anchor.tsx │ ├── config.tsx │ ├── details.ts │ ├── index.ts │ ├── menu.ts │ ├── os-provider.tsx │ └── theme-provider.tsx │ ├── helpers.ts │ ├── index.tsx │ ├── mdx-components.tsx │ ├── polyfill.ts │ ├── types.ts │ └── utils │ ├── get-git-issue-url.ts │ ├── index.ts │ ├── render.tsx │ ├── use-git-edit-url.ts │ └── use-popper.ts ├── tsconfig.json └── update_code.py /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .nvmrc 3 | .next/ 4 | 5 | k8s/ 6 | 7 | .gitignore 8 | .gitmodules 9 | 10 | .idea/ 11 | .vscode/ 12 | 13 | Dockerfile 14 | .dockerignore 15 | 16 | README.md 17 | LICENSE 18 | 19 | .eslintrc.json 20 | next-env.d.ts 21 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | BACKEND_URL= 2 | NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID= 3 | NEXT_PUBLIC_ALGOLIA_APP_ID= 4 | NEXT_PUBLIC_ALGOLIA_API_KEY= 5 | NEXT_PUBLIC_ALGOLIA_INDEX= 6 | NEWSLETTER_BASE_URL= 7 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | tailwind.config.js 2 | postcss.config.js 3 | _app.js 4 | next.config.js 5 | index-data-to-algolia.js -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | }, 6 | settings: { 7 | react: { 8 | version: "detect", 9 | }, 10 | }, 11 | extends: [ 12 | "eslint:recommended", 13 | "plugin:react/recommended", 14 | "plugin:@typescript-eslint/recommended", 15 | "plugin:unicorn/recommended", 16 | ], 17 | parser: "@typescript-eslint/parser", 18 | parserOptions: { 19 | ecmaFeatures: { 20 | jsx: true, 21 | }, 22 | ecmaVersion: "latest", 23 | sourceType: "module", 24 | }, 25 | plugins: ["react", "@typescript-eslint", "unicorn"], 26 | rules: { 27 | "unicorn/no-useless-undefined": ["error", { checkArguments: false }], 28 | "unicorn/prevent-abbreviations": "off", 29 | "unicorn/no-null": "off", 30 | }, 31 | }; 32 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @devjsc @FelixNicolaeBucsa @gautamgambhir97 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug Report 2 | description: Report a bug. 3 | labels: ["bug", "unconfirmed"] 4 | assignees: 5 | - devjsc 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thanks for taking the time to report a bug! We appreciate your contribution to improving the code. 11 | - type: checkboxes 12 | id: prerequisites 13 | attributes: 14 | label: Prerequisites 15 | description: Please confirm before submitting any new bug report. 16 | options: 17 | - label: I checked the [existing issues](https://github.com/fetchai/docs/issues) and made sure there are no similar bug reports 18 | required: true 19 | - type: dropdown 20 | id: category 21 | attributes: 22 | label: Category 23 | description: Select the category that best describes the bug. 24 | options: 25 | - Incorrect or missing Content 26 | - Technical Bug (unexpected behavior) 27 | - Other 28 | validations: 29 | required: false 30 | - type: textarea 31 | id: expected 32 | attributes: 33 | label: Expected Behavior / Content 34 | description: Describe the behavior / content you are expecting. 35 | validations: 36 | required: false 37 | - type: textarea 38 | id: actual 39 | attributes: 40 | label: Observed Behavior / Content 41 | description: Describe the behavior / content you are observing. 42 | validations: 43 | required: false 44 | - type: textarea 45 | id: steps 46 | attributes: 47 | label: To Reproduce 48 | description: Provide steps to reproduce the issue, the location where content is incorrect, or the location where the missing content should be. 49 | validations: 50 | required: false 51 | - type: textarea 52 | id: environment 53 | attributes: 54 | label: Environment Details (Optional) 55 | description: Provide any relevant information about your environment, such as operating system, and any libraries used. 56 | render: markdown 57 | validations: 58 | required: false 59 | - type: textarea 60 | id: logs 61 | attributes: 62 | label: Failure Logs (Optional) 63 | description: Include any relevant log snippets or files here. You can paste directly or drag and drop files into this area. 64 | render: shell 65 | validations: 66 | required: false 67 | - type: textarea 68 | id: additional 69 | attributes: 70 | label: Additional Information (Optional) 71 | description: Include any screenshots, code snippets, or other relevant details that might help us understand the issue. 72 | render: markdown 73 | validations: 74 | required: false 75 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: ☝️Feature request 2 | description: Suggest an idea. 3 | labels: ["enhancement", "unconfirmed"] 4 | assignees: 5 | - devjsc 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thank you for suggesting a new idea! Please complete the following so we have everything to get started. 11 | - type: checkboxes 12 | id: prerequisites 13 | attributes: 14 | label: Prerequisites 15 | description: Please confirm before submitting a feature request. 16 | options: 17 | - label: I checked the [existing issues](https://github.com/fetchai/docs/issues) to make sure this feature has not already been requested 18 | required: true 19 | - type: textarea 20 | id: feature 21 | attributes: 22 | label: Feature 23 | description: | 24 | Provide a description of the feature you would like to see implemented. 25 | validations: 26 | required: true 27 | - type: textarea 28 | id: info 29 | attributes: 30 | label: Additional Information (Optional) 31 | description: | 32 | Add any other context, screenshots, or information that could be helpful for understanding your feature request. 33 | validations: 34 | required: false 35 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Proposed Changes 2 | 3 | _[describe the changes here...]_ 4 | 5 | ## Linked Issues 6 | 7 | _[if applicable, add links to issues resolved by this PR]_ 8 | 9 | ## Types of changes 10 | 11 | _What type of change does this pull request make (put an `x` in the boxes that apply)?_ 12 | 13 | - [ ] Content update. 14 | - [ ] Bug fix (non-breaking change that fixes an issue). 15 | - [ ] New feature added (non-breaking change that adds functionality). 16 | - [ ] Breaking change (fix or feature that would cause existing functionality to stop working as expected). 17 | - [ ] Something else (e.g., tests, scripts, example, deployment, infrastructure). 18 | 19 | ## Checklist 20 | 21 | _Put an `x` in the boxes that apply:_ 22 | 23 | - [ ] I have read the [CONTRIBUTING](https://github.com/fetchai/docs/blob/main/CONTRIBUTING.md) guide 24 | - [ ] Checks and tests pass locally 25 | 26 | ## Further comments 27 | 28 | _[if this is a relatively large or complex change, kick off a discussion by explaining why you chose the solution you did, what alternatives you considered, etc...]_ 29 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | pull_request: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | build: 14 | name: Build 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v3 19 | 20 | - uses: actions/setup-node@v3 21 | with: 22 | node-version-file: ".nvmrc" 23 | 24 | - uses: pnpm/action-setup@v2 25 | with: 26 | version: 8.6.10 27 | 28 | - name: Dependencies 29 | run: | 30 | pnpm install 31 | 32 | - name: Build 33 | run: | 34 | pnpm run build 35 | 36 | - name: Lint 37 | run: | 38 | pnpm run lint 39 | 40 | - name: Formatting 41 | run: | 42 | pnpm run fmt:check 43 | -------------------------------------------------------------------------------- /.github/workflows/deploy-production.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Production 2 | 3 | on: 4 | push: 5 | branches: 6 | - release/production 7 | 8 | jobs: 9 | build: 10 | name: Build Images 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v3 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Setup Gcloud Auth 20 | uses: google-github-actions/auth@v1 21 | with: 22 | credentials_json: "${{ secrets.ORG_PRODUCTION_IMAGES_PUSH }}" 23 | 24 | - name: Setup Cloud SDK 25 | uses: google-github-actions/setup-gcloud@v1 26 | 27 | - name: Set Image Tag 28 | id: lookup 29 | run: echo "version=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT 30 | 31 | - run: | 32 | gcloud auth list 33 | gcloud auth configure-docker -q 34 | echo "VERSION: ${{ steps.lookup.outputs.version }}" 35 | 36 | - name: Build and Push Images 37 | run: | 38 | ./scripts/build-img.py 39 | env: 40 | IMAGE_REPOSITORY: ${{ secrets.PRODUCTION_IMAGE_REPOSITORY }} 41 | BACKEND_URL: ${{ secrets.NEXT_PUBLIC_BACKEND_URL }} 42 | NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID: ${{ secrets.NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID }} 43 | NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ secrets.NEXT_PUBLIC_ALGOLIA_APP_ID }} 44 | NEXT_PUBLIC_ALGOLIA_API_KEY: ${{ secrets.NEXT_PUBLIC_ALGOLIA_API_KEY }} 45 | NEXT_PUBLIC_ALGOLIA_INDEX: ${{ secrets.NEXT_PUBLIC_ALGOLIA_INDEX }} 46 | NEWSLETTER_BASE_URL: ${{ secrets.NEWSLETTER_BASE_URL }} 47 | SENDER_TOKEN: ${{ secrets.SENDER_TOKEN }} 48 | 49 | - name: Trigger Image Update 50 | run: | 51 | curl -H "Accept: application/vnd.github.everest-preview+json" \ 52 | -H "Authorization: token ${{ secrets.ORG_DISPATCH_RENDER_TOKEN }}" \ 53 | --request POST \ 54 | --data '{"event_type": "docs-build", "client_payload": {"image": "${{ env.IMAGE }}", "image_path": "${{ env.IMAGE_PATH }}", "key_path": "${{ env.KEY_PATH }}", "tag": "${{ env.TAG }}", "commit_message_service": "${{ env.SERVICE_NAME }}"}}' \ 55 | ${{ env.TARGET_REPO }} 56 | env: 57 | IMAGE: gcr.io/fetch-ai-images/docs-website 58 | KEY_PATH: ".website.image.tag" 59 | TAG: ${{ steps.lookup.outputs.version }} 60 | IMAGE_PATH: values 61 | SERVICE_NAME: Documentation 62 | TARGET_REPO: https://api.github.com/repos/fetchai/infra-production-deployment/dispatches 63 | -------------------------------------------------------------------------------- /.github/workflows/deploy-staging-revamp.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Staging 2 | 3 | on: 4 | push: 5 | branches: 6 | - feat/docs-revamps 7 | 8 | jobs: 9 | build: 10 | name: Build Images 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v3 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Setup Gcloud Auth 20 | uses: google-github-actions/auth@v1 21 | with: 22 | credentials_json: "${{ secrets.ORG_SANDBOX_DEPLOYMENT_KEY }}" 23 | 24 | - name: Setup Cloud SDK 25 | uses: google-github-actions/setup-gcloud@v1 26 | 27 | - name: Set Image Tag 28 | id: lookup 29 | run: echo "version=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT 30 | 31 | - run: | 32 | gcloud auth list 33 | gcloud auth configure-docker -q 34 | echo "VERSION: ${{ steps.lookup.outputs.version }}" 35 | 36 | - name: Build and Push Images 37 | run: | 38 | ./scripts/build-img-revamp.py 39 | env: 40 | IMAGE_REVAMP_REPOSITORY: ${{ secrets.IMAGE_REVAMP_REPOSITORY }} 41 | BACKEND_URL: ${{ secrets.STAGING_NEXT_PUBLIC_BACKEND_URL }} 42 | NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID: ${{ secrets.NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID }} 43 | NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ secrets.NEXT_PUBLIC_ALGOLIA_APP_ID }} 44 | NEXT_PUBLIC_ALGOLIA_API_KEY: ${{ secrets.NEXT_PUBLIC_ALGOLIA_API_KEY }} 45 | NEXT_PUBLIC_ALGOLIA_INDEX: ${{ secrets.NEXT_PUBLIC_ALGOLIA_INDEX }} 46 | NEWSLETTER_BASE_URL: ${{ secrets.NEWSLETTER_BASE_URL }} 47 | SENDER_TOKEN: ${{ secrets.SENDER_TOKEN }} 48 | 49 | - name: Repository Dispatch 50 | run: | 51 | curl -f -H "Accept: application/vnd.github.everest-preview+json" \ 52 | -H "Authorization: token ${{ secrets.ORG_DISPATCH_RENDER_TOKEN }}" \ 53 | --request POST \ 54 | --data '{"event_type": "docs-revamp-staging-build", "client_payload": {"image": "'"${{ secrets.IMAGE_REVAMP_REPOSITORY }}"'" , "image_path": "values", "key_path": ".image.tag", "commit_message_service": "Docs Revamp Staging", "tag": "'"${{ steps.lookup.outputs.version }}"'"}}' \ 55 | https://api.github.com/repos/fetchai/infra-sandbox-london-b-deployment/dispatches 56 | -------------------------------------------------------------------------------- /.github/workflows/deploy-staging.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Staging 2 | 3 | on: 4 | push: 5 | branches: 6 | - feat/new-landing 7 | 8 | jobs: 9 | build: 10 | name: Build Images 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v3 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Setup Gcloud Auth 20 | uses: google-github-actions/auth@v1 21 | with: 22 | credentials_json: "${{ secrets.ORG_SANDBOX_DEPLOYMENT_KEY }}" 23 | 24 | - name: Setup Cloud SDK 25 | uses: google-github-actions/setup-gcloud@v1 26 | 27 | - name: Set Image Tag 28 | id: lookup 29 | run: echo "version=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT 30 | 31 | - run: | 32 | gcloud auth list 33 | gcloud auth configure-docker -q 34 | echo "VERSION: ${{ steps.lookup.outputs.version }}" 35 | 36 | - name: Build and Push Images 37 | run: | 38 | ./scripts/build-img.py 39 | env: 40 | IMAGE_REPOSITORY: ${{ secrets.STAGING_IMAGE_REPOSITORY }} 41 | BACKEND_URL: ${{ secrets.STAGING_NEXT_PUBLIC_BACKEND_URL }} 42 | NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID: ${{ secrets.NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID }} 43 | NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ secrets.NEXT_PUBLIC_ALGOLIA_APP_ID }} 44 | NEXT_PUBLIC_ALGOLIA_API_KEY: ${{ secrets.NEXT_PUBLIC_ALGOLIA_API_KEY }} 45 | NEXT_PUBLIC_ALGOLIA_INDEX: ${{ secrets.NEXT_PUBLIC_ALGOLIA_INDEX }} 46 | NEWSLETTER_BASE_URL: ${{ secrets.NEWSLETTER_BASE_URL }} 47 | SENDER_TOKEN: ${{ secrets.SENDER_TOKEN }} 48 | 49 | - name: Repository Dispatch 50 | run: | 51 | curl -f -H "Accept: application/vnd.github.everest-preview+json" \ 52 | -H "Authorization: token ${{ secrets.ORG_DISPATCH_RENDER_TOKEN }}" \ 53 | --request POST \ 54 | --data '{"event_type": "docs-staging-build", "client_payload": {"image": "'"${{ secrets.STAGING_IMAGE_REPOSITORY }}"'" , "image_path": "values", "key_path": ".website.image.tag", "commit_message_service": "Docs Staging", "tag": "'"${{ steps.lookup.outputs.version }}"'"}}' \ 55 | https://api.github.com/repos/fetchai/infra-sandbox-london-b-deployment/dispatches 56 | -------------------------------------------------------------------------------- /.github/workflows/pr-title-linting.yml: -------------------------------------------------------------------------------- 1 | name: Lint PR Title 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | - edited 8 | - synchronize 9 | 10 | jobs: 11 | main: 12 | name: PR Title Checks 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: amannn/action-semantic-pull-request@v5.1.0 16 | env: 17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 18 | # Optionally, you can provide options for further constraints. 19 | with: 20 | # Configure which types are allowed. 21 | # Default: https://github.com/commitizen/conventional-commit-types 22 | types: | 23 | chore 24 | content 25 | fix 26 | refactor 27 | feat 28 | test 29 | experiment 30 | # Configure which scopes are allowed. 31 | scopes: | 32 | docs 33 | theme 34 | deps 35 | misc 36 | # Configure that a scope must always be provided. 37 | requireScope: true 38 | # For work-in-progress PRs you can typically use draft pull requests 39 | # from Github. However, private repositories on the free plan don't have 40 | # this option and therefore this action allows you to opt-in to using the 41 | # special "[WIP]" prefix to indicate this state. This will avoid the 42 | # validation of the PR title and the pull request checks remain pending. 43 | # Note that a second check will be reported if this is enabled. 44 | wip: true 45 | -------------------------------------------------------------------------------- /.github/workflows/spellcheck.yml: -------------------------------------------------------------------------------- 1 | name: Spell Checking 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - "**" 7 | 8 | jobs: 9 | spellcheck: 10 | name: Check Spelling with custom Python script 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | python-version: [3.9] 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@v2 18 | 19 | - name: Set up Python 20 | uses: actions/setup-python@v2 21 | with: 22 | python-version: ${{ matrix.python-version }} 23 | 24 | - name: Install dependencies 25 | run: | 26 | sudo apt-get update 27 | sudo apt-get install -y aspell aspell-en 28 | python -m pip install --upgrade pip 29 | pip install spacy markdown-it-py pyspellchecker 30 | python -m spacy download en_core_web_sm 31 | 32 | - name: Run spell-check script 33 | run: | 34 | set -e 35 | python .github/spelling/check_spelling.py 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .next 2 | node_modules 3 | .DS_Store 4 | .idea/ 5 | .env 6 | .history/ 7 | .env.local 8 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/.gitmodules -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.17 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | **/*.mdx 3 | -------------------------------------------------------------------------------- /DEVELOPING.md: -------------------------------------------------------------------------------- 1 | # Development Guidelines 2 | 3 | - [Getting the Source](#get) 4 | - [Development](#dev) 5 | - [Contributing](#contributing) 6 | 7 | ## Getting the Source 8 | 9 | 10 | 11 | 1. Fork the [repository](https://github.com/fetchai/docs.git). 12 | 2. Clone your fork of the repository: 13 | 14 | 15 | ```shell 16 | git clone https://github.com/fetchai/docs.git 17 | ``` 18 | 19 | 3. Define an `upstream` remote pointing back to the main repository: 20 | 21 | ```shell 22 | git remote add upstream https://github.com/fetchai/docs.git 23 | ``` 24 | 25 | ## Development 26 | 27 | Install dependencies: 28 | 29 | ```bash 30 | pnpm install 31 | ``` 32 | 33 | Run Development Server 34 | 35 | ```bash 36 | pnpm dev 37 | ``` 38 | 39 | The site is then visible at: 40 | 41 | 42 | 43 | http://127.0.0.1:3000/docs 44 | 45 | 46 | 47 | ## Contributing 48 | 49 | 50 | 51 | For instructions on how to contribute to the project (e.g. creating Pull Requests, commit message convention, etc), see the [contributing guide](CONTRIBUTING.md). 52 | 53 | 54 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.17.0 2 | 3 | ARG BACKEND_URL="" 4 | ARG NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID="" 5 | ARG NEXT_PUBLIC_ALGOLIA_APP_ID="" 6 | ARG NEXT_PUBLIC_ALGOLIA_API_KEY="" 7 | ARG NEXT_PUBLIC_ALGOLIA_INDEX="" 8 | ARG NEWSLETTER_BASE_URL="" 9 | ARG SENDER_TOKEN="" 10 | 11 | RUN npm install --global corepack@latest 12 | 13 | RUN corepack prepare pnpm@10.5.2 --activate && \ 14 | corepack enable 15 | 16 | WORKDIR /app 17 | ADD package.json pnpm-lock.yaml /app/ 18 | 19 | RUN pnpm install --verbose 20 | 21 | COPY . /app 22 | 23 | ENV NODE_ENV="production" 24 | ENV NODE_OPTIONS="--max-old-space-size=8192" 25 | 26 | RUN echo BACKEND_URL="${BACKEND_URL}" > .env.local && \ 27 | echo SENDER_TOKEN="${SENDER_TOKEN}" >> .env.local && \ 28 | echo NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID="${NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID}" >> .env.local && \ 29 | echo NEXT_PUBLIC_ALGOLIA_APP_ID="${NEXT_PUBLIC_ALGOLIA_APP_ID}" >> .env.local && \ 30 | echo NEXT_PUBLIC_ALGOLIA_API_KEY="${NEXT_PUBLIC_ALGOLIA_API_KEY}" >> .env.local && \ 31 | echo NEXT_PUBLIC_ALGOLIA_INDEX="${NEXT_PUBLIC_ALGOLIA_INDEX}" >> .env.local && \ 32 | echo NEWSLETTER_BASE_URL="${NEWSLETTER_BASE_URL}" >> .env.local 33 | 34 | RUN pnpm run build 35 | 36 | ENTRYPOINT ["pnpm"] 37 | CMD ["start"] 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fetch.ai Documentation Repo 2 | 3 | [![Official Website](https://img.shields.io/badge/Official%20Website-fetch.ai-blue?style=flat&logo=world&logoColor=white)](https://fetch.ai) [![Twitter Follow](https://img.shields.io/twitter/follow/fetch_ai?style=social)](https://twitter.com/fetch_ai) 4 | 5 | Welcome to the code repository for Fetch.ai's documentation at [fetch.ai/docs](fetch.ai/docs). 6 | 7 | ## Developing 8 | 9 | ### Install dependencies 10 | 11 | ```bash 12 | pnpm install test 13 | ``` 14 | 15 | ### Run Development Server 16 | 17 | ```bash 18 | pnpm dev 19 | ``` 20 | 21 | The site is then visible at: 22 | 23 | http://127.0.0.1:3000/docs 24 | 25 | ## Contributing 26 | 27 | All contributions are welcome! Remember, contribution includes not only code, but any help with docs or issues raised by other developers. See our [contribution guidelines](https://github.com/fetchai/docs/blob/main/CONTRIBUTING.md) for more details. 28 | 29 | ### Code of Conduct 30 | 31 | Please be sure to read and follow our [Code of Conduct](https://github.com/fetchai/docs/blob/main/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. 32 | 33 | ### Development Guidelines 34 | 35 | Read our [development guidelines](https://github.com/fetchai/docs/blob/main/DEVELOPING.md) to learn some useful tips related to development. 36 | 37 | ### Issues, Questions, and Discussions 38 | 39 | We use [GitHub Issues](https://github.com/fetchai/docs/issues) for tracking requests and bugs, and [GitHub Discussions](https://github.com/fetchai/docs/discussions) for general questions and discussion. 40 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | Security is very important for Fetch.ai and its community. This document outlines security procedures and general policies for this repository. 4 | 5 | ## How to Report 6 | 7 | Please follow the steps listed below to report your bug: 8 | 9 | - In an email, describe the issue clearly with reference to the underlying source code and indicate whether the bug is **Critical** or **Non-critical**. 10 | - Attach all relevant information that is required to reproduce the bug in a test environment. 11 | - Include the relevant version information associated with the faulty software of the components along with any other relevant system information such as OS versions. 12 | - Include suggested solutions and/or mitigations (if known). 13 | - Send this email to [security@fetch.ai](mailto:security@fetch.ai) and start the subject with your classification **Critical** or **Non-critical** followed by a short title of the bug. 14 | 15 | The Fetch team will review your information and your classification of the bug. 16 | 17 | For non-critical bugs, the Fetch team will create an issue or a pull request allowing you to follow the progress on the bug fix. 18 | 19 | For critical bugs that can result in loss of funds, it is important that the Fetch team has an opportunity to deploy a patched version before the exploit is acknowledged publicly. Hence, critical bugs and their fixes will be shared after the code is patched to prevent the targeting of such exploits. 20 | 21 | ## Disclosure Policy 22 | 23 | When the security team receives a security bug report, they will assign it to a primary handler. This person will coordinate the fix and release process, involving the following steps: 24 | 25 | - Confirm the problem and determine the affected versions. 26 | - Audit code to find any potential similar problems. 27 | - Prepare fixes for all releases still under maintenance. These fixes will be released as fast as possible to PyPI. 28 | 29 | ## Comments on this Policy 30 | 31 | If you have suggestions on how this process could be improved please submit a pull request. 32 | 33 | ## Public Discussions 34 | 35 | Please restrain from publicly discussing a potential security vulnerability. 🙊 36 | 37 | It's better to discuss privately and try to find a solution first, to limit the potential impact as much as possible. 38 | 39 | --- 40 | 41 | Thanks for your help! 42 | -------------------------------------------------------------------------------- /components/chat/chat-with-us.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import React, { useState } from "react"; 3 | import ChatWindow from "./chat-window"; 4 | import Image from "next/image"; 5 | import FetchWhite from "src/images/fetch_logo_only_white.svg"; 6 | 7 | const ChatWithUs = () => { 8 | const [isChatOpen, setIsChatOpen] = useState(false); 9 | 10 | return ( 11 | <> 12 | 25 | {isChatOpen && setIsChatOpen(false)} />} 26 | 27 | ); 28 | }; 29 | 30 | export default ChatWithUs; 31 | -------------------------------------------------------------------------------- /components/chat/custome-code-blocks.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { ModifiedPre } from "components/code"; 3 | import React, { useState, useEffect } from "react"; 4 | import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; 5 | 6 | const CustomCodeBlock = ({ 7 | children, 8 | }: { 9 | children: React.ReactNode | string; 10 | }) => { 11 | const [numberLines, setNumberLines] = useState(0); 12 | 13 | useEffect(() => { 14 | const text = typeof children === "string" ? children : children?.toString(); 15 | const lines = text?.split("\n").filter(Boolean).length; 16 | setNumberLines(lines ?? 0); 17 | }, [children]); 18 | 19 | if (numberLines === 1) { 20 | return ( 21 |
22 | 31 | {children as string} 32 | 33 |
34 | ); 35 | } 36 | 37 | return ( 38 |
39 | {children} 40 |
41 | ); 42 | }; 43 | export default CustomCodeBlock; 44 | -------------------------------------------------------------------------------- /components/chat/mark-down-render.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactMarkdown from "react-markdown"; 3 | import rehypeSanitize from "rehype-sanitize"; 4 | 5 | import CustomCodeBlock from "./custome-code-blocks"; 6 | 7 | interface MarkdownRendererProperties { 8 | markdownContent: string; 9 | } 10 | 11 | const MarkdownRenderer: React.FC = ({ 12 | markdownContent, 13 | }) => { 14 | return ( 15 | 20 | {markdownContent} 21 | 22 | ); 23 | }; 24 | 25 | export default MarkdownRenderer; 26 | -------------------------------------------------------------------------------- /components/dark-logo.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Image from "next/image"; 3 | import darkFetchLogo from "../src/svgs/dark-fetch-logo.svg"; 4 | 5 | const DarkLogo: React.FC = () => { 6 | return ( 7 |
8 | fetch-logo 15 |
16 | ); 17 | }; 18 | 19 | export default DarkLogo; 20 | -------------------------------------------------------------------------------- /components/error-404.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode, useEffect } from "react"; 2 | import Image from "next/image"; 3 | import Error from "../src/svgs/desktop/404.svg"; 4 | 5 | const Description = ({ children }: { children: ReactNode }) => ( 6 | 13 | {children} 14 | 15 | ); 16 | 17 | const Error404 = () => { 18 | useEffect(() => { 19 | const timer = setTimeout(() => { 20 | window.location.href = "/docs"; 21 | }, 10_000); 22 | 23 | return () => { 24 | clearTimeout(timer); 25 | }; 26 | }, []); 27 | return ( 28 |
29 | error-404 30 |
31 | 32 | Oops, we can’t find the page you’re looking for. 33 | 34 |
35 | 36 | You can{" "} 37 | window.location.replace("/docs")} 40 | > 41 | go back to the homepage or 42 | 43 | 44 |
45 |
46 |
47 | ); 48 | }; 49 | 50 | export default Error404; 51 | -------------------------------------------------------------------------------- /components/examples-mdx.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState, ChangeEvent } from "react"; 2 | import { GuideBox } from "./feature-guide-tabs"; 3 | import styles from "./footer.module.css"; 4 | import { Grid2 } from "./mdx"; 5 | import { SearchIcon } from "src/icons/shared-icons"; 6 | 7 | interface Content { 8 | type: string; 9 | title: string; 10 | description: string; 11 | path: string; 12 | } 13 | 14 | interface FilterMdxProps { 15 | content: Content[]; 16 | } 17 | 18 | const ExamplesMdx: React.FC = ({ content }) => { 19 | const [value, setValue] = useState(""); 20 | const [evt, setEvt] = useState(""); 21 | const [inputVal, setInputVal] = useState(""); 22 | 23 | const onSelectChange = (event: ChangeEvent) => { 24 | setEvt(event.target.name); 25 | setValue(event.target.value); 26 | }; 27 | 28 | const onInputChange = (event: ChangeEvent) => { 29 | setEvt(event.target.name); 30 | setInputVal(event.target.value); 31 | if (event.target.value === "") { 32 | setEvt("select"); 33 | setValue(value); 34 | } 35 | }; 36 | 37 | return ( 38 |
39 |
40 | 55 |
56 | 63 | 64 |
65 |
66 | 67 | {content 68 | .filter((item) => { 69 | if (evt === "select") { 70 | return value === "" || item.type === value; 71 | } else if (evt === "input") { 72 | const searchInTitle = item.title 73 | .toLowerCase() 74 | .includes(inputVal.toLowerCase()); 75 | const searchInDescription = item.description 76 | .toLowerCase() 77 | .includes(inputVal.toLowerCase()); 78 | return searchInTitle || searchInDescription; 79 | } else { 80 | return true; 81 | } 82 | }) 83 | .map((item, index) => ( 84 | 92 | ))} 93 | 94 |
95 | ); 96 | }; 97 | 98 | export default ExamplesMdx; 99 | -------------------------------------------------------------------------------- /components/grid-view.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import styles from "./grid.module.css"; 3 | import { useRouter } from "next/router"; 4 | 5 | export const GridView = ({ 6 | content, 7 | }: { 8 | content: { 9 | title: string; 10 | description: string; 11 | path: string; 12 | }; 13 | }) => { 14 | const router = useRouter(); 15 | const [hover, setHover] = useState(false); 16 | 17 | return ( 18 |
{ 21 | router.push(content.path); 22 | }} 23 | onMouseOver={() => { 24 | setHover(true); 25 | }} 26 | onMouseLeave={() => { 27 | setHover(false); 28 | }} 29 | id={content.title.toLowerCase().split(" ").join("-")} 30 | > 31 |

32 | {content.title} 33 |

34 |

35 | {content.description} 36 |

37 |
38 | ); 39 | }; 40 | -------------------------------------------------------------------------------- /components/grid.module.css: -------------------------------------------------------------------------------- 1 | .gridBox { 2 | padding: 16px; 3 | border-radius: 8px; 4 | border: 1px solid #b9c5d4; 5 | backdrop-filter: blur(35px); 6 | flex-direction: column; 7 | align-items: flex-start; 8 | width: 209px; 9 | cursor: pointer; 10 | color: #000d3d; 11 | } 12 | 13 | .hoverGridBox { 14 | padding: 16px; 15 | border-radius: 8px; 16 | border: 1px solid #b9c5d4; 17 | backdrop-filter: blur(35px); 18 | flex-direction: column; 19 | align-items: flex-start; 20 | background: #efebff; 21 | width: 209px; 22 | cursor: pointer; 23 | color: #5f38fb; 24 | } 25 | 26 | :is(html[class~="dark"] .gridBox) { 27 | background-color: #2c2e38; 28 | border: none; 29 | color: #e9e9ea; 30 | } 31 | 32 | :is(html[class~="dark"] .hoverGridBox) { 33 | background: rgba(95, 56, 251, 0.2); 34 | backdrop-filter: blur(35px); 35 | border: none; 36 | color: #bfaffd; 37 | } 38 | -------------------------------------------------------------------------------- /components/info-card.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Image from "next/image"; 3 | import Link from "next/link"; 4 | 5 | function InfoCard({ 6 | icon, 7 | href, 8 | mainTitle, 9 | firstTitle, 10 | mainTitleFont, 11 | displayFlex, 12 | displayTitleReverse, 13 | }: { 14 | icon: string; 15 | href: string; 16 | mainTitle: string; 17 | firstTitle: string; 18 | mainTitleFont?: string; 19 | displayFlex?: boolean; 20 | displayTitleReverse?: boolean; 21 | }) { 22 | return ( 23 | 29 |
30 | {icon} 37 |
38 |
41 |
42 | {firstTitle} 43 |
44 |
47 | {mainTitle} 48 |
49 |
50 | 51 | ); 52 | } 53 | 54 | export default InfoCard; 55 | -------------------------------------------------------------------------------- /components/info-image-card-png.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Image from "next/image"; 3 | import Link from "next/link"; 4 | 5 | function InfoImagePngCard({ 6 | image, 7 | href, 8 | mainTitle, 9 | firstTitle, 10 | }: { 11 | image: string; 12 | href: string; 13 | mainTitle: string; 14 | firstTitle: string; 15 | }) { 16 | return ( 17 | 23 |
24 |
25 | {firstTitle} 26 |
27 |
28 | {mainTitle} 29 |
30 |
31 |
32 | {image} 39 |
40 | 41 | ); 42 | } 43 | 44 | export default InfoImagePngCard; 45 | -------------------------------------------------------------------------------- /components/info-image-card.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Image from "next/image"; 3 | import Link from "next/link"; 4 | 5 | function InfoImageCard({ 6 | image, 7 | href, 8 | mainTitle, 9 | firstTitle, 10 | }: { 11 | image: string; 12 | href: string; 13 | mainTitle: string; 14 | firstTitle: string; 15 | }) { 16 | return ( 17 | 23 |
24 |
25 | {firstTitle} 26 |
27 |
28 | {mainTitle} 29 |
30 |
31 |
32 | {image} 33 |
34 | 35 | ); 36 | } 37 | 38 | export default InfoImageCard; 39 | -------------------------------------------------------------------------------- /components/last-updated.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import React, { useState, useEffect } from "react"; 3 | 4 | const LastUpdatedTime = ({ filePath }: { filePath: string }) => { 5 | const DEFAULT_LOCALE = "en-US"; 6 | const { locale = DEFAULT_LOCALE, pathname } = useRouter(); 7 | const [lastUpdated, setLastUpdated] = useState(undefined); 8 | 9 | useEffect(() => { 10 | const fetchLastUpdated = async () => { 11 | try { 12 | const response = await fetch("/docs/api/last-updated", { 13 | method: "POST", 14 | headers: { 15 | "Content-Type": "application/json", 16 | }, 17 | body: JSON.stringify({ 18 | filePath, 19 | }), 20 | }); 21 | const { lastUpdatedDate } = await response.json(); 22 | if (lastUpdatedDate) { 23 | setLastUpdated(new Date(lastUpdatedDate)); 24 | } else { 25 | setLastUpdated(undefined); 26 | } 27 | } catch (error) { 28 | console.error("Error fetching the last updated time:", error); 29 | } 30 | }; 31 | 32 | fetchLastUpdated(); 33 | }, [filePath]); 34 | 35 | return ( 36 | <> 37 | {lastUpdated && pathname !== "/" && ( 38 |
39 | Last updated on 40 | 41 | 48 |
49 | )} 50 | 51 | ); 52 | }; 53 | 54 | export default LastUpdatedTime; 55 | -------------------------------------------------------------------------------- /components/logo.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import Image from "next/image"; 3 | import fetchLogo from "../src/svgs/logo.svg"; 4 | import darkfetchLogo from "../src/svgs/dark-fetch-logo.svg"; 5 | import { useTheme } from "next-themes"; 6 | import { ThemeMode } from "theme/fetch-ai-docs/helpers"; 7 | 8 | const Logo: React.FC = () => { 9 | const { resolvedTheme } = useTheme(); 10 | const [mounted, setMounted] = useState(false); 11 | useEffect(() => { 12 | setMounted(true); 13 | }, []); 14 | 15 | if (!mounted) { 16 | return null; 17 | } 18 | return ( 19 |
20 | fetch-logo 27 |
28 | ); 29 | }; 30 | 31 | export default Logo; 32 | -------------------------------------------------------------------------------- /components/package-version.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | 3 | const PackageVersion = ({ 4 | packageName, 5 | packageType, 6 | }: { 7 | packageName: string; 8 | packageType: string; 9 | }) => { 10 | const [version, setVersion] = useState(""); 11 | 12 | useEffect(() => { 13 | const fetchVersion = async () => { 14 | try { 15 | const response = await fetch("/docs/api/package-version", { 16 | method: "POST", 17 | headers: { 18 | "Content-Type": "application/json", 19 | }, 20 | body: JSON.stringify({ 21 | packageName, 22 | packageType, 23 | }), 24 | }); 25 | const responseJson = await response.json(); 26 | setVersion(responseJson?.latestVersion); 27 | } catch (error) { 28 | console.error("Error fetching the package version:", error); 29 | } 30 | }; 31 | 32 | fetchVersion(); 33 | }, [packageName, packageType]); 34 | 35 | return {version}; 36 | }; 37 | 38 | export default PackageVersion; 39 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextra-docs-template", 3 | "version": "0.0.1", 4 | "description": "Nextra docs template", 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "fmt": "prettier --write .", 10 | "fmt:check": "prettier --check .", 11 | "lint": "eslint . --max-warnings 0" 12 | }, 13 | "dependencies": { 14 | "@headlessui/react": "^1.7.15", 15 | "@monaco-editor/react": "^4.5.1", 16 | "@popperjs/core": "^2.11.6", 17 | "@tailwindcss/typography": "^0.5.9", 18 | "@types/react": "^18.2.15", 19 | "algoliasearch": "^4.20.0", 20 | "autoprefixer": "^10.4.14", 21 | "axios": "^1.5.0", 22 | "clsx": "^2.0.0", 23 | "cookies-next": "^4.0.0", 24 | "escape-string-regexp": "^5.0.0", 25 | "focus-visible": "^5.2.0", 26 | "framer-motion": "^10.12.22", 27 | "git-url-parse": "^13.1.0", 28 | "gray-matter": "^4.0.3", 29 | "instantsearch.js": "^4.60.0", 30 | "intersection-observer": "^0.12.2", 31 | "iron-session": "^6.3.1", 32 | "match-sorter": "^6.3.1", 33 | "next": "^13.4.10", 34 | "next-seo": "^6.0.0", 35 | "next-themes": "^0.2.1", 36 | "nextra": "^2.10.0", 37 | "pnpm": "^8.6.9", 38 | "postcss": "^8.4.26", 39 | "prettier": "^3.0.3", 40 | "react": "^18.2.0", 41 | "react-dom": "^18.2.0", 42 | "react-error-boundary": "^4.0.13", 43 | "react-icons": "^4.11.0", 44 | "react-instantsearch-dom": "^6.40.4", 45 | "react-markdown": "^9.0.1", 46 | "react-syntax-highlighter": "^15.6.1", 47 | "rehype-sanitize": "^6.0.0", 48 | "remark": "^15.0.1", 49 | "remark-html": "^16.0.1", 50 | "scroll-into-view-if-needed": "^3.0.0", 51 | "sharp": "^0.32.5", 52 | "simple-git": "^3.20.0", 53 | "striptags": "^3.2.0", 54 | "swr": "^2.2.4", 55 | "typography": "^0.16.24", 56 | "zod": "^3.20.2", 57 | "zustand": "^4.3.9" 58 | }, 59 | "devDependencies": { 60 | "@types/node": "18.11.10", 61 | "@typescript-eslint/eslint-plugin": "^6.4.0", 62 | "eslint": "^8.49.0", 63 | "eslint-config-standard-with-typescript": "^39.0.0", 64 | "eslint-plugin-import": "^2.25.2", 65 | "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", 66 | "eslint-plugin-promise": "^6.0.0", 67 | "eslint-plugin-react": "^7.33.2", 68 | "eslint-plugin-unicorn": "^48.0.1", 69 | "tailwindcss": "^3.3.3", 70 | "typescript": "^4.9.5" 71 | }, 72 | "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b" 73 | } 74 | -------------------------------------------------------------------------------- /pages/404.mdx: -------------------------------------------------------------------------------- 1 | import Error404 from "../components/error-404.tsx"; 2 | 3 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | //Import required libraries and/or modules 2 | import "../styles/globals.css"; 3 | import Script from "next/script"; 4 | import { useEffect } from "react"; 5 | 6 | // ID is fetched from .env.local created at project root to maintain security + ability to easily change in the future 7 | export default function MyApp({ Component, pageProps }) { 8 | const googleAnalyticsTrackingId = 9 | process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID; 10 | // useEffect webhook used to dynamically add GA to pages 11 | useEffect(() => { 12 | if (googleAnalyticsTrackingId) { 13 | const script = document.createElement("script"); 14 | script.src = `https://www.googletagmanager.com/gtag/js?id=${googleAnalyticsTrackingId}`; 15 | // async script loading to ensure smooth page render 16 | script.async = true; 17 | script.onload = () => { 18 | window.dataLayer = window.dataLayer || []; 19 | function gtag() { 20 | dataLayer.push(arguments); 21 | } 22 | gtag("js", new Date()); 23 | gtag("config", googleAnalyticsTrackingId); 24 | }; 25 | document.head.appendChild(script); 26 | 27 | return () => { 28 | document.head.removeChild(script); 29 | }; 30 | } 31 | }, [googleAnalyticsTrackingId]); 32 | 33 | return ; 34 | } 35 | -------------------------------------------------------------------------------- /pages/_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "index": { 3 | "title": "Home", 4 | "display": "hidden", 5 | "theme": { 6 | "breadcrumb": false, 7 | "footer": true, 8 | "sidebar": false, 9 | "toc": true, 10 | "pagination": false, 11 | "layout": "full", 12 | "isUnderCurrentDocsTree": false, 13 | "timestamp": false 14 | } 15 | }, 16 | "404": { 17 | "title": "Home", 18 | "theme": { 19 | "breadcrumb": false, 20 | "footer": true, 21 | "sidebar": false, 22 | "toc": true, 23 | "pagination": false, 24 | "layout": "full", 25 | "isUnderCurrentDocsTree": false, 26 | "timestamp": false 27 | } 28 | }, 29 | "concepts": { 30 | "title": "ASI:One", 31 | "href": "#asi1", 32 | "theme": { 33 | "sidebar": false 34 | } 35 | }, 36 | "innovation-lab": { 37 | "title": "Innovation Lab", 38 | "href": "#innovationlab" 39 | }, 40 | "agentverse": { 41 | "title": "Agentverse", 42 | "href": "#agentverse" 43 | }, 44 | "Flockx": { 45 | "title": "Flockx", 46 | "href": "#flockx" 47 | }, 48 | "uAgents": { 49 | "title": "uAgents", 50 | "href": "#ugents-section" 51 | }, 52 | "Network": { 53 | "title": "Network", 54 | "href": "#network" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /pages/api/chat.ts: -------------------------------------------------------------------------------- 1 | // src/pages/api/chat.ts 2 | import type { NextApiRequest, NextApiResponse } from "next"; 3 | 4 | export default async function handler( 5 | req: NextApiRequest, 6 | res: NextApiResponse, 7 | ) { 8 | if (req.method === "POST") { 9 | const { message, sessionId } = req.body; 10 | 11 | try { 12 | const response = await fetch( 13 | "https://chat-with-docs-staging.onrender.com/echo", 14 | { 15 | method: "POST", 16 | headers: { "Content-Type": "application/json" }, 17 | body: JSON.stringify({ 18 | message: message, 19 | session_id: sessionId || "", 20 | }), 21 | }, 22 | ); 23 | const data = await response.json(); 24 | return res 25 | .status(200) 26 | .json({ reply: data.response, sessionId: data.session_id }); 27 | } catch (error) { 28 | console.log("error", error); 29 | return res 30 | .status(500) 31 | .json({ reply: "Something went wrong. Please try again." }); 32 | } 33 | } else { 34 | res.setHeader("Allow", ["POST"]); 35 | res.status(405).end(`Method ${req.method} Not Allowed`); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /pages/api/feedback.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from "next"; 2 | 3 | export default async function handler( 4 | req: NextApiRequest, 5 | res: NextApiResponse, 6 | ) { 7 | try { 8 | const { feedback_type, description, page_url } = req.body; 9 | const response = await fetch(`${process.env.BACKEND_URL}/api/feedback`, { 10 | method: "POST", 11 | headers: { 12 | "Content-Type": "application/json", 13 | }, 14 | body: JSON.stringify({ 15 | feedback_type: feedback_type, 16 | description: description, 17 | page_url: page_url, 18 | }), 19 | }); 20 | const apiResponse = await response.json(); 21 | return res.status(response.status).json({ apiResponse }); 22 | } catch (error) { 23 | console.error(error); 24 | return res.status(500).json({ error: "Internal Server Error" }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /pages/api/last-updated.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from "next"; 2 | import { execSync } from "node:child_process"; 3 | 4 | export function getLastUpdatedDate(filePath: string) { 5 | try { 6 | const lastUpdatedDate = execSync(`git log -1 --format="%cd" -- ${filePath}`) 7 | .toString() 8 | .trim(); 9 | return lastUpdatedDate; 10 | } catch (error) { 11 | console.error("Error getting last updated date:", error); 12 | return null; 13 | } 14 | } 15 | 16 | export default async function handler( 17 | req: NextApiRequest, 18 | res: NextApiResponse, 19 | ) { 20 | const { filePath } = req.body; 21 | try { 22 | const lastUpdatedDate = getLastUpdatedDate(filePath); 23 | return res.status(200).json({ lastUpdatedDate }); 24 | } catch (error) { 25 | console.error(error); 26 | return res.status(500).json({ error: "Internal Server Error" }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /pages/api/newsletter.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from "next"; 2 | 3 | export default async function handler( 4 | req: NextApiRequest, 5 | res: NextApiResponse, 6 | ) { 7 | const email = req.body; 8 | try { 9 | const headers = { 10 | Authorization: `Bearer ${process.env.SENDER_TOKEN}`, 11 | "Content-Type": "application/json", 12 | Accept: "application/json", 13 | }; 14 | 15 | const data = { 16 | email: email, 17 | groups: ["e1rVB0"], 18 | }; 19 | 20 | const response = await fetch( 21 | `${process.env.NEWSLETTER_BASE_URL}/v2/subscribers`, 22 | { 23 | method: "POST", 24 | headers, 25 | body: JSON.stringify(data), 26 | }, 27 | ).then((response) => response.json()); 28 | if (!response.success) { 29 | console.log("unable to subscribe user"); 30 | } 31 | return res.status(200).json({ response }); 32 | } catch (error) { 33 | console.error(error); 34 | return res.status(500).json({ error: "Internal Server Error" }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pages/api/search.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from "next"; 2 | 3 | export default async function handler( 4 | req: NextApiRequest, 5 | res: NextApiResponse, 6 | ) { 7 | try { 8 | const { search_term, selected_path } = req.body; 9 | const response = await fetch(`${process.env.BACKEND_URL}/api/search`, { 10 | method: "POST", 11 | headers: { 12 | "Content-Type": "application/json", 13 | }, 14 | body: JSON.stringify({ 15 | search_term: search_term, 16 | selected_path: selected_path, 17 | }), 18 | }); 19 | const apiResponse = await response.json(); 20 | return res.status(response.status).json({ apiResponse }); 21 | } catch { 22 | return res.status(500).json({ error: "Internal Server Error" }); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pages/index.mdx: -------------------------------------------------------------------------------- 1 | import LandingPage from "../components/landing-page.tsx"; 2 | 3 | 4 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | # all packages in direct subdirs of packages/ 3 | - "components/*" 4 | # all packages in subdirs of components/ 5 | - "pages/*" 6 | # exclude packages that are inside test directories 7 | - "theme/*" 8 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | "postcss-import": {}, 4 | "tailwindcss/nesting": {}, 5 | tailwindcss: {}, 6 | autoprefixer: {}, 7 | // Add any other PostCSS plugins as needed 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /public/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/public/Logo.png -------------------------------------------------------------------------------- /public/assets/icon_agenticsearch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /public/assets/icon_almanac.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icon_cosmpy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/assets/icon_ledger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/assets/icon_mailbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /public/assets/icon_multiagentsystem.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/icon_ragagent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /public/assets/icon_wallet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/assets/iconlogo_agentverse.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/iconlogo_asione.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/assets/iconlogo_flockx.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/opne-new-tab-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/solana.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/public/favicon.png -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "docs" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Your Name "] 6 | readme = "README.md" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.11" 10 | pyspellchecker = "^0.8.1" 11 | spacy = "^3.8.2" 12 | markdown-it-py = "^3.0.0" 13 | beautifulsoup4 = "^4.13.3" 14 | openai = "^1.68.2" 15 | 16 | 17 | [build-system] 18 | requires = ["poetry-core"] 19 | build-backend = "poetry.core.masonry.api" 20 | -------------------------------------------------------------------------------- /scripts/build-img-revamp.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | import sys 4 | import subprocess 5 | import argparse 6 | 7 | 8 | PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 | 10 | REPOSITORY = os.environ.get('IMAGE_REVAMP_REPOSITORY') 11 | 12 | BUILD_ENV_VARS = ( 13 | 'BACKEND_URL', 14 | 'NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID', 15 | 'NEXT_PUBLIC_ALGOLIA_APP_ID', 16 | 'NEXT_PUBLIC_ALGOLIA_API_KEY', 17 | 'NEXT_PUBLIC_ALGOLIA_INDEX', 18 | 'NEWSLETTER_BASE_URL', 19 | 'SENDER_TOKEN' 20 | ) 21 | 22 | 23 | def parse_commandline() -> argparse.Namespace: 24 | parser = argparse.ArgumentParser() 25 | parser.add_argument('-n', '--no-push', dest='push', action='store_false', help='Disable pusing of the image') 26 | parser.add_argument('-f', '--force-build', action='store_true', help=argparse.SUPPRESS) 27 | return parser.parse_args() 28 | 29 | 30 | def detect_local_modifications() -> bool: 31 | exit_code = subprocess.call(['git', 'diff-index', '--quiet', 'HEAD']) 32 | return exit_code != 0 33 | 34 | 35 | def get_version() -> str: 36 | return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode().strip() 37 | 38 | 39 | def main(): 40 | args = parse_commandline() 41 | 42 | # validate the repository environment variable 43 | if REPOSITORY is None: 44 | print('Missing IMAGE_REPOSITORY environment variable') 45 | sys.exit(1) 46 | 47 | # argument validation / augmentation 48 | push = args.push 49 | if detect_local_modifications(): 50 | if args.force_build: 51 | push = False 52 | print('Disabling push of images due to local modifications') 53 | else: 54 | print('Detected local modifications. Please commit and try again') 55 | sys.exit(1) 56 | 57 | # lookup the required information 58 | version = get_version() 59 | 60 | image_url = f'{REPOSITORY}:{version}' 61 | 62 | print() 63 | print(f'Project root: {PROJECT_ROOT}') 64 | print(f'Image Ref...: {image_url}') 65 | print(f'Push........: {push}') 66 | print() 67 | 68 | # Step 0. Collect up the build environment variables 69 | build_args = [] 70 | for env_name in BUILD_ENV_VARS: 71 | if env_name not in os.environ: 72 | print('Missing build variable', env_name) 73 | sys.exit(1) 74 | 75 | build_args.append(f'--build-arg={env_name}={os.environ[env_name]}') 76 | 77 | # Step 1. Build the image 78 | cmd = [ 79 | 'docker', 80 | 'build', 81 | ] + build_args + [ 82 | '--platform', 'linux/amd64', 83 | '-t', image_url, 84 | PROJECT_ROOT, 85 | ] 86 | subprocess.check_call(cmd) 87 | 88 | # Step 2. Push the image 89 | if push: 90 | subprocess.check_call([ 91 | 'docker', 92 | 'push', 93 | image_url, 94 | ]) 95 | 96 | 97 | 98 | if __name__ == '__main__': 99 | main() 100 | -------------------------------------------------------------------------------- /scripts/build-img.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | import sys 4 | import subprocess 5 | import argparse 6 | 7 | 8 | PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 | 10 | REPOSITORY = os.environ.get('IMAGE_REPOSITORY') 11 | 12 | BUILD_ENV_VARS = ( 13 | 'BACKEND_URL', 14 | 'NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID', 15 | 'NEXT_PUBLIC_ALGOLIA_APP_ID', 16 | 'NEXT_PUBLIC_ALGOLIA_API_KEY', 17 | 'NEXT_PUBLIC_ALGOLIA_INDEX', 18 | 'NEWSLETTER_BASE_URL', 19 | 'SENDER_TOKEN' 20 | ) 21 | 22 | 23 | def parse_commandline() -> argparse.Namespace: 24 | parser = argparse.ArgumentParser() 25 | parser.add_argument('-n', '--no-push', dest='push', action='store_false', help='Disable pusing of the image') 26 | parser.add_argument('-f', '--force-build', action='store_true', help=argparse.SUPPRESS) 27 | return parser.parse_args() 28 | 29 | 30 | def detect_local_modifications() -> bool: 31 | exit_code = subprocess.call(['git', 'diff-index', '--quiet', 'HEAD']) 32 | return exit_code != 0 33 | 34 | 35 | def get_version() -> str: 36 | return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode().strip() 37 | 38 | 39 | def main(): 40 | args = parse_commandline() 41 | 42 | # validate the repository environment variable 43 | if REPOSITORY is None: 44 | print('Missing IMAGE_REPOSITORY environment variable') 45 | sys.exit(1) 46 | 47 | # argument validation / augmentation 48 | push = args.push 49 | if detect_local_modifications(): 50 | if args.force_build: 51 | push = False 52 | print('Disabling push of images due to local modifications') 53 | else: 54 | print('Detected local modifications. Please commit and try again') 55 | sys.exit(1) 56 | 57 | # lookup the required information 58 | version = get_version() 59 | 60 | image_url = f'{REPOSITORY}:{version}' 61 | 62 | print() 63 | print(f'Project root: {PROJECT_ROOT}') 64 | print(f'Image Ref...: {image_url}') 65 | print(f'Push........: {push}') 66 | print() 67 | 68 | # Step 0. Collect up the build environment variables 69 | build_args = [] 70 | for env_name in BUILD_ENV_VARS: 71 | if env_name not in os.environ: 72 | print('Missing build variable', env_name) 73 | sys.exit(1) 74 | 75 | build_args.append(f'--build-arg={env_name}={os.environ[env_name]}') 76 | 77 | # Step 1. Build the image 78 | cmd = [ 79 | 'docker', 80 | 'build', 81 | ] + build_args + [ 82 | '--platform', 'linux/amd64', 83 | '-t', image_url, 84 | PROJECT_ROOT, 85 | ] 86 | subprocess.check_call(cmd) 87 | 88 | # Step 2. Push the image 89 | if push: 90 | subprocess.check_call([ 91 | 'docker', 92 | 'push', 93 | image_url, 94 | ]) 95 | 96 | 97 | 98 | if __name__ == '__main__': 99 | main() 100 | -------------------------------------------------------------------------------- /src/images/agentverse/explorer/agentverse-explorer_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/agentverse/explorer/agentverse-explorer_1.png -------------------------------------------------------------------------------- /src/images/concepts/ai-agents/fetpayment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/concepts/ai-agents/fetpayment.png -------------------------------------------------------------------------------- /src/images/concepts/ai-engine/hotel_tasks_go_through_the_engine_to_representative_agents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/concepts/ai-engine/hotel_tasks_go_through_the_engine_to_representative_agents.png -------------------------------------------------------------------------------- /src/images/concepts/ai-engine/system_diagram_ai_engine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/concepts/ai-engine/system_diagram_ai_engine.png -------------------------------------------------------------------------------- /src/images/concepts/tech/I1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/concepts/tech/I1.png -------------------------------------------------------------------------------- /src/images/fetch_logo_only_white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/images/flockx_collab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/flockx_collab.png -------------------------------------------------------------------------------- /src/images/flockx_nocodeagentstudio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/flockx_nocodeagentstudio.png -------------------------------------------------------------------------------- /src/images/guides/agentverse/agentverse_intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/guides/agentverse/agentverse_intro.png -------------------------------------------------------------------------------- /src/images/landing/leading/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/landing/leading/1.jpg -------------------------------------------------------------------------------- /src/images/landing/leading/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/landing/leading/2.jpg -------------------------------------------------------------------------------- /src/images/landing/leading/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/landing/leading/3.jpg -------------------------------------------------------------------------------- /src/images/landing/leading/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/landing/leading/4.jpg -------------------------------------------------------------------------------- /src/images/landing/leaves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/landing/leaves.png -------------------------------------------------------------------------------- /src/images/mailroom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/mailroom.png -------------------------------------------------------------------------------- /src/images/scaling-hosting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fetchai/docs/b1f32c304c67f0f401eec8f098ce3751c953eaeb/src/images/scaling-hosting.png -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /src/lib/fetch-json.ts: -------------------------------------------------------------------------------- 1 | export class FetchError extends Error { 2 | response: Response; 3 | data: { 4 | message: string; 5 | }; 6 | constructor({ 7 | message, 8 | response, 9 | data, 10 | }: { 11 | message: string; 12 | response: Response; 13 | data: { 14 | message: string; 15 | }; 16 | }) { 17 | super(message); 18 | if (Error.captureStackTrace) { 19 | Error.captureStackTrace(this, FetchError); 20 | } 21 | 22 | this.name = "FetchError"; 23 | this.response = response; 24 | this.data = data ?? { message: message }; 25 | } 26 | } 27 | 28 | export default async function fetchJson( 29 | input: RequestInfo, 30 | init?: RequestInit, 31 | ): Promise { 32 | if ( 33 | init && 34 | init.method && 35 | !init.method.includes("GET") && 36 | init.body && 37 | init.body 38 | ) { 39 | init.body = JSON.stringify(init.body); 40 | if (!init.headers) { 41 | init.headers = {}; 42 | } 43 | init.headers["Content-Type"] = "application/json"; 44 | } 45 | 46 | const response = await fetch(input, init); 47 | const data = await response.json(); 48 | if (response.ok) { 49 | return data; 50 | } 51 | 52 | throw new FetchError({ 53 | message: response.statusText, 54 | response, 55 | data, 56 | }); 57 | } 58 | -------------------------------------------------------------------------------- /src/styles/tailwind.css: -------------------------------------------------------------------------------- 1 | @layer base { 2 | :root { 3 | --shiki-color-text: theme("colors.white"); 4 | --shiki-token-constant: theme("colors.emerald.300"); 5 | --shiki-token-string: theme("colors.emerald.300"); 6 | --shiki-token-comment: theme("colors.zinc.500"); 7 | --shiki-token-keyword: theme("colors.sky.300"); 8 | --shiki-token-parameter: theme("colors.pink.300"); 9 | --shiki-token-function: theme("colors.violet.300"); 10 | --shiki-token-string-expression: theme("colors.emerald.300"); 11 | --shiki-token-punctuation: theme("colors.zinc.200"); 12 | } 13 | 14 | [inert] ::-webkit-scrollbar { 15 | display: none; 16 | } 17 | } 18 | 19 | @tailwind base; 20 | @tailwind components; 21 | @tailwind utilities; 22 | -------------------------------------------------------------------------------- /src/svgs/agent-functions.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/svgs/ai-engine.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/svgs/almanac.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/svgs/analytics.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/svgs/api-agents.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/svgs/cosmpy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/svgs/courses-background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/svgs/courses-stack.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/svgs/dark-course-stack.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/svgs/dark-ethereum.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/svgs/dark-fast-api.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/svgs/dark-openai.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/svgs/delta-v.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/svgs/desktop/footer_left_bottom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/svgs/desktop/footer_left_top.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/svgs/desktop/footer_right_green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/svgs/desktop/footer_right_purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/svgs/desktop/search-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/svgs/ethereum.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/svgs/explorer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/svgs/external-link.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/svgs/fastapi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/svgs/hosting.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/svgs/internal-link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/svgs/langchain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/svgs/ledger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/svgs/mac.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/svgs/mailbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/svgs/mobile/footer_left_bottom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/svgs/mobile/footer_right_green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/svgs/mobile/footer_right_purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/svgs/mobile/footer_top.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/svgs/openai.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/svgs/profile.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | -------------------------------------------------------------------------------- /src/svgs/synergy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/svgs/wallet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/svgs/windows.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /styles/hamburger.css: -------------------------------------------------------------------------------- 1 | .nextra-hamburger svg { 2 | g { 3 | @apply nx-origin-center; 4 | transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1); 5 | } 6 | path { 7 | opacity: 1; 8 | transition: 9 | transform 0.2s cubic-bezier(0.25, 1, 0.5, 1) 0.2s, 10 | opacity 0.2s ease 0.2s; 11 | } 12 | 13 | &.open { 14 | path { 15 | transition: 16 | transform 0.2s cubic-bezier(0.25, 1, 0.5, 1), 17 | opacity 0s ease 0.2s; 18 | } 19 | g { 20 | transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1) 0.2s; 21 | } 22 | } 23 | 24 | &.open > { 25 | path { 26 | @apply nx-opacity-0; 27 | } 28 | g:nth-of-type(1) { 29 | @apply nx-rotate-45; 30 | path { 31 | transform: translate3d(0, 6px, 0); 32 | } 33 | } 34 | g:nth-of-type(2) { 35 | @apply -nx-rotate-45; 36 | path { 37 | transform: translate3d(0, -6px, 0); 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /styles/typesetting-article.css: -------------------------------------------------------------------------------- 1 | article.nextra-body-typesetting-article { 2 | font-size: 17px; 3 | font-feature-settings: 4 | "rlig" 1, 5 | "calt" 1; 6 | h1 { 7 | @apply nx-mt-6 nx-mb-4 nx-text-center; 8 | font-size: 2.5rem; 9 | } 10 | h2 { 11 | @apply nx-border-none; 12 | } 13 | a { 14 | @apply nx-no-underline hover:nx-underline; 15 | } 16 | p { 17 | @apply nx-leading-8; 18 | } 19 | code { 20 | @apply nx-border-none dark:nx-bg-neutral-700; 21 | } 22 | pre code { 23 | @apply dark:nx-bg-transparent; 24 | } 25 | .subheading-anchor + a { 26 | @apply nx-no-underline hover:nx-no-underline after:nx-hidden; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require("tailwindcss/colors"); 2 | 3 | const makePrimaryColor = 4 | (l) => 5 | ({ opacityValue }) => { 6 | if (opacityValue === undefined) { 7 | return `hsl(var(--nextra-primary-hue) 100% ${l}%)`; 8 | } 9 | return `hsl(var(--nextra-primary-hue) 100% ${l}% / ${opacityValue})`; 10 | }; 11 | 12 | module.exports = { 13 | prefix: "nx-", 14 | content: [ 15 | "./pages/**/*.{js,mjs,jsx,ts,tsx,mdx}", 16 | "./components/**/*.{js,mjs,jsx,ts,tsx,mdx}", 17 | // './styles/**/*.css', // Add this line to include the nextra-theme-docs CSS files 18 | ], 19 | theme: { 20 | screens: { 21 | sm: "640px", 22 | md: "768px", 23 | lg: "1024px", 24 | xl: "1280px", 25 | "2xl": "1536px", 26 | }, 27 | fontSize: { 28 | xs: ".75rem", 29 | sm: ".875rem", 30 | base: "1rem", 31 | lg: "1.125rem", 32 | xl: "1.25rem", 33 | "2xl": "1.5rem", 34 | "3xl": "1.875rem", 35 | "4xl": "2.25rem", 36 | "5xl": "3rem", 37 | "6xl": "4rem", 38 | }, 39 | letterSpacing: { 40 | tight: "-0.015em", 41 | }, 42 | colors: { 43 | transparent: "transparent", 44 | current: "currentColor", 45 | black: "#000", 46 | white: "#fff", 47 | gray: colors.gray, 48 | slate: colors.slate, 49 | neutral: colors.neutral, 50 | red: colors.red, 51 | orange: colors.orange, 52 | blue: colors.blue, 53 | yellow: colors.yellow, 54 | primary: { 55 | 50: makePrimaryColor(97), 56 | 100: makePrimaryColor(94), 57 | 200: makePrimaryColor(86), 58 | 300: makePrimaryColor(77), 59 | 400: makePrimaryColor(66), 60 | 500: makePrimaryColor(50), 61 | 600: makePrimaryColor(45), 62 | 700: makePrimaryColor(39), 63 | 750: makePrimaryColor(35), 64 | 800: makePrimaryColor(32), 65 | 900: makePrimaryColor(24), 66 | }, 67 | }, 68 | extend: { 69 | colors: { 70 | dark: "#111", 71 | }, 72 | }, 73 | }, 74 | darkMode: ["class", 'html[class~="dark"]'], 75 | }; 76 | -------------------------------------------------------------------------------- /theme.config.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { DocsThemeConfig } from "./theme/fetch-ai-docs"; 3 | import Footer from "./components/footer"; 4 | import Logo from "components/logo"; 5 | 6 | const config: DocsThemeConfig = { 7 | logo: , 8 | project: { 9 | link: "https://github.com/fetchai", 10 | }, 11 | chat: { 12 | link: "https://discord.gg/fetchai", 13 | }, 14 | docsRepositoryBase: "https://github.com/fetchai/docs/tree/master/pages", 15 | footer: { 16 | component: