@webship.co/workspace 1.0.0-beta1 → 1.0.0-beta2
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.
- package/LICENSE +339 -0
- package/README.md +28 -364
- package/core/bin/workspace.js +135 -0
- package/core/config/settings.labels.yml +514 -0
- package/core/config/settings.template.yml +292 -0
- package/core/config/style.yml +53 -0
- package/core/config/theme.default.yml +161 -0
- package/core/config/theme.dispatch.yml +166 -0
- package/core/config/theme.drupal.yml +175 -0
- package/core/config/theme.ember.yml +160 -0
- package/core/config/theme.github.yml +172 -0
- package/core/config/theme.gitlab.yml +168 -0
- package/core/config/theme.press.yml +161 -0
- package/core/config/theme.slate.yml +160 -0
- package/core/config/theme.upsun.yml +174 -0
- package/core/docs/architecture.svg +65 -0
- package/core/docs/getting-started.md +51 -0
- package/core/docs/plugins.md +27 -0
- package/core/docs/releases.md +23 -0
- package/core/docs/testing.md +15 -0
- package/core/docs/workspaces.md +25 -0
- package/core/scripts/args/arg-ai-items.sh +65 -0
- package/core/scripts/args/arg-autostart.sh +31 -0
- package/core/scripts/args/arg-avatar-agent.sh +28 -0
- package/core/scripts/args/arg-avatar-catalog.sh +12 -0
- package/core/scripts/args/arg-avatar-character.sh +68 -0
- package/core/scripts/args/arg-avatar-voice.sh +24 -0
- package/core/scripts/args/arg-avatar.sh +22 -0
- package/core/scripts/args/arg-checks.sh +36 -0
- package/core/scripts/args/arg-clone.sh +42 -0
- package/core/scripts/args/arg-commands.sh +51 -0
- package/core/scripts/args/arg-cucumber.sh +34 -0
- package/core/scripts/args/arg-distribution.sh +30 -0
- package/core/scripts/args/arg-drupal.sh +39 -0
- package/core/scripts/args/arg-drupal_cms.sh +18 -0
- package/core/scripts/args/arg-gitlab-ci-local.sh +25 -0
- package/core/scripts/args/arg-graphify.sh +36 -0
- package/core/scripts/args/arg-graphs.sh +12 -0
- package/core/scripts/args/arg-hostnames.sh +23 -0
- package/core/scripts/args/arg-milvus-backup.sh +8 -0
- package/core/scripts/args/arg-milvus-mcp.sh +12 -0
- package/core/scripts/args/arg-milvus.sh +32 -0
- package/core/scripts/args/arg-obsidian.sh +17 -0
- package/core/scripts/args/arg-odoo.sh +18 -0
- package/core/scripts/args/arg-penpot-backup.sh +8 -0
- package/core/scripts/args/arg-penpot-mcp.sh +15 -0
- package/core/scripts/args/arg-penpot-token.sh +17 -0
- package/core/scripts/args/arg-penpot.sh +44 -0
- package/core/scripts/args/arg-rag.sh +21 -0
- package/core/scripts/args/arg-ragify.sh +35 -0
- package/core/scripts/args/arg-reclaim.sh +18 -0
- package/core/scripts/args/arg-release.sh +21 -0
- package/core/scripts/args/arg-screen.sh +28 -0
- package/core/scripts/args/arg-site-template.sh +13 -0
- package/core/scripts/args/arg-spdd.sh +16 -0
- package/core/scripts/args/arg-specs.sh +22 -0
- package/core/scripts/args/arg-storage.sh +36 -0
- package/core/scripts/args/arg-testing.sh +36 -0
- package/core/scripts/args/arg-webship.sh +34 -0
- package/core/scripts/args/arg-webships-project.sh +22 -0
- package/core/scripts/args/arg-webships-site-template.sh +17 -0
- package/core/scripts/args/arg-webships.sh +34 -0
- package/core/scripts/args/arg-website-site-template.sh +17 -0
- package/core/scripts/args/arg-website.sh +25 -0
- package/core/scripts/args/arg-wordpress.sh +18 -0
- package/core/scripts/autostart-run.sh +162 -0
- package/core/scripts/autostart-stop.sh +30 -0
- package/core/scripts/autostart-watch.sh +43 -0
- package/core/scripts/autostart.sh +26 -0
- package/core/scripts/bootstrap-functions.sh +117 -0
- package/core/scripts/bootstrap-libraries.sh +10 -0
- package/core/scripts/bootstrap.sh +71 -0
- package/core/scripts/ddev-shim/ddev +122 -0
- package/core/scripts/docker-gid.sh +119 -0
- package/core/scripts/functions/arg-site-template.sh +28 -0
- package/core/scripts/functions/fun-ai-items-lock.sh +175 -0
- package/core/scripts/functions/fun-ai-items-sources.sh +298 -0
- package/core/scripts/functions/fun-ai-items.sh +621 -0
- package/core/scripts/functions/fun-ai-providers.sh +72 -0
- package/core/scripts/functions/fun-autostart.sh +429 -0
- package/core/scripts/functions/fun-avatar.sh +441 -0
- package/core/scripts/functions/fun-backup-item.sh +50 -0
- package/core/scripts/functions/fun-build-distribution.sh +226 -0
- package/core/scripts/functions/fun-build-site-template.sh +104 -0
- package/core/scripts/functions/fun-build-webships.sh +161 -0
- package/core/scripts/functions/fun-build-website.sh +199 -0
- package/core/scripts/functions/fun-checks.sh +243 -0
- package/core/scripts/functions/fun-clone-project.sh +289 -0
- package/core/scripts/functions/fun-commands.sh +521 -0
- package/core/scripts/functions/fun-database.sh +63 -0
- package/core/scripts/functions/fun-ddev-hostnames.sh +213 -0
- package/core/scripts/functions/fun-ddev-nodejs.sh +15 -0
- package/core/scripts/functions/fun-ddev-telemetry.sh +15 -0
- package/core/scripts/functions/fun-default-settings.sh +28 -0
- package/core/scripts/functions/fun-distribution-cucumber.sh +45 -0
- package/core/scripts/functions/fun-distribution-drupal.sh +25 -0
- package/core/scripts/functions/fun-distribution-drupal_cms.sh +35 -0
- package/core/scripts/functions/fun-distribution-webship.sh +28 -0
- package/core/scripts/functions/fun-distribution-webships.sh +33 -0
- package/core/scripts/functions/fun-distribution-website.sh +19 -0
- package/core/scripts/functions/fun-drush.sh +48 -0
- package/core/scripts/functions/fun-elevenlabs.sh +179 -0
- package/core/scripts/functions/fun-files.sh +19 -0
- package/core/scripts/functions/fun-git-worktrees.sh +142 -0
- package/core/scripts/functions/fun-gitlab-ci.sh +156 -0
- package/core/scripts/functions/fun-hostnames-cli.sh +88 -0
- package/core/scripts/functions/fun-milvus.sh +584 -0
- package/core/scripts/functions/fun-odoo.sh +121 -0
- package/core/scripts/functions/fun-penpot.sh +724 -0
- package/core/scripts/functions/fun-project-name.sh +20 -0
- package/core/scripts/functions/fun-rag.sh +253 -0
- package/core/scripts/functions/fun-ragify.sh +165 -0
- package/core/scripts/functions/fun-reclaim.sh +297 -0
- package/core/scripts/functions/fun-release.sh +159 -0
- package/core/scripts/functions/fun-remove-project.sh +319 -0
- package/core/scripts/functions/fun-screen.sh +96 -0
- package/core/scripts/functions/fun-spdd.sh +676 -0
- package/core/scripts/functions/fun-specs-share.sh +237 -0
- package/core/scripts/functions/fun-storage.sh +347 -0
- package/core/scripts/functions/fun-testing.sh +329 -0
- package/core/scripts/functions/fun-users.sh +87 -0
- package/core/scripts/functions/fun-version.sh +72 -0
- package/core/scripts/functions/fun-video-edit.sh +48 -0
- package/core/scripts/functions/fun-voice.sh +45 -0
- package/core/scripts/functions/fun-wordpress.sh +59 -0
- package/core/scripts/host-mounts.sh +161 -0
- package/core/scripts/install.sh +602 -0
- package/core/scripts/libs/__pycache__/video_edit.cpython-312.pyc +0 -0
- package/core/scripts/libs/argparse.sh +93 -0
- package/core/scripts/libs/bash-yaml.sh +52 -0
- package/core/scripts/libs/checks_plan.js +312 -0
- package/core/scripts/libs/elevenlabs.py +627 -0
- package/core/scripts/libs/progress-bar.sh +19 -0
- package/core/scripts/libs/rag_index.py +446 -0
- package/core/scripts/libs/video_edit.py +636 -0
- package/core/scripts/libs/voice.py +430 -0
- package/core/scripts/plugins/jira/host-install.sh +119 -0
- package/core/scripts/plugins/jira/host-mounts.txt +2 -0
- package/core/scripts/plugins/upsun/args/arg-upsun.sh +51 -0
- package/core/scripts/plugins/upsun/functions/fun-upsun.sh +304 -0
- package/core/scripts/plugins/upsun/host-install.sh +99 -0
- package/core/scripts/plugins/upsun/host-mounts.txt +1 -0
- package/core/scripts/plugins/upsun/upsun-ai.sh +133 -0
- package/core/scripts/plugins.sh +152 -0
- package/core/scripts/release.sh +69 -0
- package/core/scripts/storage.sh +39 -0
- package/core/scripts/sync-tooling.sh +246 -0
- package/core/scripts/tests/cmd-smoke-test.sh +109 -0
- package/core/scripts/trust-https.sh +257 -0
- package/core/workspace-app/.ddev/commands/web/test-dashboard +49 -0
- package/core/workspace-app/.ddev/config.yaml +400 -0
- package/core/workspace-app/.ddev/docker-compose.dood.yaml +45 -0
- package/core/workspace-app/.ddev/docker-compose.plugin-jira-twg.yaml +26 -0
- package/core/workspace-app/.ddev/docker-compose.plugin-upsun-upsun-cli.yaml +8 -0
- package/core/workspace-app/.ddev/docker-compose.screens.yaml +15 -0
- package/core/workspace-app/.ddev/nginx_full/nginx-site.conf +114 -0
- package/core/workspace-app/.ddev/web-build/Dockerfile.workspace-app +203 -0
- package/core/workspace-app/.ddev/web-build/ddev-shim-ddev +122 -0
- package/core/workspace-app/README.md +380 -0
- package/{actions → core/workspace-app/actions}/ddev.js +0 -1
- package/{actions → core/workspace-app/actions}/rag.js +0 -1
- package/{actions → core/workspace-app/actions}/testing.js +0 -1
- package/{assistant.js → core/workspace-app/assistant.js} +1 -10
- package/{git-info.js → core/workspace-app/git-info.js} +17 -1
- package/core/workspace-app/package.json +29 -0
- package/core/workspace-app/plugin-catalog.js +50 -0
- package/{plugins-page.js → core/workspace-app/plugins-page.js} +28 -2
- package/{server.js → core/workspace-app/server.js} +18 -0
- package/core/workspace-app/tests/features/actions-rail.feature +44 -0
- package/core/workspace-app/tests/features/ai-items.feature +23 -0
- package/core/workspace-app/tests/features/assistant-speech.feature +63 -0
- package/core/workspace-app/tests/features/checks.feature +39 -0
- package/core/workspace-app/tests/features/clone-project.feature +30 -0
- package/core/workspace-app/tests/features/command-authoring.feature +58 -0
- package/core/workspace-app/tests/features/dashboard.feature +57 -0
- package/core/workspace-app/tests/features/menus.feature +29 -0
- package/core/workspace-app/tests/features/plugins/jira/jira.feature +47 -0
- package/core/workspace-app/tests/features/plugins.feature +20 -0
- package/core/workspace-app/tests/features/project-actions.feature +40 -0
- package/core/workspace-app/tests/features/screens.feature +29 -0
- package/core/workspace-app/tests/features/settings.feature +46 -0
- package/core/workspace-app/tests/features/test-reports.feature +32 -0
- package/core/workspace-app/tests/features/theme.feature +40 -0
- package/core/workspace-app/tests/step-definitions/actions-post.steps.js +25 -0
- package/core/workspace-app/tests/step-definitions/assistant-speech.steps.js +152 -0
- package/core/workspace-app/tests/step-definitions/preconditions.steps.js +100 -0
- package/core/workspace-app/tests/unit/_isolated-config.js +31 -0
- package/core/workspace-app/tests/unit/accessibility.test.js +124 -0
- package/core/workspace-app/tests/unit/actions-rail-ux.test.js +56 -0
- package/core/workspace-app/tests/unit/actions-rail.test.js +51 -0
- package/core/workspace-app/tests/unit/ai-inventory.test.js +64 -0
- package/core/workspace-app/tests/unit/app-docs.test.js +64 -0
- package/core/workspace-app/tests/unit/assistant-avatar.test.js +110 -0
- package/core/workspace-app/tests/unit/assistant-cast.test.js +105 -0
- package/core/workspace-app/tests/unit/assistant-send-animation.test.js +15 -0
- package/core/workspace-app/tests/unit/assistant-suggestions.test.js +112 -0
- package/core/workspace-app/tests/unit/assistant-switches.test.js +53 -0
- package/core/workspace-app/tests/unit/assistant-views.test.js +146 -0
- package/core/workspace-app/tests/unit/assistant-working-indicator.test.js +49 -0
- package/core/workspace-app/tests/unit/assistant.test.js +61 -0
- package/core/workspace-app/tests/unit/audio-player.test.js +147 -0
- package/core/workspace-app/tests/unit/audio-voice.test.js +634 -0
- package/core/workspace-app/tests/unit/auth-google.test.js +180 -0
- package/core/workspace-app/tests/unit/autostart-watch.test.js +76 -0
- package/core/workspace-app/tests/unit/browsers.test.js +76 -0
- package/core/workspace-app/tests/unit/build-distribution.test.js +125 -0
- package/core/workspace-app/tests/unit/build-order.test.js +153 -0
- package/core/workspace-app/tests/unit/builder-args.test.js +113 -0
- package/core/workspace-app/tests/unit/builders.test.js +158 -0
- package/core/workspace-app/tests/unit/card-state-toggle.test.js +29 -0
- package/core/workspace-app/tests/unit/changelog.test.js +177 -0
- package/core/workspace-app/tests/unit/chat-thread.test.js +92 -0
- package/core/workspace-app/tests/unit/checks-plan.test.js +205 -0
- package/core/workspace-app/tests/unit/claude-args.test.js +182 -0
- package/core/workspace-app/tests/unit/claude-code-here.test.js +15 -0
- package/core/workspace-app/tests/unit/claude-resume.test.js +147 -0
- package/core/workspace-app/tests/unit/claude-screen-options.test.js +84 -0
- package/core/workspace-app/tests/unit/claude-session.test.js +41 -0
- package/core/workspace-app/tests/unit/command-flags.test.js +45 -0
- package/core/workspace-app/tests/unit/command-palette.test.js +105 -0
- package/core/workspace-app/tests/unit/commands-center.test.js +338 -0
- package/core/workspace-app/tests/unit/composer-menu.test.js +187 -0
- package/core/workspace-app/tests/unit/config-yaml.test.js +116 -0
- package/core/workspace-app/tests/unit/confirm-dialog.test.js +69 -0
- package/core/workspace-app/tests/unit/create-card.test.js +85 -0
- package/core/workspace-app/tests/unit/ddev-addons.test.js +144 -0
- package/core/workspace-app/tests/unit/ddev-auth-ssh.test.js +40 -0
- package/core/workspace-app/tests/unit/ddev-custom-commands.test.js +56 -0
- package/core/workspace-app/tests/unit/ddev-diagnose.test.js +57 -0
- package/core/workspace-app/tests/unit/ddev-domains.test.js +153 -0
- package/core/workspace-app/tests/unit/ddev-hostnames.test.js +143 -0
- package/core/workspace-app/tests/unit/ddev-import.test.js +82 -0
- package/core/workspace-app/tests/unit/ddev-mail.test.js +135 -0
- package/core/workspace-app/tests/unit/ddev-menu-and-create.test.js +28 -0
- package/core/workspace-app/tests/unit/ddev-mutagen.test.js +37 -0
- package/core/workspace-app/tests/unit/ddev-options.test.js +51 -0
- package/core/workspace-app/tests/unit/ddev-share.test.js +40 -0
- package/core/workspace-app/tests/unit/ddev-shim.test.js +57 -0
- package/core/workspace-app/tests/unit/ddev-snapshots.test.js +142 -0
- package/core/workspace-app/tests/unit/ddev-start-daemons.test.js +62 -0
- package/core/workspace-app/tests/unit/ddev-xdebug.test.js +41 -0
- package/core/workspace-app/tests/unit/deep-chat-origin.test.js +38 -0
- package/core/workspace-app/tests/unit/density.test.js +52 -0
- package/core/workspace-app/tests/unit/elevenlabs.test.js +453 -0
- package/core/workspace-app/tests/unit/event-log.test.js +102 -0
- package/core/workspace-app/tests/unit/favicon.test.js +68 -0
- package/core/workspace-app/tests/unit/files-browser.test.js +224 -0
- package/core/workspace-app/tests/unit/git-info.test.js +26 -0
- package/core/workspace-app/tests/unit/grid-and-list.test.js +103 -0
- package/core/workspace-app/tests/unit/host-tool-wrapper.test.js +18 -0
- package/core/workspace-app/tests/unit/html-patterns.test.js +51 -0
- package/core/workspace-app/tests/unit/ide-infra.test.js +28 -0
- package/core/workspace-app/tests/unit/images-ai.test.js +201 -0
- package/core/workspace-app/tests/unit/images-create.test.js +59 -0
- package/core/workspace-app/tests/unit/images-providers.test.js +248 -0
- package/core/workspace-app/tests/unit/images-svg.test.js +213 -0
- package/core/workspace-app/tests/unit/images-workspace.test.js +144 -0
- package/core/workspace-app/tests/unit/jobs-fragment.test.js +66 -0
- package/core/workspace-app/tests/unit/media-ux.test.js +164 -0
- package/core/workspace-app/tests/unit/modal-fit.test.js +87 -0
- package/core/workspace-app/tests/unit/modules-load.test.js +23 -0
- package/core/workspace-app/tests/unit/narration.test.js +186 -0
- package/core/workspace-app/tests/unit/navigation-editor.test.js +260 -0
- package/core/workspace-app/tests/unit/navigation.test.js +254 -0
- package/core/workspace-app/tests/unit/new-folder.test.js +121 -0
- package/core/workspace-app/tests/unit/new-screen-form.test.js +149 -0
- package/core/workspace-app/tests/unit/node-menu.test.js +161 -0
- package/core/workspace-app/tests/unit/notes.test.js +128 -0
- package/core/workspace-app/tests/unit/page-structure.test.js +40 -0
- package/core/workspace-app/tests/unit/page-width.test.js +59 -0
- package/core/workspace-app/tests/unit/php-version.test.js +90 -0
- package/core/workspace-app/tests/unit/plan-card.test.js +44 -0
- package/core/workspace-app/tests/unit/plugin-catalog.test.js +31 -0
- package/core/workspace-app/tests/unit/plugin-system.test.js +251 -0
- package/core/workspace-app/tests/unit/plugins-page.test.js +28 -0
- package/core/workspace-app/tests/unit/plugins.test.js +58 -0
- package/core/workspace-app/tests/unit/project-activity-filter.test.js +180 -0
- package/core/workspace-app/tests/unit/project-make.test.js +143 -0
- package/core/workspace-app/tests/unit/project-name.test.js +202 -0
- package/core/workspace-app/tests/unit/reader.test.js +62 -0
- package/core/workspace-app/tests/unit/release.test.js +92 -0
- package/core/workspace-app/tests/unit/remove-confirm.test.js +37 -0
- package/core/workspace-app/tests/unit/report-pdf.test.js +171 -0
- package/core/workspace-app/tests/unit/round-11.test.js +31 -0
- package/core/workspace-app/tests/unit/round-12.test.js +37 -0
- package/core/workspace-app/tests/unit/row-layout.test.js +585 -0
- package/core/workspace-app/tests/unit/row-menus-fold.test.js +29 -0
- package/core/workspace-app/tests/unit/rows-add-modal.test.js +68 -0
- package/core/workspace-app/tests/unit/screen-runner-queue.test.js +41 -0
- package/core/workspace-app/tests/unit/screen-window.test.js +116 -0
- package/core/workspace-app/tests/unit/screens-beside-running.test.js +19 -0
- package/core/workspace-app/tests/unit/screens-columns.test.js +79 -0
- package/core/workspace-app/tests/unit/screens-menu.test.js +84 -0
- package/core/workspace-app/tests/unit/screens-modal-overlay.test.js +14 -0
- package/core/workspace-app/tests/unit/screens-waiting.test.js +129 -0
- package/core/workspace-app/tests/unit/screens.test.js +74 -0
- package/core/workspace-app/tests/unit/second-storage.test.js +218 -0
- package/core/workspace-app/tests/unit/session-name.test.js +64 -0
- package/core/workspace-app/tests/unit/settings-file.test.js +173 -0
- package/core/workspace-app/tests/unit/settings-nested-list.test.js +54 -0
- package/core/workspace-app/tests/unit/settings-raw.test.js +177 -0
- package/core/workspace-app/tests/unit/shared-prefs.test.js +49 -0
- package/core/workspace-app/tests/unit/speech.test.js +290 -0
- package/core/workspace-app/tests/unit/static-caching.test.js +39 -0
- package/core/workspace-app/tests/unit/status-language.test.js +47 -0
- package/core/workspace-app/tests/unit/tab-modal.test.js +69 -0
- package/core/workspace-app/tests/unit/tab-title.test.js +37 -0
- package/core/workspace-app/tests/unit/template-literals.test.js +52 -0
- package/core/workspace-app/tests/unit/terminal-scrollback.test.js +61 -0
- package/core/workspace-app/tests/unit/terminal-size.test.js +103 -0
- package/core/workspace-app/tests/unit/terminal-style.test.js +84 -0
- package/core/workspace-app/tests/unit/terminal-windows.test.js +154 -0
- package/core/workspace-app/tests/unit/themes.test.js +453 -0
- package/core/workspace-app/tests/unit/tool-labels.test.js +34 -0
- package/core/workspace-app/tests/unit/topbar-icons.test.js +47 -0
- package/core/workspace-app/tests/unit/update-docker-gid.test.js +51 -0
- package/core/workspace-app/tests/unit/user-guide.test.js +60 -0
- package/core/workspace-app/tests/unit/version-check.test.js +98 -0
- package/core/workspace-app/tests/unit/version-link.test.js +50 -0
- package/core/workspace-app/tests/unit/video-borrow.test.js +198 -0
- package/core/workspace-app/tests/unit/video-edit-ask.test.js +93 -0
- package/core/workspace-app/tests/unit/video-edit-short.test.js +42 -0
- package/core/workspace-app/tests/unit/video-edit.test.js +417 -0
- package/core/workspace-app/tests/unit/video-transcript.test.js +237 -0
- package/core/workspace-app/tests/unit/waiting.test.js +48 -0
- package/core/workspace-app/tests/unit/wordpress-odoo-builders.test.js +38 -0
- package/core/workspace-app/tests/unit/workspace-bin.test.js +48 -0
- package/core/workspace-app/tests/unit/workspace-card-tools.test.js +30 -0
- package/core/workspace-app/tests/unit/workspace-delete.test.js +77 -0
- package/core/workspace-app/tests/unit/workspace-types.test.js +68 -0
- package/core/workspace-app/tests/unit/worktree-clone.test.js +250 -0
- package/package.json +38 -36
- /package/{PLUGINS.md → core/workspace-app/PLUGINS.md} +0 -0
- /package/{WORKSPACES.md → core/workspace-app/WORKSPACES.md} +0 -0
- /package/{actions → core/workspace-app/actions}/ai-items.js +0 -0
- /package/{actions → core/workspace-app/actions}/audio.js +0 -0
- /package/{actions → core/workspace-app/actions}/build-order.js +0 -0
- /package/{actions → core/workspace-app/actions}/checks.js +0 -0
- /package/{actions → core/workspace-app/actions}/claude-session.js +0 -0
- /package/{actions → core/workspace-app/actions}/commands-center.js +0 -0
- /package/{actions → core/workspace-app/actions}/composer.js +0 -0
- /package/{actions → core/workspace-app/actions}/ddev-addons.js +0 -0
- /package/{actions → core/workspace-app/actions}/ddev-mail.js +0 -0
- /package/{actions → core/workspace-app/actions}/folders.js +0 -0
- /package/{actions → core/workspace-app/actions}/images-svg.js +0 -0
- /package/{actions → core/workspace-app/actions}/images.js +0 -0
- /package/{actions → core/workspace-app/actions}/navigation.js +0 -0
- /package/{actions → core/workspace-app/actions}/node.js +0 -0
- /package/{actions → core/workspace-app/actions}/notes.js +0 -0
- /package/{actions → core/workspace-app/actions}/plugins.js +0 -0
- /package/{actions → core/workspace-app/actions}/project-make.js +0 -0
- /package/{actions → core/workspace-app/actions}/row-actions.js +0 -0
- /package/{actions → core/workspace-app/actions}/screens.js +0 -0
- /package/{actions → core/workspace-app/actions}/video-edit.js +0 -0
- /package/{ai-inventory.js → core/workspace-app/ai-inventory.js} +0 -0
- /package/{ai-items.js → core/workspace-app/ai-items.js} +0 -0
- /package/{assistant-cast.js → core/workspace-app/assistant-cast.js} +0 -0
- /package/{assistant-suggestions.js → core/workspace-app/assistant-suggestions.js} +0 -0
- /package/{audio-voice.js → core/workspace-app/audio-voice.js} +0 -0
- /package/{auth-google.js → core/workspace-app/auth-google.js} +0 -0
- /package/{build-ai.js → core/workspace-app/build-ai.js} +0 -0
- /package/{build-order-page.js → core/workspace-app/build-order-page.js} +0 -0
- /package/{build-order.js → core/workspace-app/build-order.js} +0 -0
- /package/{builder-args.js → core/workspace-app/builder-args.js} +0 -0
- /package/{changelog.js → core/workspace-app/changelog.js} +0 -0
- /package/{chat-threads.js → core/workspace-app/chat-threads.js} +0 -0
- /package/{checks.js → core/workspace-app/checks.js} +0 -0
- /package/{claude-args.js → core/workspace-app/claude-args.js} +0 -0
- /package/{claude-sessions.js → core/workspace-app/claude-sessions.js} +0 -0
- /package/{command-author.js → core/workspace-app/command-author.js} +0 -0
- /package/{command-block.js → core/workspace-app/command-block.js} +0 -0
- /package/{commands → core/workspace-app/commands}/defaults.yml +0 -0
- /package/{commands-page.js → core/workspace-app/commands-page.js} +0 -0
- /package/{commands.js → core/workspace-app/commands.js} +0 -0
- /package/{cucumber.js → core/workspace-app/cucumber.js} +0 -0
- /package/{ddev-addons-page.js → core/workspace-app/ddev-addons-page.js} +0 -0
- /package/{ddev-addons.js → core/workspace-app/ddev-addons.js} +0 -0
- /package/{ddev-custom-commands.js → core/workspace-app/ddev-custom-commands.js} +0 -0
- /package/{ddev-domains.js → core/workspace-app/ddev-domains.js} +0 -0
- /package/{ddev-import.js → core/workspace-app/ddev-import.js} +0 -0
- /package/{ddev-mail-page.js → core/workspace-app/ddev-mail-page.js} +0 -0
- /package/{ddev-mail.js → core/workspace-app/ddev-mail.js} +0 -0
- /package/{ddev-options.js → core/workspace-app/ddev-options.js} +0 -0
- /package/{ddev-snapshots.js → core/workspace-app/ddev-snapshots.js} +0 -0
- /package/{ddev.js → core/workspace-app/ddev.js} +0 -0
- /package/{docs → core/workspace-app/docs}/DEVELOPER-GUIDE.md +0 -0
- /package/{docs → core/workspace-app/docs}/README.md +0 -0
- /package/{docs → core/workspace-app/docs}/REFERENCE.md +0 -0
- /package/{docs → core/workspace-app/docs}/USER-GUIDE.md +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-board.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-coffee.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-colours.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-icons.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-moves.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-pick-cookieman.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-settings-voices.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-status.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/create-card/create-card.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/create-card/start-ai.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-address.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-off.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-on.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-ddev-menu.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-domains.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-home.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-ide-menu.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-remove-refusal.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-rows-worktree.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-screens.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-settings.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/guide-workspace-page.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/home/card-settings.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/home/drag-reorder.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/home/edit-card.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/claude-code-image.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/edit-with-ai.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/gallery.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/generate-description.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/generate-plan.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/providers.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/svg-form.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/svg-result.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/images/upload.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/new-folder/2-form.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/new-folder/8-ddev-options.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/new-folder/files-folder.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/projects/ddev-custom-commands.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/projects/state-chip-stop.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-dark.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-light.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-dark.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-light.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-dark.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-light.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/ai.svg +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/code.svg +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/docs.svg +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/services.svg +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/sites.svg +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-dark.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-light.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/test-scenarios.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/test-steps.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-dark.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-light.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/screens-menu.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/screens-new.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/settings/auth-google-lists.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-1-row.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-2-confirm.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-3-type-name.png +0 -0
- /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-4-type-yes.png +0 -0
- /package/{event-log.js → core/workspace-app/event-log.js} +0 -0
- /package/{files-browser.js → core/workspace-app/files-browser.js} +0 -0
- /package/{folders.js → core/workspace-app/folders.js} +0 -0
- /package/{format.js → core/workspace-app/format.js} +0 -0
- /package/{github-auth.js → core/workspace-app/github-auth.js} +0 -0
- /package/{html.js → core/workspace-app/html.js} +0 -0
- /package/{icons.js → core/workspace-app/icons.js} +0 -0
- /package/{images-ai.js → core/workspace-app/images-ai.js} +0 -0
- /package/{images-create.js → core/workspace-app/images-create.js} +0 -0
- /package/{images-page.js → core/workspace-app/images-page.js} +0 -0
- /package/{images-records.js → core/workspace-app/images-records.js} +0 -0
- /package/{images-render.js → core/workspace-app/images-render.js} +0 -0
- /package/{images-svg-core.js → core/workspace-app/images-svg-core.js} +0 -0
- /package/{images-svg-sanitize.js → core/workspace-app/images-svg-sanitize.js} +0 -0
- /package/{images-svg.js → core/workspace-app/images-svg.js} +0 -0
- /package/{images.js → core/workspace-app/images.js} +0 -0
- /package/{jobs.js → core/workspace-app/jobs.js} +0 -0
- /package/{linger.js → core/workspace-app/linger.js} +0 -0
- /package/{lists.js → core/workspace-app/lists.js} +0 -0
- /package/{media-info.js → core/workspace-app/media-info.js} +0 -0
- /package/{navigation-page.js → core/workspace-app/navigation-page.js} +0 -0
- /package/{navigation.js → core/workspace-app/navigation.js} +0 -0
- /package/{notes.js → core/workspace-app/notes.js} +0 -0
- /package/{palette-index.js → core/workspace-app/palette-index.js} +0 -0
- /package/{playwright.config.js → core/workspace-app/playwright.config.js} +0 -0
- /package/{plugin-install.js → core/workspace-app/plugin-install.js} +0 -0
- /package/{plugin-loader.js → core/workspace-app/plugin-loader.js} +0 -0
- /package/{plugin-manifest.js → core/workspace-app/plugin-manifest.js} +0 -0
- /package/{plugin-settings.js → core/workspace-app/plugin-settings.js} +0 -0
- /package/{plugins → core/workspace-app/plugins}/workspace-notes/index.js +0 -0
- /package/{project-make.js → core/workspace-app/project-make.js} +0 -0
- /package/{project-name.js → core/workspace-app/project-name.js} +0 -0
- /package/{public → core/workspace-app/public}/assistant-avatar-moves.js +0 -0
- /package/{public → core/workspace-app/public}/assistant-avatar-ui.js +0 -0
- /package/{public → core/workspace-app/public}/assistant-avatar.js +0 -0
- /package/{public → core/workspace-app/public}/avatar/druplicon.vrm +0 -0
- /package/{public → core/workspace-app/public}/css/base.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/ai-assistant.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/assistant-avatar.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/assistant-views.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/build-order.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/clone-as-a-git-worktree.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/command-palette.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/commands-center.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/confirm-dialog.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/create-card.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/ddev-menu.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/deep-chat.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/density.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/floating-assistant-workspace-pages.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/folders.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/full-height-left-assistant-sidebar-all-pages.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/full-height-right-actions-rail-pages-that-have-actions.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/grid-and-list.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/help-page.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/hero.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/images.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/layout-rhythm-and-spacing-polish.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/mic-on-any-field-that-wants-typing.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/modal-fit.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/page-width.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/plugins-page.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/project-cards.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/project-rows.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/reordering-the-workspace-cards.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/responsive-home-and-the-workspace-pages.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/running-commands-as-toasts.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/settings-editor-core-config-yml.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/short-results-as-a-toast-at-the-top.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/sound-player.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/suggest-agents-skills-commands.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/tab-modal.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/terminals.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/test-report-media-one-file-per-row-paged.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/top-toolbar-logo-breadcrumb.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/video-edit.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/web-ide-open-with.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/working-indicators.css +0 -0
- /package/{public → core/workspace-app/public}/css/components/workspace-cards.css +0 -0
- /package/{public → core/workspace-app/public}/favicon.ico +0 -0
- /package/{public → core/workspace-app/public}/favicon.png +0 -0
- /package/{public → core/workspace-app/public}/htmx.min.js +0 -0
- /package/{public → core/workspace-app/public}/logo.png +0 -0
- /package/{public → core/workspace-app/public}/media-player.js +0 -0
- /package/{public → core/workspace-app/public}/mic.js +0 -0
- /package/{public → core/workspace-app/public}/narration.js +0 -0
- /package/{public → core/workspace-app/public}/palette.js +0 -0
- /package/{public → core/workspace-app/public}/sortable.js +0 -0
- /package/{public → core/workspace-app/public}/suggest.js +0 -0
- /package/{public → core/workspace-app/public}/terminal.js +0 -0
- /package/{public → core/workspace-app/public}/themes/default/theme.css +0 -0
- /package/{public → core/workspace-app/public}/themes/ember/theme.css +0 -0
- /package/{public → core/workspace-app/public}/themes/press/theme.css +0 -0
- /package/{public → core/workspace-app/public}/themes/slate/theme.css +0 -0
- /package/{public → core/workspace-app/public}/touch-icon.png +0 -0
- /package/{public → core/workspace-app/public}/ui.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/LICENSE.txt +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/ace.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/ext-language_tools.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/ext-searchbox.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/mode-css.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/mode-html.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/mode-javascript.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/mode-markdown.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/mode-sh.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/mode-yaml.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/theme-textmate.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/theme-tomorrow_night.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/ace/worker-yaml.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/deep-chat.LICENSE +0 -0
- /package/{public → core/workspace-app/public}/vendor/deep-chat.bundle.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-LICENSE.txt +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/figtree-LICENSE.txt +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-LICENSE.txt +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-LICENSE.txt +0 -0
- /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
- /package/{public → core/workspace-app/public}/vendor/tabler-LICENSE.txt +0 -0
- /package/{public → core/workspace-app/public}/vendor/tabler-sprite.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/three/LICENSE +0 -0
- /package/{public → core/workspace-app/public}/vendor/three/addons/loaders/GLTFLoader.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/three/addons/utils/BufferGeometryUtils.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/three/addons/utils/SkeletonUtils.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/three/three.core.min.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/three/three.module.min.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/three-vrm/LICENSE +0 -0
- /package/{public → core/workspace-app/public}/vendor/three-vrm/three-vrm.module.min.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/uikit-icons.min.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/uikit.min.css +0 -0
- /package/{public → core/workspace-app/public}/vendor/uikit.min.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/bookmark-outlined.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/headset.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/menu.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/pause.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/play.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/share.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-off.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-on.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/stop.svg +0 -0
- /package/{public → core/workspace-app/public}/vendor/xterm/addon-fit.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/xterm/addon-unicode11.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/xterm/addon-web-links.js +0 -0
- /package/{public → core/workspace-app/public}/vendor/xterm/xterm.css +0 -0
- /package/{public → core/workspace-app/public}/vendor/xterm/xterm.js +0 -0
- /package/{rag.js → core/workspace-app/rag.js} +0 -0
- /package/{reader.js → core/workspace-app/reader.js} +0 -0
- /package/{repo-blobs.js → core/workspace-app/repo-blobs.js} +0 -0
- /package/{report-pdf.js → core/workspace-app/report-pdf.js} +0 -0
- /package/{row-layout.js → core/workspace-app/row-layout.js} +0 -0
- /package/{screenrc → core/workspace-app/screenrc} +0 -0
- /package/{screens.js → core/workspace-app/screens.js} +0 -0
- /package/{scripts → core/workspace-app/scripts}/code-server-start.sh +0 -0
- /package/{scripts → core/workspace-app/scripts}/images-claude-finish.js +0 -0
- /package/{scripts → core/workspace-app/scripts}/screen-host.sh +0 -0
- /package/{scripts → core/workspace-app/scripts}/screen-runner.js +0 -0
- /package/{scripts → core/workspace-app/scripts}/screen-then.js +0 -0
- /package/{scripts → core/workspace-app/scripts}/update.sh +0 -0
- /package/{settings-file.js → core/workspace-app/settings-file.js} +0 -0
- /package/{speech.js → core/workspace-app/speech.js} +0 -0
- /package/{tab-modal.js → core/workspace-app/tab-modal.js} +0 -0
- /package/{test-reports.js → core/workspace-app/test-reports.js} +0 -0
- /package/{themes.js → core/workspace-app/themes.js} +0 -0
- /package/{transcripts.js → core/workspace-app/transcripts.js} +0 -0
- /package/{urls.js → core/workspace-app/urls.js} +0 -0
- /package/{validate.js → core/workspace-app/validate.js} +0 -0
- /package/{version-check.js → core/workspace-app/version-check.js} +0 -0
- /package/{video-edit.js → core/workspace-app/video-edit.js} +0 -0
- /package/{waiting.js → core/workspace-app/waiting.js} +0 -0
- /package/{workspace-card-tools.js → core/workspace-app/workspace-card-tools.js} +0 -0
- /package/{workspace-delete.js → core/workspace-app/workspace-delete.js} +0 -0
- /package/{workspace-types.js → core/workspace-app/workspace-types.js} +0 -0
- /package/{workspaces.js → core/workspace-app/workspaces.js} +0 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Milvus (https://github.com/milvus-io/milvus), self-hosted inside DDEV.
|
|
4
|
+
#
|
|
5
|
+
# Milvus standalone is three containers, not one: the database itself, etcd for its metadata, and
|
|
6
|
+
# MinIO for the segment/object store. Since 2.6 the write-ahead log is the built-in Woodpecker
|
|
7
|
+
# (MQ_TYPE=woodpecker), so there is no Pulsar or Kafka to run — that is the whole reason
|
|
8
|
+
# standalone is viable on a laptop. Attu is the web UI on top.
|
|
9
|
+
#
|
|
10
|
+
# Browser ──https──▶ ddev-router ──▶ ddev-<project>-web (nginx reverse proxy)
|
|
11
|
+
# ├─▶ milvus-attu:3000 the UI
|
|
12
|
+
# ├─▶ milvus-standalone:19530 /v2/… REST
|
|
13
|
+
# └─▶ milvus-standalone:9091 /webui/, /healthz
|
|
14
|
+
#
|
|
15
|
+
# pymilvus / MCP / notebook ──▶ 127.0.0.1:<grpc_port> ──▶ milvus-standalone:19530
|
|
16
|
+
#
|
|
17
|
+
# The gRPC port is PUBLISHED on the host, which the rest of this workspace's DDEV projects never
|
|
18
|
+
# need to do. It has to be: the DDEV router terminates HTTP(S) only, and every real Milvus client
|
|
19
|
+
# — pymilvus, the MCP server, LangChain — speaks gRPC. The HTTPS origin still gets the UI and the
|
|
20
|
+
# REST API, so nothing that can go through the router does anything else.
|
|
21
|
+
#
|
|
22
|
+
# The project is NOT a Drupal site: `--project-type=php` with settings management disabled and no
|
|
23
|
+
# docroot, because nothing in it is served from disk.
|
|
24
|
+
|
|
25
|
+
# parse_yaml keeps a value's own quotes, so `version: "v2.6.21"` reaches the shell as the
|
|
26
|
+
# nine-character string `"v2.6.21"` — which lands in an image tag as milvusdb/milvus:"v2.6.21"
|
|
27
|
+
# and makes every `${x:-fallback}` default silently stop working on an empty quoted string.
|
|
28
|
+
# Strip one layer of matching quotes from anything read from settings.
|
|
29
|
+
function milvus_setting() {
|
|
30
|
+
local value="$1";
|
|
31
|
+
case "${value}" in
|
|
32
|
+
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
|
33
|
+
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
|
34
|
+
esac
|
|
35
|
+
printf '%s' "${value}";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# The project a command acts on: the argument, else milvus.project from the settings.
|
|
39
|
+
function milvus_resolve_project() {
|
|
40
|
+
local given="$1" name;
|
|
41
|
+
if [ -n "${given}" ] && [ "${given}" != '_settings_' ] ; then
|
|
42
|
+
printf '%s' "${given}" ; return 0 ;
|
|
43
|
+
fi
|
|
44
|
+
name="$(milvus_setting "${milvus_project}")";
|
|
45
|
+
printf '%s' "${name:-milvus}";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# The one origin Attu is served on, resolved the same way build_milvus resolves it.
|
|
49
|
+
function milvus_resolve_url() {
|
|
50
|
+
local project="$1" setting;
|
|
51
|
+
setting="$(milvus_setting "${milvus_public_uri}")";
|
|
52
|
+
case "${setting:-hub}" in
|
|
53
|
+
hub) printf 'https://%s.%s.workspace.ddev.site' "${project}" "${doc_name}" ;;
|
|
54
|
+
canonical) printf 'https://%s.ddev.site' "${project}" ;;
|
|
55
|
+
*) printf '%s' "${setting}" ;;
|
|
56
|
+
esac
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# The host port an existing instance publishes Milvus on.
|
|
60
|
+
#
|
|
61
|
+
# Read from the compose file the build wrote, not from the settings: the settings hold the port to
|
|
62
|
+
# START scanning from, and an instance built while 19530 was busy is on 19531. Falls back to
|
|
63
|
+
# asking docker, then to the setting, so this answers for an instance built by an older version of
|
|
64
|
+
# this command too.
|
|
65
|
+
function milvus_host_port() {
|
|
66
|
+
local project="$1" compose port;
|
|
67
|
+
compose="${WORKSPACE_ROOT}/${doc_name}/${project}/.ddev/docker-compose.milvus.yaml";
|
|
68
|
+
|
|
69
|
+
if [ -f "${compose}" ] ; then
|
|
70
|
+
port="$(sed -n 's/^ *- "\([0-9]\+\):19530"$/\1/p' "${compose}" | head -1)";
|
|
71
|
+
[ -n "${port}" ] && { printf '%s' "${port}" ; return 0 ; }
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
port="$(docker port "ddev-${project}-milvus-standalone" 19530/tcp 2>/dev/null | head -1 | sed 's/.*://')";
|
|
75
|
+
[ -n "${port}" ] && { printf '%s' "${port}" ; return 0 ; }
|
|
76
|
+
|
|
77
|
+
port="$(milvus_setting "${milvus_grpc_port}")";
|
|
78
|
+
printf '%s' "${port:-19530}";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# What a client connects to. Everything in this workspace that is not a browser uses this:
|
|
82
|
+
# cmd-tools-ragify.sh, cmd-tools-rag.sh and the MCP server.
|
|
83
|
+
#
|
|
84
|
+
# Two answers, because these commands run in two places. On the HOST it is the published port. In a
|
|
85
|
+
# CONTAINER — the dashboard runs its jobs inside ddev-workspace-web — 127.0.0.1 is that container,
|
|
86
|
+
# and this machine's firewall drops container-to-host traffic anyway, so the published port is
|
|
87
|
+
# unreachable there. DDEV puts every project's containers on the shared `ddev_default` network, so
|
|
88
|
+
# the answer inside one is the Milvus container's own name: same port, same protocol, no proxy
|
|
89
|
+
# involved (Milvus multiplexes gRPC and REST on 19530).
|
|
90
|
+
function milvus_uri() {
|
|
91
|
+
local project="$1" port;
|
|
92
|
+
port="$(milvus_host_port "${project}")";
|
|
93
|
+
|
|
94
|
+
if [ -f /.dockerenv ] || [ -n "${DDEV_SITENAME}" ] ; then
|
|
95
|
+
printf 'http://ddev-%s-milvus-standalone:19530' "${project}";
|
|
96
|
+
return 0 ;
|
|
97
|
+
fi
|
|
98
|
+
printf 'http://127.0.0.1:%s' "${port}";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# The token clients authenticate with, empty when authorization is off (the default).
|
|
102
|
+
function milvus_token() {
|
|
103
|
+
local auth;
|
|
104
|
+
auth="$(milvus_setting "${milvus_authorization}")";
|
|
105
|
+
[ "${auth}" == 'true' ] || return 0 ;
|
|
106
|
+
printf '%s' "$(milvus_setting "${milvus_token}")";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Refuse politely rather than erroring deep inside pymilvus.
|
|
110
|
+
function milvus_require_running() {
|
|
111
|
+
local project="$1";
|
|
112
|
+
if ! docker ps --format '{{.Names}}' | grep -qx "ddev-${project}-milvus-standalone" ; then
|
|
113
|
+
echo "Milvus ${project} is not running.";
|
|
114
|
+
echo " Start it: cd ${WORKSPACE_ROOT}/${doc_name}/${project} && ddev start";
|
|
115
|
+
echo " Build it: cd ${WORKSPACE_ROOT}/${doc_name} && bash cmd-milvus-project.sh ${project}";
|
|
116
|
+
return 1 ;
|
|
117
|
+
fi
|
|
118
|
+
return 0 ;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# The next free host port from $1 upwards, as seen by docker — one instance per index set is a
|
|
122
|
+
# normal thing to want, and each publishes its own gRPC port.
|
|
123
|
+
function milvus_free_port() {
|
|
124
|
+
local port="$1" taken;
|
|
125
|
+
taken="$(docker ps --format '{{.Ports}}' 2>/dev/null)";
|
|
126
|
+
while printf '%s' "${taken}" | grep -q ":${port}->" ; do
|
|
127
|
+
port=$((port + 1));
|
|
128
|
+
if [ "${port}" -gt "$(( $1 + 40 ))" ] ; then
|
|
129
|
+
printf '%s' "$1" ; return 0 ; # give up scanning and let ddev report the conflict
|
|
130
|
+
fi
|
|
131
|
+
done
|
|
132
|
+
printf '%s' "${port}";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# Wait for Milvus to answer its own health endpoint. The container is "running" long before the
|
|
136
|
+
# database will accept a connection — a first start loads the WAL and creates the MinIO bucket —
|
|
137
|
+
# so anything that connects immediately after `ddev start` fails with a confusing gRPC error.
|
|
138
|
+
function milvus_wait_healthy() {
|
|
139
|
+
local project="$1" waited=0 limit="${2:-180}";
|
|
140
|
+
printf 'Waiting for Milvus to become healthy';
|
|
141
|
+
until docker exec "ddev-${project}-milvus-standalone" curl -sf http://localhost:9091/healthz > /dev/null 2>&1 ; do
|
|
142
|
+
printf '.';
|
|
143
|
+
sleep 3 ; waited=$((waited + 3));
|
|
144
|
+
if [ "${waited}" -ge "${limit}" ] ; then
|
|
145
|
+
printf '\n';
|
|
146
|
+
echo "Milvus did not report healthy within ${limit}s. Look at:";
|
|
147
|
+
echo " docker logs ddev-${project}-milvus-standalone";
|
|
148
|
+
return 1 ;
|
|
149
|
+
fi
|
|
150
|
+
done
|
|
151
|
+
printf ' healthy after %ss.\n' "${waited}";
|
|
152
|
+
return 0 ;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# Write .ddev/docker-compose.milvus.yaml for one instance.
|
|
156
|
+
#
|
|
157
|
+
# $1 the project directory, $2 the Milvus image tag, $3 the Attu tag, $4 the published gRPC port,
|
|
158
|
+
# $5 "true" to turn Milvus authentication on
|
|
159
|
+
function milvus_write_compose() {
|
|
160
|
+
local project_dir="$1" version="$2" attu_version="$3" grpc_port="$4" authorization="$5";
|
|
161
|
+
|
|
162
|
+
mkdir -p "${project_dir}/.ddev" ;
|
|
163
|
+
|
|
164
|
+
cat > "${project_dir}/.ddev/docker-compose.milvus.yaml" <<COMPOSEEOF
|
|
165
|
+
## Milvus standalone, orchestrated by DDEV.
|
|
166
|
+
## Written by cmd-milvus-project.sh — re-run that command rather than editing by hand.
|
|
167
|
+
## The DDEV web container (nginx) reverse-proxies the Attu UI, the REST API and the Milvus WebUI;
|
|
168
|
+
## the gRPC port is published on the host because the router speaks HTTP(S) only.
|
|
169
|
+
## Every service is on the DDEV project's 'default' network, so they resolve each other by name.
|
|
170
|
+
|
|
171
|
+
volumes:
|
|
172
|
+
milvus_etcd:
|
|
173
|
+
milvus_minio:
|
|
174
|
+
milvus_data:
|
|
175
|
+
|
|
176
|
+
services:
|
|
177
|
+
milvus-etcd:
|
|
178
|
+
container_name: ddev-\${DDEV_SITENAME}-milvus-etcd
|
|
179
|
+
image: "quay.io/coreos/etcd:v3.5.25"
|
|
180
|
+
restart: "no"
|
|
181
|
+
labels:
|
|
182
|
+
com.ddev.site-name: \${DDEV_SITENAME}
|
|
183
|
+
com.ddev.approot: \${DDEV_APPROOT}
|
|
184
|
+
environment:
|
|
185
|
+
ETCD_AUTO_COMPACTION_MODE: revision
|
|
186
|
+
ETCD_AUTO_COMPACTION_RETENTION: "1000"
|
|
187
|
+
ETCD_QUOTA_BACKEND_BYTES: "4294967296"
|
|
188
|
+
ETCD_SNAPSHOT_COUNT: "50000"
|
|
189
|
+
volumes:
|
|
190
|
+
- milvus_etcd:/etcd
|
|
191
|
+
command: etcd -advertise-client-urls=http://milvus-etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
|
|
192
|
+
healthcheck:
|
|
193
|
+
test: ["CMD", "etcdctl", "endpoint", "health"]
|
|
194
|
+
interval: 30s
|
|
195
|
+
timeout: 20s
|
|
196
|
+
retries: 3
|
|
197
|
+
|
|
198
|
+
milvus-minio:
|
|
199
|
+
container_name: ddev-\${DDEV_SITENAME}-milvus-minio
|
|
200
|
+
image: "minio/minio:RELEASE.2024-12-18T13-15-44Z"
|
|
201
|
+
restart: "no"
|
|
202
|
+
labels:
|
|
203
|
+
com.ddev.site-name: \${DDEV_SITENAME}
|
|
204
|
+
com.ddev.approot: \${DDEV_APPROOT}
|
|
205
|
+
environment:
|
|
206
|
+
MINIO_ACCESS_KEY: minioadmin
|
|
207
|
+
MINIO_SECRET_KEY: minioadmin
|
|
208
|
+
volumes:
|
|
209
|
+
- milvus_minio:/minio_data
|
|
210
|
+
## No host ports: the console is reached through the project's own https origin at /minio/,
|
|
211
|
+
## which is what keeps a second instance from colliding on 9000/9001.
|
|
212
|
+
command: minio server /minio_data --console-address ":9001"
|
|
213
|
+
healthcheck:
|
|
214
|
+
test: ["CMD", "mc", "ready", "local"]
|
|
215
|
+
interval: 30s
|
|
216
|
+
timeout: 20s
|
|
217
|
+
retries: 3
|
|
218
|
+
|
|
219
|
+
milvus-standalone:
|
|
220
|
+
container_name: ddev-\${DDEV_SITENAME}-milvus-standalone
|
|
221
|
+
image: "milvusdb/milvus:${version}"
|
|
222
|
+
restart: "no"
|
|
223
|
+
labels:
|
|
224
|
+
com.ddev.site-name: \${DDEV_SITENAME}
|
|
225
|
+
com.ddev.approot: \${DDEV_APPROOT}
|
|
226
|
+
command: ["milvus", "run", "standalone"]
|
|
227
|
+
security_opt:
|
|
228
|
+
- seccomp:unconfined
|
|
229
|
+
environment:
|
|
230
|
+
ETCD_ENDPOINTS: milvus-etcd:2379
|
|
231
|
+
MINIO_ADDRESS: milvus-minio:9000
|
|
232
|
+
## Woodpecker is the built-in WAL introduced in 2.6 — it is what removes the Pulsar
|
|
233
|
+
## dependency that used to make standalone Milvus a five-container stack.
|
|
234
|
+
MQ_TYPE: woodpecker
|
|
235
|
+
COMMON_SECURITY_AUTHORIZATIONENABLED: "${authorization}"
|
|
236
|
+
volumes:
|
|
237
|
+
- milvus_data:/var/lib/milvus
|
|
238
|
+
## Published on the host: pymilvus, the MCP server and every other real client speak gRPC,
|
|
239
|
+
## and the DDEV router cannot carry that. The HTTPS origin still serves the UI and REST.
|
|
240
|
+
ports:
|
|
241
|
+
- "${grpc_port}:19530"
|
|
242
|
+
healthcheck:
|
|
243
|
+
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
|
|
244
|
+
interval: 30s
|
|
245
|
+
start_period: 90s
|
|
246
|
+
timeout: 20s
|
|
247
|
+
retries: 3
|
|
248
|
+
depends_on:
|
|
249
|
+
milvus-etcd:
|
|
250
|
+
condition: service_healthy
|
|
251
|
+
milvus-minio:
|
|
252
|
+
condition: service_healthy
|
|
253
|
+
|
|
254
|
+
milvus-attu:
|
|
255
|
+
container_name: ddev-\${DDEV_SITENAME}-milvus-attu
|
|
256
|
+
image: "zilliz/attu:${attu_version}"
|
|
257
|
+
restart: "no"
|
|
258
|
+
labels:
|
|
259
|
+
com.ddev.site-name: \${DDEV_SITENAME}
|
|
260
|
+
com.ddev.approot: \${DDEV_APPROOT}
|
|
261
|
+
depends_on:
|
|
262
|
+
- milvus-standalone
|
|
263
|
+
environment:
|
|
264
|
+
## Attu's server-side half talks to Milvus inside the network, so the browser never needs
|
|
265
|
+
## the gRPC port and the UI works over plain https.
|
|
266
|
+
MILVUS_URL: milvus-standalone:19530
|
|
267
|
+
COMPOSEEOF
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
# Write the nginx site config that turns the DDEV web container into the reverse proxy.
|
|
271
|
+
# A full replacement (nginx_full), because none of the default PHP site config applies to a
|
|
272
|
+
# project that serves no files of its own.
|
|
273
|
+
function milvus_write_nginx() {
|
|
274
|
+
local project_dir="$1";
|
|
275
|
+
|
|
276
|
+
mkdir -p "${project_dir}/.ddev/nginx_full" ;
|
|
277
|
+
|
|
278
|
+
cat > "${project_dir}/.ddev/nginx_full/nginx-site.conf" <<'NGINXEOF'
|
|
279
|
+
# DDEV web container nginx: reverse-proxy the Milvus stack.
|
|
280
|
+
# Full replacement of the default site config (nginx_full).
|
|
281
|
+
# Written by cmd-milvus-project.sh — re-run that command rather than editing by hand.
|
|
282
|
+
|
|
283
|
+
server {
|
|
284
|
+
listen 80 default_server;
|
|
285
|
+
listen 443 ssl default_server;
|
|
286
|
+
|
|
287
|
+
root /var/www/html;
|
|
288
|
+
|
|
289
|
+
ssl_certificate /etc/ssl/certs/master.crt;
|
|
290
|
+
ssl_certificate_key /etc/ssl/certs/master.key;
|
|
291
|
+
|
|
292
|
+
include /etc/nginx/monitoring.conf;
|
|
293
|
+
|
|
294
|
+
# Bulk inserts and collection imports go through the REST API.
|
|
295
|
+
client_max_body_size 512M;
|
|
296
|
+
|
|
297
|
+
include /etc/nginx/common.d/*.conf;
|
|
298
|
+
|
|
299
|
+
# Milvus's own REST API, on the same port as gRPC — Milvus multiplexes both on 19530, so
|
|
300
|
+
# this is the plain-HTTP half of the same listener. Anything that can speak HTTP (curl, a
|
|
301
|
+
# Drupal module, the dashboard) can use the database over the project's https origin with no
|
|
302
|
+
# published port and no gRPC client.
|
|
303
|
+
location /v2/ {
|
|
304
|
+
proxy_pass http://milvus-standalone:19530;
|
|
305
|
+
proxy_http_version 1.1;
|
|
306
|
+
proxy_set_header Host $host;
|
|
307
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
308
|
+
proxy_read_timeout 600s;
|
|
309
|
+
proxy_buffering off;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
# Milvus's built-in web console and health endpoint (port 9091), which is a different server
|
|
313
|
+
# from the API above.
|
|
314
|
+
location /webui/ {
|
|
315
|
+
proxy_pass http://milvus-standalone:9091/webui/;
|
|
316
|
+
proxy_http_version 1.1;
|
|
317
|
+
proxy_set_header Host $host;
|
|
318
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
location = /healthz {
|
|
322
|
+
proxy_pass http://milvus-standalone:9091/healthz;
|
|
323
|
+
proxy_set_header Host $host;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
# The MinIO console, so the segment store is inspectable without publishing 9001 on the host.
|
|
327
|
+
location /minio/ {
|
|
328
|
+
proxy_pass http://milvus-minio:9001/;
|
|
329
|
+
proxy_http_version 1.1;
|
|
330
|
+
proxy_set_header Host $host;
|
|
331
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
332
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
333
|
+
proxy_set_header Connection "upgrade";
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
# Attu, the Milvus UI, on the root.
|
|
337
|
+
location / {
|
|
338
|
+
proxy_pass http://milvus-attu:3000;
|
|
339
|
+
proxy_http_version 1.1;
|
|
340
|
+
|
|
341
|
+
proxy_set_header Host $host;
|
|
342
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
343
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
344
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
345
|
+
proxy_set_header X-Forwarded-Host $host;
|
|
346
|
+
|
|
347
|
+
# Attu streams collection loads over a websocket.
|
|
348
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
349
|
+
proxy_set_header Connection "upgrade";
|
|
350
|
+
|
|
351
|
+
proxy_connect_timeout 75s;
|
|
352
|
+
proxy_read_timeout 3600s;
|
|
353
|
+
proxy_send_timeout 3600s;
|
|
354
|
+
proxy_buffering off;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
include /etc/nginx/server.d/*.conf;
|
|
358
|
+
}
|
|
359
|
+
NGINXEOF
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
# Build (or rebuild) a Milvus instance in the calling workspace folder.
|
|
363
|
+
#
|
|
364
|
+
# The calling cmd-*.sh sets nothing but the workspace: everything else comes from the arguments
|
|
365
|
+
# in args/arg-milvus.sh, defaulting to the `milvus:` block of the workspace settings.
|
|
366
|
+
function build_milvus() {
|
|
367
|
+
|
|
368
|
+
# The workspace settings hold the defaults; an argument that was actually given wins. The
|
|
369
|
+
# sentinel is what tells the two apart — argparse cannot report "not given" on its own.
|
|
370
|
+
if [ "${PROJECT_NAME}" == '_settings_' ] ; then PROJECT_NAME="$(milvus_setting "${milvus_project}")"; PROJECT_NAME="${PROJECT_NAME:-milvus}"; fi
|
|
371
|
+
if [ "${MILVUS_VERSION}" == '_settings_' ] ; then MILVUS_VERSION="$(milvus_setting "${milvus_version}")"; MILVUS_VERSION="${MILVUS_VERSION:-v2.6.21}"; fi
|
|
372
|
+
if [ "${ATTU_VERSION}" == '_settings_' ] ; then ATTU_VERSION="$(milvus_setting "${milvus_attu_version}")"; ATTU_VERSION="${ATTU_VERSION:-v2.6.5}"; fi
|
|
373
|
+
|
|
374
|
+
local project_dir="${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}";
|
|
375
|
+
local base_url="https://${PROJECT_NAME}.ddev.site";
|
|
376
|
+
local hub_url="https://${PROJECT_NAME}.${doc_name}.workspace.ddev.site";
|
|
377
|
+
local public_uri other_url grpc_port authorization;
|
|
378
|
+
|
|
379
|
+
public_uri="${PUBLIC_URI}";
|
|
380
|
+
if [ "${public_uri}" == '_settings_' ] ; then
|
|
381
|
+
public_uri="$(milvus_setting "${milvus_public_uri}")";
|
|
382
|
+
public_uri="${public_uri:-hub}";
|
|
383
|
+
fi
|
|
384
|
+
case "${public_uri}" in
|
|
385
|
+
hub) public_uri="${hub_url}"; other_url="${base_url}" ;;
|
|
386
|
+
canonical) public_uri="${base_url}"; other_url="${hub_url}" ;;
|
|
387
|
+
*) other_url="" ;;
|
|
388
|
+
esac
|
|
389
|
+
|
|
390
|
+
grpc_port="${GRPC_PORT}";
|
|
391
|
+
if [ "${grpc_port}" == '_settings_' ] ; then
|
|
392
|
+
grpc_port="$(milvus_setting "${milvus_grpc_port}")";
|
|
393
|
+
grpc_port="${grpc_port:-19530}";
|
|
394
|
+
fi
|
|
395
|
+
grpc_port="$(milvus_free_port "${grpc_port}")";
|
|
396
|
+
|
|
397
|
+
authorization="$(milvus_setting "${milvus_authorization}")";
|
|
398
|
+
[ "${AUTHORIZATION}" == 'yes' ] && authorization="true";
|
|
399
|
+
authorization="${authorization:-false}";
|
|
400
|
+
|
|
401
|
+
cd "${WORKSPACE_ROOT}/${doc_name}" || exit 1 ;
|
|
402
|
+
|
|
403
|
+
if [ -d "${PROJECT_NAME}" ] ; then
|
|
404
|
+
if [ "${FORCE}" != 'yes' ] ; then
|
|
405
|
+
echo "";
|
|
406
|
+
echo "${PROJECT_NAME} already exists in ${WORKSPACE_ROOT}/${doc_name}.";
|
|
407
|
+
echo " Start it with: cd ${project_dir} && ddev start";
|
|
408
|
+
echo " Rebuild it with: bash cmd-milvus-project.sh ${PROJECT_NAME} --force";
|
|
409
|
+
echo " (--force deletes the Milvus volumes too, so every collection in it goes with them.)";
|
|
410
|
+
exit 1 ;
|
|
411
|
+
fi
|
|
412
|
+
echo "Removing the existing ${PROJECT_NAME} instance, its metadata and every collection in it.";
|
|
413
|
+
# -O removes the project's volumes: for this project that is etcd's metadata, MinIO's
|
|
414
|
+
# segments and the Milvus data directory — i.e. all of the indexed data.
|
|
415
|
+
(cd "${project_dir}" && ddev delete -y -O) ;
|
|
416
|
+
rm -rf "${project_dir}" ;
|
|
417
|
+
fi
|
|
418
|
+
|
|
419
|
+
mkdir -p "${project_dir}" ;
|
|
420
|
+
cd "${project_dir}" || exit 1 ;
|
|
421
|
+
|
|
422
|
+
# No docroot and no settings management: this project serves no files of its own, it proxies.
|
|
423
|
+
ddev config --project-name=${PROJECT_NAME} --project-type=php --docroot="" --disable-settings-management ;
|
|
424
|
+
|
|
425
|
+
milvus_write_compose "${project_dir}" "${MILVUS_VERSION}" "${ATTU_VERSION}" "${grpc_port}" "${authorization}" ;
|
|
426
|
+
milvus_write_nginx "${project_dir}" ;
|
|
427
|
+
|
|
428
|
+
echo "";
|
|
429
|
+
echo "Starting Milvus ${MILVUS_VERSION} — the first run pulls ~2 GB of images, which takes a few minutes.";
|
|
430
|
+
ddev start -y ;
|
|
431
|
+
|
|
432
|
+
milvus_wait_healthy "${PROJECT_NAME}" || true ;
|
|
433
|
+
|
|
434
|
+
echo "";
|
|
435
|
+
echo "*---------------------------------------------------------------------*";
|
|
436
|
+
echo " Milvus ${MILVUS_VERSION} is ready.";
|
|
437
|
+
echo "";
|
|
438
|
+
echo " Attu (the UI) ${public_uri}";
|
|
439
|
+
echo " Milvus WebUI ${public_uri}/webui/";
|
|
440
|
+
echo " REST API ${public_uri}/v2/vectordb/collections/list";
|
|
441
|
+
echo " MinIO console ${public_uri}/minio/ (minioadmin / minioadmin)";
|
|
442
|
+
echo "";
|
|
443
|
+
echo " Clients on this machine — pymilvus, the MCP server, LangChain — connect on gRPC:";
|
|
444
|
+
echo " http://127.0.0.1:${grpc_port}";
|
|
445
|
+
if [ "${authorization}" == 'true' ] ; then
|
|
446
|
+
echo " token: $(milvus_setting "${milvus_token}") (authentication is ON for this instance)";
|
|
447
|
+
else
|
|
448
|
+
echo " No authentication: a local development database on a DDEV network.";
|
|
449
|
+
fi
|
|
450
|
+
if [ -n "${other_url}" ] ; then
|
|
451
|
+
echo "";
|
|
452
|
+
echo " ${other_url} reaches the same instance.";
|
|
453
|
+
fi
|
|
454
|
+
echo "";
|
|
455
|
+
echo " Index a project into it:";
|
|
456
|
+
echo " cd ${WORKSPACE_ROOT}/<workspace> && bash cmd-tools-ragify.sh <project>";
|
|
457
|
+
echo " Give it to the Claude Code CLI:";
|
|
458
|
+
echo " cd ${WORKSPACE_ROOT}/${doc_name} && bash cmd-milvus-mcp.sh ${PROJECT_NAME} -a register";
|
|
459
|
+
echo "*---------------------------------------------------------------------*";
|
|
460
|
+
|
|
461
|
+
if [ "${LAUNCH}" == 'yes' ] ; then
|
|
462
|
+
ddev launch ;
|
|
463
|
+
fi
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
# Back up one instance. Milvus keeps its metadata in etcd and its segments in MinIO, and a dump of
|
|
467
|
+
# either alone restores nothing — so both volumes are archived together, plus a JSON manifest of
|
|
468
|
+
# the collections so a restore can be checked against what went in.
|
|
469
|
+
function milvus_backup() {
|
|
470
|
+
local project stamp out archive manifest;
|
|
471
|
+
project="$(milvus_resolve_project "${PROJECT_NAME}")";
|
|
472
|
+
milvus_require_running "${project}" || return 1 ;
|
|
473
|
+
|
|
474
|
+
stamp="$(date +%Y-%m-%d-%H%M%S)";
|
|
475
|
+
out="${backups}/${doc_name}/${project}";
|
|
476
|
+
mkdir -p "${out}" ;
|
|
477
|
+
archive="${out}/${project}-milvus-${stamp}.tar.gz";
|
|
478
|
+
manifest="${out}/${project}-milvus-${stamp}.collections.json";
|
|
479
|
+
|
|
480
|
+
echo "Writing the collection manifest.";
|
|
481
|
+
rag_python collections --uri "$(milvus_uri "${project}")" --token "$(milvus_token)" --json > "${manifest}" 2>/dev/null \
|
|
482
|
+
|| echo " (could not reach Milvus for the manifest — archiving the volumes anyway)";
|
|
483
|
+
|
|
484
|
+
echo "Archiving the etcd metadata, the MinIO segments and the Milvus data directory.";
|
|
485
|
+
# The data lives in named volumes, not in the project directory, so it is read through a
|
|
486
|
+
# throwaway container. --user, or the archive lands owned by root: a backup the user cannot
|
|
487
|
+
# delete is a bad backup.
|
|
488
|
+
if ! docker run --rm --user "$(id -u):$(id -g)" \
|
|
489
|
+
-v "ddev-${project}_milvus_etcd:/v/etcd:ro" \
|
|
490
|
+
-v "ddev-${project}_milvus_minio:/v/minio:ro" \
|
|
491
|
+
-v "ddev-${project}_milvus_data:/v/milvus:ro" \
|
|
492
|
+
-v "${out}:/out" \
|
|
493
|
+
busybox tar czf "/out/$(basename "${archive}")" -C /v . ; then
|
|
494
|
+
echo "The archive failed — removing the partial file.";
|
|
495
|
+
rm -f "${archive}" ;
|
|
496
|
+
return 1 ;
|
|
497
|
+
fi
|
|
498
|
+
|
|
499
|
+
echo "";
|
|
500
|
+
echo "*---------------------------------------------------------------------*";
|
|
501
|
+
echo " Backed up ${project}:";
|
|
502
|
+
echo " ${archive}";
|
|
503
|
+
echo " ${manifest}";
|
|
504
|
+
echo "";
|
|
505
|
+
echo " Restore into a STOPPED instance of the same Milvus version:";
|
|
506
|
+
echo " docker run --rm -v ddev-${project}_milvus_etcd:/v/etcd \\";
|
|
507
|
+
echo " -v ddev-${project}_milvus_minio:/v/minio -v ddev-${project}_milvus_data:/v/milvus \\";
|
|
508
|
+
echo " -v ${out}:/in busybox tar xzf /in/$(basename "${archive}") -C /v";
|
|
509
|
+
echo " Re-indexing with cmd-tools-ragify.sh is usually simpler — an index is derived data.";
|
|
510
|
+
echo "*---------------------------------------------------------------------*";
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
# The Milvus MCP server, and its one-line Claude Code registration.
|
|
514
|
+
#
|
|
515
|
+
# zilliztech/mcp-server-milvus is a Python FastMCP server with 14 milvus_* tools (list/create/load
|
|
516
|
+
# collections, text, vector and hybrid search, query, insert, delete). Registered on **stdio**, so
|
|
517
|
+
# there is no port to keep open and no daemon to remember: the CLI starts it when a session needs
|
|
518
|
+
# it and stops it after. It connects to the database over the published gRPC port, which is why
|
|
519
|
+
# the instance has to be running for the tools to answer.
|
|
520
|
+
function milvus_mcp() {
|
|
521
|
+
local project uri package name token;
|
|
522
|
+
project="$(milvus_resolve_project "${PROJECT_NAME}")";
|
|
523
|
+
uri="$(milvus_uri "${project}")";
|
|
524
|
+
package="$(milvus_setting "${milvus_mcp_package}")"; package="${package:-mcp-server-milvus==0.1.1.dev9}";
|
|
525
|
+
name="rag-${project}";
|
|
526
|
+
token="$(milvus_token)";
|
|
527
|
+
|
|
528
|
+
# The published wheel declares `fastmcp` but imports `mcp.server.fastmcp`, so on its own
|
|
529
|
+
# dependency set it dies at import with ModuleNotFoundError — which the Claude Code CLI reports
|
|
530
|
+
# only as "Connection closed". The missing package is injected here rather than left to be
|
|
531
|
+
# discovered. Pinned below 2 for the same reason graphify pins it: mcp 2.x moved that module.
|
|
532
|
+
local with_mcp='--with mcp<2';
|
|
533
|
+
|
|
534
|
+
case "${MCP_ACTION}" in
|
|
535
|
+
status)
|
|
536
|
+
milvus_require_running "${project}" && echo "Milvus ${project} is running on ${uri}." ;
|
|
537
|
+
curl -s -o /dev/null -w " REST /v2/vectordb/collections/list → HTTP %{http_code}\n" \
|
|
538
|
+
-X POST "${uri}/v2/vectordb/collections/list" -H 'Content-Type: application/json' -d '{}' ;
|
|
539
|
+
claude mcp list 2>/dev/null | grep -i "${name}" || echo " Not registered in Claude Code yet — run with -a register.";
|
|
540
|
+
;;
|
|
541
|
+
register)
|
|
542
|
+
milvus_require_running "${project}" || return 1 ;
|
|
543
|
+
# Prove the server can actually start before registering it: an import error here is a
|
|
544
|
+
# sentence, and the same error after registration is only "Connection closed" in a session
|
|
545
|
+
# three days later. It exits on EOF, so an empty stdin is the whole test.
|
|
546
|
+
if ! uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" < /dev/null > /dev/null 2>&1 ; then
|
|
547
|
+
echo "The Milvus MCP server (${package}) will not start. Run it by hand to see why:";
|
|
548
|
+
echo " uvx --from ${package} ${with_mcp} mcp-server-milvus --milvus-uri ${uri}";
|
|
549
|
+
return 1 ;
|
|
550
|
+
fi
|
|
551
|
+
# uvx resolves and caches the package on first use; no install step of our own to keep in
|
|
552
|
+
# sync. The pin carries a .devN suffix because that is all PyPI has published — without it
|
|
553
|
+
# uvx refuses the package as pre-release only.
|
|
554
|
+
if [ -n "${token}" ] ; then
|
|
555
|
+
claude mcp add --scope user --env "MILVUS_TOKEN=${token}" "${name}" \
|
|
556
|
+
-- uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" || return 1 ;
|
|
557
|
+
else
|
|
558
|
+
claude mcp add --scope user "${name}" \
|
|
559
|
+
-- uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" || return 1 ;
|
|
560
|
+
fi
|
|
561
|
+
echo "";
|
|
562
|
+
echo "Registered ${name} with the Claude Code CLI (stdio, no port).";
|
|
563
|
+
echo " Open a NEW session to see its 13 tools: milvus_list_collections, milvus_text_search,";
|
|
564
|
+
echo " milvus_vector_search, milvus_hybrid_search, milvus_query, milvus_get_collection_info,";
|
|
565
|
+
echo " milvus_create_collection, milvus_insert_data, milvus_delete_entities,";
|
|
566
|
+
echo " milvus_load_collection, milvus_release_collection, milvus_list_databases,";
|
|
567
|
+
echo " milvus_use_database.";
|
|
568
|
+
echo " Re-indexing needs no re-registration — the URI does not change.";
|
|
569
|
+
;;
|
|
570
|
+
unregister)
|
|
571
|
+
claude mcp remove --scope user "${name}" && echo "Removed ${name} from the Claude Code CLI." ;
|
|
572
|
+
;;
|
|
573
|
+
serve)
|
|
574
|
+
milvus_require_running "${project}" || return 1 ;
|
|
575
|
+
echo "Serving Milvus ${project} over MCP on stdio — Ctrl+C to stop.";
|
|
576
|
+
[ -n "${token}" ] && export MILVUS_TOKEN="${token}" ;
|
|
577
|
+
exec uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" ;
|
|
578
|
+
;;
|
|
579
|
+
*)
|
|
580
|
+
echo "Pick one of -a status, -a register, -a unregister or -a serve.";
|
|
581
|
+
return 1 ;
|
|
582
|
+
;;
|
|
583
|
+
esac
|
|
584
|
+
}
|