mirror of
https://github.com/getpaseo/paseo.git
synced 2026-11-01 14:12:51 +00:00
The permit result items stored the request id already shortened to eight characters for the table, so JSON, YAML, and quiet output serialized that display value. Every request id starts with "permission-", so every row came out as "permissi" and could not be passed back to permit allow. The items now keep the full id and only the table column shortens it. Closes #4732 Co-authored-by: paseo-bot[bot] <266920839+paseo-bot[bot]@users.noreply.github.com>
85 lines
2.5 KiB
TypeScript
85 lines
2.5 KiB
TypeScript
import type { Command } from "commander";
|
|
import type { AgentPermissionRequest } from "@getpaseo/protocol/agent-types";
|
|
import type { AgentSnapshotPayload } from "@getpaseo/protocol/messages";
|
|
import { connectToDaemon } from "../../utils/client.js";
|
|
import type { CommandOptions, ListResult, OutputSchema, CommandError } from "../../output/index.js";
|
|
|
|
/** Permission list item for display */
|
|
export interface PermissionListItem {
|
|
id: string;
|
|
agentId: string;
|
|
agentShortId: string;
|
|
name: string;
|
|
description: string;
|
|
}
|
|
|
|
/** Schema for permit ls output */
|
|
export const permitLsSchema: OutputSchema<PermissionListItem> = {
|
|
idField: "id",
|
|
columns: [
|
|
{ header: "AGENT", field: "agentShortId", width: 12 },
|
|
{ header: "REQ_ID", field: (item) => item.id.slice(0, 8), width: 12 },
|
|
{ header: "TOOL", field: "name", width: 20 },
|
|
{ header: "DESCRIPTION", field: "description", width: 50 },
|
|
],
|
|
};
|
|
|
|
/** Transform agent snapshot + permission to list item */
|
|
function toListItem(
|
|
agent: AgentSnapshotPayload,
|
|
permission: AgentPermissionRequest,
|
|
): PermissionListItem {
|
|
return {
|
|
id: permission.id,
|
|
agentId: agent.id,
|
|
agentShortId: agent.id.slice(0, 7),
|
|
name: permission.name,
|
|
description: permission.description ?? "-",
|
|
};
|
|
}
|
|
|
|
export type PermitLsResult = ListResult<PermissionListItem>;
|
|
|
|
/** Collect the pending permissions of every agent */
|
|
export function listPendingPermissions(agents: AgentSnapshotPayload[]): PermitLsResult {
|
|
const items: PermissionListItem[] = [];
|
|
for (const agent of agents) {
|
|
for (const permission of agent.pendingPermissions ?? []) {
|
|
items.push(toListItem(agent, permission));
|
|
}
|
|
}
|
|
|
|
return {
|
|
type: "list",
|
|
data: items,
|
|
schema: permitLsSchema,
|
|
};
|
|
}
|
|
|
|
export interface PermitLsOptions extends CommandOptions {
|
|
host?: string;
|
|
}
|
|
|
|
export async function runLsCommand(
|
|
options: PermitLsOptions,
|
|
_command: Command,
|
|
): Promise<PermitLsResult> {
|
|
const client = await connectToDaemon({ target: options.daemonTarget });
|
|
|
|
try {
|
|
const agentsPayload = await client.fetchAgents({ filter: { includeArchived: true } });
|
|
const agents = agentsPayload.entries.map((entry) => entry.agent);
|
|
await client.close();
|
|
|
|
return listPendingPermissions(agents);
|
|
} catch (err) {
|
|
await client.close().catch(() => {});
|
|
const message = err instanceof Error ? err.message : String(err);
|
|
const error: CommandError = {
|
|
code: "LIST_PERMISSIONS_FAILED",
|
|
message: `Failed to list permissions: ${message}`,
|
|
};
|
|
throw error;
|
|
}
|
|
}
|