├── .cursor └── rules │ ├── 00-language-priority.mdc │ ├── 01-code-style.mdc │ ├── 02-project-structure.mdc │ ├── 03-typescript-guidelines.mdc │ ├── 04-code-formatting.mdc │ ├── 05-code-organization.mdc │ ├── 06-api-structure.mdc │ ├── 07-extension-structure.mdc │ ├── 08-contributing-guidelines.mdc │ ├── 09-design-system.mdc │ ├── 09-i18n-guidelines.mdc │ ├── 10-testing-guidelines.mdc │ ├── 11-ui-design-patterns.mdc │ └── 16-language-guidelines.mdc ├── .cursorrules ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github ├── CODE_OF_CONDUCT.md ├── DISCUSSION_TEMPLATE │ ├── general.yml │ ├── help.yml │ └── suggestion.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── bug_report.yml │ ├── config.yml │ ├── custom.md │ ├── document_issue.yml │ ├── feature_request.md │ ├── feature_request.yml │ └── translation_issue.yml ├── pull_request_template.md └── workflows │ ├── build-image.yml │ ├── build-middleware-image.yml │ ├── build.yml │ ├── ci-docs.yml │ ├── ci.yml │ ├── deploy-api-prod.yml │ ├── deploy-api-staging.yml │ ├── deploy-docs.yml │ ├── deploy-web-prod.yml │ ├── deploy-web-staging.yml │ ├── docker-deploy.yml │ ├── e2e.yml │ └── release-image.yml ├── .gitignore ├── .gitpod.yml ├── .husky └── pre-commit ├── .npmrc ├── .vscode ├── launch.json └── settings.json ├── CONTRIBUTING.md ├── CONTRIBUTING_CN.md ├── LICENSE ├── README.md ├── README_CN.md ├── apps ├── api │ ├── .env.development │ ├── .env.example │ ├── .gitignore │ ├── .swcrc │ ├── Dockerfile │ ├── README.md │ ├── copy-files.js │ ├── electron-builder.json │ ├── electron-builder.yml │ ├── install-engines-on-mac.js │ ├── jest.config.ts │ ├── nodemon.electron.json │ ├── nodemon.json │ ├── notarize.js │ ├── package.json │ ├── prisma │ │ ├── README.md │ │ ├── migrations │ │ │ └── 20250508182500_add_mcp_server │ │ │ │ ├── migration.sql │ │ │ │ └── migration.toml │ │ ├── schema.prisma │ │ └── sqlite-schema.prisma │ ├── scripts │ │ └── download-binaries.js │ ├── src │ │ ├── electron │ │ │ ├── electron-env.d.ts │ │ │ ├── ipc.ts │ │ │ ├── main.ts │ │ │ ├── preload.ts │ │ │ └── services │ │ │ │ ├── api.ts │ │ │ │ ├── qdrant.ts │ │ │ │ └── redis.ts │ │ ├── index.d.ts │ │ ├── main.ts │ │ ├── modules │ │ │ ├── action │ │ │ │ ├── action.controller.spec.ts │ │ │ │ ├── action.controller.ts │ │ │ │ ├── action.dto.ts │ │ │ │ ├── action.module.ts │ │ │ │ ├── action.service.spec.ts │ │ │ │ └── action.service.ts │ │ │ ├── app.controller.spec.ts │ │ │ ├── app.controller.ts │ │ │ ├── app.module.ts │ │ │ ├── app.service.ts │ │ │ ├── auth │ │ │ │ ├── auth.controller.spec.ts │ │ │ │ ├── auth.controller.ts │ │ │ │ ├── auth.dto.ts │ │ │ │ ├── auth.module.ts │ │ │ │ ├── auth.processor.ts │ │ │ │ ├── auth.service.spec.ts │ │ │ │ ├── auth.service.ts │ │ │ │ ├── guard │ │ │ │ │ ├── github-oauth.guard.ts │ │ │ │ │ ├── google-oauth.guard.ts │ │ │ │ │ ├── jwt-auth.guard.ts │ │ │ │ │ └── local-auth.guard.ts │ │ │ │ └── strategy │ │ │ │ │ ├── github-oauth.strategy.ts │ │ │ │ │ └── google-oauth.strategy.ts │ │ │ ├── canvas │ │ │ │ ├── canvas-title-generator.ts │ │ │ │ ├── canvas.controller.spec.ts │ │ │ │ ├── canvas.controller.ts │ │ │ │ ├── canvas.dto.ts │ │ │ │ ├── canvas.module.ts │ │ │ │ ├── canvas.processor.ts │ │ │ │ ├── canvas.service.spec.ts │ │ │ │ └── canvas.service.ts │ │ │ ├── code-artifact │ │ │ │ ├── code-artifact.controller.spec.ts │ │ │ │ ├── code-artifact.controller.ts │ │ │ │ ├── code-artifact.dto.ts │ │ │ │ ├── code-artifact.module.ts │ │ │ │ ├── code-artifact.service.spec.ts │ │ │ │ └── code-artifact.service.ts │ │ │ ├── collab │ │ │ │ ├── collab.controller.ts │ │ │ │ ├── collab.dto.ts │ │ │ │ ├── collab.gateway.ts │ │ │ │ ├── collab.module.ts │ │ │ │ ├── collab.service.spec.ts │ │ │ │ └── collab.service.ts │ │ │ ├── common │ │ │ │ ├── common.module.ts │ │ │ │ ├── encryption.service.ts │ │ │ │ ├── fulltext-search │ │ │ │ │ ├── backend │ │ │ │ │ │ ├── elasticsearch.ts │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── prisma.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── tokens.ts │ │ │ │ ├── object-storage │ │ │ │ │ ├── backend │ │ │ │ │ │ ├── fs.ts │ │ │ │ │ │ ├── interface.ts │ │ │ │ │ │ └── minio.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── tokens.ts │ │ │ │ ├── prisma.service.ts │ │ │ │ ├── qdrant.dto.ts │ │ │ │ ├── qdrant.service.ts │ │ │ │ └── redis.service.ts │ │ │ ├── config │ │ │ │ └── app.config.ts │ │ │ ├── event │ │ │ │ ├── event.dto.ts │ │ │ │ ├── event.module.ts │ │ │ │ ├── event.processor.ts │ │ │ │ ├── event.service.spec.ts │ │ │ │ └── event.service.ts │ │ │ ├── knowledge │ │ │ │ ├── knowledge.controller.spec.ts │ │ │ │ ├── knowledge.controller.ts │ │ │ │ ├── knowledge.dto.ts │ │ │ │ ├── knowledge.module.ts │ │ │ │ ├── knowledge.processor.ts │ │ │ │ ├── knowledge.service.spec.ts │ │ │ │ ├── knowledge.service.ts │ │ │ │ └── parsers │ │ │ │ │ ├── base.ts │ │ │ │ │ ├── cheerio.parser.ts │ │ │ │ │ ├── docx.parser.ts │ │ │ │ │ ├── factory.ts │ │ │ │ │ ├── jina.parser.ts │ │ │ │ │ ├── marker.parser.ts │ │ │ │ │ ├── pandoc.parser.ts │ │ │ │ │ ├── pdf.parser.ts │ │ │ │ │ ├── pdfjs.parser.ts │ │ │ │ │ └── plain-text.parser.ts │ │ │ ├── label │ │ │ │ ├── label.controller.spec.ts │ │ │ │ ├── label.controller.ts │ │ │ │ ├── label.dto.ts │ │ │ │ ├── label.module.ts │ │ │ │ ├── label.service.spec.ts │ │ │ │ └── label.service.ts │ │ │ ├── mcp-server │ │ │ │ ├── mcp-server.controller.ts │ │ │ │ ├── mcp-server.dto.ts │ │ │ │ ├── mcp-server.module.ts │ │ │ │ └── mcp-server.service.ts │ │ │ ├── misc │ │ │ │ ├── misc.controller.spec.ts │ │ │ │ ├── misc.controller.ts │ │ │ │ ├── misc.dto.ts │ │ │ │ ├── misc.module.ts │ │ │ │ ├── misc.processor.ts │ │ │ │ ├── misc.service.spec.ts │ │ │ │ └── misc.service.ts │ │ │ ├── pages │ │ │ │ ├── pages.controller.ts │ │ │ │ ├── pages.dto.ts │ │ │ │ ├── pages.module.ts │ │ │ │ └── pages.service.ts │ │ │ ├── project │ │ │ │ ├── project.controller.spec.ts │ │ │ │ ├── project.controller.ts │ │ │ │ ├── project.dto.ts │ │ │ │ ├── project.module.ts │ │ │ │ ├── project.service.spec.ts │ │ │ │ └── project.service.ts │ │ │ ├── provider │ │ │ │ ├── provider.controller.ts │ │ │ │ ├── provider.dto.ts │ │ │ │ ├── provider.module.ts │ │ │ │ └── provider.service.ts │ │ │ ├── rag │ │ │ │ ├── rag.dto.ts │ │ │ │ ├── rag.module.ts │ │ │ │ ├── rag.service.spec.ts │ │ │ │ └── rag.service.ts │ │ │ ├── search │ │ │ │ ├── search.controller.spec.ts │ │ │ │ ├── search.controller.ts │ │ │ │ ├── search.module.ts │ │ │ │ ├── search.service.spec.ts │ │ │ │ └── search.service.ts │ │ │ ├── share │ │ │ │ ├── share.controller.spec.ts │ │ │ │ ├── share.controller.ts │ │ │ │ ├── share.dto.ts │ │ │ │ ├── share.module.ts │ │ │ │ ├── share.service.spec.ts │ │ │ │ └── share.service.ts │ │ │ ├── skill │ │ │ │ ├── skill.controller.spec.ts │ │ │ │ ├── skill.controller.ts │ │ │ │ ├── skill.dto.ts │ │ │ │ ├── skill.module.ts │ │ │ │ ├── skill.processor.ts │ │ │ │ ├── skill.service.spec.ts │ │ │ │ └── skill.service.ts │ │ │ ├── subscription │ │ │ │ ├── subscription.controller.spec.ts │ │ │ │ ├── subscription.controller.ts │ │ │ │ ├── subscription.dto.ts │ │ │ │ ├── subscription.module.ts │ │ │ │ ├── subscription.processor.ts │ │ │ │ ├── subscription.service.spec.ts │ │ │ │ └── subscription.service.ts │ │ │ ├── template │ │ │ │ ├── template.controller.spec.ts │ │ │ │ ├── template.controller.ts │ │ │ │ ├── template.dto.ts │ │ │ │ ├── template.module.ts │ │ │ │ ├── template.service.spec.ts │ │ │ │ └── template.service.ts │ │ │ └── user │ │ │ │ ├── user.controller.spec.ts │ │ │ │ ├── user.controller.ts │ │ │ │ ├── user.dto.ts │ │ │ │ ├── user.module.ts │ │ │ │ ├── user.service.spec.ts │ │ │ │ └── user.service.ts │ │ ├── register-aliases.ts │ │ ├── scripts │ │ │ ├── encrypt-provider-api-keys.ts │ │ │ ├── generate-encryption-key.ts │ │ │ └── sync-db-schema.ts │ │ ├── tracer.ts │ │ └── utils │ │ │ ├── adapters │ │ │ └── ws-adapter.ts │ │ │ ├── cache.ts │ │ │ ├── const.ts │ │ │ ├── decorators │ │ │ └── user.decorator.ts │ │ │ ├── exception.ts │ │ │ ├── filters │ │ │ └── global-exception.filter.ts │ │ │ ├── id.ts │ │ │ ├── index.ts │ │ │ ├── interceptors │ │ │ └── logging.interceptor.ts │ │ │ ├── middleware │ │ │ └── set-trace-id.ts │ │ │ ├── response.ts │ │ │ ├── result.ts │ │ │ ├── stream.ts │ │ │ ├── typesafe.ts │ │ │ └── web-search │ │ │ ├── base.ts │ │ │ ├── searxng.ts │ │ │ └── serper.ts │ ├── tsconfig.electron.json │ └── tsconfig.json ├── extension │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── postcss.config.ts │ ├── src │ │ ├── @types │ │ │ ├── custom.d.ts │ │ │ ├── i18next.d.ts │ │ │ ├── react-app-env.d.ts │ │ │ └── resources.ts │ │ ├── assets │ │ │ ├── common │ │ │ │ └── arrow-down.svg │ │ │ ├── digest │ │ │ │ └── empty.svg │ │ │ ├── icon.png │ │ │ ├── logo.svg │ │ │ ├── menu-icons │ │ │ │ ├── abstract.svg │ │ │ │ ├── close.svg │ │ │ │ ├── code.svg │ │ │ │ ├── copy.svg │ │ │ │ ├── explain.svg │ │ │ │ ├── extension.svg │ │ │ │ ├── grammary.svg │ │ │ │ ├── qa.svg │ │ │ │ ├── refresh.svg │ │ │ │ ├── setting.svg │ │ │ │ ├── tag-hoverd.svg │ │ │ │ ├── tag-selected.svg │ │ │ │ ├── tag.svg │ │ │ │ ├── translate.svg │ │ │ │ └── write.svg │ │ │ ├── selected-content │ │ │ │ └── empty.svg │ │ │ └── side │ │ │ │ ├── close.svg │ │ │ │ ├── full-screen.svg │ │ │ │ ├── help.svg │ │ │ │ ├── notification.svg │ │ │ │ ├── send.svg │ │ │ │ └── setting.svg │ │ ├── components │ │ │ ├── content-clipper │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ ├── content-selector │ │ │ │ ├── components │ │ │ │ │ └── hover-menu │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── hooks │ │ │ │ │ ├── use-content-selector.tsx │ │ │ │ │ └── use-selected-mark.ts │ │ │ │ ├── stores │ │ │ │ │ └── content-selector.ts │ │ │ │ └── utils │ │ │ │ │ ├── get-popup-container.ts │ │ │ │ │ ├── highlight-selection.ts │ │ │ │ │ └── index.ts │ │ │ ├── header │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ ├── icon-tip │ │ │ │ └── index.tsx │ │ │ └── output-locale-list │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ ├── entrypoints │ │ │ ├── background │ │ │ │ ├── events │ │ │ │ │ ├── activated.ts │ │ │ │ │ ├── detached.ts │ │ │ │ │ ├── externalMessage.ts │ │ │ │ │ ├── messages │ │ │ │ │ │ ├── apiRequest.ts │ │ │ │ │ │ ├── getOpenedTabs.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── injectContentSelectorCss.ts │ │ │ │ │ │ ├── others.ts │ │ │ │ │ │ ├── registerEvent.ts │ │ │ │ │ │ └── toggleCopilot.ts │ │ │ │ │ ├── ports.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── index.ts │ │ │ ├── contentSelector-csui.content │ │ │ │ ├── App.scss │ │ │ │ ├── App.tsx │ │ │ │ └── index.tsx │ │ │ ├── floatingSphere-csui.content │ │ │ │ ├── App.scss │ │ │ │ ├── App.tsx │ │ │ │ └── index.tsx │ │ │ ├── main-csui.content │ │ │ │ ├── App.scss │ │ │ │ ├── App.tsx │ │ │ │ └── index.tsx │ │ │ ├── popup │ │ │ │ ├── App.scss │ │ │ │ ├── App.tsx │ │ │ │ ├── index.html │ │ │ │ ├── load-loading.tsx │ │ │ │ ├── login-header.tsx │ │ │ │ ├── main.tsx │ │ │ │ ├── not-logged.tsx │ │ │ │ ├── style.css │ │ │ │ └── unsupported.tsx │ │ │ └── utils-csui.content │ │ │ │ ├── App.scss │ │ │ │ ├── App.tsx │ │ │ │ └── index.tsx │ │ ├── hooks │ │ │ ├── content-scripts │ │ │ │ └── use-get-weblink-resource-meta.ts │ │ │ ├── use-bind-commands.ts │ │ │ ├── use-count-down.ts │ │ │ ├── use-extension-message.ts │ │ │ ├── use-get-user-settings.ts │ │ │ ├── use-knowledge-base.ts │ │ │ ├── use-mock-in-app-resource.ts │ │ │ ├── use-process-login-notify.ts │ │ │ ├── use-register-mouse-event.ts │ │ │ ├── use-save-resource.ts │ │ │ ├── use-save-selected-content.ts │ │ │ ├── use-set-container-dimension.ts │ │ │ ├── use-storage.ts │ │ │ ├── use-store-weblink.ts │ │ │ ├── use-switch-theme.ts │ │ │ └── use-weblink-indexed.ts │ │ ├── i18n │ │ │ ├── cn │ │ │ │ └── translation.ts │ │ │ ├── config.ts │ │ │ └── en │ │ │ │ └── translation.ts │ │ ├── modules │ │ │ └── toggle-copilot │ │ │ │ ├── hooks │ │ │ │ ├── use-handle-toggle-csui.ts │ │ │ │ ├── use-handle-toggle-side-panel.ts │ │ │ │ ├── use-listen-to-copilot-type.ts │ │ │ │ ├── use-set-copilot-type.ts │ │ │ │ └── use-toggle-copilot.ts │ │ │ │ └── stores │ │ │ │ └── use-copilot-type.ts │ │ ├── pages │ │ │ └── login │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ ├── public │ │ │ ├── _locales │ │ │ │ ├── en │ │ │ │ │ └── messages.json │ │ │ │ ├── en_AU │ │ │ │ │ └── messages.json │ │ │ │ ├── en_GB │ │ │ │ │ └── messages.json │ │ │ │ ├── en_US │ │ │ │ │ └── messages.json │ │ │ │ ├── zh_CN │ │ │ │ │ └── messages.json │ │ │ │ └── zh_TW │ │ │ │ │ └── messages.json │ │ │ └── icon │ │ │ │ ├── 128.png │ │ │ │ ├── 16.png │ │ │ │ ├── 32.png │ │ │ │ ├── 48.png │ │ │ │ └── 64.png │ │ ├── requests │ │ │ ├── apiRequest.ts │ │ │ └── getAllCommands.ts │ │ ├── routes │ │ │ └── index.tsx │ │ ├── stores │ │ │ ├── conversation.ts │ │ │ ├── home-state.ts │ │ │ ├── message-state.ts │ │ │ ├── popup.ts │ │ │ ├── quick-action.ts │ │ │ ├── search-state.ts │ │ │ ├── task.ts │ │ │ ├── thread-search-state.ts │ │ │ ├── thread.ts │ │ │ ├── user.ts │ │ │ └── weblink.ts │ │ ├── styles │ │ │ ├── additional-styles │ │ │ │ ├── theme.css │ │ │ │ ├── toggle-switch.css │ │ │ │ └── utility-patterns.css │ │ │ └── style.css │ │ ├── types │ │ │ └── sidePanel.ts │ │ └── utils │ │ │ ├── browser.ts │ │ │ ├── cn.ts │ │ │ ├── cookie.ts │ │ │ ├── dayjsConfig.ts │ │ │ ├── delay.ts │ │ │ ├── env.ts │ │ │ ├── locale.ts │ │ │ ├── retry.ts │ │ │ ├── save-mocked-resource.ts │ │ │ ├── storage.ts │ │ │ ├── ui.ts │ │ │ └── version.ts │ ├── tailwind.config.ts │ ├── tsconfig.json │ └── wxt.config.ts └── web │ ├── .env.example │ ├── .gitignore │ ├── Dockerfile │ ├── README.md │ ├── index.html │ ├── package.json │ ├── postcss.config.ts │ ├── public │ ├── config.js │ └── logo.svg │ ├── src │ ├── @types │ │ ├── i18next.d.ts │ │ └── react-app-env.d.ts │ ├── assets │ │ ├── common │ │ │ └── arrow-down.svg │ │ ├── digest │ │ │ └── empty.svg │ │ ├── github-mark.svg │ │ ├── google.svg │ │ ├── icon.png │ │ ├── logo.svg │ │ └── side │ │ │ ├── close.svg │ │ │ ├── full-screen.svg │ │ │ ├── help.svg │ │ │ ├── notification.svg │ │ │ ├── send.svg │ │ │ └── setting.svg │ ├── components │ │ ├── common │ │ │ ├── BlurImage.tsx │ │ │ └── PoweredByRefly.tsx │ │ ├── landing-page-partials │ │ │ ├── Footer.tsx │ │ │ ├── Header.tsx │ │ │ ├── HeroHome.tsx │ │ │ ├── Testimonials.tsx │ │ │ ├── artifact-gallery │ │ │ │ ├── data.ts │ │ │ │ └── index.tsx │ │ │ ├── feature-blocks.tsx │ │ │ ├── footer.scss │ │ │ ├── frequently-asked-questions.tsx │ │ │ ├── header.scss │ │ │ ├── hero-home.scss │ │ │ ├── use-cases-gallery │ │ │ │ ├── data.ts │ │ │ │ └── index.tsx │ │ │ ├── utils │ │ │ │ ├── Dropdown.jsx │ │ │ │ ├── Modal.jsx │ │ │ │ └── Transition.jsx │ │ │ └── workflow-blocks.tsx │ │ ├── layout │ │ │ ├── arco.css │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── login-modal │ │ │ └── index.tsx │ │ ├── reset-password-modal │ │ │ └── index.tsx │ │ └── verification-modal │ │ │ └── index.tsx │ ├── index.css │ ├── lib │ │ └── utils.ts │ ├── main.tsx │ ├── pages │ │ ├── artifact-gallery │ │ │ └── index.tsx │ │ ├── canvas │ │ │ └── index.tsx │ │ ├── code-share │ │ │ └── index.tsx │ │ ├── document-share │ │ │ └── index.tsx │ │ ├── home │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── hooks │ │ │ └── useCardScroll.ts │ │ ├── library │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── login │ │ │ └── index.tsx │ │ ├── page-share │ │ │ └── index.tsx │ │ ├── page-title │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── pages │ │ │ ├── components │ │ │ │ ├── ArtifactRenderer.tsx │ │ │ │ ├── CodeArtifactRenderer.tsx │ │ │ │ ├── DocumentRenderer.tsx │ │ │ │ ├── EmptyContentPrompt.tsx │ │ │ │ ├── ImageRenderer.tsx │ │ │ │ ├── LazyComponents.tsx │ │ │ │ ├── MemoRenderer.tsx │ │ │ │ ├── NodeBlockHeader.tsx │ │ │ │ ├── NodeRenderer.tsx │ │ │ │ ├── OptimizedPreviewMode.tsx │ │ │ │ ├── PageLayout.tsx │ │ │ │ ├── PreviewMode.tsx │ │ │ │ ├── ResourceRenderer.tsx │ │ │ │ ├── SidebarMinimap.tsx │ │ │ │ ├── SkillResponseRenderer.tsx │ │ │ │ └── WebsiteRenderer.tsx │ │ │ ├── hooks │ │ │ │ ├── useCardScroll.ts │ │ │ │ ├── usePreviewUI.ts │ │ │ │ └── useSlideshow.ts │ │ │ ├── index.tsx │ │ │ ├── list.tsx │ │ │ ├── new.tsx │ │ │ ├── styles │ │ │ │ └── preview-mode.css │ │ │ └── utils │ │ │ │ └── nodeUtils.ts │ │ ├── pricing │ │ │ └── index.tsx │ │ ├── project │ │ │ └── index.tsx │ │ ├── request-access │ │ │ └── index.tsx │ │ ├── settings │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── share │ │ │ ├── index.tsx │ │ │ └── pages │ │ │ │ └── [shareId].tsx │ │ ├── skill-response-share │ │ │ └── index.tsx │ │ ├── skill │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── template-preview │ │ │ └── index.tsx │ │ └── use-cases-gallery │ │ │ └── index.tsx │ ├── process-polyfill.ts │ ├── routes │ │ └── index.tsx │ ├── styles │ │ ├── additional-styles │ │ │ ├── arco-additional.scss │ │ │ ├── theme.css │ │ │ ├── toggle-switch.css │ │ │ └── utility-patterns.css │ │ ├── fonts.scss │ │ ├── global.css │ │ └── style.css │ ├── utils │ │ ├── date.ts │ │ ├── dom-patch.ts │ │ └── ui.ts │ └── vite-env.d.ts │ ├── tailwind.config.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── typing │ └── tailwindcss-nesting.d.ts │ ├── vite-gtag-plugin.ts │ └── vite.config.ts ├── biome.json ├── cypress.config.ts ├── cypress ├── .gitignore ├── e2e │ ├── canvas.cy.ts │ ├── login.cy.ts │ └── signup.cy.ts ├── fixtures │ ├── models-setup.sql │ ├── users-cleanup.sql │ └── users-setup.sql ├── support │ ├── commands.ts │ └── e2e.ts └── tsconfig.json ├── deploy ├── docker │ ├── docker-compose.elasticsearch.yml │ ├── docker-compose.middleware.yml │ ├── docker-compose.yml │ ├── elasticsearch-entrypoint.sh │ ├── elasticsearch │ │ └── Dockerfile │ ├── nginx.conf │ ├── qdrant │ │ └── Dockerfile │ └── searxng │ │ ├── settings.yml │ │ └── uwsgi.ini └── model-providers │ ├── deepseek.sql │ ├── ollama.sql │ ├── openai.sql │ └── openrouter.sql ├── docs ├── .vitepress │ ├── config.ts │ └── theme │ │ ├── Layout.vue │ │ ├── custom.css │ │ └── index.ts ├── README.md ├── cloud │ ├── chrome-extension.md │ ├── feature-intro │ │ ├── ask-ai.md │ │ ├── canvas-nodes.md │ │ ├── creation-toolbar.md │ │ ├── global-search.md │ │ ├── index.md │ │ ├── knowledge-base.md │ │ ├── templates.md │ │ └── ui-overview.md │ └── index.md ├── community-version │ ├── faq.md │ ├── index.md │ └── self-deploy │ │ ├── configuration.md │ │ ├── gitpod-quick-deploy.md │ │ ├── index.md │ │ └── ollama.md ├── en │ ├── about │ │ ├── privacy-policy.md │ │ └── terms-of-service.md │ ├── changelog │ │ ├── v0.1.1.md │ │ ├── v0.1.2.md │ │ ├── v0.2.0.md │ │ ├── v0.2.1.md │ │ ├── v0.2.2.md │ │ ├── v0.2.3.md │ │ ├── v0.2.4.md │ │ ├── v0.3.0.md │ │ ├── v0.4.0.md │ │ ├── v0.4.1.md │ │ ├── v0.4.2.md │ │ ├── v0.5.0.md │ │ └── v0.6.0.md │ ├── community │ │ └── contact-us.md │ ├── guide │ │ ├── chrome-extension.md │ │ ├── crash-course.md │ │ ├── introduction.md │ │ ├── use-gitpod-deploy.md │ │ └── video-tutorials.md │ └── roadmap.md ├── index.md ├── package.json ├── pnpm-lock.yaml ├── public │ ├── favicon.ico │ ├── images │ │ ├── 2025-04-25-17-29-03.webp │ │ ├── 2025-04-26-12-48-50.webp │ │ ├── 2025-04-26-15-03-40.webp │ │ ├── 2025-04-26-15-03-54.webp │ │ ├── 2025-04-26-15-04-17.webp │ │ ├── 2025-04-26-15-04-36.webp │ │ ├── 2025-04-26-15-07-23.webp │ │ ├── 2025-04-26-15-07-41.webp │ │ ├── 2025-04-26-15-07-50.webp │ │ ├── 2025-04-26-15-08-04.webp │ │ ├── 2025-04-26-15-08-17.webp │ │ ├── 2025-04-26-15-08-27.webp │ │ ├── 2025-04-26-15-08-40.webp │ │ ├── 2025-04-26-15-08-49.webp │ │ ├── 2025-04-26-15-08-58.webp │ │ ├── 2025-04-26-15-09-06.webp │ │ ├── 2025-04-26-15-09-19.webp │ │ ├── 2025-04-26-15-09-32.webp │ │ ├── 2025-04-26-15-09-50.webp │ │ ├── 2025-04-26-15-12-27.webp │ │ ├── 2025-04-26-15-12-59.webp │ │ ├── 2025-04-26-15-13-07.webp │ │ ├── 2025-04-26-15-13-22.webp │ │ ├── 2025-04-26-15-13-35.webp │ │ ├── 2025-04-26-15-13-49.webp │ │ ├── 2025-04-26-15-14-09.webp │ │ ├── 2025-04-26-15-14-21.webp │ │ ├── 2025-04-26-15-14-59.webp │ │ ├── 2025-04-26-15-15-12.webp │ │ ├── 2025-04-26-15-15-22.webp │ │ ├── 2025-04-26-15-15-34.webp │ │ ├── 2025-04-26-15-30-56.webp │ │ ├── 2025-04-26-15-31-11.webp │ │ ├── 2025-04-26-15-31-22.webp │ │ ├── 2025-04-26-15-31-31.webp │ │ ├── 2025-04-26-15-32-23.webp │ │ ├── 2025-04-26-15-32-33.webp │ │ ├── 2025-04-26-15-32-39.webp │ │ ├── 2025-04-26-15-32-51.webp │ │ ├── 2025-04-26-15-33-14.webp │ │ ├── 2025-04-26-15-33-20.webp │ │ ├── 2025-04-26-15-33-36.webp │ │ ├── 2025-04-26-15-33-47.webp │ │ ├── 2025-04-26-16-12-55.webp │ │ ├── 2025-04-26-16-13-09.webp │ │ ├── 2025-04-26-16-13-20.webp │ │ ├── 2025-04-26-16-13-28.webp │ │ ├── 2025-04-26-16-13-42.webp │ │ ├── 2025-04-26-16-14-04.webp │ │ ├── 2025-04-26-16-14-27.webp │ │ ├── 2025-04-26-16-14-40.webp │ │ ├── 2025-04-26-16-14-54.webp │ │ ├── 2025-04-26-16-15-13.webp │ │ ├── 2025-04-26-16-15-23.webp │ │ ├── 2025-04-26-16-15-32.webp │ │ ├── 2025-04-26-16-15-40.webp │ │ ├── 2025-04-26-16-15-50.webp │ │ ├── 2025-04-26-16-15-58.webp │ │ ├── 2025-04-26-22-25-27.webp │ │ ├── 2025-04-26-22-26-17.webp │ │ ├── 2025-04-26-22-26-35.webp │ │ ├── 2025-04-26-22-26-45.webp │ │ ├── 2025-04-26-22-26-57.webp │ │ ├── 2025-04-26-22-27-08.webp │ │ ├── 2025-04-26-22-27-25.webp │ │ ├── 2025-04-26-22-27-50.webp │ │ ├── 2025-04-26-22-28-01.webp │ │ ├── 2025-04-26-22-28-11.webp │ │ ├── 2025-04-26-22-28-20.webp │ │ ├── 2025-04-26-22-28-35.webp │ │ ├── 2025-04-26-22-28-44.webp │ │ ├── 2025-04-26-22-28-55.webp │ │ ├── 2025-04-26-22-29-05.webp │ │ ├── 2025-04-26-22-29-14.webp │ │ ├── 2025-04-26-22-29-25.webp │ │ ├── 2025-04-26-22-29-41.webp │ │ ├── 2025-04-26-22-29-50.webp │ │ ├── 2025-04-26-22-30-19.webp │ │ ├── 2025-04-26-22-30-30.webp │ │ ├── 2025-04-26-22-30-39.webp │ │ ├── 2025-04-26-22-30-49.webp │ │ ├── 2025-04-26-22-31-02.webp │ │ ├── 2025-04-26-22-31-21.webp │ │ ├── 2025-04-26-22-31-37.webp │ │ ├── 2025-04-26-22-31-44.webp │ │ ├── 2025-04-26-22-31-57.webp │ │ ├── 2025-04-26-22-32-16.webp │ │ ├── 2025-04-26-22-32-24.webp │ │ ├── 2025-04-26-22-32-38.webp │ │ ├── 2025-04-26-22-32-47.webp │ │ ├── 2025-04-26-22-32-59.webp │ │ ├── 2025-04-26-22-33-09.webp │ │ ├── 2025-04-26-22-33-23.webp │ │ ├── 2025-04-26-22-33-32.webp │ │ ├── 2025-04-26-22-33-43.webp │ │ ├── 2025-04-26-22-33-52.webp │ │ ├── 2025-04-26-22-34-02.webp │ │ ├── 2025-04-26-22-34-21.webp │ │ ├── 2025-04-26-22-34-41.webp │ │ ├── 2025-04-26-22-34-47.webp │ │ ├── 2025-04-26-23-33-50.webp │ │ ├── 2025-04-26-23-34-00.webp │ │ ├── 2025-04-26-23-34-09.webp │ │ ├── 2025-04-26-23-34-20.webp │ │ ├── 2025-04-26-23-34-28.webp │ │ ├── 2025-04-26-23-34-37.webp │ │ ├── 2025-04-26-23-34-50.webp │ │ ├── 2025-04-26-23-34-59.webp │ │ ├── 2025-04-26-23-35-07.webp │ │ ├── 2025-04-26-23-35-17.webp │ │ ├── 2025-04-26-23-35-28.webp │ │ ├── 2025-04-26-23-35-36.webp │ │ ├── 2025-04-26-23-35-46.webp │ │ ├── 2025-04-26-23-36-01.webp │ │ ├── 2025-04-26-23-36-20.webp │ │ ├── 2025-04-26-23-36-29.webp │ │ ├── 2025-04-26-23-36-38.webp │ │ ├── 2025-04-27-00-07-40.webp │ │ ├── 2025-04-27-00-07-52.webp │ │ ├── 2025-04-27-00-08-02.webp │ │ ├── 2025-04-27-00-15-33.webp │ │ ├── 2025-04-27-00-15-46.webp │ │ ├── 2025-04-27-00-19-43.webp │ │ ├── 2025-04-27-00-19-51.webp │ │ ├── 2025-04-27-00-20-01.webp │ │ ├── 2025-04-27-00-20-10.webp │ │ ├── 2025-04-27-00-20-20.webp │ │ ├── 2025-04-27-00-20-30.webp │ │ ├── 2025-04-27-00-20-37.webp │ │ ├── 2025-04-27-00-20-49.webp │ │ ├── 2025-04-27-00-20-58.webp │ │ ├── 2025-04-27-11-20-24.webp │ │ ├── 2025-04-27-11-20-35.webp │ │ ├── 2025-04-27-11-20-44.webp │ │ ├── 2025-04-27-11-20-54.webp │ │ ├── 2025-04-27-11-21-07.webp │ │ ├── 2025-04-27-11-21-24.webp │ │ ├── 2025-05-13-16-54-06.png │ │ ├── 2025-05-13-16-57-09.png │ │ ├── 2025-05-13-17-00-37.png │ │ ├── 2025-05-13-17-01-47.png │ │ ├── 2025-05-13-17-02-31.png │ │ ├── 2025-05-13-17-04-02.png │ │ ├── 2025-05-13-17-04-54.png │ │ ├── 2025-05-13-17-05-32.png │ │ ├── 2025-05-13-17-07-48.png │ │ ├── 2025-05-13-17-08-59.png │ │ ├── 2025-05-13-17-11-17.png │ │ ├── 2025-05-13-17-11-48.png │ │ ├── 2025-05-13-17-12-26.png │ │ ├── 2025-05-13-17-15-36.png │ │ ├── 2025-05-13-17-16-15.png │ │ ├── 2025-05-13-17-17-18.png │ │ ├── 2025-05-13-17-18-51.png │ │ ├── 2025-05-13-17-22-48.png │ │ ├── 2025-05-13-17-24-14.png │ │ ├── 2025-05-13-17-37-35.png │ │ ├── 2025-05-13-17-38-49.png │ │ ├── 2025-05-13-17-39-42.png │ │ ├── 2025-05-13-17-41-16.png │ │ ├── 2025-05-13-17-41-52.png │ │ ├── 2025-05-13-17-42-41.png │ │ ├── 2025-05-13-17-43-12.png │ │ ├── 2025-05-13-17-43-42.png │ │ ├── 2025-05-13-17-44-22.png │ │ ├── 2025-05-13-17-44-44.png │ │ ├── 2025-05-13-17-45-11.png │ │ ├── 2025-05-13-17-47-05.png │ │ ├── 2025-05-13-17-49-36.png │ │ ├── 2025-05-13-17-50-52.png │ │ ├── 2025-05-13-17-51-29.png │ │ ├── 2025-05-13-17-51-59.png │ │ ├── 2025-05-13-17-52-26.png │ │ ├── 2025-05-13-17-53-06.png │ │ ├── 2025-05-13-17-55-48.png │ │ ├── 2025-05-13-18-03-21.png │ │ ├── 2025-05-13-18-28-28.png │ │ ├── 2025-05-13-18-31-35.png │ │ ├── 2025-05-13-18-32-06.png │ │ ├── 2025-05-13-18-40-49.png │ │ ├── 2025-05-13-18-41-41.png │ │ ├── 2025-05-13-21-37-55.png │ │ ├── 2025-05-13-21-43-47.png │ │ ├── 2025-05-13-21-44-18.png │ │ ├── 2025-05-13-21-45-20.png │ │ ├── 2025-05-13-21-46-24.png │ │ ├── 2025-05-13-21-47-18.png │ │ ├── 2025-05-13-21-51-18.png │ │ ├── 2025-05-13-21-53-46.png │ │ ├── 2025-05-13-21-55-05.png │ │ ├── 2025-05-13-22-01-24.png │ │ ├── 2025-05-13-22-01-40.png │ │ ├── 2025-05-13-22-02-09.png │ │ ├── 2025-05-13-22-03-44.png │ │ ├── 2025-05-13-22-04-30.png │ │ ├── 2025-05-13-22-04-54.png │ │ ├── 2025-05-13-22-05-36.png │ │ ├── 2025-05-13-22-06-24.png │ │ ├── 2025-05-13-22-08-06.png │ │ ├── 2025-05-13-22-09-17.png │ │ ├── 2025-05-13-22-09-57.png │ │ ├── 2025-05-13-22-31-07.png │ │ ├── 2025-05-13-22-31-45.png │ │ ├── 2025-05-13-22-32-14.png │ │ ├── 2025-05-13-22-32-49.png │ │ ├── 2025-05-13-22-33-20.png │ │ ├── 2025-05-13-22-34-43.png │ │ ├── 2025-05-13-22-35-30.png │ │ ├── 2025-05-13-22-36-21.png │ │ ├── 2025-05-13-22-58-09.png │ │ ├── 2025-05-13-22-58-59.png │ │ ├── 2025-05-13-22-59-28.png │ │ ├── 2025-05-13-23-16-34.png │ │ ├── 2025-05-13-23-23-51.png │ │ ├── 2025-05-13-23-25-28.png │ │ ├── 2025-05-13-23-25-51.png │ │ ├── 2025-05-13-23-34-53.png │ │ ├── 2025-05-13-23-35-15.png │ │ ├── 2025-05-13-23-37-13.png │ │ ├── 2025-05-13-23-38-18.png │ │ ├── 2025-05-13-23-38-37.png │ │ ├── 2025-05-13-23-38-56.png │ │ ├── 2025-05-13-23-40-29.png │ │ ├── 2025-05-14-08-30-53.png │ │ ├── 2025-05-14-08-33-06.png │ │ ├── 2025-05-14-08-33-30.png │ │ ├── 2025-05-14-08-34-26.png │ │ ├── 2025-05-14-11-07-36.png │ │ ├── 2025-05-14-11-08-47.png │ │ ├── 2025-05-14-15-39-51.png │ │ ├── 2025-05-14-15-40-28.png │ │ ├── 2025-05-14-15-40-55.png │ │ ├── 2025-05-14-15-41-24.png │ │ ├── 2025-05-14-15-42-02.png │ │ ├── 2025-05-14-15-42-26.png │ │ ├── 2025-05-14-15-42-40.png │ │ ├── 2025-05-14-15-42-58.png │ │ ├── add-model-modal.webp │ │ ├── add-model.webp │ │ ├── ai-model-sql-init.webp │ │ ├── deploy-to-gitpod.webp │ │ ├── docker-compose-up.webp │ │ ├── error-report.webp │ │ ├── explore.webp │ │ ├── feature1.webp │ │ ├── feature2.webp │ │ ├── feature3.webp │ │ ├── feature4.webp │ │ ├── generate-article.webp │ │ ├── generate-outline.webp │ │ ├── gitpod-deploy-success.webp │ │ ├── gitpod-new-workspace.webp │ │ ├── landing-page-error.webp │ │ ├── lark-qrcode.webp │ │ ├── ollama-home.webp │ │ ├── other-models.webp │ │ ├── product.webp │ │ ├── register-1.webp │ │ ├── register-2.webp │ │ ├── research.webp │ │ ├── settings-provider-modal.webp │ │ ├── settings-provider.webp │ │ ├── settings.webp │ │ ├── start-chat.webp │ │ ├── wechat-group-qrcode.webp │ │ └── wechat-qrcode.webp │ └── logo │ │ ├── dark.svg │ │ ├── light.svg │ │ └── logo.svg ├── scenarios │ ├── create-tech-ppt.md │ └── index.md ├── scripts │ └── convert-webp.js └── zh │ ├── about │ ├── privacy-policy.md │ └── terms-of-service.md │ ├── changelog │ ├── v0.1.1.md │ ├── v0.1.2.md │ ├── v0.2.0.md │ ├── v0.2.1.md │ ├── v0.2.2.md │ ├── v0.2.3.md │ ├── v0.2.4.md │ ├── v0.3.0.md │ ├── v0.4.0.md │ ├── v0.4.1.md │ ├── v0.4.2.md │ ├── v0.5.0.md │ └── v0.6.0.md │ ├── cloud │ ├── chrome-extension.md │ ├── feature-intro │ │ ├── ask-ai.md │ │ ├── canvas-nodes.md │ │ ├── creation-toolbar.md │ │ ├── global-search.md │ │ ├── index.md │ │ ├── knowledge-base.md │ │ ├── templates.md │ │ └── ui-overview.md │ └── index.md │ ├── community-version │ ├── faq.md │ ├── index.md │ ├── personalization copy.md │ └── self-deploy │ │ ├── configuration.md │ │ ├── gitpod-quick-deploy.md │ │ ├── index.md │ │ ├── local-quick-start.md │ │ ├── ollama.md │ │ └── personalization.md │ ├── community │ └── contact-us.md │ ├── guide │ ├── chrome-extension.md │ ├── crash-course.md │ ├── introduction.md │ ├── use-gitpod-deploy.md │ └── video-tutorials.md │ ├── index.md │ ├── roadmap.md │ └── scenarios │ ├── create-tech-ppt.md │ └── index.md ├── package.json ├── packages ├── ai-workspace-common │ ├── .gitignore │ ├── README.md │ ├── index.html │ ├── package.json │ ├── public │ │ └── vite.svg │ ├── src │ │ ├── assets │ │ │ ├── anthropic.svg │ │ │ ├── chrome.svg │ │ │ ├── claude.svg │ │ │ ├── deepseek.svg │ │ │ ├── gemini.svg │ │ │ ├── grok.svg │ │ │ ├── logo.svg │ │ │ ├── meta.svg │ │ │ ├── mistral.svg │ │ │ ├── openai.svg │ │ │ ├── qwen.svg │ │ │ └── react.svg │ │ ├── components │ │ │ ├── canvas-template │ │ │ │ ├── create-template-modal.tsx │ │ │ │ ├── duplicate-canvas-modal.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ └── template-list.tsx │ │ │ ├── canvas │ │ │ │ ├── NotFoundOverlay.tsx │ │ │ │ ├── canvas-toolbar │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── tool-button.tsx │ │ │ │ ├── common │ │ │ │ │ ├── helper-line │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── util.ts │ │ │ │ │ └── node-selector │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── context-menu │ │ │ │ │ └── index.tsx │ │ │ │ ├── edges │ │ │ │ │ └── custom-edge.tsx │ │ │ │ ├── empty-guide │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── templates-guide.tsx │ │ │ │ ├── front-page │ │ │ │ │ ├── action.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── wireframe-cube.tsx │ │ │ │ ├── group-action-menu │ │ │ │ │ ├── group-action-buttons.tsx │ │ │ │ │ ├── group-name.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── launchpad │ │ │ │ │ ├── chat-actions │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── model-selector.tsx │ │ │ │ │ ├── chat-input.tsx │ │ │ │ │ ├── chat-panel.tsx │ │ │ │ │ ├── config-manager │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── context-manager │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── add-base-mark-context │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── base-mark-context-selector │ │ │ │ │ │ │ │ ├── home.tsx │ │ │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ │ └── type.ts │ │ │ │ │ │ │ ├── chat-history-preview.tsx │ │ │ │ │ │ │ └── selection-preview.tsx │ │ │ │ │ │ ├── context-item.tsx │ │ │ │ │ │ ├── context-preview.tsx │ │ │ │ │ │ ├── hooks │ │ │ │ │ │ │ └── use-context-filter-errror-tip.tsx │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── types │ │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ │ └── mark.ts │ │ │ │ │ │ └── utils │ │ │ │ │ │ │ ├── contentListSelection.tsx │ │ │ │ │ │ │ └── icon.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── mcp-selector-panel │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── recommend-questions-panel │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── selected-skill-header │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── skill-display │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── layout-control │ │ │ │ │ ├── help-modal.tsx │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── menu-popper │ │ │ │ │ └── index.tsx │ │ │ │ ├── multi-selection-menu │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── selection-action-menu.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── node-action-menu │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── node-chat-panel │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── node-context-menu │ │ │ │ │ └── index.tsx │ │ │ │ ├── node-preview │ │ │ │ │ ├── code-artifact.tsx │ │ │ │ │ ├── document.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── node-preview-header.tsx │ │ │ │ │ ├── resource.tsx │ │ │ │ │ ├── skill-response │ │ │ │ │ │ ├── action-container.tsx │ │ │ │ │ │ ├── action-step.tsx │ │ │ │ │ │ ├── edit-chat-input.tsx │ │ │ │ │ │ ├── enhanced-skill-response.tsx │ │ │ │ │ │ ├── index.scss │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── preview-chat-input.tsx │ │ │ │ │ │ ├── preview-context-manager.tsx │ │ │ │ │ │ ├── recommend-questions.tsx │ │ │ │ │ │ └── source-viewer.tsx │ │ │ │ │ ├── skill.tsx │ │ │ │ │ ├── tool.tsx │ │ │ │ │ └── website.tsx │ │ │ │ ├── nodes │ │ │ │ │ ├── code-artifact.tsx │ │ │ │ │ ├── document.tsx │ │ │ │ │ ├── ghost │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── group.tsx │ │ │ │ │ ├── image.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── memo │ │ │ │ │ │ ├── memo-editor.scss │ │ │ │ │ │ ├── memo-editor.tsx │ │ │ │ │ │ ├── memo.scss │ │ │ │ │ │ └── memo.tsx │ │ │ │ │ ├── resource.tsx │ │ │ │ │ ├── shared │ │ │ │ │ │ ├── action-buttons.tsx │ │ │ │ │ │ ├── color-picker.tsx │ │ │ │ │ │ ├── colors.ts │ │ │ │ │ │ ├── content-preview.tsx │ │ │ │ │ │ ├── create-node-menu.tsx │ │ │ │ │ │ ├── custom-handle.tsx │ │ │ │ │ │ ├── node-action-buttons.tsx │ │ │ │ │ │ ├── node-header.tsx │ │ │ │ │ │ ├── node-resizer.tsx │ │ │ │ │ │ ├── reasoning-content-preview.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── skill-response.tsx │ │ │ │ │ ├── skill.tsx │ │ │ │ │ ├── tool.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── website.tsx │ │ │ │ ├── refly-pilot │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── linear-thread.tsx │ │ │ │ │ └── thread-container.tsx │ │ │ │ ├── selection-action-menus │ │ │ │ │ └── utils.ts │ │ │ │ ├── selection-context-menu │ │ │ │ │ └── index.tsx │ │ │ │ ├── slideshow │ │ │ │ │ ├── create-from-canvas.tsx │ │ │ │ │ ├── index.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── new-slide.tsx │ │ │ │ │ └── slide-header.tsx │ │ │ │ └── top-toolbar │ │ │ │ │ ├── buttons.tsx │ │ │ │ │ ├── canvas-rename.tsx │ │ │ │ │ ├── canvas-title.tsx │ │ │ │ │ ├── index.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── share-settings.tsx │ │ │ ├── common │ │ │ │ ├── favicon │ │ │ │ │ └── index.tsx │ │ │ │ ├── header-actions.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── image-preview.tsx │ │ │ │ ├── loading │ │ │ │ │ └── index.tsx │ │ │ │ ├── resource-icon │ │ │ │ │ ├── defaultStyles.ts │ │ │ │ │ ├── file-icon.tsx │ │ │ │ │ ├── glyphs.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── resourceIcon.tsx │ │ │ │ ├── result-display.tsx │ │ │ │ ├── spin.tsx │ │ │ │ └── tooltip-button.tsx │ │ │ ├── document │ │ │ │ ├── ToC.scss │ │ │ │ ├── ToC.tsx │ │ │ │ ├── collab-editor.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ └── readonly-editor.tsx │ │ │ ├── editor │ │ │ │ ├── components │ │ │ │ │ ├── advanced-editor.tsx │ │ │ │ │ ├── data │ │ │ │ │ │ └── content.ts │ │ │ │ │ ├── extensions.ts │ │ │ │ │ ├── generative │ │ │ │ │ │ ├── block │ │ │ │ │ │ │ ├── ai-block-commands.tsx │ │ │ │ │ │ │ ├── ai-completion-block-command.tsx │ │ │ │ │ │ │ └── generative-block-menu-switch.tsx │ │ │ │ │ │ ├── common │ │ │ │ │ │ │ └── ai-selector.tsx │ │ │ │ │ │ └── inline │ │ │ │ │ │ │ ├── ai-completion-command.tsx │ │ │ │ │ │ │ ├── ai-selector-commands.tsx │ │ │ │ │ │ │ └── generative-menu-switch.tsx │ │ │ │ │ ├── image-upload.ts │ │ │ │ │ ├── selectors │ │ │ │ │ │ ├── ai-btn-selector.tsx │ │ │ │ │ │ ├── color-selector.scss │ │ │ │ │ │ ├── color-selector.tsx │ │ │ │ │ │ ├── content-selector-buttons.tsx │ │ │ │ │ │ ├── create-memo-selector.tsx │ │ │ │ │ │ ├── link-selector.tsx │ │ │ │ │ │ ├── node-selector.tsx │ │ │ │ │ │ ├── table-action.tsx │ │ │ │ │ │ └── text-buttons.tsx │ │ │ │ │ ├── slash-command.tsx │ │ │ │ │ ├── styles │ │ │ │ │ │ ├── CalSans-SemiBold.otf │ │ │ │ │ │ ├── fonts.ts │ │ │ │ │ │ ├── globals.css │ │ │ │ │ │ ├── prosemirror.css │ │ │ │ │ │ └── table.css │ │ │ │ │ ├── ui │ │ │ │ │ │ ├── command.tsx │ │ │ │ │ │ ├── dialog.tsx │ │ │ │ │ │ ├── icons │ │ │ │ │ │ │ ├── crazy-spinner.tsx │ │ │ │ │ │ │ ├── font-default.tsx │ │ │ │ │ │ │ ├── font-mono.tsx │ │ │ │ │ │ │ ├── font-serif.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── loading-circle.tsx │ │ │ │ │ │ │ └── magic.tsx │ │ │ │ │ │ ├── popover.tsx │ │ │ │ │ │ └── scroll-area.tsx │ │ │ │ │ └── utils │ │ │ │ │ │ └── index.ts │ │ │ │ ├── core │ │ │ │ │ ├── components │ │ │ │ │ │ ├── editor-bubble-item.tsx │ │ │ │ │ │ ├── editor-bubble.tsx │ │ │ │ │ │ ├── editor-command-item.tsx │ │ │ │ │ │ ├── editor-command.tsx │ │ │ │ │ │ ├── editor.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── extensions │ │ │ │ │ │ ├── ai-highlight.ts │ │ │ │ │ │ ├── custom-keymap.ts │ │ │ │ │ │ ├── double-plus-ai-command.ts │ │ │ │ │ │ ├── hljs.ts │ │ │ │ │ │ ├── image-resizer.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── slash-command.tsx │ │ │ │ │ │ ├── space-ai-command.ts │ │ │ │ │ │ └── updated-image.ts │ │ │ │ │ ├── plugins │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── upload-images.tsx │ │ │ │ │ └── utils │ │ │ │ │ │ ├── atoms.ts │ │ │ │ │ │ ├── editor.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── store.ts │ │ │ │ ├── extensions │ │ │ │ │ ├── Table │ │ │ │ │ │ ├── Cell.ts │ │ │ │ │ │ ├── Header.ts │ │ │ │ │ │ ├── Row.ts │ │ │ │ │ │ ├── Table.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── menus │ │ │ │ │ │ │ ├── TableColumn │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ ├── TableRow │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── ui │ │ │ │ │ │ │ ├── Button.tsx │ │ │ │ │ │ │ ├── Icon.tsx │ │ │ │ │ │ │ ├── PopoverMenu.tsx │ │ │ │ │ │ │ ├── Surface.tsx │ │ │ │ │ │ │ ├── Toolbar.tsx │ │ │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── vite-env.d.ts │ │ │ ├── home-redirect │ │ │ │ └── index.tsx │ │ │ ├── hover-card │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ ├── import-resource │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ └── intergrations │ │ │ │ │ ├── import-from-extension.tsx │ │ │ │ │ ├── import-from-file.tsx │ │ │ │ │ ├── import-from-image.tsx │ │ │ │ │ ├── import-from-text.tsx │ │ │ │ │ ├── import-from-weblink.tsx │ │ │ │ │ ├── project-select.tsx │ │ │ │ │ └── storageLimit.tsx │ │ │ ├── magicui │ │ │ │ ├── animated-beam-multiple-outputs.tsx │ │ │ │ ├── animated-beam.tsx │ │ │ │ ├── animated-bean-demo.tsx │ │ │ │ ├── animated-gradient-text.tsx │ │ │ │ ├── animated-grid-pattern.tsx │ │ │ │ ├── animated-list-demo.tsx │ │ │ │ ├── animated-list.tsx │ │ │ │ ├── animated-shiny-text.tsx │ │ │ │ ├── bento-grid.tsx │ │ │ │ ├── button.tsx │ │ │ │ ├── globe-demo.tsx │ │ │ │ ├── globe.tsx │ │ │ │ ├── marquee.tsx │ │ │ │ ├── orbiting-circles-demo.tsx │ │ │ │ ├── orbiting-circles.tsx │ │ │ │ └── shimmer-button.tsx │ │ │ ├── markdown │ │ │ │ ├── custom-plugins │ │ │ │ │ └── rehype-highlight.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── plugins │ │ │ │ │ ├── artifact-thinking │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── rehypePlugin.ts │ │ │ │ │ │ └── render.tsx │ │ │ │ │ ├── artifact │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── rehypePlugin.ts │ │ │ │ │ │ └── render.tsx │ │ │ │ │ ├── code │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── rehypePlugin.ts │ │ │ │ │ │ └── render.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── link │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── popover.tsx │ │ │ │ │ │ └── render.tsx │ │ │ │ │ ├── mcp-call │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── rehypePlugin.ts │ │ │ │ │ │ └── render.tsx │ │ │ │ │ └── mermaid │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── render.tsx │ │ │ │ ├── styles │ │ │ │ │ ├── highlight.scss │ │ │ │ │ └── markdown.scss │ │ │ │ └── types │ │ │ │ │ └── index.tsx │ │ │ ├── message │ │ │ │ ├── add-to-context-message.tsx │ │ │ │ └── delete-node-message.tsx │ │ │ ├── output-locale-list │ │ │ │ └── index.tsx │ │ │ ├── project │ │ │ │ ├── add-sources │ │ │ │ │ ├── canvases.tsx │ │ │ │ │ ├── common-list.tsx │ │ │ │ │ ├── documents.tsx │ │ │ │ │ ├── index.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── resources.tsx │ │ │ │ ├── canvas-menu │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── no-canvas │ │ │ │ │ └── index.tsx │ │ │ │ ├── project-create │ │ │ │ │ └── index.tsx │ │ │ │ ├── project-directory │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── project-knowledge-toggle │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── project-settings │ │ │ │ │ └── index.tsx │ │ │ │ └── source-menu │ │ │ │ │ └── index.tsx │ │ │ ├── request-access │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ └── protected-route.tsx │ │ │ ├── resource-view │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ └── resource-deck │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ ├── search-quick-open-btn │ │ │ │ └── index.tsx │ │ │ ├── search │ │ │ │ ├── cmdk │ │ │ │ │ ├── command-score.ts │ │ │ │ │ ├── filter.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── code │ │ │ │ │ ├── code.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── data-list.tsx │ │ │ │ ├── home.tsx │ │ │ │ ├── icons │ │ │ │ │ ├── icons.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── item.tsx │ │ │ │ ├── modal.tsx │ │ │ │ └── types │ │ │ │ │ └── index.ts │ │ │ ├── settings-guide │ │ │ │ └── index.tsx │ │ │ ├── settings │ │ │ │ ├── account-setting │ │ │ │ │ └── index.tsx │ │ │ │ ├── appearance-setting │ │ │ │ │ └── index.tsx │ │ │ │ ├── default-model │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── language-setting │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── mcp-server │ │ │ │ │ ├── McpServerBatchImport.tsx │ │ │ │ │ ├── McpServerForm.tsx │ │ │ │ │ ├── McpServerJsonEditor.tsx │ │ │ │ │ ├── McpServerList.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── model-config │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── model-form.tsx │ │ │ │ ├── model-providers │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── provider-modal.tsx │ │ │ │ ├── parser-config │ │ │ │ │ └── index.tsx │ │ │ │ ├── subscribe-modal │ │ │ │ │ ├── index.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── priceContent.tsx │ │ │ │ └── subscription │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ ├── sider-menu-setting-list │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ ├── sider │ │ │ │ ├── layout.scss │ │ │ │ ├── layout.tsx │ │ │ │ ├── popover.tsx │ │ │ │ └── sider-logged-out.tsx │ │ │ ├── skill │ │ │ │ ├── basic-info-form-items │ │ │ │ │ └── index.tsx │ │ │ │ ├── form-header │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── instance-dropdown-menu │ │ │ │ │ └── index.tsx │ │ │ │ ├── skill-avatar │ │ │ │ │ └── index.tsx │ │ │ │ ├── skill-intance-list │ │ │ │ │ └── index.tsx │ │ │ │ ├── skill-management-modal │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── skill-triggers │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── template-config-form-items │ │ │ │ │ └── index.tsx │ │ │ │ └── trigger-config-form-items │ │ │ │ │ └── index.tsx │ │ │ ├── source-list │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── source-detail-list │ │ │ │ │ ├── index.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── source-detail-item.tsx │ │ │ │ └── source-list-modal │ │ │ │ │ ├── index.scss │ │ │ │ │ └── index.tsx │ │ │ ├── subscription │ │ │ │ ├── hint.tsx │ │ │ │ ├── storage-exceeded-modal.tsx │ │ │ │ └── usage-progress.tsx │ │ │ ├── tour-modal │ │ │ │ └── index.tsx │ │ │ ├── transition.tsx │ │ │ ├── translation-wrapper │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ ├── ui-locale-list │ │ │ │ └── index.tsx │ │ │ ├── use-searchable-list │ │ │ │ ├── @types │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ └── workspace │ │ │ │ ├── canvas-list-modal │ │ │ │ ├── canvasActionDropdown.tsx │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ │ ├── content-panel │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ │ ├── document-list │ │ │ │ └── index.tsx │ │ │ │ ├── library-modal │ │ │ │ ├── index.scss │ │ │ │ └── index.tsx │ │ │ │ ├── project-list │ │ │ │ └── index.tsx │ │ │ │ ├── resource-list │ │ │ │ └── index.tsx │ │ │ │ └── scroll-loading │ │ │ │ └── index.tsx │ │ ├── context │ │ │ ├── canvas.tsx │ │ │ ├── document.tsx │ │ │ └── editor-performance.tsx │ │ ├── events │ │ │ ├── action.ts │ │ │ ├── codeArtifact.ts │ │ │ ├── deleted-nodes.ts │ │ │ ├── edge.ts │ │ │ ├── fullscreen.ts │ │ │ ├── locateToNodePreview.ts │ │ │ ├── nodeActions.ts │ │ │ ├── nodeOperations.ts │ │ │ └── slideshow.ts │ │ ├── hooks │ │ │ ├── canvas │ │ │ │ ├── index.ts │ │ │ │ ├── use-action-polling.ts │ │ │ │ ├── use-add-node-to-slide.ts │ │ │ │ ├── use-add-node.ts │ │ │ │ ├── use-add-to-context.ts │ │ │ │ ├── use-ask-project.ts │ │ │ │ ├── use-batch-nodes-selection │ │ │ │ │ ├── use-group-nodes.ts │ │ │ │ │ ├── use-ungroup-nodes.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── use-canvas-data.ts │ │ │ │ ├── use-canvas-id.ts │ │ │ │ ├── use-canvas-layout.ts │ │ │ │ ├── use-canvas-sync.ts │ │ │ │ ├── use-create-canvas.ts │ │ │ │ ├── use-create-document-purely.ts │ │ │ │ ├── use-create-document.ts │ │ │ │ ├── use-create-memo.ts │ │ │ │ ├── use-debounced-context-update.ts │ │ │ │ ├── use-delete-canvas.ts │ │ │ │ ├── use-delete-document.ts │ │ │ │ ├── use-delete-node.ts │ │ │ │ ├── use-delete-resource.ts │ │ │ │ ├── use-drag-create-node.ts │ │ │ │ ├── use-drag-drop-paste.tsx │ │ │ │ ├── use-edge-operations.ts │ │ │ │ ├── use-edge-visible.ts │ │ │ │ ├── use-find-code-artifact.ts │ │ │ │ ├── use-find-images.ts │ │ │ │ ├── use-find-memo.ts │ │ │ │ ├── use-find-thread-history.ts │ │ │ │ ├── use-find-website.ts │ │ │ │ ├── use-get-node-connect.ts │ │ │ │ ├── use-get-node-content.ts │ │ │ │ ├── use-insert-to-document.ts │ │ │ │ ├── use-invoke-action.ts │ │ │ │ ├── use-listen-node-events.ts │ │ │ │ ├── use-node-cluster.ts │ │ │ │ ├── use-node-data.ts │ │ │ │ ├── use-node-hover.ts │ │ │ │ ├── use-node-operations.ts │ │ │ │ ├── use-node-position-utils │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── use-node-position.ts │ │ │ │ ├── use-node-preview-control.ts │ │ │ │ ├── use-node-selection.ts │ │ │ │ ├── use-node-size.ts │ │ │ │ ├── use-refly-pilot-reset.ts │ │ │ │ ├── use-selected-node-zIndex.tsx │ │ │ │ ├── use-set-node-data-by-entity.ts │ │ │ │ ├── use-sync-selected-nodes-to-context.ts │ │ │ │ ├── use-update-action-result.ts │ │ │ │ └── use-update-source-list.ts │ │ │ ├── use-bind-commands.ts │ │ │ ├── use-canvas-initial-actions.ts │ │ │ ├── use-collab-token.ts │ │ │ ├── use-create-code-artifact.ts │ │ │ ├── use-create-trigger.ts │ │ │ ├── use-document-sync.ts │ │ │ ├── use-download-file.ts │ │ │ ├── use-duplicate-canvas.ts │ │ │ ├── use-export-canvas-as-image.ts │ │ │ ├── use-export-document.ts │ │ │ ├── use-fetch-data-list.ts │ │ │ ├── use-fetch-share-data.ts │ │ │ ├── use-find-skill.ts │ │ │ ├── use-forced-light-mode.ts │ │ │ ├── use-get-project-canvasId.ts │ │ │ ├── use-get-user-settings.ts │ │ │ ├── use-group-models.ts │ │ │ ├── use-handle-sider-data.ts │ │ │ ├── use-handle-url-params-callback.ts │ │ │ ├── use-hover-card.ts │ │ │ ├── use-is-login.ts │ │ │ ├── use-is-share-page.ts │ │ │ ├── use-jump-new-path.ts │ │ │ ├── use-logout.ts │ │ │ ├── use-resize-panel.ts │ │ │ ├── use-save-resouce-notify.tsx │ │ │ ├── use-skill-error.ts │ │ │ ├── use-subscription-usage.ts │ │ │ ├── use-switch-theme.ts │ │ │ ├── use-update-node-title.tsx │ │ │ ├── use-upload-image.ts │ │ │ ├── use-upload-minimap.ts │ │ │ └── use-video.ts │ │ ├── i18n │ │ │ └── config.ts │ │ ├── modules │ │ │ ├── artifacts │ │ │ │ └── code-runner │ │ │ │ │ ├── artifact-type-util.tsx │ │ │ │ │ ├── code-viewer-layout.tsx │ │ │ │ │ ├── code-viewer.tsx │ │ │ │ │ ├── monaco-editor │ │ │ │ │ ├── FallbackEditor.tsx │ │ │ │ │ ├── MonacoEditorComponent.tsx │ │ │ │ │ ├── SimpleTextEditor.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── monacoPreloader.ts │ │ │ │ │ └── types.ts │ │ │ │ │ ├── render │ │ │ │ │ ├── html.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── mind-map │ │ │ │ │ │ ├── hooks │ │ │ │ │ │ │ ├── use-mind-map-data.tsx │ │ │ │ │ │ │ ├── use-mind-map-hover.ts │ │ │ │ │ │ │ └── use-mind-map-operation.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── nodes │ │ │ │ │ │ │ ├── custom-node.scss │ │ │ │ │ │ │ ├── custom-node.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── types │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── utils │ │ │ │ │ │ │ └── layout.ts │ │ │ │ │ │ └── viewer.tsx │ │ │ │ │ ├── monaco-editor.scss │ │ │ │ │ ├── react.tsx │ │ │ │ │ ├── shadcn.ts │ │ │ │ │ └── svg.tsx │ │ │ │ │ └── syntax-highlighter.tsx │ │ │ ├── entity-selector │ │ │ │ ├── components │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── search-list │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── search-select │ │ │ │ │ │ └── index.tsx │ │ │ │ ├── hooks │ │ │ │ │ ├── index.ts │ │ │ │ │ └── use-fetch-or-search-list.ts │ │ │ │ └── utils │ │ │ │ │ ├── fetcher.ts │ │ │ │ │ └── index.ts │ │ │ ├── multilingual-search │ │ │ │ ├── components │ │ │ │ │ ├── action-menu.scss │ │ │ │ │ ├── action-menu.tsx │ │ │ │ │ ├── search-box.scss │ │ │ │ │ ├── search-box.tsx │ │ │ │ │ ├── search-home.scss │ │ │ │ │ ├── search-home.tsx │ │ │ │ │ ├── search-options.scss │ │ │ │ │ ├── search-options.tsx │ │ │ │ │ ├── search-progress.scss │ │ │ │ │ ├── search-progress.tsx │ │ │ │ │ ├── search-results.scss │ │ │ │ │ └── search-results.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── mock-data │ │ │ │ │ └── search-data.ts │ │ │ │ ├── stores │ │ │ │ │ └── multilingual-search.ts │ │ │ │ └── types │ │ │ │ │ └── index.tsx │ │ │ └── selection-menu │ │ │ │ ├── canvas-selection-context.tsx │ │ │ │ ├── selection-bubble │ │ │ │ ├── index.tsx │ │ │ │ └── styles.css │ │ │ │ ├── selection-context.tsx │ │ │ │ ├── use-selection-bubble.ts │ │ │ │ └── use-selection-context.ts │ │ ├── queries │ │ │ ├── common.ts │ │ │ ├── ensureQueryData.ts │ │ │ ├── index.ts │ │ │ ├── infiniteQueries.ts │ │ │ ├── prefetch.ts │ │ │ ├── queries.ts │ │ │ └── suspense.ts │ │ ├── requests │ │ │ ├── index.ts │ │ │ ├── proxiedRequest.ts │ │ │ ├── services.gen.ts │ │ │ └── types.gen.ts │ │ ├── stores │ │ │ ├── action-result.ts │ │ │ ├── auth.ts │ │ │ ├── canvas-nodes.ts │ │ │ ├── canvas-template-modal.ts │ │ │ ├── canvas.ts │ │ │ ├── chat │ │ │ │ └── index.ts │ │ │ ├── context-panel.ts │ │ │ ├── copilot.ts │ │ │ ├── document.ts │ │ │ ├── front-page.ts │ │ │ ├── import-new-trigger-modal.ts │ │ │ ├── import-resource.ts │ │ │ ├── knowledge-base.ts │ │ │ ├── launchpad.ts │ │ │ ├── navigation-context.ts │ │ │ ├── project-selector.ts │ │ │ ├── quick-search-state.ts │ │ │ ├── references.ts │ │ │ ├── search-state.ts │ │ │ ├── search.ts │ │ │ ├── sider.ts │ │ │ ├── skill.ts │ │ │ ├── subscription.ts │ │ │ ├── theme.ts │ │ │ ├── user.ts │ │ │ └── utils │ │ │ │ └── storage-manager.ts │ │ ├── styles │ │ │ ├── additional-styles │ │ │ │ ├── theme.css │ │ │ │ ├── toggle-switch.css │ │ │ │ └── utility-patterns.css │ │ │ └── style.css │ │ ├── types │ │ │ ├── context.ts │ │ │ └── copilot.ts │ │ ├── utils │ │ │ ├── auth.ts │ │ │ ├── canvas.ts │ │ │ ├── cn.ts │ │ │ ├── color.ts │ │ │ ├── content.ts │ │ │ ├── dayjsConfig.ts │ │ │ ├── delay.ts │ │ │ ├── env.ts │ │ │ ├── event-emitter │ │ │ │ ├── big-search-quick-open.ts │ │ │ │ ├── context.ts │ │ │ │ └── model.ts │ │ │ ├── extension │ │ │ │ ├── check.ts │ │ │ │ ├── messaging.ts │ │ │ │ ├── ports.ts │ │ │ │ └── tabs.ts │ │ │ ├── i18n.ts │ │ │ ├── index.ts │ │ │ ├── locale.ts │ │ │ ├── map-context-items.ts │ │ │ ├── notification.ts │ │ │ ├── parse.ts │ │ │ ├── request.ts │ │ │ ├── router.ts │ │ │ ├── share.ts │ │ │ ├── sse-post.ts │ │ │ ├── storage.ts │ │ │ ├── time.ts │ │ │ ├── tweet.ts │ │ │ └── ui.ts │ │ └── vite-env.d.ts │ └── tsconfig.json ├── common-types │ ├── package.json │ ├── src │ │ ├── content-selector.ts │ │ ├── context-panel.ts │ │ ├── conversation.ts │ │ ├── digest.ts │ │ ├── env.ts │ │ ├── extension-messaging.ts │ │ ├── feed.ts │ │ ├── http.ts │ │ ├── i18n.ts │ │ ├── i18next.d.ts │ │ ├── index.ts │ │ ├── page.ts │ │ ├── react-app-env.d.ts │ │ ├── request.ts │ │ ├── return-types.ts │ │ ├── session.ts │ │ ├── simple-event.ts │ │ ├── system-action.ts │ │ └── task.ts │ └── tsconfig.json ├── errors │ ├── package.json │ ├── src │ │ ├── base.ts │ │ ├── errors.ts │ │ ├── guess.ts │ │ └── index.ts │ └── tsconfig.json ├── i18n │ ├── package.json │ ├── src │ │ ├── en-US │ │ │ ├── skill-log.ts │ │ │ ├── skill.ts │ │ │ └── ui.ts │ │ └── zh-Hans │ │ │ ├── skill-log.ts │ │ │ ├── skill.ts │ │ │ └── ui.ts │ └── tsconfig.json ├── openapi-schema │ ├── nodemon.json │ ├── openapi-ts.config.ts │ ├── package.json │ ├── schema.yml │ ├── src │ │ ├── index.ts │ │ ├── schemas.gen.ts │ │ ├── services.gen.ts │ │ └── types.gen.ts │ └── tsconfig.json ├── providers │ ├── package.json │ ├── src │ │ ├── embeddings │ │ │ ├── index.ts │ │ │ ├── jina.ts │ │ │ └── ollama.ts │ │ ├── index.ts │ │ ├── llm │ │ │ ├── index.ts │ │ │ └── openai.ts │ │ ├── reranker │ │ │ ├── base.ts │ │ │ ├── fallback.ts │ │ │ ├── index.ts │ │ │ ├── jina.ts │ │ │ └── ollama.ts │ │ └── types.ts │ ├── tsconfig.json │ └── tsconfig.node.json ├── skill-template │ ├── .vscode │ │ └── settings.json │ ├── package.json │ ├── src │ │ ├── adapters │ │ │ ├── client.ts │ │ │ ├── index.ts │ │ │ └── tools.ts │ │ ├── base.ts │ │ ├── engine │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── inventory.ts │ │ ├── mcp │ │ │ └── core │ │ │ │ └── prompt.ts │ │ ├── scheduler │ │ │ ├── module │ │ │ │ ├── artifacts │ │ │ │ │ ├── examples.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── prompt.ts │ │ │ │ │ └── reactiveArtifactSchema.ts │ │ │ │ ├── common │ │ │ │ │ ├── chat-history.ts │ │ │ │ │ ├── citationRules.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── format.ts │ │ │ │ │ ├── locale-follow.ts │ │ │ │ │ ├── personalization.ts │ │ │ │ │ └── query.ts │ │ │ │ ├── commonQnA │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── examples.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── prompt.ts │ │ │ │ ├── customPrompt │ │ │ │ │ ├── index.ts │ │ │ │ │ └── prompt.ts │ │ │ │ ├── editDocument │ │ │ │ │ ├── block │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ ├── core.ts │ │ │ │ │ │ ├── examples.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── prompt.ts │ │ │ │ │ ├── common.ts │ │ │ │ │ ├── helper.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── inline │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ ├── core.ts │ │ │ │ │ │ ├── examples.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── prompt.ts │ │ │ │ │ ├── prompt.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── generateDocument │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── examples.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── prompt.ts │ │ │ │ │ └── rules.ts │ │ │ │ ├── librarySearch │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── exmaples.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── prompt.ts │ │ │ │ ├── multiLingualLibrarySearch │ │ │ │ │ ├── index.ts │ │ │ │ │ └── librarySearch.ts │ │ │ │ ├── multiLingualSearch │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── locale.ts │ │ │ │ │ ├── rewriteQuery.ts │ │ │ │ │ ├── translateQuery.ts │ │ │ │ │ ├── translateResult.ts │ │ │ │ │ └── webSearch.ts │ │ │ │ ├── relatedQuestion │ │ │ │ │ └── index.ts │ │ │ │ ├── rewriteCanvas │ │ │ │ │ ├── index.ts │ │ │ │ │ └── prompt.ts │ │ │ │ └── webSearch │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── examples.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── prompt.ts │ │ │ ├── types │ │ │ │ ├── index.ts │ │ │ │ └── intent.ts │ │ │ └── utils │ │ │ │ ├── cdn-filter.ts │ │ │ │ ├── common-prompt.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── context.ts │ │ │ │ ├── context │ │ │ │ └── index.ts │ │ │ │ ├── extract-weblink.ts │ │ │ │ ├── extractor.ts │ │ │ │ ├── followup.ts │ │ │ │ ├── message.ts │ │ │ │ ├── model.ts │ │ │ │ ├── query-rewrite │ │ │ │ ├── core.ts │ │ │ │ ├── examples.ts │ │ │ │ └── index.ts │ │ │ │ ├── queryProcessor.ts │ │ │ │ ├── semanticSearch.ts │ │ │ │ ├── skill.ts │ │ │ │ ├── summarizer.ts │ │ │ │ ├── token.ts │ │ │ │ └── truncator.ts │ │ ├── skills │ │ │ ├── agent.ts │ │ │ ├── code-artifacts.ts │ │ │ ├── common-qna.ts │ │ │ ├── custom-prompt.ts │ │ │ ├── edit-doc.ts │ │ │ ├── generate-doc.ts │ │ │ ├── image-generation.ts │ │ │ ├── index.ts │ │ │ ├── library-search.ts │ │ │ ├── recommend-questions.ts │ │ │ ├── rewrite-doc.ts │ │ │ └── web-search.ts │ │ ├── templates │ │ │ ├── arxiv-summary │ │ │ │ └── index.ts │ │ │ ├── basic-summary │ │ │ │ └── index.ts │ │ │ ├── create-formal-email │ │ │ │ └── index.ts │ │ │ ├── create-git-diff-commit │ │ │ │ └── index.ts │ │ │ ├── explain-terms │ │ │ │ └── index.ts │ │ │ ├── find-related-content │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── translate │ │ │ │ └── index.ts │ │ │ ├── website-summary │ │ │ │ └── index.ts │ │ │ └── writing │ │ │ │ ├── brainstorm-ideas.ts │ │ │ │ ├── change-tone.ts │ │ │ │ ├── continue-writing.ts │ │ │ │ ├── create-article-outline.ts │ │ │ │ ├── create-blog-post.ts │ │ │ │ ├── create-social-media-post.ts │ │ │ │ ├── extract-action-item.ts │ │ │ │ ├── fix-spelling-and-grammar-issues.ts │ │ │ │ ├── improve-writing.ts │ │ │ │ ├── index.ts │ │ │ │ ├── language-simplification.ts │ │ │ │ ├── make-shorter.ts │ │ │ │ └── maker-longer.ts │ │ ├── tools │ │ │ ├── default-response │ │ │ │ └── index.ts │ │ │ ├── refly-search │ │ │ │ └── index.ts │ │ │ └── serper-online-search │ │ │ │ └── index.ts │ │ └── utils │ │ │ ├── index.ts │ │ │ ├── mcp-utils.ts │ │ │ └── url-processing.ts │ └── tsconfig.json ├── tsconfig │ ├── base.json │ ├── next.json │ ├── package.json │ └── react.json ├── utils │ ├── package.json │ ├── src │ │ ├── ai-writing.ts │ │ ├── artifact.ts │ │ ├── brand.ts │ │ ├── cn.ts │ │ ├── content-parser.ts │ │ ├── cookie.ts │ │ ├── dayjsConfig.ts │ │ ├── editor │ │ │ ├── from_markdown.ts │ │ │ ├── index.ts │ │ │ ├── schema.ts │ │ │ ├── to_markdown.ts │ │ │ ├── token.ts │ │ │ └── transformer.ts │ │ ├── env.ts │ │ ├── event-emitter │ │ │ ├── canvas.ts │ │ │ ├── editor.ts │ │ │ └── model.ts │ │ ├── html2md.ts │ │ ├── id.ts │ │ ├── index.ts │ │ ├── isUrl.ts │ │ ├── json-repair.ts │ │ ├── markdown.ts │ │ ├── models.ts │ │ ├── parse.ts │ │ ├── provider.ts │ │ ├── quota.ts │ │ ├── scrape-weblink.ts │ │ ├── search-source-converter.ts │ │ ├── str.ts │ │ ├── time.ts │ │ ├── timeTracker.ts │ │ ├── translate │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── typesafe.ts │ │ ├── ui.ts │ │ └── url.ts │ ├── tsconfig.json │ └── tsconfig.node.json └── wxt │ ├── CHANGELOG.md │ ├── README.md │ ├── bin │ ├── wxt-publish-extension.cjs │ └── wxt.mjs │ ├── e2e │ ├── tests │ │ ├── analysis.test.ts │ │ ├── auto-imports.test.ts │ │ ├── hooks.test.ts │ │ ├── init.test.ts │ │ ├── manifest-content.test.ts │ │ ├── output-structure.test.ts │ │ ├── react.test.ts │ │ ├── remote-code.test.ts │ │ ├── typescript-project.test.ts │ │ ├── user-config.test.ts │ │ └── zip.test.ts │ └── utils.ts │ ├── package.json │ ├── scripts │ └── build.ts │ ├── src │ ├── __tests__ │ │ └── storage.test.ts │ ├── browser.ts │ ├── cli │ │ ├── __tests__ │ │ │ └── index.test.ts │ │ ├── cli-utils.ts │ │ ├── commands.ts │ │ └── index.ts │ ├── client │ │ ├── content-scripts │ │ │ ├── content-script-context.ts │ │ │ ├── custom-events.ts │ │ │ ├── index.ts │ │ │ ├── location-watcher.ts │ │ │ └── ui │ │ │ │ ├── __tests__ │ │ │ │ └── index.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ └── index.ts │ ├── core │ │ ├── build.ts │ │ ├── builders │ │ │ └── vite │ │ │ │ ├── __tests__ │ │ │ │ ├── fixtures │ │ │ │ │ ├── module.ts │ │ │ │ │ └── test.ts │ │ │ │ └── index.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── plugins │ │ │ │ ├── __tests__ │ │ │ │ └── devHtmlPrerender.test.ts │ │ │ │ ├── bundleAnalysis.ts │ │ │ │ ├── cssEntrypoints.ts │ │ │ │ ├── defineImportMeta.ts │ │ │ │ ├── devHtmlPrerender.ts │ │ │ │ ├── devServerGlobals.ts │ │ │ │ ├── download.ts │ │ │ │ ├── entrypointGroupGlobals.ts │ │ │ │ ├── excludeBrowserPolyfill.ts │ │ │ │ ├── globals.ts │ │ │ │ ├── index.ts │ │ │ │ ├── multipageMove.ts │ │ │ │ ├── noopBackground.ts │ │ │ │ ├── removeEntrypointMainFunction.ts │ │ │ │ ├── resolveVirtualModules.ts │ │ │ │ ├── tsconfigPaths.ts │ │ │ │ ├── unimport.ts │ │ │ │ └── webextensionPolyfillMock.ts │ │ ├── clean.ts │ │ ├── create-server.ts │ │ ├── define-config.ts │ │ ├── define-runner-config.ts │ │ ├── index.ts │ │ ├── initialize.ts │ │ ├── package-managers │ │ │ ├── __tests__ │ │ │ │ ├── bun.test.ts │ │ │ │ ├── fixtures │ │ │ │ │ ├── bun-project │ │ │ │ │ │ ├── bun.lockb │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── npm-project │ │ │ │ │ │ ├── package-lock.json │ │ │ │ │ │ └── package.json │ │ │ │ │ ├── pnpm-project │ │ │ │ │ │ ├── package.json │ │ │ │ │ │ └── pnpm-lock.yaml │ │ │ │ │ └── yarn-project │ │ │ │ │ │ └── package.json │ │ │ │ ├── npm.test.ts │ │ │ │ ├── pnpm.test.ts │ │ │ │ └── yarn.test.ts │ │ │ ├── bun.ts │ │ │ ├── index.ts │ │ │ ├── npm.ts │ │ │ ├── pnpm.ts │ │ │ ├── types.ts │ │ │ └── yarn.ts │ │ ├── prepare.ts │ │ ├── runners │ │ │ ├── __tests__ │ │ │ │ └── index.test.ts │ │ │ ├── index.ts │ │ │ ├── manual.ts │ │ │ ├── safari.ts │ │ │ ├── web-ext.ts │ │ │ └── wsl.ts │ │ ├── utils │ │ │ ├── __tests__ │ │ │ │ ├── arrays.test.ts │ │ │ │ ├── content-scripts.test.ts │ │ │ │ ├── content-security-policy.test.ts │ │ │ │ ├── entrypoints.test.ts │ │ │ │ ├── manifest.test.ts │ │ │ │ ├── package.test.ts │ │ │ │ ├── paths.test.ts │ │ │ │ ├── strings.test.ts │ │ │ │ ├── transform.test.ts │ │ │ │ ├── validation.test.ts │ │ │ │ └── virtual-modules.test.ts │ │ │ ├── arrays.ts │ │ │ ├── building │ │ │ │ ├── __tests__ │ │ │ │ │ ├── detect-dev-changes.test.ts │ │ │ │ │ ├── find-entrypoints.test.ts │ │ │ │ │ ├── group-entrypoints.test.ts │ │ │ │ │ ├── import-entrypoint.test.ts │ │ │ │ │ └── test-entrypoints │ │ │ │ │ │ ├── background.ts │ │ │ │ │ │ ├── content.ts │ │ │ │ │ │ ├── imported-option.ts │ │ │ │ │ │ ├── no-default-export.ts │ │ │ │ │ │ ├── react.tsx │ │ │ │ │ │ ├── unlisted.ts │ │ │ │ │ │ └── with-named.ts │ │ │ │ ├── build-entrypoints.ts │ │ │ │ ├── detect-dev-changes.ts │ │ │ │ ├── find-entrypoints.ts │ │ │ │ ├── generate-wxt-dir.ts │ │ │ │ ├── group-entrypoints.ts │ │ │ │ ├── import-entrypoint.ts │ │ │ │ ├── index.ts │ │ │ │ ├── internal-build.ts │ │ │ │ ├── rebuild.ts │ │ │ │ └── resolve-config.ts │ │ │ ├── cache.ts │ │ │ ├── cli.ts │ │ │ ├── constants.ts │ │ │ ├── content-scripts.ts │ │ │ ├── content-security-policy.ts │ │ │ ├── entrypoints.ts │ │ │ ├── fs.ts │ │ │ ├── globals.ts │ │ │ ├── i18n.ts │ │ │ ├── log │ │ │ │ ├── index.ts │ │ │ │ ├── printBuildSummary.ts │ │ │ │ ├── printFileList.ts │ │ │ │ ├── printHeader.ts │ │ │ │ └── printTable.ts │ │ │ ├── manifest.ts │ │ │ ├── network.ts │ │ │ ├── package.ts │ │ │ ├── paths.ts │ │ │ ├── strings.ts │ │ │ ├── testing │ │ │ │ └── fake-objects.ts │ │ │ ├── time.ts │ │ │ ├── transform.ts │ │ │ ├── types.ts │ │ │ ├── validation.ts │ │ │ ├── virtual-modules.ts │ │ │ └── wsl.ts │ │ ├── wxt.ts │ │ └── zip.ts │ ├── index.ts │ ├── sandbox │ │ ├── __tests__ │ │ │ ├── define-background.test.ts │ │ │ ├── define-content-script.test.ts │ │ │ └── define-unlisted-script.test.ts │ │ ├── define-background.ts │ │ ├── define-content-script.ts │ │ ├── define-unlisted-script.ts │ │ ├── index.ts │ │ └── utils │ │ │ └── logger.ts │ ├── storage.ts │ ├── testing │ │ ├── fake-browser.ts │ │ ├── index.ts │ │ └── wxt-vitest-plugin.ts │ ├── types │ │ ├── globals.d.ts │ │ ├── index.ts │ │ ├── modules.d.ts │ │ └── project-types.d.ts │ ├── version.ts │ ├── virtual │ │ ├── README.md │ │ ├── background-entrypoint.ts │ │ ├── content-script-isolated-world-entrypoint.ts │ │ ├── content-script-main-world-entrypoint.ts │ │ ├── mock-browser.ts │ │ ├── reload-html.ts │ │ ├── unlisted-script-entrypoint.ts │ │ ├── utils │ │ │ ├── keep-service-worker-alive.ts │ │ │ ├── reload-content-scripts.ts │ │ │ └── setup-web-socket.ts │ │ └── virtual-module-globals.d.ts │ └── vite-builder-env.d.ts │ ├── tsconfig.json │ ├── typedoc.json │ ├── vitest.config.ts │ └── vitest.setup.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts └── wait-for-container-health.sh └── turbo.json /.cursor/rules/09-design-system.mdc: -------------------------------------------------------------------------------- 1 | --- 2 | description: 3 | globs: 4 | alwaysApply: true 5 | --- 6 | # Design System 7 | 8 | ## Color Palette 9 | 10 | - Primary: `#155EEF` - Main brand color for buttons, links, and accents 11 | - Error: `#F04438` - Used for error states and destructive actions 12 | - Success: `#12B76A` - Used for success states and confirmations 13 | - Warning: `#F79009` - Used for warnings and important notifications 14 | - Info: `#0BA5EC` - Used for informational elements -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Versioning and metadata 2 | .git 3 | .gitignore 4 | .dockerignore 5 | .github 6 | .vscode 7 | 8 | *.log 9 | *.chunks.jsonl 10 | 11 | # Build dependencies 12 | node_modules 13 | coverage 14 | 15 | # Environment (contains sensitive data) 16 | .env 17 | 18 | # Files not required for production 19 | .editorconfig 20 | Dockerfile 21 | README.md 22 | .eslintrc.js 23 | nodemon.json 24 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | indent_size = 2 2 | indent_style = space -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: "📧 Discussions" 4 | url: https://github.com/refly-ai/refly/discussions/categories/general 5 | about: General discussions and request help from the community 6 | - name: "📚 Documentation" 7 | url: https://docs.refly.ai/ 8 | about: Check our documentation for guides and references 9 | - name: "💬 Discord Community" 10 | url: https://discord.gg/bWjffrb89h 11 | about: Join our Discord community for real-time discussions and support 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | workflow_dispatch: 5 | pull_request: 6 | types: [opened, synchronize] 7 | paths: 8 | - 'apps/**' 9 | - 'packages/**' 10 | 11 | jobs: 12 | build: 13 | uses: ./.github/workflows/build.yml 14 | secrets: inherit 15 | with: 16 | environment: 'ci' 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .yarn 2 | .env 3 | *.env 4 | **/node_modules/** 5 | .DS_Store 6 | *.tsbuildinfo 7 | 8 | dist 9 | .turbo 10 | .windsurf 11 | 12 | logs 13 | *.log 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | lerna-debug.log* 18 | .pnpm-debug.log* 19 | 20 | # Rush temporary files 21 | common/deploy/ 22 | common/temp/ 23 | common/autoinstallers/*/.npmrc 24 | **/.rush/temp/ 25 | *.lock 26 | *.log 27 | *.chunks.jsonl 28 | 29 | # mise 30 | mise.toml 31 | 32 | # docs 33 | docs/.vitepress/cache/* -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | lint-staged 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | always-auth=false 2 | @tiptap-pro:registry=https://registry.tiptap.dev/ 3 | //registry.tiptap.dev/:_authToken=6G00CGASMcjazpfBRlMGz38HILvxC2zBc58dfz9y1GEViDTXEoZwvTq82w95bnZf -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "skipFiles": ["/**"], 12 | "program": "${file}", 13 | "outFiles": ["${workspaceFolder}/**/*.js"] 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /apps/api/nodemon.electron.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": [ 3 | "src/modules", 4 | "src/electron", 5 | "../../packages/openapi-schema", 6 | "../../packages/common-types", 7 | "../../packages/skill-template", 8 | "../../packages/utils" 9 | ], 10 | "ext": "ts", 11 | "ignore": ["src/**/*.spec.ts"], 12 | "exec": "pnpm build:electron && MODE=desktop electron ." 13 | } 14 | -------------------------------------------------------------------------------- /apps/api/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": [ 3 | "src/modules", 4 | "src/server", 5 | "../../packages/openapi-schema", 6 | "../../packages/common-types", 7 | "../../packages/skill-template", 8 | "../../packages/utils" 9 | ], 10 | "ext": "ts", 11 | "ignore": ["src/**/*.spec.ts"], 12 | "exec": "prisma format && prisma generate && ts-node -r tsconfig-paths/register src/main.ts" 13 | } 14 | -------------------------------------------------------------------------------- /apps/api/prisma/migrations/20250508182500_add_mcp_server/migration.toml: -------------------------------------------------------------------------------- 1 | # Generated by Prisma 2 | 3 | migration_name = "20250508182500_add_mcp_server" 4 | checksum = "b1c5c5e5c5d5c5e5c5d5c5e5c5d5c5e5c5d5c5e5c5d5c5e5c5d5c5e5c5d5c5e5" 5 | -------------------------------------------------------------------------------- /apps/api/src/electron/ipc.ts: -------------------------------------------------------------------------------- 1 | // import { AuthService } from '@refly/api/src/auth/auth.service'; 2 | 3 | // export async function registerIpc() { 4 | // const app = await NestFactory.createApplicationContext(AppModule); 5 | 6 | // const authService = app.get(AuthService); 7 | 8 | // ipcMain.handle('/auth/config', () => { 9 | // const config = authService.getAuthConfig(); 10 | // return config; 11 | // }); 12 | // } 13 | -------------------------------------------------------------------------------- /apps/api/src/index.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | namespace Express { 3 | interface Request { 4 | user?: { id: string; name: string }; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/api/src/modules/action/action.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { ActionController } from './action.controller'; 3 | import { ActionService } from './action.service'; 4 | import { CommonModule } from '../common/common.module'; 5 | import { ProviderModule } from '../provider/provider.module'; 6 | 7 | @Module({ 8 | imports: [CommonModule, ProviderModule], 9 | controllers: [ActionController], 10 | providers: [ActionService], 11 | exports: [ActionService], 12 | }) 13 | export class ActionModule {} 14 | -------------------------------------------------------------------------------- /apps/api/src/modules/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | import { BRANDING_NAME } from '@refly/utils'; 3 | @Controller() 4 | export class AppController { 5 | @Get() 6 | ping() { 7 | return { message: 'Refly API Endpoint', version: 'v1', brand: BRANDING_NAME }; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/api/src/modules/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class AppService { 5 | getHello(): string { 6 | return 'Hello World!'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/api/src/modules/auth/auth.dto.ts: -------------------------------------------------------------------------------- 1 | export interface TokenData { 2 | uid: string; 3 | accessToken: string; 4 | refreshToken: string; 5 | } 6 | 7 | export interface SendVerificationEmailJobData { 8 | sessionId: string; 9 | } 10 | 11 | export class JwtPayload { 12 | uid: string; 13 | email: string; 14 | } 15 | -------------------------------------------------------------------------------- /apps/api/src/modules/auth/guard/github-oauth.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { AuthGuard } from '@nestjs/passport'; 3 | import { OAuthError } from '@refly/errors'; 4 | 5 | @Injectable() 6 | export class GithubOauthGuard extends AuthGuard('github') { 7 | handleRequest(err: any, user: any) { 8 | if (err || !user) { 9 | throw new OAuthError(); // This will be properly handled by global exception filter 10 | } 11 | return user; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/api/src/modules/auth/guard/google-oauth.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { AuthGuard } from '@nestjs/passport'; 3 | import { OAuthError } from '@refly/errors'; 4 | 5 | @Injectable() 6 | export class GoogleOauthGuard extends AuthGuard('google') { 7 | handleRequest(err: any, user: any) { 8 | if (err || !user) { 9 | throw new OAuthError(); // This will be properly handled by global exception filter 10 | } 11 | return user; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/api/src/modules/auth/guard/local-auth.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { AuthGuard } from '@nestjs/passport'; 3 | 4 | @Injectable() 5 | export class LocalAuthGuard extends AuthGuard('local') {} 6 | -------------------------------------------------------------------------------- /apps/api/src/modules/code-artifact/code-artifact.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { CodeArtifactController } from './code-artifact.controller'; 3 | import { CodeArtifactService } from './code-artifact.service'; 4 | import { CommonModule } from '../common/common.module'; 5 | 6 | @Module({ 7 | imports: [CommonModule], 8 | controllers: [CodeArtifactController], 9 | providers: [CodeArtifactService], 10 | exports: [CodeArtifactService], 11 | }) 12 | export class CodeArtifactModule {} 13 | -------------------------------------------------------------------------------- /apps/api/src/modules/collab/collab.gateway.ts: -------------------------------------------------------------------------------- 1 | import { Request } from 'express'; 2 | import { WebSocket } from 'ws'; 3 | import { OnGatewayConnection, WebSocketGateway } from '@nestjs/websockets'; 4 | import { CollabService } from '../collab/collab.service'; 5 | 6 | @WebSocketGateway() 7 | export class CollabGateway implements OnGatewayConnection { 8 | constructor(private collabService: CollabService) {} 9 | 10 | handleConnection(connection: WebSocket, request: Request): void { 11 | this.collabService.handleConnection(connection, request); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/api/src/modules/common/fulltext-search/tokens.ts: -------------------------------------------------------------------------------- 1 | // Token for the fulltext search service 2 | export const FULLTEXT_SEARCH = Symbol('FULLTEXT_SEARCH'); 3 | -------------------------------------------------------------------------------- /apps/api/src/modules/common/object-storage/tokens.ts: -------------------------------------------------------------------------------- 1 | // Token for the public object storage 2 | export const OSS_EXTERNAL = Symbol('OSS_EXTERNAL'); 3 | 4 | // Token for the internal object storage 5 | export const OSS_INTERNAL = Symbol('OSS_INTERNAL'); 6 | -------------------------------------------------------------------------------- /apps/api/src/modules/common/qdrant.dto.ts: -------------------------------------------------------------------------------- 1 | import { components } from '@qdrant/js-client-rest/dist/types/openapi/generated_schema'; 2 | 3 | export type PointStruct = components['schemas']['PointStruct']; 4 | export type Condition = components['schemas']['Condition']; 5 | export type Filter = components['schemas']['Filter']; 6 | export type ScrollRequest = components['schemas']['ScrollRequest']; 7 | -------------------------------------------------------------------------------- /apps/api/src/modules/event/event.dto.ts: -------------------------------------------------------------------------------- 1 | import { EntityType, SimpleEventName } from '@refly/openapi-schema'; 2 | 3 | export interface SimpleEventData { 4 | uid: string; 5 | name: SimpleEventName; 6 | entityType: EntityType; 7 | entityId: string; 8 | } 9 | -------------------------------------------------------------------------------- /apps/api/src/modules/event/event.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { EventService } from './event.service'; 3 | import { CommonModule } from '../common/common.module'; 4 | import { EventProcessor } from './event.processor'; 5 | import { SkillModule } from '../skill/skill.module'; 6 | 7 | @Module({ 8 | imports: [CommonModule, SkillModule], 9 | providers: [EventService, EventProcessor], 10 | exports: [EventService], 11 | }) 12 | export class EventModule {} 13 | -------------------------------------------------------------------------------- /apps/api/src/modules/label/label.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { LabelController } from './label.controller'; 3 | import { LabelService } from './label.service'; 4 | import { CommonModule } from '../common/common.module'; 5 | 6 | @Module({ 7 | imports: [CommonModule], 8 | controllers: [LabelController], 9 | providers: [LabelService], 10 | exports: [LabelService], 11 | }) 12 | export class LabelModule {} 13 | -------------------------------------------------------------------------------- /apps/api/src/modules/mcp-server/mcp-server.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { McpServerController } from './mcp-server.controller'; 3 | import { McpServerService } from './mcp-server.service'; 4 | import { PrismaService } from '@/modules/common/prisma.service'; 5 | import { EncryptionService } from '@/modules/common/encryption.service'; 6 | 7 | @Module({ 8 | controllers: [McpServerController], 9 | providers: [McpServerService, PrismaService, EncryptionService], 10 | exports: [McpServerService], 11 | }) 12 | export class McpServerModule {} 13 | -------------------------------------------------------------------------------- /apps/api/src/modules/provider/provider.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { ProviderController } from './provider.controller'; 3 | import { ProviderService } from './provider.service'; 4 | import { CommonModule } from '../common/common.module'; 5 | 6 | @Module({ 7 | imports: [CommonModule], 8 | controllers: [ProviderController], 9 | providers: [ProviderService], 10 | exports: [ProviderService], 11 | }) 12 | export class ProviderModule {} 13 | -------------------------------------------------------------------------------- /apps/api/src/modules/rag/rag.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { CommonModule } from '../common/common.module'; 3 | import { RAGService } from './rag.service'; 4 | import { ProviderModule } from '@/modules/provider/provider.module'; 5 | 6 | @Module({ 7 | imports: [CommonModule, ProviderModule], 8 | providers: [RAGService], 9 | exports: [RAGService], 10 | }) 11 | export class RAGModule {} 12 | -------------------------------------------------------------------------------- /apps/api/src/modules/share/share.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { ShareService } from './share.service'; 3 | 4 | describe('ShareService', () => { 5 | let service: ShareService; 6 | 7 | beforeEach(async () => { 8 | const module: TestingModule = await Test.createTestingModule({ 9 | providers: [ShareService], 10 | }).compile(); 11 | 12 | service = module.get(ShareService); 13 | }); 14 | 15 | it('should be defined', () => { 16 | expect(service).toBeDefined(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /apps/api/src/utils/adapters/ws-adapter.ts: -------------------------------------------------------------------------------- 1 | import { WsAdapter } from '@nestjs/platform-ws'; 2 | 3 | export class CustomWsAdapter extends WsAdapter { 4 | constructor( 5 | app: any, 6 | protected port: number, 7 | ) { 8 | super(app); 9 | } 10 | 11 | create(_port: number, options?: any): any { 12 | const server = super.create(this.port, { 13 | cors: { origin: '*' }, 14 | ...options, 15 | }); 16 | return server; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/api/src/utils/decorators/user.decorator.ts: -------------------------------------------------------------------------------- 1 | import { createParamDecorator, ExecutionContext } from '@nestjs/common'; 2 | import { User as UserModel } from '@/generated/client'; 3 | 4 | export const LoginedUser = createParamDecorator( 5 | (_data: unknown, ctx: ExecutionContext): UserModel | null => { 6 | const request = ctx.switchToHttp().getRequest(); 7 | return request.user ?? null; 8 | }, 9 | ); 10 | -------------------------------------------------------------------------------- /apps/api/src/utils/id.ts: -------------------------------------------------------------------------------- 1 | import crypto from 'node:crypto'; 2 | import { v5 as uuidv5 } from 'uuid'; 3 | 4 | export function sha256Hash(str: string): string { 5 | const hash = crypto.createHash('sha256'); 6 | hash.update(str); 7 | return hash.digest('hex'); 8 | } 9 | 10 | const RESOURCE_NAMESPACE = '45c341a9-8061-415e-ab09-a890f6934eda'; 11 | 12 | export function genResourceUuid(name: string): string { 13 | return uuidv5(name, RESOURCE_NAMESPACE); 14 | } 15 | -------------------------------------------------------------------------------- /apps/api/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './const'; 2 | export * from './id'; 3 | export * from './stream'; 4 | export * from './typesafe'; 5 | export * from './response'; 6 | -------------------------------------------------------------------------------- /apps/api/src/utils/middleware/set-trace-id.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, NextFunction } from 'express'; 2 | import api from '@opentelemetry/api'; 3 | 4 | export function setTraceID(_req: Request, res: Response, next: NextFunction) { 5 | const activeSpan = api.trace.getSpan(api.context.active()); 6 | if (activeSpan) { 7 | res.setHeader('x-trace-id', activeSpan.spanContext().traceId); 8 | } 9 | next(); 10 | } 11 | -------------------------------------------------------------------------------- /apps/api/src/utils/response.ts: -------------------------------------------------------------------------------- 1 | import { SkillEvent } from '@refly/openapi-schema'; 2 | import { Response } from 'express'; 3 | 4 | export const buildSuccessResponse = (data?: T) => { 5 | return { 6 | success: true, 7 | data, 8 | }; 9 | }; 10 | 11 | export const writeSSEResponse = (res: Response, msg: SkillEvent) => { 12 | res.write(`data: ${JSON.stringify(msg)}\n\n`); 13 | }; 14 | -------------------------------------------------------------------------------- /apps/api/src/utils/typesafe.ts: -------------------------------------------------------------------------------- 1 | export const pick = (obj: T, keys: K[]): Pick => { 2 | const ret: any = {}; 3 | for (const key of keys) { 4 | ret[key] = obj[key]; 5 | } 6 | return ret; 7 | }; 8 | 9 | export const omit = (obj: T, keys: K[]): Omit => { 10 | const ret = { ...obj }; 11 | for (const key of keys) { 12 | delete ret[key]; 13 | } 14 | return ret; 15 | }; 16 | -------------------------------------------------------------------------------- /apps/extension/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .output 12 | stats.html 13 | stats-*.json 14 | .wxt 15 | web-ext.config.ts 16 | 17 | # Editor directories and files 18 | .vscode/* 19 | !.vscode/extensions.json 20 | .idea 21 | .DS_Store 22 | *.suo 23 | *.ntvs* 24 | *.njsproj 25 | *.sln 26 | *.sw? 27 | chrome-data/** -------------------------------------------------------------------------------- /apps/extension/README.md: -------------------------------------------------------------------------------- 1 | # WXT + React 2 | 3 | This template should help get you started developing with React in WXT. 4 | -------------------------------------------------------------------------------- /apps/extension/postcss.config.ts: -------------------------------------------------------------------------------- 1 | import tailwindNesting from 'tailwindcss/nesting'; 2 | import tailwind from 'tailwindcss'; 3 | import autoprefixer from 'autoprefixer'; 4 | import { Plugin, Processor } from 'postcss'; 5 | import tailwindConfig from './tailwind.config'; 6 | 7 | const config: { plugins: (Plugin | Processor)[] } = { 8 | plugins: [tailwindNesting, tailwind(tailwindConfig), autoprefixer()], 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /apps/extension/src/@types/custom.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg' { 2 | const content: string; 3 | export default content; 4 | } 5 | -------------------------------------------------------------------------------- /apps/extension/src/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import resources from './resources'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | defaultNS: keyof typeof resources; 6 | resources: { 7 | translation: typeof resources.translation; 8 | }; 9 | // if you see an error like: "Argument of type 'DefaultTFuncReturn' is not assignable to parameter of type xyz" 10 | // set returnNull to false (and also in the i18next init options) 11 | // returnNull: false; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/extension/src/@types/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /apps/extension/src/@types/resources.ts: -------------------------------------------------------------------------------- 1 | import { translation } from '../i18n/en/translation'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | defaultNS: 'translation'; 6 | resources: { 7 | translation: typeof translation; 8 | }; 9 | } 10 | } 11 | 12 | const resources = { 13 | translation, 14 | } as const; 15 | 16 | export default resources; 17 | -------------------------------------------------------------------------------- /apps/extension/src/assets/common/arrow-down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/assets/icon.png -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/code.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/explain.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/extension.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/tag-hoverd.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/tag-selected.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/tag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/menu-icons/write.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/side/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/side/notification.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/assets/side/send.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extension/src/components/content-clipper/index.scss: -------------------------------------------------------------------------------- 1 | .content-clipper-collapse { 2 | .ant-collapse-header { 3 | padding: 0; 4 | } 5 | 6 | .ant-collapse-content { 7 | padding: 0; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/extension/src/components/header/index.scss: -------------------------------------------------------------------------------- 1 | header { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | 6 | .logo { 7 | display: flex; 8 | align-items: center; 9 | gap: 8px; 10 | 11 | .logo-img { 12 | width: 24px; 13 | height: 24px; 14 | } 15 | 16 | .title { 17 | font-size: 16px; 18 | font-weight: 600; 19 | } 20 | } 21 | } 22 | 23 | .logo-img { 24 | width: 28px; 25 | height: 28px; 26 | border-radius: 4px; 27 | -webkit-user-drag: none; 28 | } 29 | -------------------------------------------------------------------------------- /apps/extension/src/components/output-locale-list/index.scss: -------------------------------------------------------------------------------- 1 | .output-locale-list-menu { 2 | background-color: #ffffff !important; 3 | } 4 | -------------------------------------------------------------------------------- /apps/extension/src/entrypoints/background/events/activated.ts: -------------------------------------------------------------------------------- 1 | import { sendHeartBeatMessage } from './utils'; 2 | import { Tabs } from 'wxt/browser'; 3 | 4 | export const onActivated = (activeInfo: Tabs.OnActivatedActiveInfoType) => { 5 | // 在此处处理标签切换 6 | console.log(`Tab with ID ${activeInfo.tabId} was activated in window ${activeInfo.windowId}`); 7 | 8 | sendHeartBeatMessage(activeInfo); 9 | }; 10 | -------------------------------------------------------------------------------- /apps/extension/src/entrypoints/background/events/detached.ts: -------------------------------------------------------------------------------- 1 | import { Tabs } from 'wxt/browser'; 2 | 3 | export const onDetached = (tabId: number, detachInfo: Tabs.OnDetachedDetachInfoType) => { 4 | // 在此处处理标签切换 5 | console.log(`Tab with ID ${tabId} was detached in window ${detachInfo.oldWindowId}`); 6 | }; 7 | -------------------------------------------------------------------------------- /apps/extension/src/entrypoints/popup/load-loading.tsx: -------------------------------------------------------------------------------- 1 | import { Spin } from 'antd'; 2 | import { useTranslation } from 'react-i18next'; 3 | 4 | export const LoadLoading = () => { 5 | const { t } = useTranslation(); 6 | 7 | return ( 8 |
9 |
10 | 11 |

