Skip to content

Slash commands

Typing a message that starts with / in the chat input can trigger a built-in command instead of a normal turn — here is the full list, exactly what each one prints, and the one client-side command that isn’t in that list at all.

Commands are matched on the whole message (case-insensitive), either as an exact word (/new) or as a prefix followed by an argument (/model fast). If what you type doesn’t match any known command, it is not rejected — it’s forwarded to the agent as an ordinary chat message, exactly as if it had no leading slash. There’s no command palette or autocomplete in the WebUI: you type commands by hand.

Two commands — /stop and /status — are handled on a “priority” fast path that runs even while a turn is actively streaming or a tool is executing. The rest wait for the current dispatch to be free, which in practice is rarely noticeable.

All server-side command responses below are hardcoded in English, regardless of whether the WebUI is set to Italian or English. This is true for the confirmation text, the usage/error messages, and the /status//model output.

Command Arguments What it does
/new none Stops the active task (if any) and clears the model’s context for a fresh conversation
/stop none Cancels the active agent turn for this chat
/status none Shows a runtime snapshot: version, model, token usage, context budget, session size, uptime, active tasks
/model [preset] Shows the current model/preset, or switches the active preset
/history [n] Prints the last n persisted user/assistant messages (default 10, max 50)
/goal <description> Tells the agent to treat the request as a long-running goal
/dream none Manually triggers a memory consolidation (Dream) run in the background
/skill none Lists the currently enabled skills with their descriptions
/help none Lists all of the above (not /clear — see below)

Full details and exact output text for each command follow.

Cancels any active task first, then clears the model’s context (the LLM stops remembering everything before this point) and archives the discarded messages into long-term memory for later Dream processing. The response is rendered as a separator line in the chat, not a bubble:

New session started.

This does not erase anything from the screen. Everything above the separator stays fully visible and scrollable — see /new vs /clear below for why that matters.

There is no stop button in the WebUI; this command is the only way to interrupt a turn that’s in progress, and it works specifically because it’s on the priority fast path (it’s processed even mid-turn, before the normal dispatch lock). Response:

Stopped N task(s).

or, if nothing was running:

No active task to stop.

/stop also cancels an active /goal and discards any subagent working in the background for this chat — a subagent that finishes after being stopped has its result silently thrown away.

No arguments. Output is a fixed-format block (rendered as plain text, not markdown), for example:

🐈 jenny v0.3.0
🧠 Model: gpt-4o
📊 Tokens: 1234 in / 567 out (40% cached)
📚 Context: 12k/65k (22% of input budget)
💬 Session: 48 messages
⏱ Uptime: 2h 14m
⚡ Tasks: 0 active

The cached-percentage part of the token line only appears when the last turn actually used cached tokens. “% of input budget” is the context estimate divided by (context window − max output tokens − a small safety margin), not divided by the raw context window. /status and /stop are the two commands that work even while a turn is running.

/model [preset] — show or switch model preset

Section titled “/model [preset] — show or switch model preset”

Without an argument, shows the current state:

## Model
- Current model: `gpt-4o`
- Current preset: `default`
- Available presets: `default`, `fast`, `deep`

default is always available and reflects the plain agents.defaults.* model fields; named presets come from modelPresets in config.json — there is no UI for creating presets, they exist only in the config file. See Configuration reference.

With one argument, it switches presets for future turns and confirms:

Switched model preset to `fast`.
- Model: `gpt-4o-mini`
- Context window: 65536
- Max output tokens: 4096

If the name doesn’t match a configured preset:

Could not switch model preset: <error detail>
Available presets: `default`, `fast`, `deep`

If you pass more than one word:

Usage: `/model [preset]`

Switching is runtime-only: it does not rewrite config.json, and a turn that is already in progress keeps using the model it started with.

Shows the last n persisted user/assistant messages from the current session. Default n is 10, maximum is 50 (a value above 50 is silently capped, not rejected). Each message is truncated to 200 characters with a trailing .

Last 10 message(s):
👤 You: what's the weather like today?
🤖 Bot: It's sunny and 22°C where you are right now.

If there’s nothing to show:

No conversation history yet.

If the argument isn’t a number:

Usage: /history [count] — e.g. /history 5 (default: 10, max: 50)

This reads the persisted session history, not the on-screen transcript — see /new vs /clear for the difference.

/goal <description> — start a long-running goal

Section titled “/goal <description> — start a long-running goal”

