52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
/**
|
|
* pi.getCommands() wrapper.
|
|
*
|
|
* Fetches available slash commands from the pi ExtensionAPI and normalises
|
|
* them into the shape used by the /sessions/:id/commands REST endpoint (T-1.6).
|
|
*
|
|
* Owner: T-1.4
|
|
*/
|
|
|
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
|
|
export interface SlashCommand {
|
|
name: string;
|
|
description: string;
|
|
args?: string;
|
|
}
|
|
|
|
/**
|
|
* Get the list of registered slash commands from pi.
|
|
* Returns an empty array if the API doesn't support getCommands.
|
|
*/
|
|
export async function getCommands(pi: ExtensionAPI): Promise<SlashCommand[]> {
|
|
try {
|
|
// getCommands may not exist in all pi versions
|
|
if (
|
|
typeof (pi as unknown as { getCommands?: unknown }).getCommands !==
|
|
"function"
|
|
) {
|
|
return [];
|
|
}
|
|
const raw = await (
|
|
pi as unknown as { getCommands: () => Promise<unknown[]> }
|
|
).getCommands();
|
|
if (!Array.isArray(raw)) return [];
|
|
|
|
return raw
|
|
.filter(
|
|
(c): c is { name: string; description?: string; args?: string } =>
|
|
c !== null &&
|
|
typeof c === "object" &&
|
|
typeof (c as { name?: unknown }).name === "string",
|
|
)
|
|
.map((c) => ({
|
|
name: c.name,
|
|
description: c.description ?? "",
|
|
args: c.args,
|
|
}));
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|