Skip to content

chore: bring dsh-mnemon into the repository under dsh/ - #154

Draft
Grivn wants to merge 1235 commits into
masterfrom
claude/converge-dsh-mnemon
Draft

Grivn wants to merge 1235 commits into
masterfrom
claude/converge-dsh-mnemon

Conversation

@Grivn

@Grivn Grivn commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

What

Brings the DeepSeek Harness plugin workspace, omdsh-dev/dsh-mnemon, into this repository under dsh/, with its history. This is the first, mechanical step of putting Mnemon and its DSH surface in one place: no plugin or CLI behavior changes.

Commit What it does
chore: import dsh-mnemon into dsh/ Merges dsh-mnemon's main at 2296898d (v0.5.24), rewritten so every path sits under dsh/
chore: keep the dsh workspace out of the Go module dsh/go.mod keeps the TypeScript workspace out of the module zip; a root test guards it
chore(dsh): release the workspace from its place in mnemon Manifests name this repository and dsh/...; release checks read paths from the workspace
docs(dsh): point the workspace's links at mnemon-dev/mnemon Links move to dsh/ on master; media left in the old repository is linked at the import commit
ci: verify the dsh workspace from the repository root .github/workflows/dsh-ci.yml runs the workspace's former CI from dsh/
docs: describe the dsh workspace in the README and agent guide README (EN/ZH), license note and AGENTS.md
test: scope repository rules for the dsh workspace The architecture suite keeps forbidding credentials under dsh/ and leaves its reviewed evidence to its own rules

How the history was imported

  • main of omdsh-dev/dsh-mnemon, 1,228 commits. Authors, dates and messages match the source one to one.
  • Every path moved under dsh/.
  • Binary media under docs/ (galleries, PR evidence, old screenshots; 765 files at the tip) were left out of the history. They stay in omdsh-dev/dsh-mnemon, and the imported docs link to them at 2296898d, so they keep rendering.
  • No tags were imported. dsh-mnemon's v0.5.x tags would otherwise become versions of this Go module: go install github.com/mnemon-dev/mnemon@latest would resolve to v0.5.24.
  • The import adds 7.4 MiB of history; the source repository's history was 161 MB.
  • At the tip, every non-media file sits under dsh/ with the same blob id as in the source, and nothing else was added.

Why

Mnemon's current direction is the memory agent from the paper (arXiv 2609.36059), built on dsh-mnemon's composable memory and run on DSH. Developing the CLI and the DSH plugin in one repository gives the project one front door, one place for issues and releases, and lets changes across both land together.

Paired draft in the old repository: omdsh-dev/dsh-mnemon#350 turns it into a pointer to this home. It should merge only after this PR and the first release from here.

Validation

Check Result
make test 21 packages pass
Go module zip (golang.org/x/mod/zip, master vs this branch) 617 → 618 files (the new layout test), 3.11 MiB both, 0 files under dsh/
dsh: release intent (base master, this branch) Passes: the workspace is introduced, no changeset required
dsh: typecheck, verify:build, SDK entry builds, verify:package, public entries Pass
dsh: vitest run 176 files, 2,083 tests pass, 9 skipped
dsh: verify:docs Pass (links, anchors and bilingual pairs)
dsh: verify:plugins Pass: every plugin packed, installed from tarballs and type-checked standalone
dsh: verify:headless Pass: the Headless profile activates with 37 tools, 8 of them Mnemon's; the legacy settings import and the Starter disable path hold
Pointer pages in the paired PR 212 pages, every target exists under dsh/ here

The dsh checks ran with Node 24.19 and pnpm 11.25, the CI commands run from dsh/.

Before this can merge

