Bundle
dsh-generation
Fork agent presets and run tasks on the next generation. Make, not a compiler.
- Source
- goecho
- stars
- 3 stars
- License
- MIT
- Updated
- Updated 1 hour ago
Readme
# dsh-generation
English | [中文](README.zh.md)
A DeepSeek Harness plugin that **forks agent presets and runs a task on the next generation**.
It is **make, not a compiler**. Creator mode is already the compiler: it can inspect the runtime, edit files, and author presets. This plugin only records a lineage — copy a known-good preset, let the meta agent edit that copy with ordinary `fs` / `bash`, then start a **new** working session on it.
Compatible with DeepSeek Harness **0.1.2+** (`dsh-v0.1.3-alpha.2` and current `master`). It needs `Session.snapshotEvents()`, async `ctx.agents.create({ sessionId, meta, signal, setup })`, Host-global `ctx.tools.register`, and `dsh.bundle.patch`. Do not add `@deepseek-ai/*` to this package — a second copy of those modules crashes tool dispatch.
## Install
```sh
dsh plugin --profile web add github:goecho/dsh-generation
```
Then **restart** `dsh --profile web` so the host profile reloads. Pin a SHA from the [commit history](https://github.com/goecho/dsh-generation/commits/main) after you have read the source. The package is plain JavaScript, so git installs do not need a `prepare` build allowlist. Plugin 0.2.0 is the line that talks to `snapshotEvents()` and passes the parent `AbortSignal` into `agents.create`.
Then open a **Creator mode** (`cordis`) session — or a copy of that preset whose composition still has a plugin row `name: '@deepseek-ai/dsh-tool-cordis'`.
`dsh plugin add` installs into the **host** profile, so the two tools are registered globally. This plugin then hides them from every non-Creator session (including user copies of `standard` / `minimal` / `code`) and from every agent with `origin: subagent`, including the workers `generation_run` starts. Execute still refuses a non-Creator caller.
This repository already has the `dsh-plugin`, `dsh`, and `deepseek-harness` GitHub topics.
## Why
DeepSeek Harness splits composition into a Host plane (sandbox, model route, persistence) and an Agent plane (tools, persona, prompt). A session’s preset is locked once a turn has run, so you cannot hot-swap the working agent’s toolset without stranding logged tool calls.
The useful bootstrap is the same as a C compiler: **each generation is a new binary**. Stage N writes files for stage N+1; you do not patch the process that is currently compiling.
## What it is not
- Not a replacement for Creator mode (`cordis` preset) or `cordis_define` / `cordis_run`
- Not a way to recompose the current session, or to give an in-process subagent a different preset
- Not a YAML/JS generator, scorer, or auto-promoter of the default creator
- Not a Host-plane kernel: it does not add services, session event types, or sandbox backends
- It does **not** depend on `@deepseek-ai/dsh-tools` / `@deepseek-ai/dsh-llm`. Tools are registered as raw definitions so a second copy of those packages cannot split the host’s module identity.
## Design
Four rules:
1. **The kernel stays assembly.** No new Host services, no new `SessionEvent` types, no unlocking `agent-preset-locked`.
2. **A generation is a new process of composition.** `generation_run` uses `agents.create` + `agentPresets.mount(id)`, never `recompose` on the meta session and never `composeFrom` (in-process children inherit the parent preset).
3. **This plugin is make.** It does not write `agent.cordis.yml`. Editing uses tools the creator preset already has.
4. **A human is stage3.** `fork` and `run` go through `tools/pre-execute` `ask`. Nothing is promoted to the default creator automatically. Lineage is the meta session log (`tool/call` / `tool/result`), not a second database.
```
meta session (cordis + this plugin)
→ generation_fork copy a preset to a new id
→ fs / bash edit the copy (not this plugin)
→ generation_run new agent, mount that id, run the task, dispose
→ summary back into the meta log
→ fork again or stop
```
Working generations should fork from `standard`, `minimal`, or `code`.
## Tools
| Tool | Does | Does not |
| --- | --- | --- |
| `generation_fork` | `agentPresets.copy(from, id)`; writes `purpose` into the new `preset.yml` description; returns id and directory | Accept composition YAML (authoring stays copy-only); overwrite an existing id |
| `generation_run` | After approval, create an agent, `mount` the preset, `followup(task)`, wait until idle, cancel, or a 15-minute timeout, return `sessionId`, `stopReason`, tool names used, last assistant text, then `dispose` | Run Creator mode as the worker; inherit the meta toolset; leave a half-created agent on failure |
### `generation_fork`
| Argument | Required | Meaning |
| --- | --- | --- |
| `from` | yes | Preset id to copy. Prefer `standard`, `minimal`, or `code`. |
| `id` | yes | New preset id (`/^[a-z0-9][a-z0-9-]*$/`). Must not already exist. |
| `purpose` | yes | One sentence written into the new `preset.yml` description. |
Returns `{ ok, id, from, purpose, path, compositionPath }` where `path` is the preset directory.
### `generation_run`
| Argument | Required | Meaning |
| --- | --- | --- |
| `preset` | yes | Preset id to mount on the new working session. Must not be `cordis`. |
| `task` | yes | Self-contained follow-up for the worker. It does not see meta history. |
Refuses a worker whose composition still has a plugin row `name: '@deepseek-ai/dsh-tool-cordis'`. Inherits the meta session’s workspace `cwd`, records `origin: subagent` and `parentSession` so logs chain, and passes the parent tool `AbortSignal` into `agents.create` so cancelling the meta tool also aborts worker creation. It does not dump the full worker transcript into the meta context. Worker logs are read with `snapshotEvents()`. If the worker never goes idle, it is cancelled after 15 minutes (`stopReason: "timeout"`). Domain failures keep `{ ok: false }` but render as `ERROR:` so the model notices.
Returns `{ ok, sessionId, presetId, stopReason, toolsUsed, lastAssistantText }`.
## Trust
Treat a Creator session that can fork and run generations as **shell access**. Mitigation in v1:
- Human approval on every fork and every run
- Worker preset cannot be `cordis`, and cannot still carry a `@deepseek-ai/dsh-tool-cordis` plugin row
- Edits belong under the new preset directory
- Model-written JavaScript is never auto-mounted via `cordis_run`
## Develop
```sh
npm test
```
There are no `@deepseek-ai/*` runtime dependencies. The tests mock `ctx.tools` / `ctx.agentPresets` / `ctx.agents`. GitHub Actions runs the same `npm test` on Node 22.
## License
[MIT](LICENSE)
Install
dsh plugin --profile web add github:goecho/dsh-generation#c29fde10775e710e74e4aacea47651a5db232eb4
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-generation from the hub