bashJobTool function
Creates the bash_job tool: inspect and stop the session's background
shell jobs (see ShellJobRegistry).
Implementation
AgentTool bashJobTool(ShellJobRegistry jobs) {
return AgentTool(
name: 'bash_job',
label: 'bash job',
// `stop` kills a process, so the whole tool sits at the write tier
// (task_send precedent); status/output are plain reads.
tier: ApprovalTier.write,
description:
'Manage background shell jobs (started with bash background: true '
'or moved to background when you were interrupted). Actions: '
'"status" lists all jobs (or one with id), "output" shows the tail '
'of a job log (id, optional lines), "stop" terminates a running job '
'(id).',
parameters: const {
'type': 'object',
'properties': {
'action': {
'type': 'string',
'enum': ['status', 'output', 'stop'],
'description': 'What to do with the job(s)',
},
'id': {
'type': 'string',
'description': 'The job id (e.g. sh-1); required for output/stop',
},
'lines': {
'type': 'number',
'description': 'Log tail size for output (default 50)',
},
},
'required': ['action'],
},
execute: (arguments, cancelToken, onUpdate) async {
final action = arguments['action'] as String;
final id = arguments['id'] as String?;
final lines = (arguments['lines'] as num?)?.toInt();
return switch (action) {
'status' => _bashJobStatusResult(jobs, id),
'output' => await _bashJobOutputResult(jobs, id, lines),
'stop' => await _bashJobStopResult(jobs, id),
_ => throw StateError('unknown bash_job action: $action'),
};
},
);
}