This draft moves the code and the CI. These steps are left for review and for repository settings:

  1. Release lane.
    • Tags for the plugin packages need a prefix (for example dsh-mnemon@0.5.25), never bare v*, which is reserved for the CLI and the Go module.
    • dsh/.github/workflows/publish.yml moves to the root with working-directory: dsh.
    • This repository needs an npm-release environment with a required reviewer and the NPM_TOKEN secret.
    • The GitHub "latest release" stays on the CLI.
  2. Repository rules. The workspace's PR rules and issue forms are inactive in dsh/.github until they are merged with this repository's own.
  3. Open dsh-mnemon pull requests (#296, #335, #343–#349 there) land first or are replayed here; git format-patch plus git am --directory=dsh applies them under dsh/.
  4. Required checks. "DSH plugins CI" should become a required check for changes under dsh/.
  5. Paired PR. Merge chore: turn this repository into a pointer to mnemon-dev/mnemon omdsh-dev/dsh-mnemon#350 after the first release from here.
  6. Catalog entries. The dshfind listing and the release badge in dsh/README.md still point at omdsh-dev/dsh-mnemon; the owner decides when to move them.

Checklist

  • Deterministic tests pass (make test)
  • Relevant E2E/process/Docker boundaries pass (make test-integration, when affected): not affected, no Go behavior changes
  • New/changed behavior is covered by tests (module boundary, scoped hygiene rules, docs link checker, release paths)
  • Documentation updated (README, docs/zh/README.md, AGENTS.md)
  • User-facing release-note impact described in this PR, if applicable: none for CLI users; the npm package names of the plugin are unchanged

🤖 Generated with Claude Code

Grivn and others added 30 commits September 27, 2026 02:23
fix(metadata): emphasize composable view-based memory
…issue

docs(compatibility): explain cordis group display issue
fix(client): use a brain icon for memory navigation
Support only the newest DSH release. Pin every DSH development package to
0.1.7-rc.2 and require it in the published peer ranges.

- Build every Config schema with DSH's @deepseek-ai/schemastery fork and
  drop the upstream schemastery package, the schemastery-live alias and the
  Cosmokit 1.8.3 fallback that only older hosts needed.
- Install the runtime imports that the 0.1.7 UI primitives and client store
  leave undeclared, so tests that inline the primitives keep resolving.
- Remove the minimumReleaseAgeExclude cohort; 0.1.7-rc.2 is past pnpm 11's
  one-day quarantine.
- Speak DSH's Messages protocol in the Headless and WebUI model stubs,
  verify the 0.1.7 legacy settings import, use a shell-free test preset,
  and upgrade from v0.5.16, the newest release that runs on this host.
- Adapt tests to the 0.1.7 session format, PTC runtime and primitives that
  measure with ResizeObserver, and derive the DSH family guard from
  package.json instead of hard-coding one release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Stop passing an authority option to rpc.handle. DSH's Connection service
  takes two arguments and ignores a third; the API Gateway Remote service
  keeps the remoteAccess management grant.
- Read Session history through snapshotEvents() and eventAt() directly and
  delete the shim for the 0.1.1 events array.
- Always create task Agents with agents.create instead of borrowing a live
  conversation Agent on hosts without the factory.
- Remove the DSH 0.1.0 schema/view projection fields together with the
  0.1.0-rc.8 test alias and its cross-generation checkpoint tests.
- Narrow LiveMnemonRuntime to the Agent lookup it uses, and correct the
  subagent diagnostic comments: in-process children publish none.

Tests use one shared Session log fake built on the public readers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DSH 0.1.7 replaces settings.register() with Config-backed profile forms,
so the branch that reused the older settings service is unreachable.

- Mount ProfileMnemonSettings unconditionally and drop createHostSettings,
  subscribeSettings and the prepared-graph cache that only the synchronous
  legacy commit needed. Validation still composes a candidate graph and
  disposes it; commits rebuild from the live profile references.
- Add onUpdated to the settings facade contract and require it in
  MemoryPluginManagement instead of listening for the older
  settings/updated event.
- Type ctx.settings as DSH's own forms, read only by the facade.

Tests drive the profile path the way DSH does: candidates go through the
owner's internal/config waterfall and commits publish volatile updates.
The invalid-root check now asserts the actual filesystem rejection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DSH 0.1.7 moved the conversation turn-tail and assistant-action slots into
@deepseek-ai/dsh-client-ui-chat. Depend on it directly for their types
instead of reaching them through another package's declarations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DSH 0.1.7 recreates the Agent for startup, resume, clear and compaction and
reports why on agent/created; agent/session-start no longer exists. Record
that source when installing the lifecycle and drop the dead session-start
listeners on roots and children.

Every 0.1.7 Session publishes its model-visible surface, so the reminder
check and review checkpoint read it directly instead of keeping a
session-scoped fallback for hosts without one. The shared session-log
fixture now models an append-only surface, and the lifecycle fixture
commits admitted steps the way DSH does.

Routing guidance registers through inject(['systemPrompt']) so it follows
the prompt service's lifecycle instead of a one-time lookup.

The V4 codec contract test resolves the codec through the installed DSH
host and now always runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Agent Teams review matrix and the plugin manager activation check only
ran when an extra installation was supplied, and the Teams matrix still
carried the DSH 0.1.5 branch and the removed worker-thread runtime. Both now
default to the pinned development host (their variables still select another
installation), expect the pinned DSH version, and drop the pre-0.1.7 paths.
The activation fixture calls the profile patch reader and reconciler that
0.1.7 always provides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collapse the compatibility matrix to the pinned DSH 0.1.7-rc.2 host and
point older hosts at v0.5.16, the last release verified with them. Install
commands, the Agent Teams guidance and the troubleshooting table follow the
same baseline, and the review budget text now says that clearing or
compacting a context starts a new budget because DSH replaces the Agent.
Section anchors stay unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/serve-web-regression.mjs refuses to start unless the installed DSH
is 0.1.1-rc.2 and installs a third-party web UI, so it cannot run against
the 0.1.7-rc.2 baseline. Remove it together with the test-only
panel-event-loss plugin that only it installed. Current WebUI work uses
pnpm e2e:serve.

The historical PR evidence that mentions the harness does so in code
spans only and stays unchanged. Drop the development guide's note about
refreshing on the old 0.1.1-rc.2 rollback target and keep its console
advice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/fixtures/reproduce-published-team.mjs asserts DSH 0.1.5-rc.2 and
Agent Teams 0.1.5-alpha.2. tests/agent-team-review-host.spec.ts now runs
the guarded Team review matrix against an isolated published profile and
supersedes it.

The idle-review PR evidence mentions the script only inside code blocks
and stays unchanged. Point the development guide's idle-review note at
the Agent Teams matrix instead of the old rc.2 / alpha.2 packages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
scripts/link-dsh-source.mjs still defaults to DSH 0.1.2-alpha.5 and
links only part of the DSH development dependencies. A pnpm override with
link: covers a source investigation without a bespoke restore record.
Remove the script and its dsh:link-source / dsh:restore-registry package
scripts.

Drop the source overlay section from both development guides. Its
idle-review fixture note belongs to the real WebUI fixtures and now ends
that section. The vitest dedupe comment no longer mentions source-linked
DSH workspaces; dedupe itself stays.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"bundle": "tsdown" duplicates the first step of "build" and no
documentation, CI job, test or script invokes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No Vitest config enables globals and every test imports its helpers from
vitest, so the ambient vitest/globals declarations only hid a missing
import. tsc -p tsconfig.json --noEmit stays clean without them, and the
emitted declarations are unchanged because tsconfig.types.json already
limits types to node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing in the client graph imports an unscoped cordis package; Cordis
is consumed as @deepseek-ai/cordis. Removing the dead pattern leaves all
41 files under lib/ byte-identical (SHA-256 per file before and after).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
auto-capture, light-context and scoped declared @deepseek-ai/cordis in
devDependencies with the same ^4.0.1 range as their peerDependency. The
other thirteen official plugins rely on the peer alone, which pnpm and
npm install automatically.

Drop the duplicate declarations. The lockfile only moves each importer's
unchanged cordis 4.0.4 entry from devDependencies to the auto-installed
peer block. Each plugin's own typecheck, test and build still pass after
relinking its node_modules from the frozen lockfile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Starter publishes bin/repair-legacy-session.mjs through "files" and
"bin", but the root input pattern omitted bin/, so editing the published
repair CLI required neither a changeset nor a version bump. Add bin/ to
the pattern and assert that a bin change selects dsh-mnemon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The development baseline is now DSH 0.1.7-rc.2 and pnpm-workspace.yaml no
longer carries a minimumReleaseAgeExclude list, so remove the paragraph
about the reviewed rc.1 release-age exclusions and its composition test.

Name 0.1.7-rc.2 as the pinned development profile that Root, the Source
Client tests and the external consumer share. The UI primitives note
still applies to 0.1.7-rc.2, whose manifest lists the Markdown and
highlighting packages as development dependencies, so only its version
changes. English and Chinese stay aligned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Agent Teams matrix and the plugin manager activation check run on the
pinned host with the ordinary suite; their variables only select another
installation. Drop the removed DSH 0.1.5 Teams flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The CPU budget measures the control-plane cost; the wall fence exists only
to catch accidental I/O waits. Healthy runs crossed the old five-second wall
limit while other suites loaded the machine, so widen it and keep the CPU
budget unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DSH reads dsh.client.inject as package-name ordering edges for client
modules. "slots" names a Cordis service, not a package, so the entry never
matched a graph row. Each Source client already declares its service
dependencies through `export const inject = ['slots', 'locale']` in
src/client/ui.tsx.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DSH 0.1.7 ships cordis-plugin-loader 1.0.5, which always provides locate,
import and unwrapExports, so the Source no longer treats import and
unwrapExports as optional or keeps a hand-written default-export unwrap.
A missing Loader still fails with the same error.

The `typeof ctx.get` guards only served a test that passed `{}` as a
Context; that test now uses a real Context. The fiber-entry fallback after
loader.locate was unreachable because locate already walks fiber.entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
loader.locate already walks fiber.entry up the fiber chain, so reading
fiber.entry.options.id after it could never produce another id. Behavior
with a Loader is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Grivn and others added 29 commits October 3, 2026 04:42
Apply the changesets from #325, #326 and #328: the Starter moves to
0.5.22 and its 17 pinned components stay as they are. Add the bilingual
release notes, the GitHub Release body and the versioned acceptance on
DSH 0.2.0-rc.2 and 0.1.7-rc.2, and point the installation, operations and
compatibility pages at this release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
perf(memory): optimize compaction, query and multi-space recall
The Entities page summed each space's top 20 entities from the Provider
status, so most entities were missing and many counts were short, and a
selected entity ran Agent recall, whose quality policy keeps at most four
medium results: an entity carried by 22 memories listed 5. The rail and the
selection now come from one entity index per space, built from the memories
the Provider lists (or its own entityIndex), so a count is the number of
memories the list shows. Recall still adds related memories, as a separate
list without the ones that carry the entity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A selection reuses the Provider health its space index was checked with for
ten seconds, so the memories that carry the entity come from the index
without queueing behind the store lock; the rail still checks every space
again. Related recall runs per page view and a newer selection in the same
view cancels the read the view left, so it no longer waits for recall the
user moved on from. The reviewed presentation baseline takes the new entity
page classes and copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ndex

The UI guide explains that an entity count is the number of memories that
carry it and what Related memories adds. The extension guide states how a
Provider feeds the Entities page: entities on every listed memory, or the
optional entityIndex for a list that stops short, and statistics that change
with every write.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The browser bundle may import only Client code, contracts and presentation
assets, so the entity key that the Host index and the Client graph share now
lives in the Source contracts instead of its own module. The Workbench test
fake answers the Entities page's two reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Synthetic Native spaces in the real WebUI on DSH 0.2.0-rc.2 and 0.1.7-rc.2,
main and this branch: rail counts, the memories a selection lists, related
memories and click-to-first-card times, with timings on 4 x 500 memories
and counts from the export behind the report. The Starter, which bundles the
Memory Spaces presentation, measures 1,523,952 bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI's packed-plugin job runs each plugin's tests in four parallel standalone
installs, where the Entities page tests ran 13 times slower than in the
workspace (40.5 s against 3.1 s) and the paging test passed its 5 s limit. The
paging test now reads on after a short first page with two reveals instead of
eight, the page tests allow 30 s and 5 s waits, and the related-memories test
that has taken 5-5.5 s there allows 15 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Related memories cost a recall per space, about 0.5 s each, and every
selection ran one. They now stay collapsed under the carrying memories
until Find related memories is pressed. Once opened they stay open for
the next entities in the browser session until hidden, and hiding and
opening them again shows what was found without another recall. When no
memory carries a name entered, they open by themselves, since they are
all the page can offer.

A forgotten memory now leaves both lists at once, and the lists shown
stay in place until the refresh that follows replaces them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Entities page record now shows related memories collapsed under the
carrying list, found on demand in 0.7-0.8 s on both hosts, and opened by
themselves for the next entity once asked for. The first card still
shows in 91-99 ms.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(memory-spaces): count and list entities from every memory
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bring the DeepSeek Harness plugin workspace from omdsh-dev/dsh-mnemon into
this repository, so the memory system and its DSH surface are developed,
tested and released from one place.

The imported history is main of omdsh-dev/dsh-mnemon at 2296898d (v0.5.24),
rewritten so that every path sits under dsh/. Its 1,228 commits keep their
authors, dates and messages one to one. Binary media under docs/ (765 files
at the tip: galleries, PR evidence and old screenshots) stay in
omdsh-dev/dsh-mnemon, which keeps serving them. No tags were imported, so Go
module versions are unaffected. The import adds 7.4 MiB of history.

Validation: comparing the trees file by file found every non-media file of
the source tip under dsh/ with the same blob id, and nothing else.
dsh/ is a TypeScript workspace. A nested go.mod gives it its own module
boundary, so the zip that `go install github.com/mnemon-dev/mnemon@latest`
downloads still holds only the CLI.

A root test keeps that boundary in place: it fails if dsh/go.mod goes missing,
names another module, or if Go code appears inside dsh/.
Published manifests now name mnemon-dev/mnemon and their directory inside
it (dsh/...). The release checks read the workspace from that directory:

- changed paths come from `git diff --relative`, so only the workspace's own
  files count, in the same form as before;
- earlier manifests are read with `git show <rev>:./<path>`, relative to the
  workspace;
- release intent compares against origin/master. The change that brings in
  the whole workspace (no Starter at the base revision) needs no changeset:
  it relocates the packages and publishes nothing.
Links into the workspace now resolve in this repository: blob, tree and raw
links to omdsh-dev/dsh-mnemon's main branch become dsh/ paths on master, and
the "file an issue", triage, security and clone instructions name
mnemon-dev/mnemon.

Media that stayed in omdsh-dev/dsh-mnemon (README images, galleries, PR
evidence) is linked at 2296898d, the commit this workspace was imported
from, so those links keep resolving. Links to numbered issues, pull
requests, Actions runs and tagged files are history and stay as they were.

The README's star badge counts this repository. The documentation check
maps dsh/ links on master to local files and rejects new links into the
old repository's main branch.
GitHub reads workflows only from the root, so the workspace's CI moves to
.github/workflows/dsh-ci.yml with the same jobs: Windows workspace paths,
source verification and packed plugins. Every command runs from dsh/, and
the workflow runs only when dsh/ or the workflow itself changes.

The workspace's publish, pull request and issue workflows stay inactive in
dsh/.github, next to the tests that read them, until its release lane and
repository rules move to the root. dsh/.github/README.md says so.
The DeepSeek Harness section now says where the plugin is developed and
installs a local checkout from dsh/. The development and license sections
name the workspace and its MIT license, in English and Chinese. AGENTS.md
gives agents the workspace's boundary and where its rules live.
The architecture suite scans the whole repository, and dsh/ tripped two of
its rules on purpose-made content:

- the single-module check now skips dsh/, whose go.mod declares no Go code
  and only keeps the workspace out of the module zip (the root layout test
  guards that boundary);
- the hygiene check keeps forbidding credentials and local Host state under
  dsh/, but leaves the workspace's reviewed PR evidence (logs, traces, JSON
  records), gallery manifests and tooling configuration to its own
  contribution rules.

Rules for the rest of the repository are unchanged. A new unit test pins
what the hygiene check still rejects inside dsh/.

Validation: make test passes (21 packages).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant