@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,446 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Index a project into Milvus, and read the result back.
|
|
3
|
+
|
|
4
|
+
The worker behind cmd-tools-ragify.sh and cmd-tools-rag.sh. It is run through
|
|
5
|
+
`uv run --with pymilvus ...` so there is nothing to install and nothing to keep
|
|
6
|
+
in sync — see rag_python() in core/scripts/functions/fun-rag.sh.
|
|
7
|
+
|
|
8
|
+
Retrieval is Milvus's built-in BM25 function by default: the database itself
|
|
9
|
+
tokenises the text and builds the sparse vectors, so no embedding model runs
|
|
10
|
+
here and nothing leaves the machine. `--embedding openai` adds a dense vector
|
|
11
|
+
per chunk from the OpenAI API and searches both fields together, which is
|
|
12
|
+
better on paraphrase and is the only mode that sends content anywhere.
|
|
13
|
+
|
|
14
|
+
What gets indexed is deliberately the opposite of what graphify covers: prose,
|
|
15
|
+
templates and configuration — .md, .twig, *.yml, *.module hooks — the files a
|
|
16
|
+
code graph classifies as documents and then never reads.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import json
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
from typing import Iterable, Iterator, List, Optional
|
|
24
|
+
|
|
25
|
+
# Milvus VARCHAR tops out at 65535 bytes, and a chunk that long is not a useful
|
|
26
|
+
# retrieval unit anyway. Chunks are truncated to this many characters, counted
|
|
27
|
+
# in bytes after encoding because the limit is a byte limit and Arabic or emoji
|
|
28
|
+
# in a comment would otherwise overflow a chunk that looks short.
|
|
29
|
+
MAX_CHUNK_BYTES = 16000
|
|
30
|
+
|
|
31
|
+
# Only these are read. A whitelist rather than a "skip binaries" heuristic: the
|
|
32
|
+
# point is to index what a person would read, and a .png or a .lock is not that.
|
|
33
|
+
TEXT_SUFFIXES = {
|
|
34
|
+
# Drupal/PHP, including the extensions that hold hooks — the files graphify
|
|
35
|
+
# does not classify at all.
|
|
36
|
+
".php", ".module", ".install", ".theme", ".profile", ".engine", ".inc",
|
|
37
|
+
# The wiring and config a Drupal site actually behaves like.
|
|
38
|
+
".yml", ".yaml", ".toml", ".ini", ".xml", ".json",
|
|
39
|
+
# Templates and front end.
|
|
40
|
+
".twig", ".html", ".css", ".scss", ".less", ".js", ".jsx", ".ts", ".tsx", ".vue",
|
|
41
|
+
# Prose and scripts.
|
|
42
|
+
".md", ".markdown", ".txt", ".rst", ".sh", ".bash", ".py", ".rb", ".go", ".sql",
|
|
43
|
+
".feature", ".gitlab-ci.yml", ".dist",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# Files whose name alone says "read me" even without a suffix.
|
|
47
|
+
TEXT_NAMES = {
|
|
48
|
+
"README", "CHANGELOG", "LICENSE", "AGENTS.md", "CLAUDE.md", "Dockerfile", "Makefile",
|
|
49
|
+
".gitlab-ci.yml", "composer.json", "package.json",
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Never worth indexing even when the suffix passes: generated, minified or lock data.
|
|
53
|
+
SKIP_NAME_PARTS = (".min.js", ".min.css", "-min.js", ".map", "composer.lock", "package-lock.json",
|
|
54
|
+
"yarn.lock", "patches.lock.json")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def eprint(*args):
|
|
58
|
+
print(*args, file=sys.stderr)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def collection_ok(name: str) -> str:
|
|
62
|
+
"""Milvus allows letters, digits and underscore, and no leading digit."""
|
|
63
|
+
safe = "".join(c if (c.isalnum() or c == "_") else "_" for c in name)
|
|
64
|
+
if safe and safe[0].isdigit():
|
|
65
|
+
safe = "c_" + safe
|
|
66
|
+
return safe
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def is_text_file(path: str) -> bool:
|
|
70
|
+
base = os.path.basename(path)
|
|
71
|
+
if any(part in base for part in SKIP_NAME_PARTS):
|
|
72
|
+
return False
|
|
73
|
+
if base in TEXT_NAMES:
|
|
74
|
+
return True
|
|
75
|
+
_, ext = os.path.splitext(base)
|
|
76
|
+
return ext.lower() in TEXT_SUFFIXES
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def walk_files(root: str, excludes: Iterable[str], max_file_kb: int) -> Iterator[str]:
|
|
80
|
+
"""Every indexable file under root, minus the excluded paths.
|
|
81
|
+
|
|
82
|
+
Excludes are matched as path prefixes relative to the root ("web/core") and
|
|
83
|
+
as bare directory names ("node_modules"), which is how the workspace already
|
|
84
|
+
expresses them for graphify.
|
|
85
|
+
"""
|
|
86
|
+
prefixes = {e.strip("/") for e in excludes if e and "/" in e}
|
|
87
|
+
names = {e.strip("/") for e in excludes if e and "/" not in e}
|
|
88
|
+
names |= {".git", ".ddev", ".idea", "graphify-out", "graphify-yaml"}
|
|
89
|
+
limit = max_file_kb * 1024
|
|
90
|
+
|
|
91
|
+
for dirpath, dirnames, filenames in os.walk(root):
|
|
92
|
+
rel_dir = os.path.relpath(dirpath, root)
|
|
93
|
+
rel_dir = "" if rel_dir == "." else rel_dir
|
|
94
|
+
# Prune in place so os.walk does not descend into what we are skipping.
|
|
95
|
+
dirnames[:] = [
|
|
96
|
+
d for d in dirnames
|
|
97
|
+
if d not in names
|
|
98
|
+
and os.path.join(rel_dir, d).lstrip("/") not in prefixes
|
|
99
|
+
and not any(os.path.join(rel_dir, d).lstrip("/").startswith(p + "/") for p in prefixes)
|
|
100
|
+
]
|
|
101
|
+
for name in filenames:
|
|
102
|
+
full = os.path.join(dirpath, name)
|
|
103
|
+
if not is_text_file(full):
|
|
104
|
+
continue
|
|
105
|
+
try:
|
|
106
|
+
if os.path.getsize(full) > limit or os.path.islink(full):
|
|
107
|
+
continue
|
|
108
|
+
except OSError:
|
|
109
|
+
continue
|
|
110
|
+
yield full
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def chunk_file(path: str, root: str, chunk_lines: int, overlap: int) -> List[dict]:
|
|
114
|
+
"""Split one file into overlapping line windows.
|
|
115
|
+
|
|
116
|
+
Lines, not tokens: a chunk that keeps whole lines is one you can open at the
|
|
117
|
+
line number it reports, and the overlap keeps a function that straddles a
|
|
118
|
+
boundary findable from either side.
|
|
119
|
+
"""
|
|
120
|
+
try:
|
|
121
|
+
with open(path, "r", encoding="utf-8", errors="replace") as handle:
|
|
122
|
+
lines = handle.read().splitlines()
|
|
123
|
+
except OSError:
|
|
124
|
+
return []
|
|
125
|
+
|
|
126
|
+
if not any(line.strip() for line in lines):
|
|
127
|
+
return []
|
|
128
|
+
|
|
129
|
+
rel = os.path.relpath(path, root)
|
|
130
|
+
ext = os.path.splitext(path)[1].lower().lstrip(".") or os.path.basename(path)
|
|
131
|
+
step = max(1, chunk_lines - overlap)
|
|
132
|
+
out = []
|
|
133
|
+
|
|
134
|
+
for start in range(0, max(1, len(lines)), step):
|
|
135
|
+
window = lines[start:start + chunk_lines]
|
|
136
|
+
text = "\n".join(window).strip()
|
|
137
|
+
if not text:
|
|
138
|
+
continue
|
|
139
|
+
encoded = text.encode("utf-8")
|
|
140
|
+
if len(encoded) > MAX_CHUNK_BYTES:
|
|
141
|
+
text = encoded[:MAX_CHUNK_BYTES].decode("utf-8", errors="ignore")
|
|
142
|
+
out.append({
|
|
143
|
+
"path": rel[:1020],
|
|
144
|
+
"ext": ext[:28],
|
|
145
|
+
"start_line": start + 1,
|
|
146
|
+
"end_line": min(start + chunk_lines, len(lines)),
|
|
147
|
+
# The path is part of the indexed text on purpose: "where is the
|
|
148
|
+
# Website Starter hero styled" should match a file called hero.twig even when
|
|
149
|
+
# the word never appears inside it.
|
|
150
|
+
"text": rel + "\n" + text,
|
|
151
|
+
})
|
|
152
|
+
if start + chunk_lines >= len(lines):
|
|
153
|
+
break
|
|
154
|
+
return out
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def connect(uri: str, token: str):
|
|
158
|
+
from pymilvus import MilvusClient
|
|
159
|
+
return MilvusClient(uri=uri, token=token or "")
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def openai_embed(texts: List[str], model: str, key: str) -> List[List[float]]:
|
|
163
|
+
from openai import OpenAI
|
|
164
|
+
client = OpenAI(api_key=key)
|
|
165
|
+
result = client.embeddings.create(model=model, input=texts)
|
|
166
|
+
return [item.embedding for item in result.data]
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def build_schema(client, embedding: str, dim: int):
|
|
170
|
+
from pymilvus import DataType, Function, FunctionType
|
|
171
|
+
|
|
172
|
+
schema = client.create_schema(auto_id=True, enable_dynamic_field=False)
|
|
173
|
+
schema.add_field("id", DataType.INT64, is_primary=True)
|
|
174
|
+
schema.add_field("path", DataType.VARCHAR, max_length=1024)
|
|
175
|
+
schema.add_field("ext", DataType.VARCHAR, max_length=32)
|
|
176
|
+
schema.add_field("start_line", DataType.INT64)
|
|
177
|
+
schema.add_field("end_line", DataType.INT64)
|
|
178
|
+
# enable_analyzer is what makes the BM25 function legal on this field: it is
|
|
179
|
+
# the tokeniser the sparse vectors are built from.
|
|
180
|
+
schema.add_field("text", DataType.VARCHAR, max_length=65535, enable_analyzer=True)
|
|
181
|
+
schema.add_field("sparse", DataType.SPARSE_FLOAT_VECTOR)
|
|
182
|
+
schema.add_function(Function(
|
|
183
|
+
name="text_bm25",
|
|
184
|
+
function_type=FunctionType.BM25,
|
|
185
|
+
input_field_names=["text"],
|
|
186
|
+
output_field_names=["sparse"],
|
|
187
|
+
))
|
|
188
|
+
|
|
189
|
+
index_params = client.prepare_index_params()
|
|
190
|
+
index_params.add_index(
|
|
191
|
+
field_name="sparse",
|
|
192
|
+
index_type="SPARSE_INVERTED_INDEX",
|
|
193
|
+
metric_type="BM25",
|
|
194
|
+
params={"inverted_index_algo": "DAAT_MAXSCORE"},
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
if embedding == "openai":
|
|
198
|
+
schema.add_field("dense", DataType.FLOAT_VECTOR, dim=dim)
|
|
199
|
+
index_params.add_index(field_name="dense", index_type="AUTOINDEX", metric_type="COSINE")
|
|
200
|
+
|
|
201
|
+
return schema, index_params
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def cmd_index(args) -> int:
|
|
205
|
+
root = os.path.abspath(args.path)
|
|
206
|
+
if not os.path.isdir(root):
|
|
207
|
+
eprint(f"No such project directory: {root}")
|
|
208
|
+
return 1
|
|
209
|
+
|
|
210
|
+
name = collection_ok(args.collection)
|
|
211
|
+
embedding = args.embedding
|
|
212
|
+
key = args.openai_key or os.environ.get("OPENAI_API_KEY", "")
|
|
213
|
+
if embedding == "openai" and not key:
|
|
214
|
+
eprint("--embedding openai needs an OpenAI key (settings.yml ai_providers.openai.api_key "
|
|
215
|
+
"or OPENAI_API_KEY).")
|
|
216
|
+
return 1
|
|
217
|
+
|
|
218
|
+
client = connect(args.uri, args.token)
|
|
219
|
+
|
|
220
|
+
# A dimension is only known once a model has answered, so it is probed with one
|
|
221
|
+
# cheap call rather than hardcoded per model name.
|
|
222
|
+
dim = 0
|
|
223
|
+
if embedding == "openai":
|
|
224
|
+
dim = len(openai_embed(["dimension probe"], args.openai_model, key)[0])
|
|
225
|
+
|
|
226
|
+
existing = name in client.list_collections()
|
|
227
|
+
if existing and not args.append:
|
|
228
|
+
client.drop_collection(name)
|
|
229
|
+
existing = False
|
|
230
|
+
if not existing:
|
|
231
|
+
schema, index_params = build_schema(client, embedding, dim)
|
|
232
|
+
client.create_collection(collection_name=name, schema=schema, index_params=index_params)
|
|
233
|
+
|
|
234
|
+
files = list(walk_files(root, args.exclude or [], args.max_file_kb))
|
|
235
|
+
total_chunks = 0
|
|
236
|
+
batch: List[dict] = []
|
|
237
|
+
batch_size = 128 if embedding == "openai" else 512
|
|
238
|
+
|
|
239
|
+
def flush() -> int:
|
|
240
|
+
nonlocal batch
|
|
241
|
+
if not batch:
|
|
242
|
+
return 0
|
|
243
|
+
if embedding == "openai":
|
|
244
|
+
vectors = openai_embed([row["text"] for row in batch], args.openai_model, key)
|
|
245
|
+
for row, vector in zip(batch, vectors):
|
|
246
|
+
row["dense"] = vector
|
|
247
|
+
client.insert(collection_name=name, data=batch)
|
|
248
|
+
count = len(batch)
|
|
249
|
+
batch = []
|
|
250
|
+
return count
|
|
251
|
+
|
|
252
|
+
for index, path in enumerate(files, start=1):
|
|
253
|
+
for chunk in chunk_file(path, root, args.chunk_lines, args.chunk_overlap):
|
|
254
|
+
batch.append(chunk)
|
|
255
|
+
if len(batch) >= batch_size:
|
|
256
|
+
total_chunks += flush()
|
|
257
|
+
if args.progress and index % 200 == 0:
|
|
258
|
+
eprint(f" {index}/{len(files)} files, {total_chunks + len(batch)} chunks")
|
|
259
|
+
|
|
260
|
+
total_chunks += flush()
|
|
261
|
+
client.flush(name)
|
|
262
|
+
client.load_collection(name)
|
|
263
|
+
|
|
264
|
+
result = {
|
|
265
|
+
"collection": name,
|
|
266
|
+
"files": len(files),
|
|
267
|
+
"chunks": total_chunks,
|
|
268
|
+
"embedding": embedding,
|
|
269
|
+
"uri": args.uri,
|
|
270
|
+
}
|
|
271
|
+
print(json.dumps(result) if args.json else
|
|
272
|
+
f"Indexed {result['files']} files as {result['chunks']} chunks "
|
|
273
|
+
f"into {name} ({embedding}).")
|
|
274
|
+
return 0
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def cmd_search(args) -> int:
|
|
278
|
+
client = connect(args.uri, args.token)
|
|
279
|
+
name = collection_ok(args.collection)
|
|
280
|
+
if name not in client.list_collections():
|
|
281
|
+
eprint(f"No collection {name}. Index it first with cmd-tools-ragify.sh.")
|
|
282
|
+
return 1
|
|
283
|
+
client.load_collection(name)
|
|
284
|
+
|
|
285
|
+
fields = ["path", "start_line", "end_line", "text"]
|
|
286
|
+
has_dense = any(f["name"] == "dense" for f in client.describe_collection(name)["fields"])
|
|
287
|
+
|
|
288
|
+
if has_dense and args.openai_key:
|
|
289
|
+
# Dense and sparse are asked separately and merged by reciprocal rank
|
|
290
|
+
# fusion: BM25 finds the exact identifier, the embedding finds the
|
|
291
|
+
# paraphrase, and RRF needs no score calibration between the two.
|
|
292
|
+
from pymilvus import AnnSearchRequest, RRFRanker
|
|
293
|
+
vector = openai_embed([args.query], args.openai_model, args.openai_key)[0]
|
|
294
|
+
hits = client.hybrid_search(
|
|
295
|
+
collection_name=name,
|
|
296
|
+
reqs=[
|
|
297
|
+
AnnSearchRequest(data=[args.query], anns_field="sparse", param={}, limit=args.limit),
|
|
298
|
+
AnnSearchRequest(data=[vector], anns_field="dense", param={}, limit=args.limit),
|
|
299
|
+
],
|
|
300
|
+
ranker=RRFRanker(),
|
|
301
|
+
limit=args.limit,
|
|
302
|
+
output_fields=fields,
|
|
303
|
+
)
|
|
304
|
+
else:
|
|
305
|
+
hits = client.search(
|
|
306
|
+
collection_name=name,
|
|
307
|
+
data=[args.query],
|
|
308
|
+
anns_field="sparse",
|
|
309
|
+
limit=args.limit,
|
|
310
|
+
output_fields=fields,
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
rows = [
|
|
314
|
+
{
|
|
315
|
+
"score": round(float(hit["distance"]), 4),
|
|
316
|
+
"path": hit["entity"]["path"],
|
|
317
|
+
"lines": f"{hit['entity']['start_line']}-{hit['entity']['end_line']}",
|
|
318
|
+
"text": hit["entity"]["text"],
|
|
319
|
+
}
|
|
320
|
+
for hit in (hits[0] if hits else [])
|
|
321
|
+
]
|
|
322
|
+
|
|
323
|
+
if args.json:
|
|
324
|
+
print(json.dumps(rows, indent=2))
|
|
325
|
+
return 0
|
|
326
|
+
|
|
327
|
+
if not rows:
|
|
328
|
+
print(f"No match for {args.query!r} in {name}.")
|
|
329
|
+
return 0
|
|
330
|
+
|
|
331
|
+
for row in rows:
|
|
332
|
+
print(f"\n\033[1m{row['path']}:{row['lines']}\033[0m (score {row['score']})")
|
|
333
|
+
body = row["text"].split("\n", 1)[1] if "\n" in row["text"] else row["text"]
|
|
334
|
+
for line in body.splitlines()[: args.context]:
|
|
335
|
+
print(f" {line}")
|
|
336
|
+
print()
|
|
337
|
+
return 0
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def cmd_collections(args) -> int:
|
|
341
|
+
client = connect(args.uri, args.token)
|
|
342
|
+
names = sorted(client.list_collections())
|
|
343
|
+
rows = []
|
|
344
|
+
for name in names:
|
|
345
|
+
try:
|
|
346
|
+
stats = client.get_collection_stats(name)
|
|
347
|
+
count = int(stats.get("row_count", 0))
|
|
348
|
+
except Exception:
|
|
349
|
+
count = -1
|
|
350
|
+
rows.append({"collection": name, "chunks": count})
|
|
351
|
+
|
|
352
|
+
if args.json:
|
|
353
|
+
print(json.dumps(rows, indent=2))
|
|
354
|
+
return 0
|
|
355
|
+
if not rows:
|
|
356
|
+
print("No collections yet. Index one with: cmd-tools-ragify.sh <project>")
|
|
357
|
+
return 0
|
|
358
|
+
print(f"{'COLLECTION':<52} {'CHUNKS':>10}")
|
|
359
|
+
for row in rows:
|
|
360
|
+
print(f"{row['collection']:<52} {row['chunks']:>10}")
|
|
361
|
+
return 0
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def cmd_info(args) -> int:
|
|
365
|
+
client = connect(args.uri, args.token)
|
|
366
|
+
name = collection_ok(args.collection)
|
|
367
|
+
if name not in client.list_collections():
|
|
368
|
+
eprint(f"No collection {name}.")
|
|
369
|
+
return 1
|
|
370
|
+
described = client.describe_collection(name)
|
|
371
|
+
stats = client.get_collection_stats(name)
|
|
372
|
+
info = {
|
|
373
|
+
"collection": name,
|
|
374
|
+
"chunks": int(stats.get("row_count", 0)),
|
|
375
|
+
"fields": [f["name"] for f in described["fields"]],
|
|
376
|
+
"functions": [f.get("name") for f in described.get("functions", [])],
|
|
377
|
+
}
|
|
378
|
+
if args.json:
|
|
379
|
+
print(json.dumps(info, indent=2))
|
|
380
|
+
return 0
|
|
381
|
+
print(f"Collection : {info['collection']}")
|
|
382
|
+
print(f"Chunks : {info['chunks']}")
|
|
383
|
+
print(f"Fields : {', '.join(info['fields'])}")
|
|
384
|
+
print(f"Functions : {', '.join(x for x in info['functions'] if x) or '—'}")
|
|
385
|
+
return 0
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def cmd_drop(args) -> int:
|
|
389
|
+
client = connect(args.uri, args.token)
|
|
390
|
+
name = collection_ok(args.collection)
|
|
391
|
+
if name not in client.list_collections():
|
|
392
|
+
eprint(f"No collection {name}.")
|
|
393
|
+
return 1
|
|
394
|
+
client.drop_collection(name)
|
|
395
|
+
print(f"Dropped {name}. Rebuild it with cmd-tools-ragify.sh in its workspace folder.")
|
|
396
|
+
return 0
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def main(argv: Optional[List[str]] = None) -> int:
|
|
400
|
+
parser = argparse.ArgumentParser(description="Index a project into Milvus and query it.")
|
|
401
|
+
parser.add_argument("--uri", default="http://127.0.0.1:19530")
|
|
402
|
+
parser.add_argument("--token", default="")
|
|
403
|
+
parser.add_argument("--json", action="store_true")
|
|
404
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
405
|
+
|
|
406
|
+
p = sub.add_parser("index")
|
|
407
|
+
p.add_argument("--collection", required=True)
|
|
408
|
+
p.add_argument("--path", required=True)
|
|
409
|
+
p.add_argument("--exclude", nargs="*", default=[])
|
|
410
|
+
p.add_argument("--chunk-lines", type=int, default=60)
|
|
411
|
+
p.add_argument("--chunk-overlap", type=int, default=10)
|
|
412
|
+
p.add_argument("--max-file-kb", type=int, default=512)
|
|
413
|
+
p.add_argument("--embedding", choices=["bm25", "openai"], default="bm25")
|
|
414
|
+
p.add_argument("--openai-model", default="text-embedding-3-small")
|
|
415
|
+
p.add_argument("--openai-key", default="")
|
|
416
|
+
p.add_argument("--append", action="store_true",
|
|
417
|
+
help="Add to the collection instead of rebuilding it.")
|
|
418
|
+
p.add_argument("--progress", action="store_true")
|
|
419
|
+
p.set_defaults(func=cmd_index)
|
|
420
|
+
|
|
421
|
+
p = sub.add_parser("search")
|
|
422
|
+
p.add_argument("--collection", required=True)
|
|
423
|
+
p.add_argument("--query", required=True)
|
|
424
|
+
p.add_argument("--limit", type=int, default=5)
|
|
425
|
+
p.add_argument("--context", type=int, default=12)
|
|
426
|
+
p.add_argument("--openai-model", default="text-embedding-3-small")
|
|
427
|
+
p.add_argument("--openai-key", default="")
|
|
428
|
+
p.set_defaults(func=cmd_search)
|
|
429
|
+
|
|
430
|
+
p = sub.add_parser("collections")
|
|
431
|
+
p.set_defaults(func=cmd_collections)
|
|
432
|
+
|
|
433
|
+
p = sub.add_parser("info")
|
|
434
|
+
p.add_argument("--collection", required=True)
|
|
435
|
+
p.set_defaults(func=cmd_info)
|
|
436
|
+
|
|
437
|
+
p = sub.add_parser("drop")
|
|
438
|
+
p.add_argument("--collection", required=True)
|
|
439
|
+
p.set_defaults(func=cmd_drop)
|
|
440
|
+
|
|
441
|
+
args = parser.parse_args(argv)
|
|
442
|
+
return args.func(args)
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
if __name__ == "__main__":
|
|
446
|
+
sys.exit(main())
|