← Back to directory

pi-interactive-shell

Pi coding agent extension that allows Pi to autonomously control interactive CLIs in an observable overlay. Full PTY emulation, no tmux, token efficient. User can take over anytime.

TerminalVerified with notes★ 449MIT

Safety notes

Verified with notes
Observable PTY overlay for interactive CLIs; inherently powerful, but implementation avoids shell-pipe installers.

Static scan findings

This is a first-pass static screen, not a formal audit. It flags patterns worth reading before install.

MEDIUM · spawn_shell
index.ts
  • import { spawn as spawnChildProcess } from "node:child_process";
  • const literal = /^\/(.+)\/([A-Za-z]*)$/.exec(trimmed);
  • const match = parsed.regex.exec(input);
MEDIUM · token_access
key-encoding.ts
  • /** Parse a key token and return the escape sequence */
  • function encodeKeyToken(token: string): string {
  • const normalized = token.trim().toLowerCase();
MEDIUM · spawn_shell
spawn.ts
  • import { execFileSync } from "node:child_process";
  • export function resolveSpawn(
MEDIUM · token_access
spawn.ts
  • const tokenized = tokenizeSpawnArgs(args);
  • if (!tokenized.ok) {
  • return tokenized;
MEDIUM · spawn_shell
pty-protocol.ts
  • while ((match = regex.exec(input)) !== null) {
MEDIUM · network_download
README.md
  • command: 'curl -sf http://localhost:3000/health',
  • command: 'curl -s https://api.example.com/quote/NVDA',
MEDIUM · spawn_shell
pty-session.ts
  • this.ptyProcess = spawn(shell, shellArgs, {
MEDIUM · token_access
CHANGELOG.md
  • - Kill suppression is conditional on completion state — `markAgentHandledCompletion` only set when `session.getResult()` is not yet available, preventing leaked suppression tokens
MEDIUM · network_download
tool-schema.ts
  • - interactive_shell({ command: 'curl -sf http://localhost:3000/health', mode: "monitor", monitor: { strategy: "poll-diff", triggers: [{ id: "changed", regex: "/./" }], poll: { inte
MEDIUM · token_access
tool-schema.ts
  • description: "If true, return only NEW output since last query (raw stream). More token-efficient for repeated polling.",

Package scripts captured

package.json
{
  "test": "vitest run"
}