63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
import * as plugins from '../../plugins.js';
|
|
import { tspmIpcClient } from '../../../client/tspm.ipcclient.js';
|
|
import type { CliArguments } from '../../types.js';
|
|
import { registerIpcCommand } from '../../registration/index.js';
|
|
|
|
export function registerSearchCommand(smartcli: plugins.smartcli.Smartcli) {
|
|
registerIpcCommand(
|
|
smartcli,
|
|
'search',
|
|
async (argvArg: CliArguments) => {
|
|
const query = String(argvArg._[1] || '').trim();
|
|
if (!query) {
|
|
console.error('Error: Please provide a search query');
|
|
console.log('Usage: tspm search <name-fragment | id-fragment>');
|
|
return;
|
|
}
|
|
|
|
// Fetch list of processes, then enrich with names via describe
|
|
const listRes = await tspmIpcClient.request('list', {});
|
|
const processes = listRes.processes;
|
|
|
|
// If there are no processes, short-circuit
|
|
if (processes.length === 0) {
|
|
console.log('No processes found.');
|
|
return;
|
|
}
|
|
|
|
const lowerQ = query.toLowerCase();
|
|
const matches: Array<{ id: number; name?: string }> = [];
|
|
|
|
// Collect describe calls to obtain names
|
|
for (const proc of processes) {
|
|
try {
|
|
const desc = await tspmIpcClient.request('describe', { id: proc.id });
|
|
const name = desc.config.name || '';
|
|
const idStr = String(proc.id);
|
|
if (name.toLowerCase().includes(lowerQ) || idStr.includes(query)) {
|
|
matches.push({ id: proc.id, name });
|
|
}
|
|
} catch {
|
|
// Ignore describe errors for individual processes
|
|
}
|
|
}
|
|
|
|
if (matches.length === 0) {
|
|
console.log(`No matches for "${query}"`);
|
|
return;
|
|
}
|
|
|
|
console.log(`Matches for "${query}":`);
|
|
for (const m of matches) {
|
|
if (m.name) {
|
|
console.log(`- id:${m.id}\tname:${m.name}`);
|
|
} else {
|
|
console.log(`- id:${m.id}`);
|
|
}
|
|
}
|
|
},
|
|
{ actionLabel: 'search processes' },
|
|
);
|
|
}
|
|
|