Skip to main content

Terminal Access

Terminal Access

Characters can execute shell commands on the host machine through a multi-layered security system. Terminal access is powerful — a character can check system status, manage files, run scripts, and interact with the operating system — but it's carefully controlled.


How Terminal Access Works

When a character has the Terminal node enabled and needs to run a command, it includes a trigger in its response:

[TRIGGER:terminal:ls -la /var/log]

The command passes through five security layers before execution:

  1. Dangerous pattern check — hardcoded patterns that are always blocked (fork bombs, recursive root deletion, disk formatting)
  2. Whitelist — commands in the active preset's allowed list pass through
  3. Blacklist — explicitly blocked commands are rejected
  4. Path validation — commands accessing paths outside allowed directories are blocked
  5. Terminal Service safety checker — a second independent safety layer at the execution point

Only commands that pass all five layers are executed. The result is returned to the character for analysis.


Presets

Terminal access is controlled through presets — named collections of allowed commands. Each preset defines what commands the character can run:

Preset Commands Best For
Read Only 69 commands — ls, cat, grep, find, curl, ps, df, ping, etc. Safe system inspection. Cannot modify anything.
Read & Write 35 commands — mkdir, cp, mv, rm, chmod, tar, nano, etc. File management tasks
Developer 61 commands — git, npm, python, docker, make, cargo, etc. Development and DevOps workflows
System Admin 46 commands — systemctl, journalctl, useradd, mount, sudo, etc. System administration
Manual 0 commands — you define your own whitelist and blacklist Full custom control

Presets are additive to your manual whitelist. You can select a preset AND add extra commands to the whitelist.


Enabling Terminal Access

Terminal access is configured in two places:

On the Character (Visual Builder)

Add the Terminal node to the character's canvas. This enables the character to use [TRIGGER:terminal:command] patterns. Configure allowed commands, blocked patterns, and path restrictions in the node settings.

On the User (Concierge Terminal Settings)

For the Concierge assistant specifically, terminal access is configured in the QUI Core dashboard → Chat tab → Terminal Settings:

  1. Toggle Enable Terminal Access on
  2. Select a preset (or Manual for custom)
  3. Optionally add commands to the whitelist or blacklist
  4. Toggle Require Manual Approval if you want to review each command before execution

Manual Approval Mode

When manual approval is enabled, every command proposed by the character shows an Execute button instead of running automatically. You see the command, decide if it's safe, and click Execute to proceed.

The Execute button bypasses the preset/whitelist filters (since you're explicitly approving), but the Terminal Service's safety layer still blocks inherently dangerous operations.


What's Always Blocked

Regardless of preset, whitelist, or manual approval, these patterns are always blocked by the dangerous command filter:

  • Recursive root deletion (rm -rf /)
  • Writing to disk devices (dd of=/dev/sda)
  • Filesystem formatting (mkfs)
  • Fork bombs
  • Recursive world-writable permissions (chmod -R 777)
  • Piping untrusted URLs to shell (curl | bash)
  • Background process detachment (nohup, disown)

These protections exist at both the QUI Core command filter layer and the Terminal Service safety checker layer — two independent systems that must both pass.


Audit Trail

Every terminal command attempt is logged, regardless of outcome:

  • Which user ran it
  • The full command
  • Whether it was allowed, blocked, executed, or failed
  • The exit code and output (if executed)
  • Which preset was active
  • Execution duration

Audit logs are retained for 90 days and cleaned up automatically.


Terminal in ThinkThing

ThinkThing has 24 terminal node types — one generic and 23 specialized for specific domains (Git, Python, Docker, PostgreSQL, etc.). These nodes use an agentic loop:

  1. You describe a task in natural language
  2. The LLM decides what commands to run
  3. Commands are executed through the security system
  4. Results are fed back to the LLM
  5. The LLM iterates until the task is complete or the iteration limit is reached

Each specialized node scopes the LLM to its domain — a "Git Terminal" node focuses the LLM on git operations, while a "Docker Terminal" node focuses on container management.

Updated on Mar 21, 2026