Bundle
dsh-node-repl
Per-session Node REPL terminal in the DSH web UI: a session-local floating terminal (ghostty-web) bridged over WebSocket to an in-process node:repl that has the live agent Cordis Context (agent.ctx) in scope.
- Source
- idkidknow
- License
- MIT
- Updated
- Updated 2 days ago
Readme
# dsh-node-repl
[](https://www.npmjs.com/package/dsh-node-repl)
Per-session **Node REPL terminal** for the DSH web UI. Open a real Node.js REPL
inside any conversation — with the live agent context (`ctx`, `agent`) in scope.
## Features
- A **REPL** button in every session header opens a floating terminal window,
local to that session (no global overlay, no conversation space taken).
- A real `node:repl` prompt — Tab completion, up/down history, top-level `await`,
ANSI colors, `.help` / `.editor`.
- The live agent context is in scope: `ctx` (= `agent.ctx`) and `agent`, so
`ctx.plugin`, `ctx.effect`, `ctx.get`, `ctx.on`, `ctx.provide` all work — plus
the usual Node globals (`require`, `process`, `console`, `fetch`, …).
- Draggable and resizable window; collapse keeps the REPL alive, close kills it.
## Install
```sh
dsh plugin --profile web add dsh-node-repl
```
Restart `dsh web`, and the **REPL** button appears in each session header.
## Usage
Open a session, click **REPL**, and type JavaScript. Top-level `await` works:
```js
> 1 + 1
2
> await Promise.resolve(42)
42
> ctx.get("webServer") // any service the agent can reach
> agent.id // the session id
```
### Window controls
| Control | Effect |
| ---------------------------- | ------------------------------ |
| Header `REPL` button | open / restore / collapse |
| Title bar `–` | collapse (keep the REPL alive) |
| Title bar `✕` | close (kill the REPL) |
| Drag the title bar | move the window |
| Drag the bottom-right corner | resize |
The REPL belongs to its session: refreshing the page, dropping the WebSocket, or
disposing the agent kills it (reopen to start fresh).
## Notes
The REPL runs **inside the DSH host process** (not in a child), which is how it
reaches the live `agent.ctx`. That also makes it a fully-trusted local tool: code
runs unsandboxed and can hang the process — treat it like a shell on that process.
## Development
Requires [pnpm](https://pnpm.io/) and Node ≥ 22. Build outputs (`lib/`) are
generated, not committed.
```sh
pnpm install # installs deps and builds (prepare)
pnpm build # rebuild host (tsc) + client bundle (esbuild)
pnpm test # PTY/REPL bridge smoke test
pnpm lint # eslint
pnpm format # prettier --write
```
Install
dsh plugin --profile web add github:idkidknow/dsh-node-repl
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-node-repl from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.