taikutaiku
User GuidePluginsAPI Reference

Permissions

Every plugin permission, what it allows, and how to evaluate risk.

Every plugin declares the permissions it needs in its manifest. taiku enforces these at runtime. If a plugin tries to call a bridge method it does not have permission for, the call is rejected. This is not advisory; it is enforced in the host bridge code.

Permission reference

PermissionRiskDescription
session.readlowView session metadata, shells, and users.
session.writemediumRename sessions and modify session metadata.
terminal.readlowRead buffered terminal output from shells.
terminal.writehighSend input to shells and create or close them.
chat.readlowRead session chat history.
chat.writemediumSend chat messages into the session.
events.subscribelowReceive host-emitted plugin events.
events.broadcastmediumBroadcast custom events to other plugins and the session.
ui.toolbarlowShow a toolbar icon for the plugin.
ui.toolbar.customlowAdd custom toolbar actions, badges, and tooltips.
ui.panellowOpen and control sidebar, bottom, floating, tooltip, or overlay panels.
ui.openlowOpen a path in the built-in file viewer.
ui.toastlowShow host toast notifications.
ui.notifymediumSend browser or desktop notifications.
audio.playmediumPlay built-in sounds or plugin-provided audio URLs.
tunnel.readlowRead the session's published tunnel ports.
workspace.readlowInspect workspaces, tabs, tiles, and layout state.
workspace.writemediumCreate workspaces and modify the tile layout.
hotkey.registerlowRegister plugin-defined hotkeys.
shell.aliashighExpose shell alias commands inside terminals.
kv.readlowRead session-scoped shared plugin KV data.
kv.writemediumWrite session-scoped shared plugin KV data.
storage.readlowRead plugin-owned persistent storage files.
storage.writemediumWrite and delete plugin-owned persistent storage files.
fs.listlowList directories through the CLI-backed file API.
fs.read.cwdmediumRead files relative to the session working directory.
fs.readhighRead arbitrary files accessible to the session host.
fs.write.cwdmediumWrite files relative to the session working directory.
fs.writehighWrite arbitrary files accessible to the session host.
agent.eventshighRead AI agent session history, events, and token usage.

Risk levels

Low: the plugin can observe but not modify. Reading session metadata, subscribing to events, and displaying panels are low-risk because they do not change session state or access sensitive data.

Medium: the plugin can modify shared state or trigger visible side effects. Writing to session KV, sending chat messages, broadcasting events, and showing notifications all affect what other participants see or hear.

High: the plugin can take actions with real consequences. Writing to terminals means executing commands. Writing to the filesystem means modifying files. Reading arbitrary files means accessing anything the session host can access. These permissions should only be granted to plugins you trust completely.

Evaluating a plugin

When deciding whether to enable a plugin, look at its permission list and ask: does this plugin need these capabilities for what it claims to do?

A monitoring plugin like Event Log needs session.read and events.subscribe and that makes sense. If it also requested terminal.write or fs.write, that would be a red flag, because a read-only log viewer has no reason to write to your terminals or files.

A command runner like Terminal Commander legitimately needs both terminal.read and terminal.write, because its entire purpose is sending commands and viewing output.

The general principle: fewer permissions means less risk. A plugin with only ui.panel and events.subscribe can display information but cannot modify your session. A plugin with terminal.write and fs.write can execute commands and change files. Both are valid, but they represent very different trust levels.

Persistence scopes

Different permissions gate access to different storage layers:

Storage layerGated byScopeLifetime
Local secrets/settingsNone (browser-only)Current deviceUntil browser data cleared
Session KVkv.read, kv.writeOne session, all participantsSession lifetime
User KVsession.readOne user, all sessionsPersistent (Postgres)
Plugin file storagestorage.read, storage.writeOne user + pluginPersistent (server-side)
Session filesystemfs.* permissionsSession working directory or full hostN/A (reads/writes host files)

On this page