moa-rl-env / moav2 /src /core /tools /runtime-pack-tool.ts
natnael kahssay
feat: use real moav2 source as RL task suite — symlinked sandbox, 3 real service tasks
ce25387
import { Type } from '@sinclair/typebox'
import type { AgentTool } from '@mariozechner/pi-agent-core'
import { runtimePackService } from '../services/runtime-pack'
import { logAction } from '../services/action-logger'
export function createRuntimePackTool(): AgentTool<any, any> {
return {
name: 'runtime_pack',
label: 'Runtime Pack',
description: 'Inspect, activate, rollback, and execute scripts from runtime packs.',
parameters: Type.Object({
action: Type.String({ description: 'One of: info, list_scripts, run_script, activate, rollback' }),
script: Type.Optional(Type.String({ description: 'Script name for run_script' })),
packId: Type.Optional(Type.String({ description: 'Pack id for activate' })),
}),
execute: async (_toolCallId, params) => {
try {
switch (params.action) {
case 'info': {
const info = runtimePackService.getInfoSync()
return {
content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
details: info,
}
}
case 'list_scripts': {
const info = runtimePackService.getInfoSync()
const config = runtimePackService.getActiveConfigSync()
const scripts = config?.scripts ?? {}
const names = Object.keys(scripts)
const lines = names.length > 0
? names.map((name) => {
const script = scripts[name]
return `${name}: ${script.type} -> ${script.command}`
})
: ['(no runtime scripts)']
return {
content: [{ type: 'text', text: `Active pack: ${info.activePackId ?? '(none)'}\n${lines.join('\n')}` }],
details: { activePackId: info.activePackId, scripts: names },
}
}
case 'run_script': {
if (!params.script) {
return {
content: [{ type: 'text', text: 'Error: script is required for run_script' }],
details: { error: 'missing_script' },
}
}
const result = await runtimePackService.executeScript(params.script)
logAction('tool.runtime_pack.run_script', {
script: params.script,
ok: result.ok,
packId: result.packId,
}, { actor: 'agent' })
return {
content: [{ type: 'text', text: result.output }],
details: { ok: result.ok, packId: result.packId, script: params.script },
}
}
case 'activate': {
if (!params.packId) {
return {
content: [{ type: 'text', text: 'Error: packId is required for activate' }],
details: { error: 'missing_packId' },
}
}
const ok = runtimePackService.activatePackSync(params.packId)
logAction('tool.runtime_pack.activate', { packId: params.packId, ok }, { actor: 'agent' })
return {
content: [{ type: 'text', text: ok ? `Activated pack: ${params.packId}` : `Failed to activate pack: ${params.packId}` }],
details: { packId: params.packId, ok },
}
}
case 'rollback': {
const ok = runtimePackService.rollbackSync()
logAction('tool.runtime_pack.rollback', { ok }, { actor: 'agent' })
return {
content: [{ type: 'text', text: ok ? 'Rolled back to previous runtime pack.' : 'No previous runtime pack to roll back to.' }],
details: { ok },
}
}
default:
return {
content: [{ type: 'text', text: `Unknown action: ${params.action}` }],
details: { error: 'unknown_action' },
}
}
} catch (e: any) {
return {
content: [{ type: 'text', text: `Runtime pack error: ${e.message}` }],
details: { error: e.message },
}
}
},
}
}