{t('extension.popup.loading')}

12 |
13 |
14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /apps/extension/src/entrypoints/utils-csui.content/App.scss: -------------------------------------------------------------------------------- 1 | body { 2 | width: 0; 3 | height: 0; 4 | margin: 0; 5 | padding: 0; 6 | } 7 | -------------------------------------------------------------------------------- /apps/extension/src/hooks/use-knowledge-base.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/hooks/use-knowledge-base.ts -------------------------------------------------------------------------------- /apps/extension/src/public/_locales/zh_CN/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": { 3 | "message": "Refly - AI Native 创作引擎", 4 | "description": "Name of the extension." 5 | }, 6 | "description": { 7 | "message": "基于自由画布的创作平台,通过多线程对话、知识库整合、上下文记忆、智能搜索和 AI 文档编辑器,轻松将想法转化为优质内容。", 8 | "description": "Description of the extension." 9 | }, 10 | "displayName": { 11 | "message": "Refly - AI Native 创作引擎", 12 | "description": "Display name of the extension." 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/extension/src/public/_locales/zh_TW/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": { 3 | "message": "Refly - AI Native 创作引擎", 4 | "description": "Name of the extension." 5 | }, 6 | "description": { 7 | "message": "基于自由画布的创作平台,通过多线程对话、知识库整合、上下文记忆、智能搜索和 AI 文档编辑器,轻松将想法转化为优质内容。", 8 | "description": "Description of the extension." 9 | }, 10 | "displayName": { 11 | "message": "Refly - AI Native 创作引擎", 12 | "description": "Display name of the extension." 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /apps/extension/src/public/icon/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/public/icon/128.png -------------------------------------------------------------------------------- /apps/extension/src/public/icon/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/public/icon/16.png -------------------------------------------------------------------------------- /apps/extension/src/public/icon/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/public/icon/32.png -------------------------------------------------------------------------------- /apps/extension/src/public/icon/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/public/icon/48.png -------------------------------------------------------------------------------- /apps/extension/src/public/icon/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/extension/src/public/icon/64.png -------------------------------------------------------------------------------- /apps/extension/src/requests/apiRequest.ts: -------------------------------------------------------------------------------- 1 | import type { HandlerRequest, HandlerResponse } from '@refly/common-types'; 2 | 3 | export const apiRequest = async ( 4 | req: HandlerRequest, 5 | ): Promise> => { 6 | console.log(req.body); 7 | 8 | try { 9 | return null as any; 10 | } catch (err) { 11 | return { 12 | success: false, 13 | errMsg: err, 14 | }; 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /apps/extension/src/requests/getAllCommands.ts: -------------------------------------------------------------------------------- 1 | import type { HandlerRequest, HandlerResponse } from '@refly/common-types'; 2 | 3 | const handler = async ( 4 | req: HandlerRequest, 5 | ): Promise> => { 6 | console.log(req?.body); 7 | 8 | try { 9 | const commands = (await chrome.commands.getAll()) || []; 10 | return { 11 | success: true, 12 | data: commands, 13 | }; 14 | } catch (_err) { 15 | return { 16 | success: false, 17 | }; 18 | } 19 | }; 20 | 21 | export default handler; 22 | -------------------------------------------------------------------------------- /apps/extension/src/types/sidePanel.ts: -------------------------------------------------------------------------------- 1 | export interface SidePanelAction { 2 | name: 'openContentSelector'; 3 | value: boolean; 4 | } 5 | 6 | export interface ToggleCopilotStatus { 7 | openContentSelector: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /apps/extension/src/utils/cn.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /apps/extension/src/utils/cookie.ts: -------------------------------------------------------------------------------- 1 | import { UID_COOKIE } from '@refly/utils/cookie'; 2 | import { getClientOrigin } from '@refly/utils/url'; 3 | import { browser } from 'wxt/browser'; 4 | 5 | export async function getCookie() { 6 | try { 7 | const res = await browser.cookies?.get({ 8 | name: UID_COOKIE, 9 | url: getClientOrigin(), 10 | }); 11 | 12 | if (!res?.value) { 13 | throw new Error('user not auth'); 14 | } 15 | 16 | return res.value; 17 | } catch (err) { 18 | console.log('err', err); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /apps/extension/src/utils/dayjsConfig.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | import relativeTime from 'dayjs/plugin/relativeTime'; 3 | import utc from 'dayjs/plugin/utc'; 4 | 5 | dayjs.extend(utc); 6 | 7 | dayjs.extend(relativeTime); 8 | 9 | //这里需要国际化 10 | dayjs.locale('zh-cn'); 11 | 12 | export default dayjs; 13 | -------------------------------------------------------------------------------- /apps/extension/src/utils/delay.ts: -------------------------------------------------------------------------------- 1 | export const delay = (ms: number) => { 2 | return new Promise((resolve) => setTimeout(resolve, ms)); 3 | }; 4 | -------------------------------------------------------------------------------- /apps/extension/src/utils/locale.ts: -------------------------------------------------------------------------------- 1 | export const mapDefaultLocale = (locale: string) => { 2 | if (locale?.toLocaleLowerCase()?.startsWith('zh')) { 3 | return 'zh-CN'; 4 | } 5 | 6 | return 'en'; 7 | }; 8 | -------------------------------------------------------------------------------- /apps/extension/src/utils/storage.ts: -------------------------------------------------------------------------------- 1 | // export const storage = { 2 | // defineItem: (key: string, options: { defaultValue: T }) => { 3 | // const item = browser.storage.sync.get(key); 4 | // if (item) { 5 | // return JSON.parse(item) as T; 6 | // } else { 7 | // const { defaultValue } = options; 8 | // } 9 | -------------------------------------------------------------------------------- /apps/extension/src/utils/version.ts: -------------------------------------------------------------------------------- 1 | import { browser } from 'wxt/browser'; 2 | 3 | export const getExtensionVersion = () => { 4 | return browser.runtime.getManifest().version; 5 | }; 6 | -------------------------------------------------------------------------------- /apps/web/.env.example: -------------------------------------------------------------------------------- 1 | # Refly API URL 2 | VITE_API_URL=http://localhost:5800 3 | 4 | # Refly Collab URL 5 | VITE_COLLAB_URL=http://localhost:5801 6 | 7 | # Whether subscription feature is enabled 8 | VITE_SUBSCRIPTION_ENABLED= 9 | 10 | # Whether canvas template feature is enabled 11 | VITE_CANVAS_TEMPLATE_ENABLED= 12 | 13 | # Static public endpoint 14 | VITE_STATIC_PUBLIC_ENDPOINT=http://localhost:5800/v1/misc/public 15 | 16 | # Static private endpoint 17 | VITE_STATIC_PRIVATE_ENDPOINT=http://localhost:5800/v1/misc 18 | -------------------------------------------------------------------------------- /apps/web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | # Sentry Config File 27 | .env.sentry-build-plugin 28 | 29 | # vite config cache 30 | vite.config.ts.timestamp-* -------------------------------------------------------------------------------- /apps/web/README.md: -------------------------------------------------------------------------------- 1 | ## Refly Web 项目 2 | 3 | 按照依赖: 4 | 5 | ```bash 6 | yarn 7 | ``` 8 | 9 | 开启项目: 10 | 11 | ```bash 12 | yarn dev 13 | ``` 14 | -------------------------------------------------------------------------------- /apps/web/postcss.config.ts: -------------------------------------------------------------------------------- 1 | import tailwindNesting from 'tailwindcss/nesting'; 2 | import tailwind from 'tailwindcss'; 3 | import autoprefixer from 'autoprefixer'; 4 | import { Plugin, Processor } from 'postcss'; 5 | import tailwindConfig from './tailwind.config'; 6 | 7 | const config: { plugins: (Plugin | Processor)[] } = { 8 | plugins: [tailwindNesting, tailwind(tailwindConfig), autoprefixer()], 9 | }; 10 | 11 | export default config; 12 | -------------------------------------------------------------------------------- /apps/web/public/config.js: -------------------------------------------------------------------------------- 1 | window.ENV = { 2 | API_URL: '', 3 | COLLAB_URL: '', 4 | }; 5 | -------------------------------------------------------------------------------- /apps/web/src/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import resources from '@refly/common-types'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | resources: typeof resources; 6 | // if you see an error like: "Argument of type 'DefaultTFuncReturn' is not assignable to parameter of type xyz" 7 | // set returnNull to false (and also in the i18next init options) 8 | // returnNull: false; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/web/src/@types/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /apps/web/src/assets/common/arrow-down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/web/src/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/web/src/assets/icon.png -------------------------------------------------------------------------------- /apps/web/src/assets/side/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/web/src/assets/side/notification.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/web/src/assets/side/send.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/web/src/components/landing-page-partials/footer.scss: -------------------------------------------------------------------------------- 1 | .logo { 2 | display: flex; 3 | flex-direction: row; 4 | align-items: center; 5 | 6 | .title { 7 | margin-left: 8px; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/web/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import clsx, { ClassValue } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /apps/web/src/pages/library/index.scss: -------------------------------------------------------------------------------- 1 | .workspace-container { 2 | height: 100%; 3 | } 4 | 5 | .workspace-inner-container { 6 | height: 100%; 7 | background-color: #eef4f7; 8 | } 9 | 10 | .workspace-panel-container { 11 | height: 100%; 12 | } 13 | 14 | .workspace-content-panel { 15 | background-color: #eef4f7; 16 | border-color: hsla(60, 11%, 83%, 0.5); 17 | box-shadow: 0 1px 1px 0 hsla(60, 11%, 83%, 0.3); 18 | border-bottom-right-radius: 12px; 19 | border-top-right-radius: 12px; 20 | } 21 | -------------------------------------------------------------------------------- /apps/web/src/pages/page-title/index.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/web/src/pages/page-title/index.scss -------------------------------------------------------------------------------- /apps/web/src/pages/project/index.tsx: -------------------------------------------------------------------------------- 1 | import { Project } from '@refly-packages/ai-workspace-common/components/project'; 2 | import { useParams } from 'react-router-dom'; 3 | 4 | const ProjectPage = () => { 5 | const { projectId = '' } = useParams(); 6 | 7 | return ; 8 | }; 9 | 10 | export default ProjectPage; 11 | -------------------------------------------------------------------------------- /apps/web/src/pages/request-access/index.tsx: -------------------------------------------------------------------------------- 1 | import RequestAccess from '@refly-packages/ai-workspace-common/components/request-access/index'; 2 | 3 | export default RequestAccess; 4 | -------------------------------------------------------------------------------- /apps/web/src/pages/share/index.tsx: -------------------------------------------------------------------------------- 1 | import { useParams } from 'react-router-dom'; 2 | import { Canvas } from '@refly-packages/ai-workspace-common/components/canvas'; 3 | 4 | const ShareCanvasPage = () => { 5 | const { canvasId = '' } = useParams(); 6 | 7 | return ; 8 | }; 9 | 10 | export default ShareCanvasPage; 11 | -------------------------------------------------------------------------------- /apps/web/src/pages/skill/index.scss: -------------------------------------------------------------------------------- 1 | .skill-list { 2 | padding: 24px 32px; 3 | &__header { 4 | padding: 15px 0; 5 | } 6 | &__content { 7 | overflow: auto; 8 | height: calc(100vh - 48px - 66px - 16px); 9 | box-sizing: border-box; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/web/src/pages/template-preview/index.tsx: -------------------------------------------------------------------------------- 1 | import { useParams } from 'react-router-dom'; 2 | import { Canvas } from '@refly-packages/ai-workspace-common/components/canvas'; 3 | 4 | const TemplatePreviewPage = () => { 5 | const { shareId = '' } = useParams(); 6 | 7 | return ; 8 | }; 9 | 10 | export default TemplatePreviewPage; 11 | -------------------------------------------------------------------------------- /apps/web/src/process-polyfill.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Process polyfill for browser environments 3 | * This is used to provide a 'process' global that some libraries expect to exist 4 | */ 5 | 6 | // Simply providing minimal process shim 7 | // @ts-ignore - Ignoring type errors to create a simple shim 8 | if (typeof window !== 'undefined') { 9 | // @ts-ignore - Using any to bypass strict type checking 10 | window.process = window.process || { 11 | env: {}, 12 | version: '0.0.0', 13 | }; 14 | } 15 | 16 | export {}; 17 | -------------------------------------------------------------------------------- /apps/web/src/styles/additional-styles/arco-additional.scss: -------------------------------------------------------------------------------- 1 | .arco-modal { 2 | border-radius: 16px !important; 3 | } 4 | -------------------------------------------------------------------------------- /apps/web/src/styles/global.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/apps/web/src/styles/global.css -------------------------------------------------------------------------------- /apps/web/src/utils/ui.ts: -------------------------------------------------------------------------------- 1 | export const getPopupContainer = (): HTMLElement => { 2 | const elem = document.querySelector('.main'); 3 | 4 | return elem as HTMLElement; 5 | }; 6 | -------------------------------------------------------------------------------- /apps/web/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /apps/web/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts", "tailwind.config.ts", "postcss.config.ts", "vite-gtag-plugin.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /apps/web/typing/tailwindcss-nesting.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'tailwindcss/nesting'; 2 | -------------------------------------------------------------------------------- /cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | 3 | export default defineConfig({ 4 | e2e: { 5 | projectId: 'k7kkoz', 6 | defaultBrowser: 'chrome', 7 | viewportWidth: 1920, 8 | viewportHeight: 1080, 9 | retries: 2, 10 | baseUrl: 'http://localhost:5173', 11 | env: { 12 | databaseUrl: 'postgresql://refly:test@localhost:5432/refly', 13 | }, 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /cypress/.gitignore: -------------------------------------------------------------------------------- 1 | screenshots/* 2 | videos/* 3 | -------------------------------------------------------------------------------- /cypress/fixtures/users-cleanup.sql: -------------------------------------------------------------------------------- 1 | DELETE FROM "refly"."accounts" WHERE "uid" LIKE 'u-at-%'; 2 | DELETE FROM "refly"."users" WHERE "uid" LIKE 'u-at-%'; 3 | DELETE FROM "refly"."canvases" WHERE "uid" LIKE 'u-at-%'; 4 | DELETE FROM "refly"."documents" WHERE "uid" LIKE 'u-at-%'; 5 | DELETE FROM "refly"."resources" WHERE "uid" LIKE 'u-at-%'; -------------------------------------------------------------------------------- /cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["es5", "dom"], 5 | "types": ["cypress", "node"] 6 | }, 7 | "include": ["**/*.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /deploy/docker/elasticsearch/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM docker.elastic.co/elasticsearch/elasticsearch:7.10.2 2 | 3 | # Install ICU Analysis plugin 4 | RUN elasticsearch-plugin install analysis-icu --batch 5 | -------------------------------------------------------------------------------- /deploy/docker/qdrant/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM qdrant/qdrant:v1.13.1 2 | 3 | RUN apt-get update -yq && apt-get install -yqq curl -------------------------------------------------------------------------------- /deploy/model-providers/deepseek.sql: -------------------------------------------------------------------------------- 1 | -- Provider: deepseek 2 | -- Default model: deepseek-chat 3 | -- OPENAI_BASE_URL: https://api.deepseek.com 4 | INSERT INTO "refly"."model_infos" ("name", "label", "provider", "tier", "enabled", "is_default", "context_limit", "max_output", "capabilities") 5 | VALUES 6 | ('deepseek-chat', 'DeepSeek Chat', 'deepseek', 't2', 't', 't', 64000, 8000, '{}'), 7 | ('deepseek-reasoner', 'DeepSeek Reasoner', 'deepseek', 't1', 't', 'f', 64000, 8000, '{}'); 8 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/Layout.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | import DefaultTheme from 'vitepress/theme'; 2 | import Layout from './Layout.vue'; 3 | import './custom.css'; 4 | 5 | export default { 6 | extends: DefaultTheme, 7 | Layout, 8 | }; 9 | -------------------------------------------------------------------------------- /docs/cloud/index.md: -------------------------------------------------------------------------------- 1 | # Cloud Version 2 | 3 | This is the homepage for the Refly.AI Cloud Version documentation. -------------------------------------------------------------------------------- /docs/community-version/faq.md: -------------------------------------------------------------------------------- 1 | # Frequently Asked Questions 2 | 3 | This section contains frequently asked questions about the Refly.AI Community Version. -------------------------------------------------------------------------------- /docs/community-version/index.md: -------------------------------------------------------------------------------- 1 | # Community Version 2 | 3 | This is the homepage for the Refly.AI Community Version documentation. -------------------------------------------------------------------------------- /docs/community-version/self-deploy/gitpod-quick-deploy.md: -------------------------------------------------------------------------------- 1 | # Gitpod 快速部署 -------------------------------------------------------------------------------- /docs/en/guide/introduction.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | Welcome to our documentation! This guide will help you understand our project and how to make the most of it. 4 | 5 | ## What is This Project? 6 | 7 | This project aims to provide comprehensive documentation with multi-language support. 8 | 9 | ## Key Features 10 | 11 | - Multi-language support (English and Chinese) 12 | - Clear navigation structure 13 | - Comprehensive guides 14 | - Easy to extend 15 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "refly-docs", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "dev": "vitepress dev", 7 | "build": "vitepress build", 8 | "preview": "vitepress preview", 9 | "convert-images": "node scripts/convert-webp.js" 10 | }, 11 | "devDependencies": { 12 | "@biomejs/biome": "^1.9.0", 13 | "sharp": "^0.33.5", 14 | "vitepress": "^1.5.0" 15 | }, 16 | "packageManager": "pnpm@8.15.8" 17 | } 18 | -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/public/images/2025-04-25-17-29-03.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-25-17-29-03.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-12-48-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-12-48-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-03-40.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-03-40.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-03-54.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-03-54.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-04-17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-04-17.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-04-36.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-04-36.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-07-23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-07-23.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-07-41.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-07-41.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-07-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-07-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-08-04.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-08-04.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-08-17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-08-17.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-08-27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-08-27.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-08-40.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-08-40.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-08-49.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-08-49.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-08-58.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-08-58.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-09-06.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-09-06.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-09-19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-09-19.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-09-32.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-09-32.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-09-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-09-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-12-27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-12-27.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-12-59.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-12-59.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-13-07.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-13-07.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-13-22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-13-22.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-13-35.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-13-35.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-13-49.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-13-49.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-14-09.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-14-09.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-14-21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-14-21.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-14-59.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-14-59.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-15-12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-15-12.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-15-22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-15-22.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-15-34.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-15-34.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-30-56.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-30-56.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-31-11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-31-11.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-31-22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-31-22.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-31-31.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-31-31.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-32-23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-32-23.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-32-33.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-32-33.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-32-39.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-32-39.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-32-51.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-32-51.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-33-14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-33-14.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-33-20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-33-20.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-33-36.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-33-36.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-15-33-47.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-15-33-47.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-12-55.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-12-55.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-13-09.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-13-09.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-13-20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-13-20.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-13-28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-13-28.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-13-42.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-13-42.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-14-04.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-14-04.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-14-27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-14-27.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-14-40.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-14-40.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-14-54.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-14-54.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-15-13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-15-13.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-15-23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-15-23.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-15-32.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-15-32.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-15-40.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-15-40.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-15-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-15-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-16-15-58.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-16-15-58.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-25-27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-25-27.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-26-17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-26-17.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-26-35.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-26-35.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-26-45.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-26-45.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-26-57.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-26-57.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-27-08.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-27-08.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-27-25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-27-25.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-27-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-27-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-28-01.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-28-01.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-28-11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-28-11.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-28-20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-28-20.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-28-35.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-28-35.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-28-44.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-28-44.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-28-55.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-28-55.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-29-05.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-29-05.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-29-14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-29-14.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-29-25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-29-25.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-29-41.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-29-41.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-29-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-29-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-30-19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-30-19.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-30-30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-30-30.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-30-39.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-30-39.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-30-49.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-30-49.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-31-02.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-31-02.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-31-21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-31-21.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-31-37.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-31-37.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-31-44.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-31-44.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-31-57.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-31-57.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-32-16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-32-16.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-32-24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-32-24.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-32-38.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-32-38.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-32-47.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-32-47.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-32-59.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-32-59.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-33-09.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-33-09.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-33-23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-33-23.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-33-32.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-33-32.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-33-43.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-33-43.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-33-52.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-33-52.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-34-02.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-34-02.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-34-21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-34-21.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-34-41.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-34-41.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-22-34-47.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-22-34-47.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-33-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-33-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-00.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-00.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-09.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-09.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-20.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-28.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-37.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-37.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-50.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-50.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-34-59.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-34-59.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-35-07.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-35-07.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-35-17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-35-17.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-35-28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-35-28.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-35-36.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-35-36.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-35-46.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-35-46.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-36-01.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-36-01.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-36-20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-36-20.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-36-29.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-36-29.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-26-23-36-38.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-26-23-36-38.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-07-40.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-07-40.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-07-52.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-07-52.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-08-02.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-08-02.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-15-33.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-15-33.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-15-46.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-15-46.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-19-43.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-19-43.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-19-51.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-19-51.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-01.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-01.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-10.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-20.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-30.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-37.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-37.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-49.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-49.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-00-20-58.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-00-20-58.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-11-20-24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-11-20-24.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-11-20-35.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-11-20-35.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-11-20-44.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-11-20-44.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-11-20-54.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-11-20-54.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-11-21-07.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-11-21-07.webp -------------------------------------------------------------------------------- /docs/public/images/2025-04-27-11-21-24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-04-27-11-21-24.webp -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-16-54-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-16-54-06.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-16-57-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-16-57-09.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-00-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-00-37.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-01-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-01-47.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-02-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-02-31.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-04-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-04-02.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-04-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-04-54.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-05-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-05-32.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-07-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-07-48.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-08-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-08-59.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-11-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-11-17.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-11-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-11-48.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-12-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-12-26.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-15-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-15-36.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-16-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-16-15.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-17-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-17-18.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-18-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-18-51.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-22-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-22-48.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-24-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-24-14.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-37-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-37-35.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-38-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-38-49.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-39-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-39-42.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-41-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-41-16.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-41-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-41-52.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-42-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-42-41.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-43-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-43-12.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-43-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-43-42.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-44-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-44-22.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-44-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-44-44.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-45-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-45-11.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-47-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-47-05.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-49-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-49-36.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-50-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-50-52.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-51-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-51-29.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-51-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-51-59.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-52-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-52-26.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-53-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-53-06.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-17-55-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-17-55-48.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-18-03-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-18-03-21.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-18-28-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-18-28-28.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-18-31-35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-18-31-35.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-18-32-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-18-32-06.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-18-40-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-18-40-49.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-18-41-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-18-41-41.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-37-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-37-55.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-43-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-43-47.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-44-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-44-18.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-45-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-45-20.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-46-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-46-24.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-47-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-47-18.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-51-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-51-18.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-53-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-53-46.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-21-55-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-21-55-05.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-01-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-01-24.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-01-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-01-40.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-02-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-02-09.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-03-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-03-44.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-04-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-04-30.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-04-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-04-54.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-05-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-05-36.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-06-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-06-24.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-08-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-08-06.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-09-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-09-17.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-09-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-09-57.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-31-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-31-07.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-31-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-31-45.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-32-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-32-14.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-32-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-32-49.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-33-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-33-20.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-34-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-34-43.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-35-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-35-30.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-36-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-36-21.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-58-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-58-09.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-58-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-58-59.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-22-59-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-22-59-28.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-16-34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-16-34.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-23-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-23-51.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-25-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-25-28.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-25-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-25-51.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-34-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-34-53.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-35-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-35-15.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-37-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-37-13.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-38-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-38-18.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-38-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-38-37.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-38-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-38-56.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-13-23-40-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-13-23-40-29.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-08-30-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-08-30-53.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-08-33-06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-08-33-06.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-08-33-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-08-33-30.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-08-34-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-08-34-26.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-11-07-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-11-07-36.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-11-08-47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-11-08-47.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-39-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-39-51.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-40-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-40-28.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-40-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-40-55.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-41-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-41-24.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-42-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-42-02.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-42-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-42-26.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-42-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-42-40.png -------------------------------------------------------------------------------- /docs/public/images/2025-05-14-15-42-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/2025-05-14-15-42-58.png -------------------------------------------------------------------------------- /docs/public/images/add-model-modal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/add-model-modal.webp -------------------------------------------------------------------------------- /docs/public/images/add-model.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/add-model.webp -------------------------------------------------------------------------------- /docs/public/images/ai-model-sql-init.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/ai-model-sql-init.webp -------------------------------------------------------------------------------- /docs/public/images/deploy-to-gitpod.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/deploy-to-gitpod.webp -------------------------------------------------------------------------------- /docs/public/images/docker-compose-up.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/docker-compose-up.webp -------------------------------------------------------------------------------- /docs/public/images/error-report.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/error-report.webp -------------------------------------------------------------------------------- /docs/public/images/explore.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/explore.webp -------------------------------------------------------------------------------- /docs/public/images/feature1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/feature1.webp -------------------------------------------------------------------------------- /docs/public/images/feature2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/feature2.webp -------------------------------------------------------------------------------- /docs/public/images/feature3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/feature3.webp -------------------------------------------------------------------------------- /docs/public/images/feature4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/feature4.webp -------------------------------------------------------------------------------- /docs/public/images/generate-article.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/generate-article.webp -------------------------------------------------------------------------------- /docs/public/images/generate-outline.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/generate-outline.webp -------------------------------------------------------------------------------- /docs/public/images/gitpod-deploy-success.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/gitpod-deploy-success.webp -------------------------------------------------------------------------------- /docs/public/images/gitpod-new-workspace.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/gitpod-new-workspace.webp -------------------------------------------------------------------------------- /docs/public/images/landing-page-error.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/landing-page-error.webp -------------------------------------------------------------------------------- /docs/public/images/lark-qrcode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/lark-qrcode.webp -------------------------------------------------------------------------------- /docs/public/images/ollama-home.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/ollama-home.webp -------------------------------------------------------------------------------- /docs/public/images/other-models.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/other-models.webp -------------------------------------------------------------------------------- /docs/public/images/product.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/product.webp -------------------------------------------------------------------------------- /docs/public/images/register-1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/register-1.webp -------------------------------------------------------------------------------- /docs/public/images/register-2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/register-2.webp -------------------------------------------------------------------------------- /docs/public/images/research.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/research.webp -------------------------------------------------------------------------------- /docs/public/images/settings-provider-modal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/settings-provider-modal.webp -------------------------------------------------------------------------------- /docs/public/images/settings-provider.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/settings-provider.webp -------------------------------------------------------------------------------- /docs/public/images/settings.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/settings.webp -------------------------------------------------------------------------------- /docs/public/images/start-chat.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/start-chat.webp -------------------------------------------------------------------------------- /docs/public/images/wechat-group-qrcode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/wechat-group-qrcode.webp -------------------------------------------------------------------------------- /docs/public/images/wechat-qrcode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/docs/public/images/wechat-qrcode.webp -------------------------------------------------------------------------------- /docs/scenarios/index.md: -------------------------------------------------------------------------------- 1 | # Scenario Sharing 2 | 3 | This section will share usage scenarios and case studies of Refly.AI. -------------------------------------------------------------------------------- /docs/zh/changelog/v0.2.4.md: -------------------------------------------------------------------------------- 1 | # v0.2.4 更新日志 2 | 3 | ## 🦹 更新总览 4 | 5 | 🌟 重磅整合 DeepSeek R1 推理模型,全面升级知识问答、AI 深度搜索及文档生成能力。限时特惠:订阅用户可享永久优惠价续订! 6 | 7 | ## 🌟 功能详情 8 | 9 | - **📚 超值会员权益升级** 10 | - 限时特惠期间订阅的用户,后续续费均可享受同等优惠价格 11 | 12 | - **💰 全新 DeepSeek R1 模型加持** 13 | - 引入业界领先的 DeepSeek R1 推理模型 14 | - 全面提升知识问答、AI 搜索及文档生成体验 15 | 16 | - **🚀 交互体验优化** 17 | - 新增「悬浮卡片」开关控制功能 18 | - 支持通过卡片提示或画布右键菜单进行显示控制 19 | 20 | - **🚀 智能推荐系统升级** 21 | - 优化推荐算法,整合资源消耗及上下文信息 22 | - 提供更精准、更贴合场景的问题建议 -------------------------------------------------------------------------------- /docs/zh/cloud/feature-intro/global-search.md: -------------------------------------------------------------------------------- 1 | # 搜索 2 | 3 | 全局搜索是 Refly 中的一个强大功能,可以帮助你快速找到所有的画布和资源。 4 | 5 | 当你使用全局搜索时,系统会优先显示匹配到的画布。接着,它会搜索资源,匹配资源的名称以及内容中的关键词。 6 | 7 | 你可以通过点击搜索框,或者使用键盘快捷键 **Ctrl+K** 来快速打开全局搜索。 8 | 9 | 利用全局搜索,你可以轻松找到你之前创建的历史画布,也可以方便地将资源添加到当前的画布中。 10 | 11 | ![全局搜索界面图1](/images/2025-04-27-00-15-33.webp) 12 | 图1:全局搜索的入口和界面示例。 13 | 14 | ![搜索结果展示图2](/images/2025-04-27-00-15-46.webp) 15 | 图2:全局搜索结果展示示例,画布优先显示。 -------------------------------------------------------------------------------- /docs/zh/cloud/feature-intro/templates.md: -------------------------------------------------------------------------------- 1 | # 模版 2 | 3 | ## 模板的创建与使用 4 | 5 | 模板功能允许您将自己的画布保存为模板,供自己或他人重复使用特定功能的场景。 6 | 7 | 您可以通过画布中的“分享”按钮将当前画布转换为模板。转换后的模板将保存在“我的模板”中。 8 | 9 | 如果您希望将模板分享给其他用户,可以提交模板进行审核。审核通过后,您的模板将在“全部模板”中显示,供其他用户使用。 10 | 11 | ![图1](/images/2025-04-27-00-07-40.webp) 12 | 13 | ## 使用其他用户的模板 14 | 15 | 在“全部模板”区域,您可以使用其他用户分享的模板。 16 | 17 | 当您缺乏创意或不确定如何使用 Refly 的某些功能时,优先查看其他用户分享的模板是一个很好的选择。模板也是您快速入手或者学习 Refly 高级功能的便捷途径。 18 | 19 | ![图2](/images/2025-04-27-00-07-52.webp) 20 | 21 | ![图3](/images/2025-04-27-00-08-02.webp) -------------------------------------------------------------------------------- /docs/zh/cloud/index.md: -------------------------------------------------------------------------------- 1 | # 云版本 2 | 3 | 这是 Refly.AI 云版本的文档主页。 -------------------------------------------------------------------------------- /docs/zh/community-version/faq.md: -------------------------------------------------------------------------------- 1 | # 常见问题 2 | 3 | 这里是 Refly.AI 社区版本的常见问题解答。 -------------------------------------------------------------------------------- /docs/zh/community-version/index.md: -------------------------------------------------------------------------------- 1 | # 社区版本 2 | 3 | 这是 Refly.AI 社区版本的文档主页。 -------------------------------------------------------------------------------- /docs/zh/guide/introduction.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | 欢迎阅读我们的文档!本指南将帮助您了解我们的项目并充分利用它。 4 | 5 | ## 这是什么项目? 6 | 7 | 本项目旨在提供全面的多语言文档支持。 8 | 9 | ## 主要特性 10 | 11 | - 多语言支持(中文和英文) 12 | - 清晰的导航结构 13 | - 全面的指南 14 | - 易于扩展 15 | -------------------------------------------------------------------------------- /docs/zh/scenarios/index.md: -------------------------------------------------------------------------------- 1 | # 场景分享 2 | 3 | 这里将分享 Refly.AI 的使用场景和案例。 -------------------------------------------------------------------------------- /packages/ai-workspace-common/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas-template/index.scss: -------------------------------------------------------------------------------- 1 | .canvas-template-modal { 2 | .ant-spin-nested-loading, 3 | .ant-spin-container { 4 | height: 100%; 5 | width: 100%; 6 | } 7 | } 8 | 9 | .template-list { 10 | .ant-modal-header { 11 | margin-bottom: 0; 12 | } 13 | .ant-modal-content { 14 | padding: 0; 15 | } 16 | } -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/launchpad/chat-actions/index.scss: -------------------------------------------------------------------------------- 1 | .model-selector-overlay { 2 | .ant-dropdown-menu { 3 | max-height: 48vh; 4 | overflow-y: auto; 5 | 6 | .ant-dropdown-menu-item { 7 | margin: 0 8px; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/launchpad/context-manager/types/item.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Mark, MarkType } from '@refly/common-types'; 3 | import { SortMark } from './mark'; 4 | 5 | export interface RenderItem { 6 | domain: string; 7 | heading: string; 8 | data: SortMark; 9 | type: MarkType; 10 | icon: React.ReactNode; 11 | action?: boolean; 12 | actionHeading?: { create: string }; 13 | onItemClick?: (item: Mark) => void; 14 | onCreateClick?: () => void; 15 | } 16 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/launchpad/context-manager/types/mark.ts: -------------------------------------------------------------------------------- 1 | import { Mark } from '@refly/common-types'; 2 | 3 | export interface SortMark extends Mark { 4 | isSelected?: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/node-chat-panel/index.scss: -------------------------------------------------------------------------------- 1 | .node-chat-panel-skill-select { 2 | .ant-select-selector { 3 | padding-left: 0px !important; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/node-preview/tool.tsx: -------------------------------------------------------------------------------- 1 | export const ToolNodePreview = () => { 2 | return
ToolNodePreview
; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/nodes/memo/memo-editor.scss: -------------------------------------------------------------------------------- 1 | .memo-color-picker { 2 | &.ant-color-picker-trigger-active { 3 | box-shadow: none; 4 | } 5 | .ant-color-picker-color-block { 6 | width: 18px; 7 | height: 18px; 8 | border-radius: 50%; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/nodes/memo/memo.scss: -------------------------------------------------------------------------------- 1 | .memo-node-editor { 2 | .ProseMirror { 3 | margin: 0 !important; 4 | padding: 0 !important; 5 | height: 100%; 6 | width: 100%; 7 | font-size: 0.75rem !important; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/canvas/top-toolbar/index.scss: -------------------------------------------------------------------------------- 1 | .canvas-share-setting { 2 | .ant-select-selector { 3 | padding: 0 !important; 4 | .ant-select-selection-item { 5 | padding-inline-end: 0 !important; 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/common/resource-icon/index.tsx: -------------------------------------------------------------------------------- 1 | export { default as FileIcon } from './file-icon'; 2 | export { default as defaultStyles } from './defaultStyles'; 3 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/common/spin.tsx: -------------------------------------------------------------------------------- 1 | import { Spin as AntdSpin, SpinProps } from 'antd'; 2 | import { IconLoading } from './icon'; 3 | 4 | export const Spin = (props: SpinProps, className?: string) => { 5 | return ( 6 | } {...props} /> 7 | ); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/components/selectors/color-selector.scss: -------------------------------------------------------------------------------- 1 | .editor-color-popover { 2 | .ant-popover-inner { 3 | padding: 0; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/components/styles/CalSans-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/ai-workspace-common/src/components/editor/components/styles/CalSans-SemiBold.otf -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/components/ui/icons/crazy-spinner.tsx: -------------------------------------------------------------------------------- 1 | const CrazySpinner = () => { 2 | return ( 3 |
4 |
5 |
6 |
7 |
8 | ); 9 | }; 10 | 11 | export default CrazySpinner; 12 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/components/ui/icons/index.tsx: -------------------------------------------------------------------------------- 1 | export { default as FontDefault } from './font-default'; 2 | export { default as FontSerif } from './font-serif'; 3 | export { default as FontMono } from './font-mono'; 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/components/utils/index.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/core/plugins/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | UploadImagesPlugin, 3 | type UploadFn, 4 | type ImageUploadOptions, 5 | createImageUpload, 6 | handleImageDrop, 7 | handleImagePaste, 8 | } from './upload-images'; 9 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/core/utils/atoms.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'jotai'; 2 | import type { Range } from '@tiptap/core'; 3 | 4 | export const queryAtom = atom(''); 5 | export const rangeAtom = atom(null); 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/core/utils/editor.ts: -------------------------------------------------------------------------------- 1 | import { useEditor, Editor } from '@tiptap/react'; 2 | 3 | export { useEditor, Editor }; 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/core/utils/store.ts: -------------------------------------------------------------------------------- 1 | import { createStore } from 'jotai'; 2 | 3 | export const novelStore = createStore(); 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/extensions/Table/Row.ts: -------------------------------------------------------------------------------- 1 | import TiptapTableRow from '@tiptap/extension-table-row'; 2 | 3 | export const TableRow = TiptapTableRow.extend({ 4 | allowGapCursor: false, 5 | content: '(tableCell | tableHeader)*', 6 | }); 7 | 8 | export default TableRow; 9 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/extensions/Table/Table.ts: -------------------------------------------------------------------------------- 1 | import TiptapTable from '@tiptap/extension-table'; 2 | 3 | export const Table = TiptapTable.configure({ resizable: true, lastColumnResizable: false }); 4 | 5 | export default Table; 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/extensions/Table/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Table'; 2 | export * from './Cell'; 3 | export * from './Header'; 4 | export * from './Row'; 5 | 6 | export * from './menus'; 7 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/extensions/Table/menus/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './TableColumn'; 2 | export * from './TableRow'; 3 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/extensions/Table/ui/types.ts: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Placement, Props } from 'tippy.js'; 3 | 4 | export interface TooltipProps { 5 | children?: string | React.ReactNode; 6 | enabled?: boolean; 7 | title?: string; 8 | shortcut?: string[]; 9 | tippyOptions?: Omit, 'content'>; 10 | content?: React.ReactNode; 11 | } 12 | 13 | export interface TippyProps { 14 | 'data-placement': Placement; 15 | 'data-reference-hidden'?: string; 16 | 'data-escaped'?: string; 17 | } 18 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/extensions/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Table'; 2 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/index.ts: -------------------------------------------------------------------------------- 1 | export * from './schema'; 2 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/editor/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/hover-card/index.scss: -------------------------------------------------------------------------------- 1 | .hover-card-popover { 2 | .ant-popover-inner { 3 | @apply p-0 rounded-lg shadow-[0_4px_12px_rgba(0,0,0,0.1)]; 4 | } 5 | 6 | .ant-popover-arrow { 7 | @apply hidden; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/markdown/plugins/artifact-thinking/index.ts: -------------------------------------------------------------------------------- 1 | import { ARTIFACT_THINKING_TAG } from '@refly/utils/artifact'; 2 | 3 | import Component from './render'; 4 | import rehypePlugin from './rehypePlugin'; 5 | 6 | const ReflyThinkingElement = { 7 | Component, 8 | rehypePlugin, 9 | tag: ARTIFACT_THINKING_TAG, 10 | }; 11 | 12 | export default ReflyThinkingElement; 13 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/markdown/plugins/artifact/index.ts: -------------------------------------------------------------------------------- 1 | import { ARTIFACT_TAG } from '@refly/utils/artifact'; 2 | 3 | import Component from './render'; 4 | import rehypePlugin from './rehypePlugin'; 5 | 6 | type ArtifactElement = { 7 | Component: typeof Component; 8 | rehypePlugin: typeof rehypePlugin; 9 | tag: string; 10 | }; 11 | 12 | const ReflyArtifactElement: ArtifactElement = { 13 | Component, 14 | rehypePlugin, 15 | tag: ARTIFACT_TAG, 16 | }; 17 | 18 | export default ReflyArtifactElement; 19 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/markdown/plugins/code/index.ts: -------------------------------------------------------------------------------- 1 | import Component from './render'; 2 | import rehypePlugin from './rehypePlugin'; 3 | 4 | // Define a proper interface to avoid the type error 5 | interface MarkdownElementPlugin { 6 | tag: string; 7 | Component: React.ComponentType; 8 | rehypePlugin: () => (tree: any) => void; 9 | } 10 | 11 | const CodeElement: MarkdownElementPlugin = { 12 | tag: 'pre', 13 | Component, 14 | rehypePlugin, 15 | }; 16 | 17 | export default CodeElement; 18 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/markdown/plugins/link/index.ts: -------------------------------------------------------------------------------- 1 | import Component from './render'; 2 | 3 | const LinkElement = { 4 | Component, 5 | tag: 'a', 6 | }; 7 | 8 | export default LinkElement; 9 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/markdown/plugins/mermaid/index.ts: -------------------------------------------------------------------------------- 1 | import Component from './render'; 2 | 3 | interface MermaidElementType { 4 | Component: typeof Component; 5 | tag: string; 6 | } 7 | 8 | const MermaidElement: MermaidElementType = { 9 | Component, 10 | tag: 'pre', 11 | }; 12 | 13 | export default MermaidElement; 14 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/markdown/types/index.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react'; 2 | 3 | export interface MarkdownElementProps { 4 | children: ReactNode; 5 | id: string; 6 | type: string; 7 | } 8 | 9 | export type MarkdownMode = 'readonly' | 'interactive'; 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/project/add-sources/index.scss: -------------------------------------------------------------------------------- 1 | .add-sources-modal { 2 | .ant-modal-body { 3 | height: 50vh; 4 | overflow: hidden; 5 | .ant-tabs { 6 | width: 100%; 7 | height: 100%; 8 | .source-list { 9 | height: calc(50vh - 62px); 10 | overflow-y: auto; 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/project/project-knowledge-toggle/index.scss: -------------------------------------------------------------------------------- 1 | .project-kb-toggle { 2 | .project-selector { 3 | overflow: hidden; 4 | 5 | .ant-select-selector { 6 | padding-left: 0 !important; 7 | } 8 | 9 | .ant-select-selection-item { 10 | height: 32px !important; 11 | padding-left: 0 !important; 12 | } 13 | } 14 | 15 | .ant-switch.ant-switch-checked { 16 | background-color: #00968f !important; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/request-access/index.scss: -------------------------------------------------------------------------------- 1 | .request-access-modal { 2 | &.arco-modal { 3 | max-width: 100%; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/resource-view/resource-deck/index.scss: -------------------------------------------------------------------------------- 1 | .deck { 2 | .ant-tabs-content-holder { 3 | overflow: scroll; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/search/cmdk/filter.ts: -------------------------------------------------------------------------------- 1 | import { commandScore } from './command-score'; 2 | import { type CommandProps } from './types'; 3 | export const defaultFilter: CommandProps['filter'] = (value, search, keywords) => 4 | commandScore(value, search, keywords); 5 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/search/types/index.ts: -------------------------------------------------------------------------------- 1 | import { SearchDomain, SearchResult } from '@refly/openapi-schema'; 2 | 3 | export interface RenderItem { 4 | domain: SearchDomain; 5 | heading: string; 6 | data: SearchResult[]; 7 | icon: React.ReactNode; 8 | action?: boolean; 9 | actionHeading?: { create: string }; 10 | onItemClick?: (item: SearchResult) => void; 11 | onCreateClick?: () => void; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/settings/language-setting/index.scss: -------------------------------------------------------------------------------- 1 | .language-setting { 2 | box-sizing: border-box; 3 | overflow: auto; 4 | &-title { 5 | font-size: 20px; 6 | margin-bottom: 16px; 7 | font-weight: 500; 8 | } 9 | &-content-item { 10 | margin-bottom: 32px; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/settings/mcp-server/index.ts: -------------------------------------------------------------------------------- 1 | export * from './McpServerList'; 2 | export * from './McpServerForm'; 3 | export * from './McpServerJsonEditor'; 4 | export * from './types'; 5 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/skill/skill-intance-list/index.tsx: -------------------------------------------------------------------------------- 1 | export const SkillInstanceList = () => { 2 | return
skill instance list
; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/skill/skill-management-modal/index.scss: -------------------------------------------------------------------------------- 1 | .modal-dialog { 2 | @apply relative z-50; 3 | } 4 | 5 | .modal-panel { 6 | @apply w-full max-w-md transform rounded-2xl bg-white p-6 text-left align-middle shadow-xl transition-all; 7 | } 8 | 9 | .skill-management-modal-wrap { 10 | .skill-management-modal-content { 11 | height: calc(80vh - 48px - 48px); 12 | overflow-y: auto; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/translation-wrapper/index.scss: -------------------------------------------------------------------------------- 1 | .translation-wrapper { 2 | .translation-content { 3 | display: inline-flex; 4 | align-items: center; 5 | gap: 4px; 6 | 7 | .original-text { 8 | color: rgba(0, 0, 0, 0.45); 9 | } 10 | 11 | .anticon { 12 | font-size: 12px; 13 | color: #1890ff; 14 | margin-left: 4px; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/use-searchable-list/@types/index.tsx: -------------------------------------------------------------------------------- 1 | export type Primitive = string | number | boolean; 2 | 3 | export type SearchableListProps = { 4 | clearOnEmpty?: boolean; 5 | firstLetterCheck?: boolean; 6 | debounce?: boolean; 7 | delay?: number; 8 | }; 9 | 10 | export type SearchableListItem = Record; 11 | 12 | export type UseSearchableListHook = [ 13 | T[], 14 | (value: T[]) => void, 15 | (value: Primitive) => void, 16 | ]; 17 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/workspace/canvas-list-modal/index.scss: -------------------------------------------------------------------------------- 1 | .canvas-list { 2 | .ant-modal-content { 3 | .ant-modal-body { 4 | max-height: 60vh; 5 | min-height: 60vh; 6 | overflow: auto; 7 | } 8 | 9 | .ant-btn.ant-btn-icon-only { 10 | width: 32px; 11 | height: 32px; 12 | padding-inline: 0; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/components/workspace/library-modal/index.scss: -------------------------------------------------------------------------------- 1 | .library-modal { 2 | .ant-modal-content { 3 | .ant-modal-body { 4 | position: relative; 5 | height: 60vh; 6 | min-height: 60vh; 7 | overflow: hidden; 8 | box-sizing: border-box; 9 | .ant-tabs { 10 | width: 100%; 11 | height: 100%; 12 | } 13 | } 14 | } 15 | 16 | .ant-card .ant-card-actions > li { 17 | margin: 4px 0; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/action.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | import { ActionResult } from '@refly/openapi-schema'; 3 | 4 | export type Events = { 5 | updateResult: { 6 | resultId: string; 7 | payload: ActionResult; 8 | }; 9 | }; 10 | 11 | export const actionEmitter = mitt(); 12 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/codeArtifact.ts: -------------------------------------------------------------------------------- 1 | import { CodeArtifactType } from '@refly/openapi-schema'; 2 | import mitt from 'mitt'; 3 | 4 | export type Events = { 5 | contentUpdate: { 6 | artifactId: string; 7 | content: string; 8 | }; 9 | statusUpdate: { 10 | artifactId: string; 11 | status: 'finish' | 'generating'; 12 | type: CodeArtifactType; 13 | }; 14 | }; 15 | 16 | export const codeArtifactEmitter = mitt(); 17 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/deleted-nodes.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | export type DeletedNodesEvents = { 4 | nodeDeleted: string; // entityId of the deleted node 5 | }; 6 | 7 | export const deletedNodesEmitter = mitt(); 8 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/edge.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | import { Edge } from '@xyflow/react'; 3 | 4 | export type EdgeEvents = { 5 | edgeChange: { 6 | oldEdges: Edge[]; 7 | newEdges: Edge[]; 8 | }; 9 | }; 10 | 11 | export const edgeEventsEmitter = mitt(); 12 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/fullscreen.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | // Define the event types for fullscreen management 4 | export type FullscreenEvents = { 5 | // Event to exit fullscreen when requesting a fix for code 6 | exitFullscreenForFix: { 7 | nodeId: string; 8 | }; 9 | }; 10 | 11 | // Create and export the event emitter for fullscreen events 12 | export const fullscreenEmitter = mitt(); 13 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/locateToNodePreview.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | export type Events = { 4 | locateToNodePreview: { 5 | canvasId: string; 6 | id: string; 7 | type?: 'editResponse'; 8 | }; 9 | }; 10 | 11 | export const locateToNodePreviewEmitter = mitt(); 12 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/events/slideshow.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | type Events = { 4 | update: { 5 | canvasId: string; 6 | pageId: string; 7 | entityId: string; 8 | }; 9 | }; 10 | 11 | export const slideshowEmitter = mitt(); 12 | 13 | export const createSlideshowUpdateEventName = (canvasId: string) => `slideshow.update.${canvasId}`; 14 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/hooks/canvas/use-canvas-data.ts: -------------------------------------------------------------------------------- 1 | import { useReactFlow } from '@xyflow/react'; 2 | import { CanvasNode } from '@refly-packages/ai-workspace-common/components/canvas/nodes'; 3 | 4 | export const useCanvasData = () => { 5 | const { getNodes, getEdges } = useReactFlow>(); 6 | 7 | return { 8 | nodes: getNodes(), 9 | edges: getEdges(), 10 | }; 11 | }; 12 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/hooks/canvas/use-canvas-id.ts: -------------------------------------------------------------------------------- 1 | import { useParams } from 'react-router-dom'; 2 | import { useCanvasContext } from '../../context/canvas'; 3 | 4 | export const useCanvasId = () => { 5 | const { canvasId: contextCanvasId } = useCanvasContext(); 6 | const { canvasId: routeCanvasId } = useParams(); 7 | const canvasId = contextCanvasId ?? routeCanvasId; 8 | 9 | return canvasId; 10 | }; 11 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/hooks/canvas/use-node-position-utils/constants.ts: -------------------------------------------------------------------------------- 1 | export const SPACING = { 2 | X: 400, // Keep original X spacing 3 | Y: 30, // Fixed vertical spacing between nodes 4 | INITIAL_X: 100, 5 | INITIAL_Y: 300, 6 | }; 7 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/artifacts/code-runner/monaco-editor/index.scss: -------------------------------------------------------------------------------- 1 | .refly-code-editor { 2 | * { 3 | font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, 4 | Consolas, "Liberation Mono", "Courier New", monospace; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/artifacts/code-runner/monaco-editor/types.ts: -------------------------------------------------------------------------------- 1 | import { CodeArtifactType } from '@refly/openapi-schema'; 2 | 3 | export interface MonacoEditorProps { 4 | content: string; 5 | language: string; 6 | type: CodeArtifactType; 7 | readOnly?: boolean; 8 | isGenerating?: boolean; 9 | canvasReadOnly?: boolean; 10 | onChange?: (value: string) => void; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/artifacts/code-runner/render/mind-map/nodes/custom-node.scss: -------------------------------------------------------------------------------- 1 | .memo-node-editor { 2 | .ProseMirror { 3 | margin: 0 !important; 4 | padding: 0 !important; 5 | height: 100%; 6 | width: 100%; 7 | font-size: 0.75rem !important; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/artifacts/code-runner/render/mind-map/nodes/index.ts: -------------------------------------------------------------------------------- 1 | import { CustomNode } from './custom-node'; 2 | 3 | export const nodeTypes = { 4 | custom: CustomNode, 5 | }; 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/artifacts/code-runner/render/mind-map/types/index.ts: -------------------------------------------------------------------------------- 1 | export interface NodeData { 2 | id: string; 3 | label?: string; 4 | content: string; 5 | richTextContent?: any; 6 | colors?: { 7 | bg: string; 8 | border: string; 9 | }; 10 | children?: NodeData[]; 11 | [key: string]: any; 12 | } 13 | 14 | export interface ExtractedContent { 15 | title: string; 16 | keyPoints: { 17 | point: string; 18 | context?: string; 19 | }[]; 20 | } 21 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/artifacts/code-runner/render/monaco-editor.scss: -------------------------------------------------------------------------------- 1 | .refly-code-editor { 2 | * { 3 | font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, 4 | Consolas, "Liberation Mono", "Courier New", monospace; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/entity-selector/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './search-select'; 2 | export * from './search-list'; 3 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/entity-selector/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from './use-fetch-or-search-list'; 2 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/entity-selector/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './fetcher'; 2 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/multilingual-search/components/search-box.scss: -------------------------------------------------------------------------------- 1 | .search-progress { 2 | padding-top: 8px; 3 | margin: 0 auto; 4 | 5 | .duration { 6 | color: #888; 7 | font-size: 0.9em; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/multilingual-search/components/search-options.scss: -------------------------------------------------------------------------------- 1 | .search-options { 2 | display: flex; 3 | gap: 16px; 4 | align-items: flex-start; 5 | margin-top: 4px; 6 | 7 | .select-group { 8 | display: flex; 9 | flex-direction: column; 10 | gap: 4px; 11 | 12 | .select-label { 13 | font-size: 12px; 14 | color: #666; 15 | margin-left: 4px; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/modules/multilingual-search/types/index.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/ai-workspace-common/src/modules/multilingual-search/types/index.tsx -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/queries/index.ts: -------------------------------------------------------------------------------- 1 | // generated with @7nohe/openapi-react-query-codegen@2.0.0-beta.3 2 | 3 | export * from './common'; 4 | export * from './queries'; 5 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/requests/index.ts: -------------------------------------------------------------------------------- 1 | // This file is auto-generated by @hey-api/openapi-ts 2 | export * from './services.gen'; 3 | export * from './types.gen'; 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/types/context.ts: -------------------------------------------------------------------------------- 1 | import { SearchResult } from '@refly/openapi-schema'; 2 | 3 | export interface ContextItem extends SearchResult { 4 | isSelected?: boolean; 5 | } 6 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/cn.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/color.ts: -------------------------------------------------------------------------------- 1 | export function getRandomColor() { 2 | // 生成随机的R、G、B分量 3 | const r = Math.floor(Math.random() * 256); 4 | const g = Math.floor(Math.random() * 256); 5 | const b = Math.floor(Math.random() * 256); 6 | // 将RGB转换为十六进制颜色代码 7 | const color = `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`; 8 | return color; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/dayjsConfig.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | import relativeTime from 'dayjs/plugin/relativeTime'; 3 | import utc from 'dayjs/plugin/utc'; 4 | 5 | dayjs.extend(utc); 6 | 7 | dayjs.extend(relativeTime); 8 | 9 | //这里需要国际化 10 | dayjs.locale('zh-cn'); 11 | 12 | export default dayjs; 13 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/delay.ts: -------------------------------------------------------------------------------- 1 | export const delay = (ms: number) => { 2 | return new Promise((resolve) => setTimeout(resolve, ms)); 3 | }; 4 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/event-emitter/big-search-quick-open.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | type Events = { 4 | openSearch: boolean; 5 | closeSearch: boolean; 6 | }; 7 | 8 | export type EditorOperation = 'openSearch' | 'closeSearch'; 9 | 10 | export const bigSearchQuickOpenEmitter = mitt(); 11 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/event-emitter/model.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | type ModelEvents = { 4 | 'model:list:refetch': null; 5 | }; 6 | 7 | export const modelEmitter = mitt(); 8 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/locale.ts: -------------------------------------------------------------------------------- 1 | import { safeParseJSON } from '@refly/utils/parse'; 2 | 3 | export const mapDefaultLocale = (locale: string) => { 4 | if (locale?.toLocaleLowerCase()?.startsWith('zh')) { 5 | return 'zh-CN'; 6 | } 7 | 8 | return 'en'; 9 | }; 10 | 11 | export const getLocale = () => { 12 | const settings = safeParseJSON(localStorage.getItem('refly-local-settings')); 13 | return settings?.uiLocale || 'en'; 14 | }; 15 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/router.ts: -------------------------------------------------------------------------------- 1 | import { 2 | MemoryRouter, 3 | useMatch, 4 | useNavigate, 5 | useParams, 6 | useLocation, 7 | Link, 8 | useSearchParams, 9 | Routes, 10 | Route, 11 | } from 'react-router-dom'; 12 | 13 | export { 14 | MemoryRouter, 15 | useMatch, 16 | useNavigate, 17 | useParams, 18 | useLocation, 19 | Link, 20 | useSearchParams, 21 | Route, 22 | Routes, 23 | }; 24 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/share.ts: -------------------------------------------------------------------------------- 1 | export const getShareLink = (entityType: string, shareId: string) => { 2 | let entity = ''; 3 | if (entityType === 'canvas') { 4 | entity = 'canvas'; 5 | } else if (entityType === 'codeArtifact') { 6 | entity = 'code'; 7 | } else if (entityType === 'skillResponse') { 8 | entity = 'answer'; 9 | } else if (entityType === 'document') { 10 | entity = 'doc'; 11 | } 12 | return `${window.location.origin}/share/${entity}/${shareId}`; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/utils/time.ts: -------------------------------------------------------------------------------- 1 | import { LOCALE } from '@refly/common-types'; 2 | import dayjsConfig from './dayjsConfig'; 3 | 4 | export const time = ( 5 | date: string | number | Date | dayjsConfig.Dayjs, 6 | locale: LOCALE = LOCALE.EN, 7 | ) => { 8 | return dayjsConfig(date, { locale }); 9 | }; 10 | -------------------------------------------------------------------------------- /packages/ai-workspace-common/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/common-types/src/context-panel.ts: -------------------------------------------------------------------------------- 1 | import { SearchDomain } from '@refly/openapi-schema'; 2 | 3 | export type ContextPanelDomain = SearchDomain | 'weblink'; 4 | -------------------------------------------------------------------------------- /packages/common-types/src/conversation.ts: -------------------------------------------------------------------------------- 1 | export enum ConversationOperation { 2 | CREATE = 'create', 3 | UPDATE = 'update', 4 | DELETE = 'delete', 5 | } 6 | -------------------------------------------------------------------------------- /packages/common-types/src/env.ts: -------------------------------------------------------------------------------- 1 | export type ICopilotType = 'extension-sidepanel' | 'extension-csui'; 2 | export type IRuntime = 3 | | 'web' 4 | | ICopilotType 5 | | 'extension-background' 6 | | 'extension-popup' 7 | | 'desktop'; 8 | -------------------------------------------------------------------------------- /packages/common-types/src/feed.ts: -------------------------------------------------------------------------------- 1 | import type { Digest } from '.'; 2 | 3 | export interface Feed extends Digest { 4 | // 增加一些指标 5 | readCount: number; // 阅读次数 6 | askFollow: number; // 追问次数 7 | userId?: string; 8 | } 9 | -------------------------------------------------------------------------------- /packages/common-types/src/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import resources from './resources'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | resources: typeof resources; 6 | // if you see an error like: "Argument of type 'DefaultTFuncReturn' is not assignable to parameter of type xyz" 7 | // set returnNull to false (and also in the i18next init options) 8 | // returnNull: false; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/common-types/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './http'; 2 | export * from './conversation'; 3 | export * from './system-action'; 4 | export * from './task'; 5 | export * from './session'; 6 | export * from './page'; 7 | export * from './feed'; 8 | export * from './digest'; 9 | export * from './content-selector'; 10 | export * from './request'; 11 | export * from './i18n'; 12 | export * from './context-panel'; 13 | export * from './env'; 14 | export * from './extension-messaging'; 15 | -------------------------------------------------------------------------------- /packages/common-types/src/page.ts: -------------------------------------------------------------------------------- 1 | export interface ListPageProps { 2 | pageSize: number; 3 | page: number; 4 | } 5 | -------------------------------------------------------------------------------- /packages/common-types/src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/common-types/src/request.ts: -------------------------------------------------------------------------------- 1 | export interface HandlerRequest { 2 | name: string; 3 | method?: 'GET' | 'POST' | 'PUT'; 4 | body?: T; 5 | } 6 | 7 | export interface HandlerResponse { 8 | data?: T | null | undefined; 9 | success: boolean; 10 | errMsg?: any; 11 | } 12 | -------------------------------------------------------------------------------- /packages/common-types/src/return-types.ts: -------------------------------------------------------------------------------- 1 | export interface ReturnType { 2 | success: boolean; 3 | data?: T; 4 | errMsg?: string; 5 | } 6 | -------------------------------------------------------------------------------- /packages/common-types/src/session.ts: -------------------------------------------------------------------------------- 1 | import { Source } from '@refly/openapi-schema'; 2 | 3 | export type RelatedQuestion = string; 4 | 5 | export interface SessionItem { 6 | question: string; 7 | sources: Source[]; 8 | answer: string; 9 | relatedQuestions: RelatedQuestion[]; // 推荐问题列表 10 | } 11 | -------------------------------------------------------------------------------- /packages/common-types/src/simple-event.ts: -------------------------------------------------------------------------------- 1 | import { SimpleEvent } from '@refly/openapi-schema'; 2 | 3 | export const SimpleEvents: SimpleEvent[] = [ 4 | { 5 | name: 'onResourceReady', 6 | displayName: { 7 | 'zh-CN': '资源准备就绪', 8 | en: 'Resource Ready', 9 | }, 10 | provideContextKeys: ['resources'], 11 | }, 12 | ]; 13 | -------------------------------------------------------------------------------- /packages/common-types/src/system-action.ts: -------------------------------------------------------------------------------- 1 | export enum SystemAction { 2 | SupportUs = 'supportUs', 3 | InviteBoost = 'inviteBoost', 4 | RecommendQuestion = 'recommendQuestion', 5 | } 6 | 7 | export type RecommendQuestionItem = { 8 | type: SystemAction; 9 | title: string; 10 | question: string; 11 | }; 12 | -------------------------------------------------------------------------------- /packages/errors/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@refly/errors", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.ts", 6 | "scripts": { 7 | "clean": "rimraf dist", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": {}, 14 | "devDependencies": {} 15 | } 16 | -------------------------------------------------------------------------------- /packages/errors/src/base.ts: -------------------------------------------------------------------------------- 1 | export abstract class BaseError extends Error { 2 | abstract code: string; 3 | abstract messageDict: Record; 4 | 5 | constructor(message?: string) { 6 | super(message ?? ''); // compatible with safari 7 | Object.setPrototypeOf(this, new.target.prototype); 8 | } 9 | 10 | toString() { 11 | return `[${this.code}] ${this.messageDict?.en ?? 'Unknown error occurred'}`; 12 | } 13 | 14 | getMessage(locale: string) { 15 | return this.messageDict[locale] || this.messageDict.en; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/errors/src/guess.ts: -------------------------------------------------------------------------------- 1 | import { ModelProviderError, ModelProviderRateLimitExceeded, ModelProviderTimeout } from './errors'; 2 | 3 | export const guessModelProviderError = (error: string | Error) => { 4 | const e = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase(); 5 | if (e.includes('limit exceed')) { 6 | return new ModelProviderRateLimitExceeded(); 7 | } 8 | if (e.includes('timeout')) { 9 | return new ModelProviderTimeout(); 10 | } 11 | return new ModelProviderError(); 12 | }; 13 | -------------------------------------------------------------------------------- /packages/errors/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './base'; 2 | export * from './errors'; 3 | export * from './guess'; 4 | -------------------------------------------------------------------------------- /packages/i18n/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@refly/i18n", 3 | "version": "1.0.0", 4 | "description": "Refly product translations", 5 | "author": "", 6 | "license": "ISC", 7 | "exports": { 8 | "./en-US/*": "./src/en-US/*.ts", 9 | "./zh-Hans/*": "./src/zh-Hans/*.ts" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/openapi-schema/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["schema.yml"], 3 | "ext": "yml", 4 | "exec": "openapi-ts" 5 | } 6 | -------------------------------------------------------------------------------- /packages/openapi-schema/openapi-ts.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@hey-api/openapi-ts'; 2 | 3 | export default defineConfig({ 4 | client: '@hey-api/client-fetch', 5 | input: './schema.yml', 6 | output: { 7 | format: 'biome', 8 | path: 'src/', 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /packages/openapi-schema/src/index.ts: -------------------------------------------------------------------------------- 1 | // This file is auto-generated by @hey-api/openapi-ts 2 | export * from './schemas.gen'; 3 | export * from './services.gen'; 4 | export * from './types.gen'; 5 | -------------------------------------------------------------------------------- /packages/providers/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './llm'; 2 | export * from './embeddings'; 3 | export * from './reranker'; 4 | -------------------------------------------------------------------------------- /packages/providers/src/types.ts: -------------------------------------------------------------------------------- 1 | export interface BaseProvider { 2 | providerKey: string; 3 | apiKey?: string; 4 | baseUrl?: string; 5 | } 6 | -------------------------------------------------------------------------------- /packages/providers/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /packages/skill-template/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.json": "jsonc", 4 | "*.css": "tailwindcss" 5 | }, 6 | "typescript.preferences.importModuleSpecifier": "relative", 7 | "tailwindCSS.includeLanguages": { 8 | "typescript": "tsx", 9 | "javascript": "jsx", 10 | "html": "html", 11 | "css": "css", 12 | "scss": "scss" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/skill-template/src/adapters/index.ts: -------------------------------------------------------------------------------- 1 | import { type StreamableHTTPConnection } from './client'; 2 | 3 | export { 4 | MultiServerMCPClient, 5 | type Connection, 6 | type StdioConnection, 7 | type StreamableHTTPConnection, 8 | } from './client'; 9 | 10 | /** 11 | * Type alias for backward compatibility with previous versions of the package. 12 | */ 13 | export type SSEConnection = StreamableHTTPConnection; 14 | 15 | export { loadMcpTools } from './tools'; 16 | -------------------------------------------------------------------------------- /packages/skill-template/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './base'; 2 | export * from './templates'; 3 | export * from './engine'; 4 | export * from './inventory'; 5 | export * from './scheduler/utils/extractor'; 6 | export * from './adapters'; 7 | export * from './utils'; 8 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/artifacts/index.ts: -------------------------------------------------------------------------------- 1 | // Export prompt for generating canvas artifacts 2 | // Export prompt and schema for generating reactive artifacts 3 | import { 4 | buildArtifactsSystemPrompt, 5 | buildArtifactsUserPrompt, 6 | buildArtifactsContextUserPrompt, 7 | } from './prompt'; 8 | 9 | // Export the prompt building functions for artifacts module 10 | export { buildArtifactsSystemPrompt, buildArtifactsUserPrompt, buildArtifactsContextUserPrompt }; 11 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/commonQnA/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/customPrompt/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/editDocument/block/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | export * from './context'; 3 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/editDocument/index.ts: -------------------------------------------------------------------------------- 1 | export * as inlinePrompt from './inline'; 2 | export * from './types'; 3 | export * from './helper'; 4 | export * from './prompt'; 5 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/editDocument/inline/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | export * from './context'; 3 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/generateDocument/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/librarySearch/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/relatedQuestion/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/skill-template/src/scheduler/module/relatedQuestion/index.ts -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/rewriteCanvas/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/module/webSearch/index.ts: -------------------------------------------------------------------------------- 1 | export * from './prompt'; 2 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/types/intent.ts: -------------------------------------------------------------------------------- 1 | export enum DocumentIntent { 2 | GenerateDocument = 'generateDocument', 3 | UpdateDocument = 'updateDocument', 4 | RewriteDocument = 'rewriteDocument', 5 | QnA = 'qna', 6 | } 7 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/utils/context/index.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/skill-template/src/scheduler/utils/context/index.ts -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/utils/model.ts: -------------------------------------------------------------------------------- 1 | import { LLMModelConfig } from '@refly/openapi-schema'; 2 | 3 | export const checkIsSupportedModel = (modelInfo: LLMModelConfig) => { 4 | return !!modelInfo?.capabilities?.functionCall; 5 | }; 6 | 7 | export const checkModelContextLenSupport = (modelInfo: LLMModelConfig) => { 8 | return modelInfo?.contextLimit > 8 * 1024; 9 | }; 10 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/utils/query-rewrite/index.ts: -------------------------------------------------------------------------------- 1 | export * from './core'; 2 | export * from './examples'; 3 | -------------------------------------------------------------------------------- /packages/skill-template/src/scheduler/utils/skill.ts: -------------------------------------------------------------------------------- 1 | export async function writeSkill() { 2 | /** 3 | * 1. 基于 4 | */ 5 | } 6 | 7 | export async function readSkill() {} 8 | 9 | export async function qaSkill() {} 10 | 11 | export async function otherIntentSkill() {} 12 | -------------------------------------------------------------------------------- /packages/skill-template/src/skills/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common-qna'; 2 | export * from './generate-doc'; 3 | export * from './rewrite-doc'; 4 | export * from './edit-doc'; 5 | export * from './web-search'; 6 | export * from './library-search'; 7 | export * from './recommend-questions'; 8 | export * from './custom-prompt'; 9 | export * from './code-artifacts'; 10 | export * from './agent'; 11 | export * from './image-generation'; 12 | -------------------------------------------------------------------------------- /packages/skill-template/src/templates/index.ts: -------------------------------------------------------------------------------- 1 | export * from './create-formal-email'; 2 | export * from './create-git-diff-commit'; 3 | export * from './basic-summary'; 4 | export * from './explain-terms'; 5 | export * from './translate'; 6 | export * from './find-related-content'; 7 | export * from './writing'; 8 | export * from './arxiv-summary'; 9 | export * from './website-summary'; 10 | -------------------------------------------------------------------------------- /packages/skill-template/src/templates/writing/index.ts: -------------------------------------------------------------------------------- 1 | export * from './brainstorm-ideas'; 2 | export * from './change-tone'; 3 | export * from './continue-writing'; 4 | export * from './create-article-outline'; 5 | export * from './create-blog-post'; 6 | export * from './create-social-media-post'; 7 | export * from './extract-action-item'; 8 | export * from './fix-spelling-and-grammar-issues'; 9 | export * from './improve-writing'; 10 | export * from './language-simplification'; 11 | export * from './make-shorter'; 12 | export * from './maker-longer'; 13 | -------------------------------------------------------------------------------- /packages/skill-template/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './mcp-utils'; 2 | export * from './url-processing'; 3 | -------------------------------------------------------------------------------- /packages/tsconfig/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tsconfig", 3 | "version": "0.0.0", 4 | "private": true, 5 | "license": "MIT", 6 | "publishConfig": { 7 | "access": "public" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/tsconfig/react.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "React Library", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "lib": ["DOM"], 7 | "target": "ESNext", 8 | "jsx": "react-jsx" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/utils/src/brand.ts: -------------------------------------------------------------------------------- 1 | export const BRANDING_NAME = 'Refly'; 2 | -------------------------------------------------------------------------------- /packages/utils/src/cn.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /packages/utils/src/cookie.ts: -------------------------------------------------------------------------------- 1 | export const ACCESS_TOKEN_COOKIE = '_rf_access'; 2 | export const REFRESH_TOKEN_COOKIE = '_rf_refresh'; 3 | export const UID_COOKIE = '_rf_uid'; 4 | -------------------------------------------------------------------------------- /packages/utils/src/dayjsConfig.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | import relativeTime from 'dayjs/plugin/relativeTime'; 3 | import utc from 'dayjs/plugin/utc'; 4 | 5 | dayjs.extend(utc); 6 | 7 | dayjs.extend(relativeTime); 8 | 9 | //这里需要国际化 10 | dayjs.locale('zh-cn'); 11 | 12 | export default dayjs; 13 | -------------------------------------------------------------------------------- /packages/utils/src/editor/index.ts: -------------------------------------------------------------------------------- 1 | export * from './transformer'; 2 | export * from './schema'; 3 | export * from './from_markdown'; 4 | export * from './to_markdown'; 5 | -------------------------------------------------------------------------------- /packages/utils/src/event-emitter/canvas.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/utils/src/event-emitter/canvas.ts -------------------------------------------------------------------------------- /packages/utils/src/event-emitter/model.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | type ModelEvents = { 4 | 'model:list:refetch': null; 5 | }; 6 | 7 | export const modelEmitter = mitt(); 8 | -------------------------------------------------------------------------------- /packages/utils/src/isUrl.ts: -------------------------------------------------------------------------------- 1 | export function isUrl(str: string): boolean { 2 | try { 3 | new URL(str); 4 | return true; 5 | } catch { 6 | return false; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/utils/src/quota.ts: -------------------------------------------------------------------------------- 1 | import { StorageUsageMeter } from '@refly/openapi-schema'; 2 | 3 | export function getAvailableFileCount(storageUsage: StorageUsageMeter) { 4 | if (!storageUsage || storageUsage.fileCountQuota < 0) { 5 | return Number.POSITIVE_INFINITY; 6 | } 7 | return storageUsage.fileCountQuota - (storageUsage.fileCountUsed ?? 0); 8 | } 9 | -------------------------------------------------------------------------------- /packages/utils/src/time.ts: -------------------------------------------------------------------------------- 1 | import { LOCALE } from '@refly/common-types'; 2 | import dayjsConfig from './dayjsConfig'; 3 | 4 | export const time = ( 5 | date: string | number | Date | dayjsConfig.Dayjs, 6 | locale: LOCALE = LOCALE.EN, 7 | ) => { 8 | return dayjsConfig(date, { locale }); 9 | }; 10 | 11 | export const delay = (ms: number) => { 12 | return new Promise((resolve) => setTimeout(resolve, ms)); 13 | }; 14 | -------------------------------------------------------------------------------- /packages/utils/src/typesafe.ts: -------------------------------------------------------------------------------- 1 | export const pick = (obj: T, keys: K[]): Pick => { 2 | const ret: any = {}; 3 | for (const key of keys) { 4 | ret[key] = obj[key]; 5 | } 6 | return ret; 7 | }; 8 | 9 | export const omit = (obj: T, keys: K[]): Omit => { 10 | const ret = { ...obj }; 11 | for (const key of keys) { 12 | delete ret[key]; 13 | } 14 | return ret; 15 | }; 16 | -------------------------------------------------------------------------------- /packages/utils/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /packages/wxt/bin/wxt-publish-extension.cjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /** 3 | * A alias around `publish-extension` that is always installed on the path without having to install 4 | * `publish-browser-extension` as a direct dependency (like for PNPM, which doesn't link 5 | * sub-dependency binaries to "node_modules/.bin") 6 | */ 7 | require('publish-browser-extension/cli'); 8 | -------------------------------------------------------------------------------- /packages/wxt/bin/wxt.mjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import '../dist/cli.js'; 3 | -------------------------------------------------------------------------------- /packages/wxt/src/client/content-scripts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './content-script-context'; 2 | export * from './ui'; 3 | -------------------------------------------------------------------------------- /packages/wxt/src/client/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Any runtime APIs that use the web extension APIs. 3 | * 4 | * @module wxt/client 5 | */ 6 | export * from './content-scripts'; 7 | -------------------------------------------------------------------------------- /packages/wxt/src/core/builders/vite/__tests__/fixtures/module.ts: -------------------------------------------------------------------------------- 1 | import { a } from './test'; 2 | 3 | function defineSomething(config: T): T { 4 | return config; 5 | } 6 | 7 | export default defineSomething({ 8 | option: 'some value', 9 | main: () => { 10 | console.log('main', a); 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /packages/wxt/src/core/builders/vite/__tests__/fixtures/test.ts: -------------------------------------------------------------------------------- 1 | console.log('Side-effect in test.ts'); 2 | export const a = 'a'; 3 | -------------------------------------------------------------------------------- /packages/wxt/src/core/builders/vite/plugins/tsconfigPaths.ts: -------------------------------------------------------------------------------- 1 | import { ResolvedConfig } from '~/types'; 2 | import type * as vite from 'vite'; 3 | 4 | export function tsconfigPaths(config: ResolvedConfig): vite.Plugin { 5 | return { 6 | name: 'wxt:aliases', 7 | async config() { 8 | return { 9 | resolve: { 10 | alias: config.alias, 11 | }, 12 | }; 13 | }, 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /packages/wxt/src/core/define-config.ts: -------------------------------------------------------------------------------- 1 | import { UserConfig } from '~/types'; 2 | 3 | export function defineConfig(config: UserConfig): UserConfig { 4 | return config; 5 | } 6 | -------------------------------------------------------------------------------- /packages/wxt/src/core/define-runner-config.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionRunnerConfig } from '~/types'; 2 | 3 | export function defineRunnerConfig( 4 | config: ExtensionRunnerConfig, 5 | ): ExtensionRunnerConfig { 6 | return config; 7 | } 8 | -------------------------------------------------------------------------------- /packages/wxt/src/core/index.ts: -------------------------------------------------------------------------------- 1 | export * from './build'; 2 | export * from './clean'; 3 | export * from './define-config'; 4 | export * from './define-runner-config'; 5 | export * from './create-server'; 6 | export * from './initialize'; 7 | export * from './prepare'; 8 | export * from './zip'; 9 | -------------------------------------------------------------------------------- /packages/wxt/src/core/package-managers/__tests__/fixtures/bun-project/bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/wxt/src/core/package-managers/__tests__/fixtures/bun-project/bun.lockb -------------------------------------------------------------------------------- /packages/wxt/src/core/package-managers/__tests__/fixtures/bun-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bun-ls", 3 | "dependencies": { 4 | "mime-types": "2.1.35" 5 | }, 6 | "devDependencies": { 7 | "flatten": "1.0.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/wxt/src/core/package-managers/__tests__/fixtures/npm-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "npm-ls", 3 | "dependencies": { 4 | "mime-types": "2.1.35" 5 | }, 6 | "devDependencies": { 7 | "flatten": "1.0.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/wxt/src/core/package-managers/__tests__/fixtures/pnpm-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pnpm-ls", 3 | "dependencies": { 4 | "mime-types": "2.1.35" 5 | }, 6 | "devDependencies": { 7 | "flatten": "1.0.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/wxt/src/core/package-managers/__tests__/fixtures/yarn-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "yarn-ls", 3 | "packageManager": "yarn@1.22.19", 4 | "dependencies": { 5 | "mime-types": "2.1.35" 6 | }, 7 | "devDependencies": { 8 | "flatten": "1.0.3" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/wxt/src/core/package-managers/types.ts: -------------------------------------------------------------------------------- 1 | import { WxtPackageManager } from '~/types'; 2 | 3 | export type WxtPackageManagerImpl = Pick< 4 | WxtPackageManager, 5 | 'downloadDependency' | 'listDependencies' | 'overridesKey' 6 | >; 7 | -------------------------------------------------------------------------------- /packages/wxt/src/core/prepare.ts: -------------------------------------------------------------------------------- 1 | import { InlineConfig } from '~/types'; 2 | import { findEntrypoints, generateTypesDir } from '~/core/utils/building'; 3 | import { registerWxt, wxt } from './wxt'; 4 | 5 | export async function prepare(config: InlineConfig) { 6 | await registerWxt('build', config); 7 | wxt.logger.info('Generating types...'); 8 | 9 | const entrypoints = await findEntrypoints(); 10 | await generateTypesDir(entrypoints); 11 | } 12 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/background.ts: -------------------------------------------------------------------------------- 1 | import { defineBackground } from '~/sandbox'; 2 | 3 | export default defineBackground({ 4 | main() {}, 5 | }); 6 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/content.ts: -------------------------------------------------------------------------------- 1 | import { defineContentScript } from '~/sandbox'; 2 | 3 | export default defineContentScript({ 4 | matches: [''], 5 | main() {}, 6 | }); 7 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/imported-option.ts: -------------------------------------------------------------------------------- 1 | import { defineContentScript } from '~/sandbox'; 2 | import { faker } from '@faker-js/faker'; 3 | 4 | export default defineContentScript({ 5 | matches: [faker.string.nanoid()], 6 | main() {}, 7 | }); 8 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/no-default-export.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/refly-ai/refly/665afe959d5ed37b43fa914a497cdf64f36f2658/packages/wxt/src/core/utils/building/__tests__/test-entrypoints/no-default-export.ts -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/react.tsx: -------------------------------------------------------------------------------- 1 | import { defineUnlistedScript } from '~/sandbox'; 2 | 3 | export default defineUnlistedScript(() => {}); 4 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/unlisted.ts: -------------------------------------------------------------------------------- 1 | import { defineUnlistedScript } from '~/sandbox'; 2 | 3 | export default defineUnlistedScript(() => {}); 4 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/__tests__/test-entrypoints/with-named.ts: -------------------------------------------------------------------------------- 1 | import { defineBackground } from '~/sandbox'; 2 | 3 | export const a = {}; 4 | 5 | export default defineBackground(() => {}); 6 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/building/index.ts: -------------------------------------------------------------------------------- 1 | export * from './build-entrypoints'; 2 | export * from './detect-dev-changes'; 3 | export * from './find-entrypoints'; 4 | export * from './generate-wxt-dir'; 5 | export * from './resolve-config'; 6 | export * from './group-entrypoints'; 7 | export * from './import-entrypoint'; 8 | export * from './internal-build'; 9 | export * from './rebuild'; 10 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/constants.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Module ID used to build the background in dev mode if the extension doesn't include a background 3 | * script/service worker. 4 | */ 5 | export const VIRTUAL_NOOP_BACKGROUND_MODULE_ID = 'virtual:user-background'; 6 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/log/index.ts: -------------------------------------------------------------------------------- 1 | export * from './printBuildSummary'; 2 | export * from './printFileList'; 3 | export * from './printHeader'; 4 | export * from './printTable'; 5 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/log/printHeader.ts: -------------------------------------------------------------------------------- 1 | import pc from 'picocolors'; 2 | import { version } from '~/version'; 3 | import { consola } from 'consola'; 4 | 5 | export function printHeader() { 6 | console.log(); 7 | consola.log(`${pc.gray('WXT')} ${pc.gray(pc.bold(version))}`); 8 | } 9 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Remove optional from key, but keep undefined if present 3 | * 4 | * @example 5 | * type Test = NullablyRequired<{a?: string, b: number}> 6 | * // type Test = {a: string | undefined, b: number} 7 | */ 8 | export type NullablyRequired = { [K in keyof Required]: T[K] }; 9 | -------------------------------------------------------------------------------- /packages/wxt/src/core/utils/wsl.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns true when running on WSL or WSL2. 3 | */ 4 | export async function isWsl(): Promise { 5 | const { default: isWsl } = await import('is-wsl'); // ESM only, requires dynamic import 6 | return isWsl; 7 | } 8 | -------------------------------------------------------------------------------- /packages/wxt/src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @module wxt 3 | */ 4 | export * from '~/core'; 5 | export * from '~/types'; 6 | export * from '~/version'; 7 | -------------------------------------------------------------------------------- /packages/wxt/src/sandbox/define-background.ts: -------------------------------------------------------------------------------- 1 | import type { BackgroundDefinition } from '~/types'; 2 | 3 | export function defineBackground(main: () => void): BackgroundDefinition; 4 | export function defineBackground( 5 | definition: BackgroundDefinition, 6 | ): BackgroundDefinition; 7 | export function defineBackground( 8 | arg: (() => void) | BackgroundDefinition, 9 | ): BackgroundDefinition { 10 | if (typeof arg === 'function') return { main: arg }; 11 | return arg; 12 | } 13 | -------------------------------------------------------------------------------- /packages/wxt/src/sandbox/define-content-script.ts: -------------------------------------------------------------------------------- 1 | import type { ContentScriptDefinition } from '~/types'; 2 | 3 | export function defineContentScript( 4 | definition: ContentScriptDefinition, 5 | ): ContentScriptDefinition { 6 | return definition; 7 | } 8 | -------------------------------------------------------------------------------- /packages/wxt/src/sandbox/define-unlisted-script.ts: -------------------------------------------------------------------------------- 1 | import type { UnlistedScriptDefinition } from '~/types'; 2 | 3 | export function defineUnlistedScript( 4 | main: () => void, 5 | ): UnlistedScriptDefinition; 6 | export function defineUnlistedScript( 7 | definition: UnlistedScriptDefinition, 8 | ): UnlistedScriptDefinition; 9 | export function defineUnlistedScript( 10 | arg: (() => void) | UnlistedScriptDefinition, 11 | ): UnlistedScriptDefinition { 12 | if (typeof arg === 'function') return { main: arg }; 13 | return arg; 14 | } 15 | -------------------------------------------------------------------------------- /packages/wxt/src/sandbox/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Any runtime APIs that don't use the web extension APIs. 3 | * 4 | * @module wxt/sandbox 5 | */ 6 | export * from './define-unlisted-script'; 7 | export * from './define-background'; 8 | export * from './define-content-script'; 9 | export * from '@webext-core/match-patterns'; 10 | -------------------------------------------------------------------------------- /packages/wxt/src/testing/fake-browser.ts: -------------------------------------------------------------------------------- 1 | export { fakeBrowser, type FakeBrowser } from '@webext-core/fake-browser'; 2 | -------------------------------------------------------------------------------- /packages/wxt/src/testing/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @module wxt/testing 3 | */ 4 | export * from './fake-browser'; 5 | export * from './wxt-vitest-plugin'; 6 | -------------------------------------------------------------------------------- /packages/wxt/src/types/globals.d.ts: -------------------------------------------------------------------------------- 1 | declare const __DEV_SERVER_PROTOCOL__: string; 2 | declare const __DEV_SERVER_HOSTNAME__: string; 3 | declare const __DEV_SERVER_PORT__: string; 4 | 5 | // Globals defined by the vite-plugins/devServerGlobals.ts and utils/globals.ts 6 | interface ImportMetaEnv { 7 | readonly COMMAND: WxtCommand; 8 | readonly MANIFEST_VERSION: 2 | 3; 9 | readonly ENTRYPOINT: string; 10 | } 11 | -------------------------------------------------------------------------------- /packages/wxt/src/types/project-types.d.ts: -------------------------------------------------------------------------------- 1 | // Types generated in the .wxt directory available after wxt prepare 2 | 3 | declare type PublicPath = string; 4 | -------------------------------------------------------------------------------- /packages/wxt/src/version.ts: -------------------------------------------------------------------------------- 1 | export { version } from '../package.json'; 2 | -------------------------------------------------------------------------------- /packages/wxt/src/virtual/mock-browser.ts: -------------------------------------------------------------------------------- 1 | import { fakeBrowser as mockBrowser } from 'wxt/testing'; 2 | 3 | export default mockBrowser; 4 | -------------------------------------------------------------------------------- /packages/wxt/src/virtual/utils/keep-service-worker-alive.ts: -------------------------------------------------------------------------------- 1 | import { browser } from 'wxt/browser'; 2 | 3 | /** 4 | * https://developer.chrome.com/blog/longer-esw-lifetimes/ 5 | */ 6 | export function keepServiceWorkerAlive() { 7 | setInterval(async () => { 8 | // Calling an async browser API resets the service worker's timeout 9 | await browser.runtime.getPlatformInfo(); 10 | }, 5e3); 11 | } 12 | -------------------------------------------------------------------------------- /packages/wxt/src/vite-builder-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/wxt/typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": [ 3 | "src/client/index.ts", 4 | "src/testing/index.ts", 5 | "src/sandbox/index.ts", 6 | "src/browser.ts", 7 | "src/index.ts", 8 | "src/storage.ts" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /packages/wxt/vitest.setup.ts: -------------------------------------------------------------------------------- 1 | // @ts-expect-error 2 | globalThis.__ENTRYPOINT__ = 'test'; 3 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'apps/*' 3 | - 'packages/*' 4 | --------------------------------------------------------------------------------