Files
oh-my-pi/packages/coding-agent/src/tools/memory-edit.ts
T
can1357 a050474af7 feat: migrated validation schemas and tool definitions from Zod to ArkType
- Migrated all wire protocol, schema definitions, and tools validation from Zod to ArkType across multiple packages.
- Updated extension runtimes, custom tools loader, and TypeBox compatibility shim to expose and use ArkType instances.
- Added a comprehensive ArkType migration guide, validation parity tests, and helper utilities.
- Removed redundant PDF asset routing and parsing implementations from the read tool.
2026-06-18 00:59:53 +02:00

60 lines
2.1 KiB
TypeScript

import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
import { type } from "arktype";
import memoryEditDescription from "../prompts/tools/memory-edit.md" with { type: "text" };
import type { ToolSession } from ".";
const memoryEditSchema = type({
op: "'update' | 'forget' | 'invalidate'",
id: "string",
content: "string?",
importance: "number?",
replacement_id: "string?",
});
export type MemoryEditParams = typeof memoryEditSchema.infer;
export class MemoryEditTool implements AgentTool<typeof memoryEditSchema> {
readonly name = "memory_edit";
readonly approval = "read" as const;
readonly label = "Memory Edit";
readonly description = memoryEditDescription;
readonly parameters = memoryEditSchema;
readonly strict = true;
readonly loadMode = "discoverable";
readonly summary = "Update, forget, or invalidate Mnemopi memories";
constructor(private readonly session: ToolSession) {}
static createIf(session: ToolSession): MemoryEditTool | null {
const backend = session.settings.get("memory.backend");
if (backend !== "mnemopi") return null;
return new MemoryEditTool(session);
}
async execute(_id: string, params: MemoryEditParams): Promise<AgentToolResult> {
const state = this.session.getMnemopiSessionState?.();
if (!state) {
throw new Error("Mnemopi backend is not initialised for this session.");
}
if (params.op === "update" && params.content === undefined && params.importance === undefined) {
throw new Error("memory_edit update requires content or importance.");
}
const importance = params.importance === undefined ? undefined : Math.max(0, Math.min(1, params.importance));
const result = state.editScopedMemory(params.op, params.id, {
content: params.content,
importance,
replacementId: params.replacement_id,
});
const location = result.bank ? ` in bank ${result.bank}${result.store ? ` (${result.store})` : ""}` : "";
const text =
result.status === "not_found"
? `Memory ${params.id} was not found${location}.`
: `Memory ${params.id} ${result.status}${location}.`;
return {
content: [{ type: "text", text }],
details: result,
};
}
}