Repository navigation
List and download a profile's LSI, from the library and the CLI - #59
Merged
Merged
Conversation
A release carries each profile's LSI projection as <nickname>-lsi.zip, and list_remote_profiles hides those on purpose, so the only way to get one was to build its URL by hand. Library: - list_remote_lsi(): the release's LSI assets, named after their profile. - download_lsi(nick): fetches <nick>-lsi.zip into ~/.textsearch/lsi/, apart from profiles/. - lsi_summary(path): what an artifact says about itself (profile_id, outdim, ...) from the manifest, without dequantizing the projection. - Listing and downloading now share one implementation for both kinds, and a file:// URL counts as direct, as the app already treated it. CLI: - list --lsi / list --remote --lsi. - download NICK --lsi: also fetches the LSI (keeping an installed profile) and removes it again if it is not bound to that profile. - info reports the installed LSI and whether it is bound; uninstall takes it with the profile. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
list shows installed profiles and LSI projections in two sections, and --remote does the same for a release; --profiles/--lsi narrow it. An LSI is flagged when it is not bound to its nickname's installed profile, or when that profile is not installed. install recognizes an LSI zip by its manifest, installs it into lsi/ named without the -lsi suffix, and refuses it when the installed profile of that nickname is not the one it was fitted against. Replacing a profile that its installed LSI no longer matches prints a note. info NICK --lsi, or info on a path to an LSI, shows the profile it names, whether that profile is installed and bound, outdim and scaling. uninstall --lsi removes only the LSI. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Sep 25, 2026
Merged
This was referenced Sep 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Each profile in
profiles-1.1has its LSI beside it as<nickname>-lsi.zip, butlist_remote_profileshides them on purpose (#51), so the only way to get one was to build the URL by hand. This adds the missing path, in the library first and the CLI on top of it.Library
list_remote_lsi(; repo, tag, url): the release's LSIs, in the same shape aslist_remote_profiles.nameis the nickname of the profile each one belongs to ("es"fores-lsi.zip).download_lsi(nick; repo, tag, dest, url, force): downloads<nick>-lsi.zipinto~/.textsearch/lsi/<nick>.zip, apart fromprofiles/because it is not a profile. It checks nothing itself;load_lsiis still the one that refuses a wrong profile.lsi_summary(path):(profile_id, name, repo, tag, outdim, maxoutdim, scaling)read from the manifest, without loading the projection. That makes the binding check cheap (a manifest read against dequantizing up to 300 MB).file://counts as a direct URL, as the app already treated it.CLI
LSIs are listed beside the profiles, in their own section, and every management command handles them:
list/list --remote--profiles/--lsinarrow it. Locally it flags an LSI not bound to its profile, or whose profile isn't installeddownload es --lsiprofile_id: if the LSI names another profile, it removes it and says soinstall ./es-lsi.ziplsi/ases. Refuses it if the installedesisn't the profile it was fitted against; with no profile it's accepted andlistshows it as waiting. Replacing a profile the installed LSI no longer matches prints a noteinfo eslsi: installed, outdim=256 -> …, or bound to another / not installedinfo es --lsi, orinfo <path to an LSI>outdim, scalinguninstall es [--force]--lsiremoves only the LSIWhy the refusals: an LSI against the wrong profile doesn't fail, it answers wrongly, so it can't be left installed where a consumer would load it.
Verified
TEXTSEARCH_HOMEsandboxed):list --remoteshows the 7 profiles and the 7 LSIs in separate sections.download eu,install eu-lsi.zip,list,info eu --lsi,info <path>,uninstall eu --lsi [--force],download eu --lsianduninstall eu --forcebehave as described.file://, with an LSI bound to another profile. They cover thelistsections,download --lsi,install(bound, refused, waiting for its profile),info --lsi/ on a path, anduninstallwith and without--lsi.lsi_summary(directory and zip),download_lsi(lsi/destination,force), andlist_remote_lsion the mock.🤖 Generated with Claude Code