dsh-session-search-incremental
Verifieddsh-session-search-incremental · v0.2.2-alpha.2 · MIT
Experimental incremental session search for DSH: bounded background indexing with eventual consistency
Install
dsh plugin add dsh-session-search-incremental Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
DSH Incremental Session Search
Experimental independent workaround for DSH 0.2.2-alpha.2. Not an official DSH fix.
Reuses the official SQLite FTS query/extraction implementation, but replaces whole-corpus reconciliation with independent bounded session updates. Searches use the last indexed state while a background queue catches up. Results are eventually consistent and may be incomplete or stale. A fast search is not proof of completeness.
Context: https://github.com/deepseek-ai/deepseek-harness/discussions/8783
Why
Legacy revisions can depend on a store-wide hash; filesystem device metadata changes can also invalidate many otherwise unchanged revisions. This plugin does not strip or falsify these revisions. It rereads each affected session, validates its revision before and after reading, and commits stable sessions independently. A write or failure in another session need not discard all progress.
Behavior and limits
- Targets DSH 0.2.2-alpha.2, Node 22.23+, derived SQLite schema 8.
engines.dshdeclares this exact host version; DSH peers are pinned to 0.2.2-alpha.2 and Cordis to ~4.0.6-alpha.1. Other host versions, including the former alpha.3 target, are not declared compatible by this manifest. - Version policy: the plugin version must exactly match the supported DSH version, including prerelease
identifiers: this release is dsh-session-search-incremental 0.2.2-alpha.2 for DSH 0.2.2-alpha.2. Keep
package.json.version,engines.dsh, the DSH peers and lockfile aligned. Publish to latest, even when the version includesrcor another prerelease suffix. Do not independently increment the plugin version. If that exact version is already published, stop and ask the maintainer; never invent another version. - Compatibility was checked against the published DSH alpha packages using real Cordis/SQLite services and synthetic in-memory session data, not a full installed Web profile or sustained/restart workload.
- Uses private engine methods: revalidate before upgrading DSH. The schema guard alone does not guarantee API compatibility.
- Background cycles run about one second after the previous cycle completes. Listing is refreshed at most every two seconds. Batches read at most two non-attached sessions, with previously unseen sessions prioritized.
- Searches can read up to two unseen cold sessions and refresh changed attached sessions in connection-local TEMP tables. Attached sessions are not continuously copied into the main durable index.
- A session changed during reading is requeued. An unreadable source logs a warning and is retried after 30 seconds; other sessions still progress. A legacy session whose own dependency revision never stabilizes can remain pending.
- Replacements are transactional; a failed replacement preserves the old indexed content. The plugin never writes, migrates or deletes canonical conversation logs. It deletes derived entries only after a successful listing no longer contains the session and it is not attached.
- Fingerprints are process-local. Invalidated sessions are reread after restart. An in-memory rowid map proportional to document count accelerates replacements.
- Use one provider/writer per derived database. Operations are serialized. Two sessions is a count limit, not a time guarantee: listing, a huge source, initial rowid scanning or FTS writes can still delay a request. There is no hard per-source timeout.
- Archive status is not an exclusion filter. DSH still controls visibility/authorization; Agent workspace restrictions are not bypassed.
- No custom settings page or freshness badge yet. Programmatic diagnostics:
ctx.sessionQuery.status()exposes eventual-consistency mode, pending count, failures and last listing time. Attached pending sessions can already be searchable via TEMP. Logs may contain IDs/paths: redact before sharing. - Not suitable as an authoritative time ledger. Use canonical logs and consider gaps/overlaps.
Install from npm
Install the package from the latest npm channel into the profile serving your Web GUI:
dsh plugin --profile web add dsh-session-search-incremental@latest
Keep this bundle after the official base/search bundles. Restart the existing DSH process after installation. Review the database, single-writer and rollback guidance below before enabling it.
Recommended companion: dsh-deeplink
Pair this provider with dsh-deeplink to turn discovered conversations and workspaces into clickable links in the DSH Web GUI. The search provider finds context; the deep-link plugin guides the model through the exposed search/read/trace tools and opens the resulting links in the same tab, using the browser's actual origin and application path.
After both packages are published:
dsh plugin --profile web add dsh-deeplink dsh-session-search-incremental@latest
They are optional companions, not runtime dependencies of one another. Deep links also work with the standard DSH search provider, and incremental search does not need the deep-link UI. Neither package grants access to otherwise unauthorized conversations. Search results remain eventually consistent: an empty result does not prove a conversation is absent. Do not enable both scoped and unscoped deep-link packages.
Local installation
No npm publication required. Clone and install pinned dependencies:
git clone https://github.com/victorwads/dsh-session-search-incremental.git
cd dsh-session-search-incremental
npm ci
npm test
In the DSH Web profile package manifest, add (adapt clone location):
"dsh-session-search-incremental": "link:~/GitRepos/dsh/dsh-session-search-incremental"
Append dsh-session-search-incremental to dsh.profile.bundles, after the official base and optional
search bundles, then install profile dependencies with its package manager. Standard profiles use pnpm. The
local DSH link convention uses link:~/...; if installing with plain pnpm outside DSH, normalize that link to
an absolute path in the installation command/lockfile if your pnpm does not expand the tilde.
The bundle disables both standard SQLite providers and clears the optional search bundle isolation, so UI and Agent tools use one provider. Review composition if you customized isolation or providers. Do not mount another copy by absolute file path. The installed bundle provides plugin metadata via its package manifest; it has no custom client settings panel.
Default DB: ./session-search-incremental.sqlite, relative to host working directory. Prefer an explicit
writable absolute path in your profile patch:
- id: session-search-incremental
config:
path: /absolute/path/to/session-search-incremental.sqlite
openAt: startup
Back up configuration and index before switching. A separate fresh index is safest for evaluation; it fills gradually. A schema-8 index can be reused only without competing writers. No replacement Web server/browser build is needed. Honor restart-required notices; do not assume hot reload succeeded.
Verification and rollback
Search an old phrase through UI and tools; add a unique phrase in a new conversation and verify it appears without rebuilding. Repeat after continued activity/restart and inspect pending/errors. No single successful query proves completeness.
To uninstall: remove this bundle, restore the official providers and previous isolation settings, remove any local override for this provider, then reload/restart as required. Preserve the derived DB until rollback is verified. Never remove canonical session storage.
Development
npm ci
npm run check
npm test
npm pack --dry-run
Tests use synthetic in-memory sessions only: appends, metadata invalidation, write races, unreadable sources, rollback, membership deletion, workspace predicates, event search, bounded batches, cancellation and background progress. No private logs, recovery databases or user-specific paths are bundled. Cross-platform and long-running/restart stability remain unverified.
Publishing
See the release guide for first-publication commands and the manual GitHub Actions/OIDC
workflow. The package publishes under latest, including versions with a prerelease suffix.
License
MIT. Official dependency licenses remain applicable; see NOTICE.