Repository navigation
Releases: ciskonc/dsh-context-imports
Release list
v0.3.1 — expand imports of every instruction file the harness loaded
dsh-context-imports 0.3.1
Expands the @path imports of every instruction file the harness loaded — including a project AGENTS.md it picks up mid-session once the agent touches files under it.
What changed
- New setting
expandLoadedInstructions(default on). The harness publishes which instruction files it loaded: everyagent-instructionsmessage carries a scope key (<dir>\u0000<file>, the directory relative to the project root) plus the baseline identity that names the project root. The plugin now reads those facts from all three places they appear — the agent's inbox (where the host parks a freshly loaded file), the current step's message batch, and the durable surface — and expands the imports of every file in that set. - Injection is incremental instead of once-per-session. A file already in the model's context is never sent twice; a newly loaded project AGENTS.md adds exactly its own imported files while the earlier ones stay untouched. Deduplication compares the rendered block (path + content), so it holds across steps and across processes, and a file whose content changed is sent again.
- Fix: the inbox lookup read
session.inboxinstead ofagent.inboxand therefore never fired (0.3.0). The step-batch path carried the feature on its own; the inbox fallback is now real.
Testing
- E2E on DSH 0.2.1-rc.3 (isolated instance): fresh session injects the root imports; reading a project file brings that project's AGENTS.md in and expands its imports in the same round; two projects load together; a file shared by both projects is injected exactly once; files already in the context are not repeated; missing files are reported, not fatal.
- Robustness:
scripts/robustness.test.mjs— a mock-host harness (no model, no browser) with 24 checks over config normalization for every wrong field shape, injection/dedup/compaction re-seed decisions, the three host instruction-scope sources, byte budgets, truncation, missing files, circular imports and a broken surface. Run it withnpm test. - Host API audit against DSH 0.2.1-rc.3: no relevant change versus 0.2.1-rc.2 (only the plugin manager's navigation service gained
openList).
Compatibility
- Needs DSH ≥ 0.2.0 (the host's published instruction scopes). 0.3.0 and 0.2.x keep the older cwd-only behaviour.
- Install with
dsh plugin add— since DSH 0.2.0-rc.2 the loader verifies profile lockfile consistency and silently drops hand-copied node_modules.
v0.2.3 — fix config defaults loss on DSH 0.2.0-rc.2 (session crash / no injection)
dsh-context-imports 0.2.3
Hardens config access for DSH >= 0.2.0-rc.2. No behavior change on older hosts.
Fixed
-
Session-create crash / silent no-injection on DSH >= 0.2.0-rc.2. Since rc.2 the config projection for
.volatile()schema fields no longer fills schema defaults into the resolved entry value — every field can arrive undefined even though the schema declares.default(). With the 0.2.2 schema (all fields volatile, required for the settings page) this caused two failures:entry.injectOnundefined →TypeError: includes is not a functionthrown fromagent/created→ the whole session-create fails (every session shows "unavailable")entry.filesundefined →TypeError: cfg.files is not iterableinside the pre-step injection → caught and swallowed → brand-new sessions silently get no injection
normalizeConfig()now runs atapply()entry: every field is coerced to its declared type with the schema default as fallback,injectOnadditionally accepts the comma-separated string form and is filtered to known scenes.
Tested
- DSH 0.2.0-rc.2: before the fix fresh sessions logged
injection FAILED: TypeError: cfg.files is not iterableand got no injection; after the fix the same path injects exactly one block. - DSH 0.2.0-rc.1: full browser pass (startup injection, dedup, compaction re-injection, settings form) — unchanged behavior.
- Engines requirement unchanged: DSH >= 0.1.7-rc.1. 0.2.3 has not been re-tested on 0.1.7-rc.2 (no environment available).
v0.2.2 — fix compaction re-injection and settings page mounting
dsh-context-imports 0.2.2
Two silent defects found by a full browser test pass on a dedicated debug instance (DSH 0.2.0-rc.1), both fixed:
Fixed
- No re-injection after compaction.
/compactin DSH 0.2.0 replaces the block in place (surfaceOp replace) and never re-firesagent/created, so the process-local ledger entry from the first injection went stale and blocked re-seeding forever. The surface check is now tri-state (visible/absent/unknown) and takes precedence over the ledger; the ledger only guards an unreadable surface. - Settings page never mounted. Two independent causes: the Config schema declared no
.volatile()fields, so the host's settings describe skipped the namespace entirely; anddsh.client.injectdid not declare the service-provider modules, leaving the client fiber'sslots/locale/configFormsservices unresolved (fiber pending, no error). All fields are now volatile and the inject list declares@deepseek-ai/dsh-client-locale,@deepseek-ai/dsh-client-ui-settings,@deepseek-ai/dsh-client-ui-plugin-manager.
Added
scripts/check-injection.cjs: session-log forensics checker (single visible injection, placement after AGENTS.md/skill catalog, wrapper shape, surface visibility replay).
Tested
- DSH 0.2.0-rc.1 (debug instance): startup injection (single, after AGENTS.md/skill catalog), dedup on subsequent messages, re-injection after
/compact, no duplicate after re-seed, nested@importexpansion, missing-file notes, settings form render/save/reset in zh UI. - Engines requirement unchanged: DSH >= 0.1.7-rc.1. 0.2.2 itself has not been re-tested on 0.1.7-rc.2 (no environment available).
v0.2.1
Adapted to DeepSeek Harness 0.1.7 (tested on 0.1.7-rc.2). For DSH 0.1.5, stay on the 0.1.x line.
v0.2.0 — 0.1.7 adaptation:
- agent/session-start → agent/created (same scene payloads: startup/resume/clear/compact)
- installSection removed: settings namespaces are projected from loader entries, zero registration code
- client settingsScope service → configForms (get + whileServed); settings page moved to the plugins.item tab
- custom message source kind 'context-imports' via module merge (was kind 'plugin')
- settings card rebuilt on the official shared form widgets (SettingsFormModel/SettingsForm/SettingsValueField/Checkbox)
v0.2.1 — duplicate-injection regression fix:
- decision.messages is only the step's admitted batch, never history — the 0.1.4 convergence counter read zero on later steps and appended again. Detection is now a three-layer gate: step batch → process ledger → durable surface visibility scan.
Install: dsh plugin --profile web add dsh-context-imports
v0.1.4
Converge to exactly one injection per request.
decision.messages is the complete request sequence, so counting our
messages there (matched by source.plugin) replaces every previous
detector:
- zero injections -> scene-gated append (fresh session, compaction
cleared the old block, never-injected active session, model switch) - exactly one -> untouched
- multiple -> stale ones dropped, newest kept (official skill-catalog
replacement pattern)
Tested against DeepSeek Harness 0.1.5-rc.2.
Install: dsh plugin --profile web add dsh-context-imports
v0.1.3
Judge prior injections by surface visibility, not the full durable log.
Replaying a real session's surface fold showed compaction replaces old
injections out of the surface while the full log still contains them, so
the 0.1.2 full-log scan blocked the promised compaction re-seed.
Detection now walks the live surface projection only: visible = skip,
compaction-removed = re-inject.
Tested against DeepSeek Harness 0.1.5-rc.2.
Install: dsh plugin --profile web add dsh-context-imports
v0.1.2
Seed never-injected active sessions on their next step.
Sessions that never saw a session-start event in the current process (model switches on long-lived sessions, sessions created before the plugin was activated) were skipped forever. An absent scene ledger now defaults to allowed: the single-injection invariant stays the only gate, so such sessions get seeded exactly once on their next step.
Tested against DeepSeek Harness 0.1.5-rc.2.
Install: dsh plugin --profile web add dsh-context-imports
v0.1.1
Installable as a profile bundle.
- declares the dsh.bundle manifest (cordis.patch.yml included in the package), so 'dsh plugin add' now registers and activates it as a profile layer instead of a plain dependency
- declares engines: dsh >= 0.1.5-rc.1
- tested against DeepSeek Harness 0.1.5-rc.2
Install: dsh plugin --profile web add dsh-context-imports
v0.1.0
First public release.
- Claude Code-style @path imports for AGENTS.md/CLAUDE.md: recursive expansion (depth-limited), byte budgets, missing-file notes
- Injects at session start (startup/resume/clear/compact, configurable) placed after all context injections via the official pre-step channel
- Single-injection invariant with full-log fingerprint detection (re-seeds after compaction)
- Six-language settings card (zh/en/ja/fr/ru/ko); wrapper text follows the UI locale or a custom template
Install: dsh plugin --profile web add dsh-context-imports