{"_id":"@dennisrongo/dsh-memory","_rev":"3-1f59247497f9a4c2d2003265ee571649","name":"@dennisrongo/dsh-memory","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@dennisrongo/dsh-memory","version":"0.1.0","author":{"name":"Dennis Rongo"},"license":"MIT","_id":"@dennisrongo/dsh-memory@0.1.0","maintainers":[{"name":"dennisrongo","email":"dennis@menacestudio.com"}],"homepage":"https://github.com/dennisrongo/dsh-plugins/tree/main/plugins/dsh-memory#readme","bugs":{"url":"https://github.com/dennisrongo/dsh-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime"],"platform":"web","immediately":true}},"dist":{"shasum":"88112096ed2c5dd5d52c93ee8e6e781d501820f2","tarball":"https://registry.npmjs.org/@dennisrongo/dsh-memory/-/dsh-memory-0.1.0.tgz","fileCount":6,"integrity":"sha512-An//yZOhD380QnnDsj9hzLe/V5eUh0AWTO7Yq9k/5lNgsiPLTFhNX/OVM089rBJ6T2WNdZiL3mwqGWwCgRd/Hw==","signatures":[{"sig":"MEUCIDDon1YHAEbHyvLEPokr9rIns+gGPhEkkIOaFkJbtpPEAiEA1Hi/SlgYdpszzKBDLmth1oHC6i2VlGb8jchLpSZkgQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dennisrongo%2fdsh-memory@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":364772},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./typert":{"default":"./lib/typert.host.js"},"./package.json":"./package.json"},"gitHead":"f3f56e3e0d834f8bf484ed327bda5e15afe71e5a","scripts":{"test":"node build/build.mjs && node test/smoke.mjs","build":"node build/build.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"dennisrongo","email":"dennis@menacestudio.com"},"repository":{"url":"git+https://github.com/dennisrongo/dsh-plugins.git","type":"git","directory":"plugins/dsh-memory"},"_npmVersion":"10.9.8","description":"Memory capture and inspection for DeepSeek Harness (dsh) — a /remember command that writes into the AGENTS.md hierarchy, and a tab showing which instruction files the loader actually kept","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"react":"^18.3.0","esbuild":"^0.24.0","react-dom":"^18.3.0","typescript":"^5.6.0","@types/node":"^22.20.1","@types/react":"^18.3.0","@types/react-dom":"^18.3.0"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-commands":"^0.1.1-rc.2","@deepseek-ai/dsh-workspace":"^0.1.1-rc.2","@deepseek-ai/dsh-typert-protocol":"^0.1.1-rc.2","@deepseek-ai/dsh-agent-instructions":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-memory_0.1.0_1788036370077_0.15583426188924765","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dennisrongo/dsh-memory","version":"0.1.1","author":{"name":"Dennis Rongo"},"license":"MIT","_id":"@dennisrongo/dsh-memory@0.1.1","maintainers":[{"name":"dennisrongo","email":"dennis@menacestudio.com"}],"homepage":"https://github.com/dennisrongo/dsh-plugins/tree/main/plugins/dsh-memory#readme","bugs":{"url":"https://github.com/dennisrongo/dsh-plugins/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime"],"platform":"web","immediately":true}},"dist":{"shasum":"f4ccac14e122f1a2b50190a3d0a37e5df04cc651","tarball":"https://registry.npmjs.org/@dennisrongo/dsh-memory/-/dsh-memory-0.1.1.tgz","fileCount":6,"integrity":"sha512-8gn93iA8DKPe03jKGCKaujnMZ8U3K3Y07MWvEkSYVTbHtuxeT89NconmwrFSjmwed7t9oP6PoyO+CTOtpKILQQ==","signatures":[{"sig":"MEUCIBRLmc+jp2S8Hz2RVj9VtnvhZZJsC1IBODxs7MbaLn3NAiEAy3ZMSVkO/UWwv/ulicZQ8E2svVwTiYr2mqUiCzvtMII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dennisrongo%2fdsh-memory@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":364995},"main":"lib/index.js","type":"module","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./typert":{"default":"./lib/typert.host.js"},"./package.json":"./package.json"},"gitHead":"5d44dcf43c62c7929574d5cd52a014f8d601ba45","scripts":{"test":"node build/build.mjs && node test/smoke.mjs","build":"node build/build.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"dennisrongo","email":"dennis@menacestudio.com"},"repository":{"url":"git+https://github.com/dennisrongo/dsh-plugins.git","type":"git","directory":"plugins/dsh-memory"},"_npmVersion":"10.9.8","description":"Memory capture and inspection for DeepSeek Harness (dsh) — a /remember command that writes into the AGENTS.md hierarchy, and a tab showing which instruction files the loader actually kept","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"react":"^18.3.0","esbuild":"^0.24.0","react-dom":"^18.3.0","typescript":"^5.6.0","@types/node":"^22.20.1","@types/react":"^18.3.0","@types/react-dom":"^18.3.0"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-commands":"^0.1.1-rc.2","@deepseek-ai/dsh-workspace":"^0.1.1-rc.2","@deepseek-ai/dsh-typert-protocol":"^0.1.1-rc.2","@deepseek-ai/dsh-agent-instructions":"^0.1.1-rc.2"},"_npmOperationalInternal":{"tmp":"tmp/dsh-memory_0.1.1_1788066792072_0.5990280425204557","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dennisrongo/dsh-memory","version":"0.1.2","description":"Memory capture and inspection for DeepSeek Harness (dsh) — a /remember command that writes into the AGENTS.md hierarchy, and a tab showing which instruction files the loader actually kept","type":"module","license":"MIT","author":{"name":"Dennis Rongo"},"main":"lib/index.js","exports":{".":{"default":"./lib/index.js"},"./client":{"default":"./lib/client.js"},"./typert":{"default":"./lib/typert.host.js"},"./package.json":"./package.json"},"scripts":{"build":"node build/build.mjs","typecheck":"tsc --noEmit","test":"node build/build.mjs && node test/smoke.mjs"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"platform":"web","inject":["@deepseek-ai/dsh-client-runtime"],"immediately":true}},"dependencies":{"zod":"^4.4.3"},"peerDependencies":{"@deepseek-ai/cordis":"^4.0.1","@deepseek-ai/dsh-agent-instructions":"^0.1.1-rc.2","@deepseek-ai/dsh-commands":"^0.1.1-rc.2","@deepseek-ai/dsh-typert-protocol":"^0.1.1-rc.2","@deepseek-ai/dsh-workspace":"^0.1.1-rc.2"},"devDependencies":{"@types/node":"^22.20.1","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","esbuild":"^0.24.0","react":"^18.3.0","react-dom":"^18.3.0","typescript":"^5.6.0"},"repository":{"type":"git","url":"git+https://github.com/dennisrongo/dsh-plugins.git","directory":"plugins/dsh-memory"},"homepage":"https://github.com/dennisrongo/dsh-plugins/tree/main/plugins/dsh-memory#readme","bugs":{"url":"https://github.com/dennisrongo/dsh-plugins/issues"},"_id":"@dennisrongo/dsh-memory@0.1.2","gitHead":"b037914e62a2b12d5c76d3387b218f96319d7a54","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-fTgISCyFtEyAAPyyqtMItNfD4MnlnI68Mi9R+gZtvhV716ic4NFFQEoyJXovrrJ8mJ7ufu7yGtSde3A6cT2DOA==","shasum":"8af36b6e08c9e292cda8508ebab116a919764a2d","tarball":"https://registry.npmjs.org/@dennisrongo/dsh-memory/-/dsh-memory-0.1.2.tgz","fileCount":6,"unpackedSize":369764,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dennisrongo%2fdsh-memory@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGTt2yJpspIDul7HdzHY/0gCRdbNFm0Q5FURW/o7vQjdAiBoMyaFJRvDfxC86uH4YJ6UhDQHSpiBGQ12H1NnEy+Oxg=="}]},"_npmUser":{"name":"dennisrongo","email":"dennis@menacestudio.com"},"directories":{},"maintainers":[{"name":"dennisrongo","email":"dennis@menacestudio.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-memory_0.1.2_1788288064648_0.6613565840384981"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-29T20:46:09.868Z","modified":"2026-09-01T18:41:05.150Z","0.1.0":"2026-08-29T20:46:10.255Z","0.1.1":"2026-08-30T05:13:12.251Z","0.1.2":"2026-09-01T18:41:04.821Z"},"bugs":{"url":"https://github.com/dennisrongo/dsh-plugins/issues"},"author":{"name":"Dennis Rongo"},"license":"MIT","homepage":"https://github.com/dennisrongo/dsh-plugins/tree/main/plugins/dsh-memory#readme","repository":{"type":"git","url":"git+https://github.com/dennisrongo/dsh-plugins.git","directory":"plugins/dsh-memory"},"description":"Memory capture and inspection for DeepSeek Harness (dsh) — a /remember command that writes into the AGENTS.md hierarchy, and a tab showing which instruction files the loader actually kept","maintainers":[{"name":"dennisrongo","email":"dennis@menacestudio.com"}],"readme":"# dsh-memory\n\n**npm:** [`@dennisrongo/dsh-memory`](https://www.npmjs.com/package/@dennisrongo/dsh-memory)\n\nA `/remember` command that writes a fact into the instruction hierarchy dsh already reads, and a **Memory** tab that shows which of those files the loader actually kept.\n\n## Why this is small\n\ndsh already has the read half of a memory system, and it is more capable than it looks. `@deepseek-ai/dsh-agent-instructions` — its own manifest calls it a *\"Workspace context loader for AGENTS.md/CLAUDE.md instruction files\"* — loads the user-global `$DSH_HOME/AGENTS.md`, then every `AGENTS.md` and `CLAUDE.md` from the project root down to the session's directory, plus `AGENTS.local.md` / `CLAUDE.local.md` overlays, deduplicated per directory, budgeted by bytes, and it pulls in nested files as the agent touches them. Sessions are already bound to workspaces by canonical path through `workspaceRegistry`.\n\nTwo things were missing:\n\n**Nothing writes.** There is no `#`-style capture and no `/remember`, so a fact learned mid-session is a fact you retype into a file by hand, later, if you remember to.\n\n**Nothing shows what loaded.** The byte budget silently omits files. A file that exists, is discovered, and is dropped for budget looks exactly like a file the agent is ignoring for no reason — and the shipped `code` preset's budget is 64 KiB, which a real monorepo reaches.\n\nSo this plugin is those two things and deliberately nothing else. There is no parallel fact database: a second store beside the instruction files would mean two things to keep in sync, two precedence orders, and a place for facts to hide from a loader that already works.\n\n## Capture\n\n```\n/remember the build needs pnpm 11 — package.json pnpm blocks are ignored\n/remember --local the staging token lives in ~/.config/acme\n/remember --user I prefer conventional commits with no Claude co-author trailer\n```\n\n| Flag | File | Reach |\n|---|---|---|\n| *(default)* `--project` | `<projectRoot>/AGENTS.md` | travels with the repository |\n| `--local` | `<projectRoot>/AGENTS.local.md` | this checkout only, usually gitignored |\n| `--user` | `$DSH_HOME/AGENTS.md` | every project on this machine |\n\nThe reply always names the exact path it wrote. \"Saved\" would leave you guessing which of four candidate files in the hierarchy it landed in.\n\nFacts are filed under a `## Memories` heading rather than appended to the end of the file, and a second fact joins the existing list instead of starting a new one. Nothing a human wrote is ever moved: a file with no memories section gets one appended (with the blank line guarded, so the heading cannot end up glued to the last line of prose), and a file with one gets the new item at the end of *that section*, not after whatever heading happens to be last.\n\nThe Memory tab has the same capture box, with a scope chooser; Enter saves, Shift+Enter is a newline.\n\n## Inspection\n\nThe tab lists every instruction file discovered for the workspace, in **model precedence order**, with its size and whether the budget kept it:\n\n```\nAGENTS.md                                    5.1 KB   not loaded\npackages/app/AGENTS.md      cut to 96 B      5.1 KB\n```\n\nClick a row to read the file. `not loaded` and `cut to …` are the two facts you cannot get anywhere else, and they are the reason the tab exists.\n\nBoth come from the loader's own exports — `discoverBaselineInstructionFiles` for the candidate list and `loadBaselineInstructions` for the `omitted` / `truncated` accounting. Nothing here reimplements the walk. An inspector that reimplemented it would eventually disagree with the loader, and an inspector you cannot trust when it disagrees is worse than none: the entire point is to answer \"is the agent reading this file?\" authoritatively.\n\n`read` serves a path only when the loader discovered it for that workspace. Without that check the endpoint reads any file on the host.\n\n## Configuration\n\n```yaml\n- id: dsh-memory\n  config:\n    maxBytes: 65536\n```\n\n`maxBytes` **must match** the `agent-instructions` row's own `maxBytes`, or the inspector reports omissions against the wrong budget. The shipped `code` preset uses `65536`, which is this plugin's default; a plugin cannot read another plugin's entry config, so if you change one, change both.\n\n## Endpoints\n\n| Method | Takes | Returns |\n|---|---|---|\n| `dshMemory/inspect` | `{ workspaceId }` | `{ report }` — every discovered file, sized, with `included` / `truncatedTo` |\n| `dshMemory/remember` | `{ workspaceId, fact, scope }` | `{ ok, path, line }` or `{ ok: false, reason }` |\n| `dshMemory/read` | `{ workspaceId, absolutePath }` | `{ text? }` — discovered files only |\n\nAll take a single parameter named `request`.\n\n## Install\n\n```bash\ndsh plugin add @dennisrongo/dsh-memory\n```\n\nRestart the profile afterwards — the Typert loader caches its per-package verdict for the process lifetime, so a newly added service is not picked up by a browser refresh.\n\n## Requires\n\n`ctx.workspaceRegistry` and `@deepseek-ai/dsh-agent-instructions`, both composed by the shipped presets. `ctx.commands` is picked up through a child fiber rather than injected, so a deployment that composes no command registry still gets the tab and the endpoints — it just has no `/remember`.\n","readmeFilename":"README.md"}