singularity-forge/docs/dev/extending-pi/18-remote-execution-tool-overrides.md
Jeremy 872b0adb48 docs: reorganize into user-docs/ and dev/ subdirectories
Split flat docs/ into user-docs/ (guides, config, troubleshooting) and
dev/ (ADRs, architecture, extension guides, proposals). Updated
docs/README.md index to reflect new paths.
2026-04-10 09:25:31 -05:00

1.5 KiB

Remote Execution & Tool Overrides

SSH Example Pattern

import { createReadTool, createBashTool, createWriteTool } from "@mariozechner/pi-coding-agent";

export default function (pi: ExtensionAPI) {
  pi.registerFlag("ssh", { description: "SSH target", type: "string" });

  const localBash = createBashTool(process.cwd());

  pi.registerTool({
    ...localBash,
    async execute(id, params, signal, onUpdate, ctx) {
      const sshTarget = pi.getFlag("--ssh");
      if (sshTarget) {
        const remoteBash = createBashTool(process.cwd(), {
          operations: createSSHOperations(sshTarget),
        });
        return remoteBash.execute(id, params, signal, onUpdate);
      }
      return localBash.execute(id, params, signal, onUpdate);
    },
  });
}

Tool Override Pattern (Logging/Access Control)

pi.registerTool({
  name: "read",  // Same name = overrides built-in
  label: "Read (Logged)",
  description: "Read file contents with logging",
  parameters: Type.Object({
    path: Type.String(),
    offset: Type.Optional(Type.Number()),
    limit: Type.Optional(Type.Number()),
  }),
  async execute(toolCallId, params, signal, onUpdate, ctx) {
    console.log(`[AUDIT] Reading: ${params.path}`);
    // Delegate to built-in implementation
    const builtIn = createReadTool(ctx.cwd);
    return builtIn.execute(toolCallId, params, signal, onUpdate);
  },
  // Omit renderCall/renderResult to use built-in renderer automatically
});