feat(cli/daemon/processmonitor): Add flexible target resolution and search command; improve restart/backoff and error handling
This commit is contained in:
@@ -208,6 +208,8 @@ export class TspmDaemon {
|
||||
async (request: RequestForMethod<'delete'>) => {
|
||||
try {
|
||||
const id = toProcessId(request.id);
|
||||
// Ensure desired state reflects stopped before deletion
|
||||
await this.tspmInstance.setDesiredState(id, 'stopped');
|
||||
await this.tspmInstance.delete(id);
|
||||
return {
|
||||
success: true,
|
||||
@@ -246,18 +248,7 @@ export class TspmDaemon {
|
||||
},
|
||||
);
|
||||
|
||||
this.ipcServer.onMessage(
|
||||
'remove',
|
||||
async (request: RequestForMethod<'remove'>) => {
|
||||
try {
|
||||
const id = toProcessId(request.id);
|
||||
await this.tspmInstance.delete(id);
|
||||
return { success: true, message: `Process ${id} deleted successfully` };
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to remove process: ${error.message}`);
|
||||
}
|
||||
},
|
||||
);
|
||||
// Note: 'remove' is only a CLI alias. Daemon exposes 'delete' only.
|
||||
|
||||
this.ipcServer.onMessage(
|
||||
'list',
|
||||
@@ -291,6 +282,58 @@ export class TspmDaemon {
|
||||
},
|
||||
);
|
||||
|
||||
// Resolve target (id:n | name:foo | numeric string) to ProcessId
|
||||
this.ipcServer.onMessage(
|
||||
'resolveTarget',
|
||||
async (request: RequestForMethod<'resolveTarget'>) => {
|
||||
const raw = String(request.target || '').trim();
|
||||
if (!raw) {
|
||||
throw new Error('Empty target');
|
||||
}
|
||||
|
||||
// id:<n>
|
||||
if (/^id:\s*\d+$/i.test(raw)) {
|
||||
const idNum = raw.split(':')[1].trim();
|
||||
const id = toProcessId(idNum);
|
||||
const config = this.tspmInstance.processConfigs.get(id);
|
||||
if (!config) throw new Error(`Process ${id} not found`);
|
||||
return { id, name: config.name } as ResponseForMethod<'resolveTarget'>;
|
||||
}
|
||||
|
||||
// name:<label>
|
||||
if (/^name:/i.test(raw)) {
|
||||
const name = raw.slice(raw.indexOf(':') + 1).trim();
|
||||
if (!name) throw new Error('Missing name after name:');
|
||||
const matches = Array.from(this.tspmInstance.processConfigs.values()).filter(
|
||||
(c) => (c.name || '').trim() === name,
|
||||
);
|
||||
if (matches.length === 0) {
|
||||
throw new Error(`No process found with name "${name}"`);
|
||||
}
|
||||
if (matches.length > 1) {
|
||||
const ids = matches.map((c) => String(c.id)).join(', ');
|
||||
throw new Error(
|
||||
`Multiple processes found with name "${name}": ids [${ids}]. Please use id:<n>.`,
|
||||
);
|
||||
}
|
||||
return { id: matches[0].id, name } as ResponseForMethod<'resolveTarget'>;
|
||||
}
|
||||
|
||||
// bare numeric id
|
||||
if (/^\d+$/.test(raw)) {
|
||||
const id = toProcessId(raw);
|
||||
const config = this.tspmInstance.processConfigs.get(id);
|
||||
if (!config) throw new Error(`Process ${id} not found`);
|
||||
return { id, name: config.name } as ResponseForMethod<'resolveTarget'>;
|
||||
}
|
||||
|
||||
// Unknown format
|
||||
throw new Error(
|
||||
'Unsupported target format. Use numeric id (e.g. 1), id:<n> (e.g. id:1), or name:<label> (e.g. name:api).',
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
// Batch operations handlers
|
||||
this.ipcServer.onMessage(
|
||||
'startAll',
|
||||
|
Reference in New Issue
Block a user