/**
* Admin Tool
*
* M5 Task: Third tool for testing coordination failure modes
*
* Purpose: Provides administrative operations requiring level 3 permissions
* Tests: Security boundaries in multi-tool orchestration
*/
import {
BaseTool,
type ToolIdentity,
type ToolContext,
type ToolResult,
type ToolClass,
} from '../core/tool-interface.js';
import type { ConversationState } from '../core/conversation-migration.js';
import type { SharedContext } from '../core/shared-context.js';
/**
* Admin Tool Implementation
*
* Capabilities:
* - delete-resource: Delete resource from shared context (requires level 3)
* - validate-resource: Validate resource structure (requires level 1)
*/
class AdminTool extends BaseTool {
constructor() {
super({
name: 'admin-tool',
version: '1.0.0',
capabilities: ['delete-resource', 'validate-resource'],
});
}
/**
* Execute tool action
*/
async execute(action: string, context: ToolContext): Promise<ToolResult> {
console.error(`[AdminTool] Executing action: ${action}`);
console.error(`[AdminTool] Alignment: ${context.alignmentCheck?.alignment || 'none'}`);
// M5: Require shared context
if (!context.sharedContext) {
return {
success: false,
error: 'SharedContext not available in tool context',
};
}
const args = context.args || {};
switch (action) {
case 'delete-resource':
return this.deleteResource(context.sharedContext, args);
case 'validate-resource':
return this.validateResource(context.sharedContext, args);
default:
return {
success: false,
error: `Unknown action: ${action}. Available: delete-resource, validate-resource`,
};
}
}
/**
* Delete resource from shared context (requires level 3)
*/
private deleteResource(context: SharedContext, args: any): ToolResult {
if (!args.name) {
return {
success: false,
error: 'Required parameter: name',
};
}
const resource = context.getResource(args.name);
if (!resource) {
return {
success: false,
error: `Resource '${args.name}' not found`,
};
}
// Delete by setting to null (SharedContext doesn't have delete method yet)
// In production, this would call context.deleteResource(args.name)
const deleted = context.updateResource(args.name, null, 'admin-tool');
if (!deleted) {
return {
success: false,
error: `Failed to delete resource '${args.name}'`,
};
}
return {
success: true,
output: {
message: `Resource '${args.name}' deleted`,
deletedResource: resource.name,
},
};
}
/**
* Validate resource structure (requires level 1)
*/
private validateResource(context: SharedContext, args: any): ToolResult {
if (!args.name) {
return {
success: false,
error: 'Required parameter: name',
};
}
const resource = context.getResource(args.name);
if (!resource) {
return {
success: false,
error: `Resource '${args.name}' not found`,
};
}
// Validate structure
const isValid =
resource.name &&
resource.createdBy &&
typeof resource.createdAt === 'number' &&
typeof resource.updatedAt === 'number';
return {
success: true,
output: {
valid: isValid,
resource: {
name: resource.name,
hasData: !!resource.data,
createdBy: resource.createdBy,
createdAt: new Date(resource.createdAt).toISOString(),
},
},
};
}
/**
* Restore state after hot-reload
*/
static fromState(state: ConversationState): AdminTool {
const tool = new AdminTool();
console.error(`[AdminTool] Restored from state: conversation ${state.conversationId}`);
return tool;
}
}
/**
* Tool Class Export
*
* Static identity property required for hot-reload and registry discovery
*/
const AdminToolClass: ToolClass = Object.assign(AdminTool, {
identity: {
name: 'admin-tool',
version: '1.0.0',
capabilities: ['delete-resource', 'validate-resource'],
} as ToolIdentity,
actionSchemas: {
'delete-resource': {
params: ['name'],
required: ['name'],
description: 'Delete a resource from shared context (requires level 3)',
},
'validate-resource': {
params: ['name'],
required: ['name'],
description: 'Validate a resource structure',
},
},
});
export default AdminToolClass;