Files
pi/packages/coding-agent/examples/extensions/shutdown-command.ts
Armin Ronacher 35ff2689ee fix(typebox): migrate to v1 with extension compat (#3474)
* fix(typebox): migrate to v1 with extension compat

Replace AJV-based validation with TypeBox-native validation, keep legacy extension imports working (including @sinclair/typebox/compiler), and restore coercion for serialized/plain JSON schemas.

This change closes #3112.

* fix(typebox): use canonical imports and harden coercion

Switch first-party code to canonical typebox imports while retaining legacy extension aliases in the loader.

Remove obsolete runtime codegen guards, expand serialized JSON-schema coercion coverage, and update related tests and fixtures.

Fixes #3112.

---------

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-04-22 19:59:33 +02:00

64 lines
2.0 KiB
TypeScript

/**
* Shutdown Command Extension
*
* Adds a /quit command that allows extensions to trigger clean shutdown.
* Demonstrates how extensions can use ctx.shutdown() to exit pi cleanly.
*/
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
import { Type } from "typebox";
export default function (pi: ExtensionAPI) {
// Register a /quit command that cleanly exits pi
pi.registerCommand("quit", {
description: "Exit pi cleanly",
handler: async (_args, ctx) => {
ctx.shutdown();
},
});
// You can also create a tool that shuts down after completing work
pi.registerTool({
name: "finish_and_exit",
label: "Finish and Exit",
description: "Complete a task and exit pi",
parameters: Type.Object({}),
async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
// Do any final work here...
// Request graceful shutdown (deferred until agent is idle)
ctx.shutdown();
// This return is sent to the LLM before shutdown occurs
return {
content: [{ type: "text", text: "Shutdown requested. Exiting after this response." }],
details: {},
};
},
});
// You could also create a more complex tool with parameters
pi.registerTool({
name: "deploy_and_exit",
label: "Deploy and Exit",
description: "Deploy the application and exit pi",
parameters: Type.Object({
environment: Type.String({ description: "Target environment (e.g., production, staging)" }),
}),
async execute(_toolCallId, params, _signal, onUpdate, ctx) {
onUpdate?.({ content: [{ type: "text", text: `Deploying to ${params.environment}...` }], details: {} });
// Example deployment logic
// const result = await pi.exec("npm", ["run", "deploy", params.environment], { signal });
// On success, request graceful shutdown
onUpdate?.({ content: [{ type: "text", text: "Deployment complete, exiting..." }], details: {} });
ctx.shutdown();
return {
content: [{ type: "text", text: "Done! Shutdown requested." }],
details: { environment: params.environment },
};
},
});
}