Rewrites your message into a normal agent turn that instructs the model to register a sustained objective (via the internal long_task tool) instead of answering as a one-shot request. There’s no separate “goal view” — it’s the same chat, with normal turns, but the objective stays pinned in the agent’s context (so it survives compaction) and the per-turn timeout is disabled until it’s done. A banner with a running timer appears while a turn is in progress.

Without a description:

Usage: /goal <long-running task description>

If a task is already running in this chat:

A task is already running for this chat. Use `/stop` first, then send `/goal <long-running task description>` again.

Only one goal can be active per chat at a time. The agent closes it itself (or you can cancel with /stop); an inactive goal also expires automatically after 12 hours.

Triggers Dream (the long-term memory consolidation job) in the background. It replies immediately:

Dreaming...

and later, once the run finishes, with a separate message giving the outcome — one of:

Dream completed in 4.2s.
Dream completed in 4.2s but wrote nothing (attempts blocked/refused); memory cursor was not advanced.
Dream did not complete after 4.2s; memory cursor was not advanced.
Dream failed after 4.2s: <error>

If there’s no new history to process yet (common on a fresh or short chat, since Dream only reads from memory/history.jsonl, which is only populated after compaction), you get a longer explanation instead, ending with suggestions like enabling idleCompactAfterMinutes. See Memory and Dream for the full model.

Available skills (3):
- **weather** — Look up current weather and forecasts.
- **app-creator** — Guide the user through building a new Jenny App.
- **llm-wiki** — Maintain the workspace wiki (scaffold, ingest, compile).

or, if none are enabled:

No skills available.
✿ jenny commands:
/new — Stop the current task and start a fresh conversation.
/stop — Cancel the active agent turn for this chat.
/status — Display runtime, provider, and channel status.
/model [preset] — Show or switch the active model preset.
/history [n] — Print the last N persisted conversation messages.
/goal <goal> — Tell the agent to treat the request as a long-running goal.
/dream — Manually trigger memory consolidation.
/skill — List enabled skills and their descriptions.
/help — List available slash commands.

/clear is deliberately not in this list — see below.

/clear — the hidden, client-side command

Section titled “/clear — the hidden, client-side command”

/clear exists but does not appear in /help, is not registered as a server command, and is handled entirely inside the WebUI before your message is even sent. It:

  • Wipes the rendered message list from the screen.
  • Prints a local system line: Chat cleared.
  • Resets the WebUI’s own scroll/history cursor so older messages reload from the beginning on scroll-up.

It never reaches the gateway. The server-side session, the model’s context, and the persisted transcript are all completely untouched.

These two commands are easy to confuse and do genuinely different things — and neither one deletes anything on the server:

/new /clear
Where it runs Server (gateway) Client (WebUI only, never sent)
What it clears The model’s context (what the LLM remembers) Only what’s drawn on your screen right now
Effect on the visible chat Nothing is erased; adds a “New session started.” separator Wipes the screen; next scroll-up reloads history from the server
Effect on the persisted transcript Untouched — it’s a separate, permanent log Untouched
In /help? Yes No

In short: /new changes what the model remembers but leaves everything on screen; /clear changes what you see but leaves everything the model remembers and everything stored on the server untouched. If you want a genuinely blank-looking chat that the model has also forgotten, you need /new/clear alone will just come back the moment you scroll up or reopen the app. If you want to actually forget content, /new is still not permanent deletion: the discarded messages are archived for Dream, not destroyed, and the full transcript with everything before the separator is still visible on screen.

This is unrelated to slash commands but shares the same “plain files, no terminal” spirit: Jenny also runs a periodic check every 30 minutes (gateway.heartbeat.intervalS, default 1800) driven by workspace/HEARTBEAT.md. It only acts on lines under a ## Active Tasks heading; everything else in the file is ignored. You can edit that file directly from the Workspace tab, or just ask Jenny in chat to “add a periodic task” and she’ll update it for you. This job shows up in the agent’s internal job list as heartbeat, but it’s system-managed and can’t be removed the way a normal reminder can; to disable it you’d set gateway.heartbeat.enabled to false in config.json and restart the app (there is no in-app toggle for it). See Scheduling and proactivity for the full picture, including the cost-per-cycle caveat and reliability limits.

Jenny · code underAGPL-3.0 · name and mascot undertrademark

No cookies, no trackers, no analytics. This page loads nothing from a third party.