synapse-sdk 1.0.0a61__tar.gz → 1.0.0a63__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/PKG-INFO +1 -1
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/__init__.py +26 -19
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/devtools.py +18 -9
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/plugin/publish.py +22 -13
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/server.py +42 -63
- synapse_sdk-1.0.0a63/synapse_sdk/devtools/utils.py +52 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/dist/index.html +2 -2
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/LogViewer.jsx +15 -1
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/NavigationSidebar.jsx +4 -13
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/utils/api.js +23 -6
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk.egg-info/PKG-INFO +1 -1
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk.egg-info/SOURCES.txt +1 -1
- synapse_sdk-1.0.0a61/.github/workflows/update-changelog.yml +0 -109
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/.coverage +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/.github/workflows/lint.yml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/.github/workflows/pypi-publish.yml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/.gitignore +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/.pre-commit-config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/LICENSE +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/README.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/clients/agent.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/clients/backend.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/clients/base.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/index.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/plugins/categories.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/plugins/models.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/plugins/utils.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/utils/file.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/utils/storage.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/api/utils/types.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/categories.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/changelog.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/concepts/index.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/configuration.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/contributing.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/examples/index.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/faq.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/i18n/ko/code.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/i18n/ko/docusaurus-plugin-content-docs/current/introduction.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/i18n/ko/docusaurus-theme-classic/footer.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/i18n/ko/docusaurus-theme-classic/navbar.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/installation.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/introduction.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/quickstart.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/troubleshooting.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/_category_.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/congratulations.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/create-a-blog-post.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/create-a-document.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/create-a-page.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/deploy-your-site.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-basics/markdown-features.mdx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-extras/_category_.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-extras/img/docsVersionDropdown.png +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-extras/img/localeDropdown.png +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-extras/manage-docs-versions.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/docs/tutorial-extras/translate-your-site.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/locale/en/LC_MESSAGES/messages.mo +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/locale/en/LC_MESSAGES/messages.po +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/locale/ko/LC_MESSAGES/messages.mo +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/locale/ko/LC_MESSAGES/messages.po +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/pyproject.toml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/requirements.test.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/requirements.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/setup.cfg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/create.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/dataclass.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/default.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/delete.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/list.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/read.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/update.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/alias/utils.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/config.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/plugin/create.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/cli/plugin/run.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/agent/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/agent/core.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/agent/ray.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/agent/service.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/annotation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/core.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/data_collection.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/hitl.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/integration.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/ml.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/backend/models.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/base.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/exceptions.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/ray/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/ray/core.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/ray/serve.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/utils.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/validators/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/clients/validators/collections.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/config.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/.gitignore +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/README.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/2019-05-28-first-blog-post.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/2019-05-29-long-blog-post.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/2021-08-01-mdx-blog-post.mdx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/2021-08-26-welcome/index.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/authors.yml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/blog/tags.yml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/docusaurus.config.ts +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/package-lock.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/package.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/sidebars.ts +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/src/components/HomepageFeatures/index.tsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/src/components/HomepageFeatures/styles.module.css +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/src/css/custom.css +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/src/pages/index.module.css +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/src/pages/index.tsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/src/pages/markdown-page.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/.nojekyll +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/docusaurus-social-card.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/docusaurus.png +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/favicon.ico +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/logo.png +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_mountain.svg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_react.svg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/static/img/undraw_docusaurus_tree.svg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/docs/tsconfig.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/models.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/.gitignore +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/README.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/index.html +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/jsconfig.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/package-lock.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/package.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/pnpm-lock.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/App.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/App.module.css +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/assets/favicon.ico +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/Breadcrumbs.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/Layout.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/MessageViewer.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/ServerStatusBar.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/icons.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/index.css +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/index.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/logo.svg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/router.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/views/ApplicationDetailView.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/views/ApplicationsView.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/views/HomeView.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/views/JobDetailView.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/views/PluginView.jsx +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/vite.config.js +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/i18n.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/loggers.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/base.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/data_validation/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/data_validation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/data_validation/actions/validation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/data_validation/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/data_validation/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/data_validation/templates/plugin/validation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/decorators.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/actions/export.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/enums.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/export/templates/plugin/export.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/deployment.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/gradio.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/inference.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/test.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/train.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/actions/tune.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/base/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/base/inference.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/templates/plugin/inference.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/templates/plugin/test.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/neural_net/templates/plugin/train.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/post_annotation/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/post_annotation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/post_annotation/actions/post_annotation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/post_annotation/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/post_annotation/templates/plugin/post_annotation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/actions/to_task.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/pre_annotation.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/pre_annotation/templates/plugin/to_task.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/registry.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/smart_tool/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/smart_tool/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/smart_tool/actions/auto_label.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/smart_tool/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/smart_tool/templates/plugin/auto_label.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/templates.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/upload/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/upload/actions/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/upload/actions/upload.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/upload/templates/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/upload/templates/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/categories/upload/templates/plugin/upload.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/enums.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/exceptions.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/models.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/cookiecutter.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/hooks/post_gen_project.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/hooks/pre_prompt.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/plugin-config-schema.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/schema.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.gitignore +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/.pre-commit-config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/README.md +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/config.yaml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/plugin/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/pyproject.toml +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/templates/synapse-{{cookiecutter.plugin_code}}-plugin/requirements.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/upload.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/plugins/utils.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/shared/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/shared/enums.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/types.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/converters/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/converters/coco/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/converters/coco/from_dm.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/dataset.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/debug.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/file.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/http.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/module_loading.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/network.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/pydantic/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/pydantic/config.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/pydantic/errors.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/pydantic/validators.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/storage/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/storage/providers/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/storage/providers/gcp.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/storage/providers/s3.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/storage/providers/sftp.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/storage/registry.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/utils/string.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk.egg-info/dependency_links.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk.egg-info/entry_points.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk.egg-info/requires.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk.egg-info/top_level.txt +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/clients/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/clients/test_backend_models.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/clients/test_base_client.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/clients/test_collection_validators.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/conftest.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/loggers/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/loggers/test_base_logger.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/test_cli.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/test_cli_integration.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/__init__,py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/conftest.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/__init__.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/test/json/dm_1.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/test/json/dm_2.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/test/json/dm_3.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/test/original_files/dm_1.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/test/original_files/dm_2.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/test/original_files/dm_3.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/json/dm_4.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/json/dm_5.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/json/dm_6.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/json/dm_7.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/original_files/dm_4.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/original_files/dm_5.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/original_files/dm_6.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/train/original_files/dm_7.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/valid/json/dm_8.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/valid/json/dm_9.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/valid/original_files/dm_8.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/categorized/valid/original_files/dm_9.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/not_categorized/json/dm_1.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/not_categorized/json/dm_2.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/not_categorized/json/dm_3.json +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/not_categorized/original_files/dm_1.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/not_categorized/original_files/dm_2.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/data_types/image/not_categorized/original_files/dm_3.jpg +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/fixtures/dm_schema.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/converters/test_coco_from_dm.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/tests/utils/test_debug.py +0 -0
- {synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/uv.lock +0 -0
|
@@ -106,18 +106,36 @@ def display_connection_status():
|
|
|
106
106
|
click.echo() # Empty line for spacing
|
|
107
107
|
|
|
108
108
|
|
|
109
|
-
def run_devtools(build=
|
|
109
|
+
def run_devtools(build=True):
|
|
110
110
|
"""Run devtools with default settings"""
|
|
111
111
|
try:
|
|
112
|
+
from synapse_sdk.devtools.config import get_server_config
|
|
112
113
|
from synapse_sdk.devtools.server import create_devtools_server
|
|
114
|
+
from synapse_sdk.devtools.utils import find_available_port, is_port_available
|
|
113
115
|
|
|
114
116
|
if build:
|
|
115
|
-
click.echo('Building
|
|
117
|
+
click.echo('Building...')
|
|
116
118
|
build_frontend()
|
|
117
119
|
|
|
118
120
|
click.echo('Starting Synapse Devtools...')
|
|
119
|
-
|
|
120
|
-
server
|
|
121
|
+
|
|
122
|
+
# Get server configuration defaults
|
|
123
|
+
server_config = get_server_config()
|
|
124
|
+
host = server_config['host']
|
|
125
|
+
port = server_config['port']
|
|
126
|
+
|
|
127
|
+
# Check if the port is available, fallback to next available port if not
|
|
128
|
+
if not is_port_available(host, port):
|
|
129
|
+
try:
|
|
130
|
+
fallback_port = find_available_port(host, port + 1)
|
|
131
|
+
click.echo(click.style(f'Port {port} is in use, falling back to port {fallback_port}', fg='yellow'))
|
|
132
|
+
port = fallback_port
|
|
133
|
+
except RuntimeError as e:
|
|
134
|
+
click.echo(click.style(f'Failed to find available port: {e}', fg='red'), err=True)
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
server = create_devtools_server(host=host, port=port)
|
|
138
|
+
server.start_server()
|
|
121
139
|
except ImportError:
|
|
122
140
|
click.echo(
|
|
123
141
|
click.style(
|
|
@@ -153,21 +171,20 @@ def build_frontend():
|
|
|
153
171
|
try:
|
|
154
172
|
# Install dependencies if node_modules doesn't exist
|
|
155
173
|
if not (devtools_dir / 'node_modules').exists():
|
|
156
|
-
click.echo('Installing
|
|
174
|
+
click.echo('Installing dependencies...')
|
|
157
175
|
result = subprocess.run(['npm', 'install'], cwd=devtools_dir, capture_output=True, text=True)
|
|
158
176
|
if result.returncode != 0:
|
|
159
177
|
click.echo(click.style(f'npm install failed:\n{result.stderr}', fg='red'), err=True)
|
|
160
178
|
return False
|
|
161
179
|
|
|
162
180
|
# Build the frontend
|
|
163
|
-
click.echo('Building frontend...')
|
|
164
181
|
result = subprocess.run(['npm', 'run', 'build'], cwd=devtools_dir, capture_output=True, text=True)
|
|
165
182
|
|
|
166
183
|
if result.returncode != 0:
|
|
167
184
|
click.echo(click.style(f'Frontend build failed:\n{result.stderr}', fg='red'), err=True)
|
|
168
185
|
return False
|
|
169
186
|
|
|
170
|
-
click.echo(click.style('
|
|
187
|
+
click.echo(click.style('Build completed successfully!', fg='green'))
|
|
171
188
|
return True
|
|
172
189
|
|
|
173
190
|
except Exception as e:
|
|
@@ -184,23 +201,13 @@ def run_config():
|
|
|
184
201
|
|
|
185
202
|
@click.group(invoke_without_command=True)
|
|
186
203
|
@click.option('--dev-tools', is_flag=True, help='Start devtools immediately')
|
|
187
|
-
@click.option('--build', is_flag=True, help='Build frontend before starting devtools (only with --dev-tools)')
|
|
188
204
|
@click.pass_context
|
|
189
|
-
def cli(ctx, dev_tools
|
|
205
|
+
def cli(ctx, dev_tools):
|
|
190
206
|
"""Synapse SDK - Interactive CLI"""
|
|
191
207
|
|
|
192
208
|
# Handle --dev-tools flag
|
|
193
209
|
if dev_tools:
|
|
194
|
-
|
|
195
|
-
run_devtools(build=True)
|
|
196
|
-
else:
|
|
197
|
-
run_devtools(build=False)
|
|
198
|
-
return
|
|
199
|
-
|
|
200
|
-
# Handle --build flag without --dev-tools (show warning)
|
|
201
|
-
if build and not dev_tools:
|
|
202
|
-
click.echo(click.style('Warning: --build flag requires --dev-tools flag', fg='yellow'))
|
|
203
|
-
click.echo('Use: synapse --dev-tools --build')
|
|
210
|
+
run_devtools()
|
|
204
211
|
return
|
|
205
212
|
|
|
206
213
|
if ctx.invoked_subcommand is None:
|
|
@@ -9,15 +9,15 @@ from synapse_sdk.i18n import gettext as _
|
|
|
9
9
|
@click.command()
|
|
10
10
|
@click.option('--host', default=None, help='Host to bind the devtools server')
|
|
11
11
|
@click.option('--port', default=None, type=int, help='Port to bind the devtools server')
|
|
12
|
-
@click.option('--no-browser', is_flag=True, help='Do not open browser automatically')
|
|
13
12
|
@click.option('--debug', is_flag=True, help='Run in debug mode')
|
|
14
|
-
|
|
15
|
-
def devtools(host, port, no_browser, debug, build):
|
|
13
|
+
def devtools(host, port, debug):
|
|
16
14
|
"""Start the Synapse devtools web interface"""
|
|
17
15
|
|
|
18
16
|
try:
|
|
19
17
|
from synapse_sdk.devtools.config import get_server_config
|
|
20
18
|
from synapse_sdk.devtools.server import create_devtools_server
|
|
19
|
+
from synapse_sdk.devtools.utils import find_available_port, is_port_available
|
|
20
|
+
|
|
21
21
|
except ImportError:
|
|
22
22
|
click.echo(
|
|
23
23
|
click.style(
|
|
@@ -27,12 +27,11 @@ def devtools(host, port, no_browser, debug, build):
|
|
|
27
27
|
)
|
|
28
28
|
sys.exit(1)
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
from synapse_sdk.cli import build_frontend
|
|
30
|
+
click.echo('Building assets...')
|
|
31
|
+
from synapse_sdk.cli import build_frontend
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
if not build_frontend():
|
|
34
|
+
click.echo(click.style('Build failed, continuing with existing assets...', fg='yellow'))
|
|
36
35
|
|
|
37
36
|
if debug:
|
|
38
37
|
click.echo(_('Starting devtools in debug mode...'))
|
|
@@ -47,13 +46,23 @@ def devtools(host, port, no_browser, debug, build):
|
|
|
47
46
|
final_host = host if host is not None else server_config['host']
|
|
48
47
|
final_port = port if port is not None else server_config['port']
|
|
49
48
|
|
|
49
|
+
# Check if the port is available, fallback to next available port if not
|
|
50
|
+
if not is_port_available(final_host, final_port):
|
|
51
|
+
try:
|
|
52
|
+
fallback_port = find_available_port(final_host, final_port + 1)
|
|
53
|
+
click.echo(click.style(f'Port {final_port} is in use, falling back to port {fallback_port}', fg='yellow'))
|
|
54
|
+
final_port = fallback_port
|
|
55
|
+
except RuntimeError as e:
|
|
56
|
+
click.echo(click.style(f'Failed to find available port: {e}', fg='red'), err=True)
|
|
57
|
+
sys.exit(1)
|
|
58
|
+
|
|
50
59
|
# Create and start the devtools server
|
|
51
60
|
# Pass the current working directory as the plugin directory
|
|
52
61
|
plugin_directory = os.getcwd()
|
|
53
62
|
server = create_devtools_server(host=final_host, port=final_port, plugin_directory=plugin_directory)
|
|
54
63
|
|
|
55
64
|
try:
|
|
56
|
-
server.start_server(
|
|
65
|
+
server.start_server()
|
|
57
66
|
except KeyboardInterrupt:
|
|
58
67
|
click.echo(_('\nDevtools stopped.'))
|
|
59
68
|
except Exception as e:
|
|
@@ -8,14 +8,14 @@ from synapse_sdk.plugins.models import PluginRelease
|
|
|
8
8
|
from synapse_sdk.plugins.upload import archive
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
debug
|
|
18
|
-
|
|
11
|
+
def _publish(host, access_token, debug, debug_modules=''):
|
|
12
|
+
"""
|
|
13
|
+
Publish a plugin release to the Synapse backend.
|
|
14
|
+
|
|
15
|
+
:param host: The host URL of the Synapse backend.
|
|
16
|
+
:param access_token: The access token for authentication.
|
|
17
|
+
:param debug_modules: Comma-separated list of debug modules.
|
|
18
|
+
"""
|
|
19
19
|
plugin_release = PluginRelease()
|
|
20
20
|
|
|
21
21
|
source_path = Path('./')
|
|
@@ -29,8 +29,17 @@ def publish(ctx, host, access_token, debug_modules):
|
|
|
29
29
|
|
|
30
30
|
client = BackendClient(host, access_token)
|
|
31
31
|
client.create_plugin_release(data)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
|
|
33
|
+
message = _('Successfully published "{}" ({}) to synapse backend!').format(plugin_release.name, plugin_release.code)
|
|
34
|
+
click.secho(message, fg='green', bold=True)
|
|
35
|
+
return plugin_release
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@click.command()
|
|
39
|
+
@click.option('--host', required=True)
|
|
40
|
+
@click.option('--access_token', required=True)
|
|
41
|
+
@click.option('--debug_modules', default='', envvar='SYNAPSE_DEBUG_MODULES')
|
|
42
|
+
@click.pass_context
|
|
43
|
+
def publish(ctx, host, access_token, debug_modules):
|
|
44
|
+
debug = ctx.obj['DEBUG']
|
|
45
|
+
_publish(host, access_token, debug, debug_modules)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
import webbrowser
|
|
4
3
|
from contextlib import asynccontextmanager
|
|
5
4
|
from datetime import datetime
|
|
6
5
|
from importlib.metadata import version
|
|
@@ -15,11 +14,13 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
|
15
14
|
from fastapi.responses import StreamingResponse
|
|
16
15
|
from fastapi.staticfiles import StaticFiles
|
|
17
16
|
|
|
17
|
+
from synapse_sdk.cli.plugin.publish import _publish
|
|
18
18
|
from synapse_sdk.clients.agent import AgentClient
|
|
19
19
|
from synapse_sdk.clients.backend import BackendClient
|
|
20
20
|
from synapse_sdk.clients.exceptions import ClientError
|
|
21
21
|
from synapse_sdk.devtools.config import get_backend_config, load_devtools_config
|
|
22
22
|
from synapse_sdk.devtools.models import ConfigResponse, ConfigUpdateRequest
|
|
23
|
+
from synapse_sdk.devtools.utils import get_display_host
|
|
23
24
|
|
|
24
25
|
logger = logging.getLogger(__name__)
|
|
25
26
|
|
|
@@ -93,32 +94,12 @@ class DevtoolsServer:
|
|
|
93
94
|
"""Internal method to publish plugin using CLI logic"""
|
|
94
95
|
import os
|
|
95
96
|
|
|
96
|
-
from synapse_sdk.clients.backend import BackendClient
|
|
97
|
-
from synapse_sdk.plugins.models import PluginRelease
|
|
98
|
-
from synapse_sdk.plugins.upload import archive
|
|
99
|
-
|
|
100
|
-
# Change to plugin directory
|
|
101
97
|
original_cwd = os.getcwd()
|
|
102
98
|
try:
|
|
103
99
|
os.chdir(str(source_path))
|
|
104
100
|
|
|
105
|
-
|
|
106
|
-
plugin_release =
|
|
107
|
-
|
|
108
|
-
# Create archive
|
|
109
|
-
archive_path = source_path / 'dist' / 'archive.zip'
|
|
110
|
-
archive(source_path, archive_path)
|
|
111
|
-
|
|
112
|
-
# Prepare data for backend
|
|
113
|
-
data = {'plugin': plugin_release.plugin, 'file': str(archive_path), 'debug': debug}
|
|
114
|
-
|
|
115
|
-
if debug:
|
|
116
|
-
modules = [] # TODO: Get debug modules from environment or config
|
|
117
|
-
data['meta'] = {'modules': modules}
|
|
118
|
-
|
|
119
|
-
# Create backend client and publish
|
|
120
|
-
client = BackendClient(host, access_token, debug=debug)
|
|
121
|
-
result = client.create_plugin_release(data)
|
|
101
|
+
debug_modules = os.getenv('SYNAPSE_DEBUG_MODULES', '')
|
|
102
|
+
plugin_release = _publish(host, access_token, debug, debug_modules)
|
|
122
103
|
|
|
123
104
|
return {
|
|
124
105
|
'success': True,
|
|
@@ -127,7 +108,7 @@ class DevtoolsServer:
|
|
|
127
108
|
'plugin_code': plugin_release.code,
|
|
128
109
|
'version': plugin_release.version,
|
|
129
110
|
'name': plugin_release.name,
|
|
130
|
-
'result':
|
|
111
|
+
'result': '',
|
|
131
112
|
}
|
|
132
113
|
|
|
133
114
|
finally:
|
|
@@ -263,9 +244,11 @@ class DevtoolsServer:
|
|
|
263
244
|
|
|
264
245
|
def _inject_env_vars(self, html_content: str) -> str:
|
|
265
246
|
"""Inject environment variables into HTML"""
|
|
247
|
+
# Use display host for frontend access (resolves 0.0.0.0 to actual IP)
|
|
248
|
+
display_host = get_display_host(self.host)
|
|
266
249
|
env_script = f"""<script>
|
|
267
250
|
window.VITE_API_PORT = {self.port};
|
|
268
|
-
window.VITE_API_HOST = '{
|
|
251
|
+
window.VITE_API_HOST = '{display_host}';
|
|
269
252
|
</script>"""
|
|
270
253
|
|
|
271
254
|
# Insert before closing head tag
|
|
@@ -360,14 +343,38 @@ class DevtoolsServer:
|
|
|
360
343
|
raise HTTPException(status_code=503, detail='Agent client not configured')
|
|
361
344
|
|
|
362
345
|
async def log_generator():
|
|
346
|
+
import asyncio
|
|
347
|
+
|
|
363
348
|
try:
|
|
364
|
-
#
|
|
365
|
-
|
|
366
|
-
|
|
349
|
+
# Run the synchronous generator in a thread to avoid blocking
|
|
350
|
+
loop = asyncio.get_event_loop()
|
|
351
|
+
log_iter = self.agent_client.tail_job_logs(job_id, stream_timeout=3)
|
|
352
|
+
|
|
353
|
+
while True:
|
|
354
|
+
# Check if client disconnected before getting next log
|
|
367
355
|
if await request.is_disconnected():
|
|
368
356
|
logger.info(f'Client disconnected, stopping log stream for job {job_id}')
|
|
369
357
|
break
|
|
370
|
-
|
|
358
|
+
|
|
359
|
+
try:
|
|
360
|
+
# Get next log line with timeout to allow periodic disconnect checks
|
|
361
|
+
log_line = await loop.run_in_executor(None, lambda: next(log_iter, None))
|
|
362
|
+
|
|
363
|
+
if log_line is None:
|
|
364
|
+
break
|
|
365
|
+
|
|
366
|
+
# Check again before yielding
|
|
367
|
+
if await request.is_disconnected():
|
|
368
|
+
logger.info(f'Client disconnected before yield, stopping log stream for job {job_id}')
|
|
369
|
+
break
|
|
370
|
+
|
|
371
|
+
# Convert plain text to SSE format
|
|
372
|
+
if log_line.strip():
|
|
373
|
+
yield f'data: {log_line.strip()}\n\n'
|
|
374
|
+
|
|
375
|
+
except StopIteration:
|
|
376
|
+
break
|
|
377
|
+
|
|
371
378
|
except ClientError as e:
|
|
372
379
|
logger.warning(f'Agent client error in log streaming for job {job_id}: {e.reason}')
|
|
373
380
|
if e.status == 408:
|
|
@@ -383,7 +390,7 @@ class DevtoolsServer:
|
|
|
383
390
|
logger.info(f'Log streaming ended for job {job_id}')
|
|
384
391
|
|
|
385
392
|
try:
|
|
386
|
-
return StreamingResponse(log_generator(), media_type='text/
|
|
393
|
+
return StreamingResponse(log_generator(), media_type='text/event-stream')
|
|
387
394
|
except Exception as e:
|
|
388
395
|
logger.error(f'Failed to setup log stream for job {job_id}: {e}')
|
|
389
396
|
raise HTTPException(status_code=500, detail=f'Failed to setup log stream for job {job_id}')
|
|
@@ -786,40 +793,12 @@ class DevtoolsServer:
|
|
|
786
793
|
self.websocket_connections.remove(connection)
|
|
787
794
|
logger.info('Removed disconnected WebSocket connection')
|
|
788
795
|
|
|
789
|
-
def start_server(self
|
|
796
|
+
def start_server(self):
|
|
790
797
|
"""Start the devtools server"""
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
def open_browser_delayed():
|
|
796
|
-
import os
|
|
797
|
-
import time
|
|
798
|
-
|
|
799
|
-
time.sleep(1.5)
|
|
800
|
-
|
|
801
|
-
try:
|
|
802
|
-
# Redirect stderr to suppress xdg-open error messages
|
|
803
|
-
old_stderr = os.dup(2)
|
|
804
|
-
with open(os.devnull, 'w') as devnull:
|
|
805
|
-
os.dup2(devnull.fileno(), 2)
|
|
806
|
-
webbrowser.open(url)
|
|
807
|
-
os.dup2(old_stderr, 2)
|
|
808
|
-
os.close(old_stderr)
|
|
809
|
-
except Exception:
|
|
810
|
-
# Restore stderr if something went wrong
|
|
811
|
-
try:
|
|
812
|
-
os.dup2(old_stderr, 2)
|
|
813
|
-
os.close(old_stderr)
|
|
814
|
-
except Exception as e:
|
|
815
|
-
logger.error(f'Failed to restore stderr: {e}')
|
|
816
|
-
|
|
817
|
-
# Always show the URL since we can't reliably detect browser success
|
|
818
|
-
print(f'Open devtools on your browser: {url}')
|
|
819
|
-
|
|
820
|
-
import threading
|
|
821
|
-
|
|
822
|
-
threading.Thread(target=open_browser_delayed, daemon=True).start()
|
|
798
|
+
# Use display host for browser opening and URL display
|
|
799
|
+
display_host = get_display_host(self.host)
|
|
800
|
+
url = f'http://{display_host}:{self.port}'
|
|
801
|
+
print(f'Open devtools on your browser: {url}')
|
|
823
802
|
|
|
824
803
|
uvicorn.run(self.app, host=self.host, port=self.port, log_level='warning', access_log=False)
|
|
825
804
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import socket
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def is_port_available(host: str, port: int) -> bool:
|
|
5
|
+
"""Check if a port is available on the given host"""
|
|
6
|
+
try:
|
|
7
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
8
|
+
sock.settimeout(1)
|
|
9
|
+
result = sock.connect_ex((host, port))
|
|
10
|
+
return result != 0
|
|
11
|
+
except (socket.error, OSError):
|
|
12
|
+
return False
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def find_available_port(host: str, start_port: int, max_attempts: int = 10) -> int:
|
|
16
|
+
"""Find an available port starting from start_port"""
|
|
17
|
+
for port in range(start_port, start_port + max_attempts):
|
|
18
|
+
if is_port_available(host, port):
|
|
19
|
+
return port
|
|
20
|
+
raise RuntimeError(f'No available port found in range {start_port}-{start_port + max_attempts - 1}')
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_local_ip() -> str:
|
|
24
|
+
"""Get the local IP address for client access"""
|
|
25
|
+
try:
|
|
26
|
+
# In WSL, return localhost since the server is accessible via localhost
|
|
27
|
+
if _is_wsl():
|
|
28
|
+
return '127.0.0.1'
|
|
29
|
+
|
|
30
|
+
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
|
31
|
+
s.connect(('8.8.8.8', 80))
|
|
32
|
+
return s.getsockname()[0]
|
|
33
|
+
except Exception:
|
|
34
|
+
# Fallback to localhost if we can't determine the local IP
|
|
35
|
+
return '127.0.0.1'
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _is_wsl() -> bool:
|
|
39
|
+
"""Check if we're running in WSL"""
|
|
40
|
+
try:
|
|
41
|
+
with open('/proc/version', 'r') as f:
|
|
42
|
+
content = f.read().lower()
|
|
43
|
+
return 'microsoft' in content or 'wsl' in content
|
|
44
|
+
except Exception:
|
|
45
|
+
return False
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_display_host(server_host: str) -> str:
|
|
49
|
+
"""Get the appropriate host for display and frontend access"""
|
|
50
|
+
if server_host == '0.0.0.0':
|
|
51
|
+
return get_local_ip()
|
|
52
|
+
return server_host
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<meta name="theme-color" content="#000000" />
|
|
7
7
|
<link rel="shortcut icon" type="image/ico" href="/assets/favicon-mtvwWgEY.ico" />
|
|
8
8
|
<title>Synapse SDK</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-C-6muTAU.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DaWyc9aY.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
{synapse_sdk-1.0.0a61 → synapse_sdk-1.0.0a63}/synapse_sdk/devtools/web/src/components/LogViewer.jsx
RENAMED
|
@@ -186,6 +186,10 @@ export default function LogViewer(props) {
|
|
|
186
186
|
startStreaming();
|
|
187
187
|
});
|
|
188
188
|
|
|
189
|
+
onCleanup(() => {
|
|
190
|
+
stopStreaming();
|
|
191
|
+
});
|
|
192
|
+
|
|
189
193
|
return (
|
|
190
194
|
<div class="github-log-viewer">
|
|
191
195
|
{/* Header */}
|
|
@@ -208,9 +212,19 @@ export default function LogViewer(props) {
|
|
|
208
212
|
</div>
|
|
209
213
|
</div>
|
|
210
214
|
|
|
215
|
+
{/* Error State */}
|
|
216
|
+
<Show when={error()}>
|
|
217
|
+
<div class="alert alert-error mb-2">
|
|
218
|
+
<svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24">
|
|
219
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
220
|
+
</svg>
|
|
221
|
+
<span>{error()}</span>
|
|
222
|
+
</div>
|
|
223
|
+
</Show>
|
|
224
|
+
|
|
211
225
|
{/* Container */}
|
|
212
226
|
<div class="log-container" ref={logContainerRef} onScroll={handleScroll}>
|
|
213
|
-
<Show when={logs().length === 0}>
|
|
227
|
+
<Show when={logs().length === 0 && !error()}>
|
|
214
228
|
<div class="log-empty">
|
|
215
229
|
<div class="empty-state">
|
|
216
230
|
<svg class="empty-icon" viewBox="0 0 24 24" width="24" height="24">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useLocation, useNavigate } from "@solidjs/router";
|
|
2
2
|
import { createSignal, Show } from "solid-js";
|
|
3
|
-
import {
|
|
3
|
+
import { MenuIcon, CloseIcon, DocumentIcon } from "./icons";
|
|
4
4
|
import { createStatusResource } from "../utils/api";
|
|
5
5
|
|
|
6
6
|
export default function NavigationSidebar() {
|
|
@@ -15,23 +15,17 @@ export default function NavigationSidebar() {
|
|
|
15
15
|
{
|
|
16
16
|
id: "home",
|
|
17
17
|
label: "Jobs",
|
|
18
|
-
icon: HomeIcon,
|
|
19
18
|
path: "/",
|
|
20
|
-
description: "View and manage Ray jobs"
|
|
21
19
|
},
|
|
22
20
|
{
|
|
23
21
|
id: "applications",
|
|
24
|
-
label: "Serve
|
|
25
|
-
icon: CubeIcon,
|
|
22
|
+
label: "Serve Application",
|
|
26
23
|
path: "/serve_applications",
|
|
27
|
-
description: "Ray Serve applications"
|
|
28
24
|
},
|
|
29
25
|
{
|
|
30
26
|
id: "plugin",
|
|
31
|
-
label: "Plugin
|
|
32
|
-
icon: SettingsIcon,
|
|
27
|
+
label: "Plugin",
|
|
33
28
|
path: "/plugin",
|
|
34
|
-
description: "Develop and test plugins"
|
|
35
29
|
}
|
|
36
30
|
];
|
|
37
31
|
|
|
@@ -89,7 +83,6 @@ export default function NavigationSidebar() {
|
|
|
89
83
|
<nav class="flex-1 p-6 py-8 overflow-y-auto">
|
|
90
84
|
<ul class="space-y-2">
|
|
91
85
|
{navigationItems.map((item) => {
|
|
92
|
-
const Icon = item.icon;
|
|
93
86
|
const active = isActive(item.path);
|
|
94
87
|
|
|
95
88
|
return (
|
|
@@ -102,10 +95,8 @@ export default function NavigationSidebar() {
|
|
|
102
95
|
}`}
|
|
103
96
|
onClick={() => handleNavigation(item.path)}
|
|
104
97
|
>
|
|
105
|
-
<Icon class="w-5 h-5 flex-shrink-0" />
|
|
106
98
|
<div class="flex-1 min-w-0">
|
|
107
99
|
<div class="text-sm font-medium">{item.label}</div>
|
|
108
|
-
<div class="text-xs text-slate-500 truncate">{item.description}</div>
|
|
109
100
|
</div>
|
|
110
101
|
</button>
|
|
111
102
|
</li>
|
|
@@ -120,7 +111,7 @@ export default function NavigationSidebar() {
|
|
|
120
111
|
<div class="flex items-center justify-between">
|
|
121
112
|
<span>SDK {status()?.devtools?.version || "Unknown"}</span>
|
|
122
113
|
<a
|
|
123
|
-
href="https://docs.synapse.
|
|
114
|
+
href="https://docs.synapse.sh"
|
|
124
115
|
target="_blank"
|
|
125
116
|
rel="noopener noreferrer"
|
|
126
117
|
class="text-slate-600 hover:text-slate-900"
|
|
@@ -333,12 +333,29 @@ export function createJobLogsStream(jobId) {
|
|
|
333
333
|
const lines = buffer.split(/\r?\n/);
|
|
334
334
|
buffer = lines.pop() || "";
|
|
335
335
|
|
|
336
|
-
const
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
336
|
+
for (const line of lines) {
|
|
337
|
+
if (!line.trim()) continue;
|
|
338
|
+
|
|
339
|
+
// Handle SSE format (data: prefix)
|
|
340
|
+
if (line.startsWith('data: ')) {
|
|
341
|
+
const content = line.substring(6).trim();
|
|
342
|
+
|
|
343
|
+
// Check if this is an error message from the server
|
|
344
|
+
if (content.includes('Agent client error') ||
|
|
345
|
+
content.includes('Agent connection error') ||
|
|
346
|
+
content.includes('Agent error:') ||
|
|
347
|
+
content.includes('Unexpected error:')) {
|
|
348
|
+
setError(content);
|
|
349
|
+
// Still add as a log entry so user can see the error
|
|
350
|
+
setLogs(prev => [...prev, parseLogLine(content)]);
|
|
351
|
+
} else {
|
|
352
|
+
// Normal log line
|
|
353
|
+
setLogs(prev => [...prev, parseLogLine(content)]);
|
|
354
|
+
}
|
|
355
|
+
} else {
|
|
356
|
+
// Handle non-SSE format (backward compatibility)
|
|
357
|
+
setLogs(prev => [...prev, parseLogLine(line)]);
|
|
358
|
+
}
|
|
342
359
|
}
|
|
343
360
|
}
|
|
344
361
|
|
|
@@ -9,7 +9,6 @@ requirements.txt
|
|
|
9
9
|
uv.lock
|
|
10
10
|
.github/workflows/lint.yml
|
|
11
11
|
.github/workflows/pypi-publish.yml
|
|
12
|
-
.github/workflows/update-changelog.yml
|
|
13
12
|
docs/categories.md
|
|
14
13
|
docs/changelog.md
|
|
15
14
|
docs/configuration.md
|
|
@@ -105,6 +104,7 @@ synapse_sdk/devtools/__init__.py
|
|
|
105
104
|
synapse_sdk/devtools/config.py
|
|
106
105
|
synapse_sdk/devtools/models.py
|
|
107
106
|
synapse_sdk/devtools/server.py
|
|
107
|
+
synapse_sdk/devtools/utils.py
|
|
108
108
|
synapse_sdk/devtools/docs/.gitignore
|
|
109
109
|
synapse_sdk/devtools/docs/README.md
|
|
110
110
|
synapse_sdk/devtools/docs/docusaurus.config.ts
|