Files
bot/src/agents/tool-catalog.ts
zeekay 3de1e92a15 Bump to 2026.5.12; finish HanzoBot* → Bot* identifier sweep so build passes
The big rebrand left a residue of HanzoBot* identifiers inside camelCase
compounds (resolveHanzoBotAgentDir, HanzoBotPackageRoot, hanzoBotRoot,
HanzoBotTmpDir, …) that the canonical bot-root.ts / tmp-bot-dir.ts had
always exported as Bot* / bot*. The earlier \b-anchored sweep missed
them because the H is mid-identifier with no word boundary. Replace
HanzoBot(?=[A-Z][a-z]) → Bot (and hanzoBot equivalent) everywhere, plus
HanzoBotKit → BotKit (the on-disk module is apps/shared/BotKit).

Also one stray pi-tools.ts type narrowing (senderId is string|null but
the target wants string|undefined) — coerce with ?? undefined.

pnpm build → ✔ Build complete in 7s.
2026-05-12 20:41:07 -07:00

327 lines
7.4 KiB
TypeScript

export type ToolProfileId = "minimal" | "coding" | "messaging" | "full";
type ToolProfilePolicy = {
allow?: string[];
deny?: string[];
};
export type CoreToolSection = {
id: string;
label: string;
tools: Array<{
id: string;
label: string;
description: string;
}>;
};
type CoreToolDefinition = {
id: string;
label: string;
description: string;
sectionId: string;
profiles: ToolProfileId[];
includeInBotGroup?: boolean;
};
const CORE_TOOL_SECTION_ORDER: Array<{ id: string; label: string }> = [
{ id: "fs", label: "Files" },
{ id: "runtime", label: "Runtime" },
{ id: "web", label: "Web" },
{ id: "memory", label: "Memory" },
{ id: "sessions", label: "Sessions" },
{ id: "ui", label: "UI" },
{ id: "messaging", label: "Messaging" },
{ id: "automation", label: "Automation" },
{ id: "nodes", label: "Nodes" },
{ id: "agents", label: "Agents" },
{ id: "media", label: "Media" },
];
const CORE_TOOL_DEFINITIONS: CoreToolDefinition[] = [
{
id: "read",
label: "read",
description: "Read file contents",
sectionId: "fs",
profiles: ["coding"],
},
{
id: "write",
label: "write",
description: "Create or overwrite files",
sectionId: "fs",
profiles: ["coding"],
},
{
id: "edit",
label: "edit",
description: "Make precise edits",
sectionId: "fs",
profiles: ["coding"],
},
{
id: "apply_patch",
label: "apply_patch",
description: "Patch files (OpenAI)",
sectionId: "fs",
profiles: ["coding"],
},
{
id: "exec",
label: "exec",
description: "Run shell commands",
sectionId: "runtime",
profiles: ["coding"],
},
{
id: "process",
label: "process",
description: "Manage background processes",
sectionId: "runtime",
profiles: ["coding"],
},
{
id: "web_search",
label: "web_search",
description: "Search the web",
sectionId: "web",
profiles: [],
includeInBotGroup: true,
},
{
id: "web_fetch",
label: "web_fetch",
description: "Fetch web content",
sectionId: "web",
profiles: [],
includeInBotGroup: true,
},
{
id: "memory_search",
label: "memory_search",
description: "Semantic search",
sectionId: "memory",
profiles: ["coding"],
includeInBotGroup: true,
},
{
id: "memory_get",
label: "memory_get",
description: "Read memory files",
sectionId: "memory",
profiles: ["coding"],
includeInBotGroup: true,
},
{
id: "sessions_list",
label: "sessions_list",
description: "List sessions",
sectionId: "sessions",
profiles: ["coding", "messaging"],
includeInBotGroup: true,
},
{
id: "sessions_history",
label: "sessions_history",
description: "Session history",
sectionId: "sessions",
profiles: ["coding", "messaging"],
includeInBotGroup: true,
},
{
id: "sessions_send",
label: "sessions_send",
description: "Send to session",
sectionId: "sessions",
profiles: ["coding", "messaging"],
includeInBotGroup: true,
},
{
id: "sessions_spawn",
label: "sessions_spawn",
description: "Spawn sub-agent",
sectionId: "sessions",
profiles: ["coding"],
includeInBotGroup: true,
},
{
id: "subagents",
label: "subagents",
description: "Manage sub-agents",
sectionId: "sessions",
profiles: ["coding"],
includeInBotGroup: true,
},
{
id: "session_status",
label: "session_status",
description: "Session status",
sectionId: "sessions",
profiles: ["minimal", "coding", "messaging"],
includeInBotGroup: true,
},
{
id: "browser",
label: "browser",
description: "Control web browser",
sectionId: "ui",
profiles: [],
includeInBotGroup: true,
},
{
id: "canvas",
label: "canvas",
description: "Control canvases",
sectionId: "ui",
profiles: [],
includeInBotGroup: true,
},
{
id: "message",
label: "message",
description: "Send messages",
sectionId: "messaging",
profiles: ["messaging"],
includeInBotGroup: true,
},
{
id: "cron",
label: "cron",
description: "Schedule tasks",
sectionId: "automation",
profiles: ["coding"],
includeInBotGroup: true,
},
{
id: "gateway",
label: "gateway",
description: "Gateway control",
sectionId: "automation",
profiles: [],
includeInBotGroup: true,
},
{
id: "nodes",
label: "nodes",
description: "Nodes + devices",
sectionId: "nodes",
profiles: [],
includeInBotGroup: true,
},
{
id: "agents_list",
label: "agents_list",
description: "List agents",
sectionId: "agents",
profiles: [],
includeInBotGroup: true,
},
{
id: "image",
label: "image",
description: "Image understanding",
sectionId: "media",
profiles: ["coding"],
includeInBotGroup: true,
},
{
id: "tts",
label: "tts",
description: "Text-to-speech conversion",
sectionId: "media",
profiles: [],
includeInBotGroup: true,
},
];
const CORE_TOOL_BY_ID = new Map<string, CoreToolDefinition>(
CORE_TOOL_DEFINITIONS.map((tool) => [tool.id, tool]),
);
function listCoreToolIdsForProfile(profile: ToolProfileId): string[] {
return CORE_TOOL_DEFINITIONS.filter((tool) => tool.profiles.includes(profile)).map(
(tool) => tool.id,
);
}
const CORE_TOOL_PROFILES: Record<ToolProfileId, ToolProfilePolicy> = {
minimal: {
allow: listCoreToolIdsForProfile("minimal"),
},
coding: {
allow: listCoreToolIdsForProfile("coding"),
},
messaging: {
allow: listCoreToolIdsForProfile("messaging"),
},
full: {},
};
function buildCoreToolGroupMap() {
const sectionToolMap = new Map<string, string[]>();
for (const tool of CORE_TOOL_DEFINITIONS) {
const groupId = `group:${tool.sectionId}`;
const list = sectionToolMap.get(groupId) ?? [];
list.push(tool.id);
sectionToolMap.set(groupId, list);
}
const botTools = CORE_TOOL_DEFINITIONS.filter((tool) => tool.includeInBotGroup).map(
(tool) => tool.id,
);
return {
"group:bot": botTools,
...Object.fromEntries(sectionToolMap.entries()),
};
}
export const CORE_TOOL_GROUPS = buildCoreToolGroupMap();
export const PROFILE_OPTIONS = [
{ id: "minimal", label: "Minimal" },
{ id: "coding", label: "Coding" },
{ id: "messaging", label: "Messaging" },
{ id: "full", label: "Full" },
] as const;
export function resolveCoreToolProfilePolicy(profile?: string): ToolProfilePolicy | undefined {
if (!profile) {
return undefined;
}
const resolved = CORE_TOOL_PROFILES[profile as ToolProfileId];
if (!resolved) {
return undefined;
}
if (!resolved.allow && !resolved.deny) {
return undefined;
}
return {
allow: resolved.allow ? [...resolved.allow] : undefined,
deny: resolved.deny ? [...resolved.deny] : undefined,
};
}
export function listCoreToolSections(): CoreToolSection[] {
return CORE_TOOL_SECTION_ORDER.map((section) => ({
id: section.id,
label: section.label,
tools: CORE_TOOL_DEFINITIONS.filter((tool) => tool.sectionId === section.id).map((tool) => ({
id: tool.id,
label: tool.label,
description: tool.description,
})),
})).filter((section) => section.tools.length > 0);
}
export function resolveCoreToolProfiles(toolId: string): ToolProfileId[] {
const tool = CORE_TOOL_BY_ID.get(toolId);
if (!tool) {
return [];
}
return [...tool.profiles];
}
export function isKnownCoreToolId(toolId: string): boolean {
return CORE_TOOL_BY_ID.has(toolId);
}