mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
The sandbox deliberately provides no Node API, and now says so instead of letting a bare ReferenceError teach nothing: require, the timers, and fetch are callable traps whose error redirects to the cordis alternative (inject: ['fs'] + ctx.fs, ['web'] + ctx.web, ['bash'] + ctx.bash, ['timer'] + ctx.setTimeout — a fiber effect, unwound on unmount). Only function-shaped globals are trapped; process/Buffer stay undefined so typeof feature probes stay inert. The mount description and the demo persona state the routing rule, and the demo mounts ctx.fs (local provider) and ctx.web (seam + keyless local fetch provider) so agent-built plugins have real capabilities to build on. Live-validated: a model that reached for Node setTimeout self-corrected to inject: ['timer'] in one step and built a working ctx.web fetch tool.
84 lines
3.6 KiB
YAML
84 lines
3.6 KiB
YAML
# The cordis-agent plugin tree: the SELF-REFERENTIAL harness demo. Same spine
|
|
# as coding-agent (DeepSeek V4 + local bash on @deepseek-ai/dsh-stdio-agent),
|
|
# plus @deepseek-ai/dsh-tool-cordis, which gives the model three tools over the
|
|
# live cordis runtime it is running inside: cordis_inspect (services / plugin
|
|
# tree / tools / dynamic mounts / api / events), cordis_mount (evaluate
|
|
# model-written code in a vm sandbox and mount the returned plugin under the
|
|
# `cordis-dynamic` group), and cordis_unmount (dispose one mount by id).
|
|
# Requires DEEPSEEK_API_KEY (and optionally DEEPSEEK_BASE_URL) — the
|
|
# dsh-stdio-agent bin loads the gitignored repo-root .env first.
|
|
#
|
|
# Trust stance (docs/rfc/implemented/feature/2026-07-08-self-referential-cordis-toolset.md):
|
|
# the mounted code gets the REAL ctx — the
|
|
# vm sandbox only prevents accidental global pollution. Load the toolset as
|
|
# deliberately as you would grant a bash tool.
|
|
|
|
# Hot-module reload for the dev/demo loop (needs `node --expose-internals`).
|
|
- id: hmr
|
|
name: '@cordisjs/plugin-hmr'
|
|
config:
|
|
root: ['.']
|
|
|
|
# The DeepSeek adapter.
|
|
- id: llm-deepseek
|
|
name: '@deepseek-ai/dsh-llm-deepseek'
|
|
config:
|
|
apiKey: !!js process.env.DEEPSEEK_API_KEY
|
|
baseURL: !!js process.env.DEEPSEEK_BASE_URL
|
|
models:
|
|
- deepseek-v4-pro
|
|
- deepseek-v4-flash
|
|
|
|
# Local bash executor for agent-core's tool-bash schema — gives the agent an
|
|
# ordinary tool whose calls make the mounted listeners observably fire.
|
|
- id: bash
|
|
name: '@deepseek-ai/dsh-bash-local'
|
|
config:
|
|
timeoutMs: 60000
|
|
|
|
# Filesystem service for mounted plugins (ctx.fs) — the local provider only.
|
|
# The model-facing read/write/edit tools stay unmounted on purpose: this demo
|
|
# is about the agent building its own tools over the services.
|
|
- id: fs-local
|
|
name: '@deepseek-ai/dsh-fs-local'
|
|
config:
|
|
cwd: !!js process.cwd()
|
|
|
|
# Web service for mounted plugins (ctx.web): the seam plus the anonymous local
|
|
# fetch provider (keyless). No search provider is loaded — ctx.web search
|
|
# calls fail loud until a deployment adds one.
|
|
- id: web
|
|
name: '@deepseek-ai/dsh-web'
|
|
|
|
- id: web-fetch-local
|
|
name: '@deepseek-ai/dsh-web-fetch-local'
|
|
|
|
# The stdio chat app: the whole spine + front-door cluster, configured for the
|
|
# self-referential demo driving a pre-created `main` agent.
|
|
- id: stdio-agent
|
|
name: '@deepseek-ai/dsh-stdio-agent'
|
|
config:
|
|
model: deepseek-v4-flash
|
|
resumeSessionId: !!js process.env.RESUME_SESSION_ID
|
|
persistenceRoot: './.sessions'
|
|
welcome: 'cordis-agent ready. Ask it to inspect its runtime, mount a listener, or invent a tool for itself.'
|
|
persona: |
|
|
You are cordis-agent, a self-referential harness demo powered by the
|
|
{{model}} model.
|
|
|
|
You run INSIDE a cordis plugin runtime, and your cordis_* tools operate
|
|
on that live runtime: cordis_inspect to look around (its `api` and
|
|
`events` sections document the service methods, type shapes, and events
|
|
your plugin code can use), cordis_mount to add a plugin (an event
|
|
listener, a brand-new tool for yourself, or a service other mounts
|
|
inject), cordis_unmount to clean one up. In mounted code, NEVER use Node
|
|
built-ins (require/setTimeout/fetch) — use the runtime's cordis services
|
|
via inject: fs, web, bash, and timer (ctx.setTimeout). Prefer small
|
|
single-purpose plugins, prefer plain notification events over waterfall
|
|
events unless you intend to intercept, and unmount what you no longer
|
|
need. Report results briefly.
|
|
|
|
# The self-referential cordis toolset (loaded after the app so ctx.tools exists).
|
|
- id: tool-cordis
|
|
name: '@deepseek-ai/dsh-tool-cordis'
|