import { Type } from "@sinclair/typebox"; import type { ExtensionAPI, ToolResult } from "../_shared/pi-api.js"; import { errorResult } from "../_shared/pi-api.js"; import { validateParams } from "../_shared/validation.js"; const TodoWriteParams = Type.Object({ ops: Type.Array(Type.Object({ op: Type.Union([ Type.Literal("init"), Type.Literal("start"), Type.Literal("done"), Type.Literal("drop"), Type.Literal("rm"), Type.Literal("append"), Type.Literal("note"), ]), phase: Type.Optional(Type.String()), task: Type.Optional(Type.String()), items: Type.Optional(Type.Array(Type.String(), { maxItems: 20 })), text: Type.Optional(Type.String({ maxLength: 500 })), list: Type.Optional(Type.Array(Type.Object({ phase: Type.String(), items: Type.Array(Type.String()) }))), }), { maxItems: 30 }), }); const CheckpointParams = Type.Object({ action: Type.Union([Type.Literal("save"), Type.Literal("list"), Type.Literal("rewind")]), title: Type.Optional(Type.String({ maxLength: 100 })), content: Type.Optional(Type.String({ maxLength: 20000 })), }); const JobParams = Type.Object({ action: Type.Union([Type.Literal("start"), Type.Literal("list"), Type.Literal("wait"), Type.Literal("cancel")]), id: Type.Optional(Type.String()), command: Type.Optional(Type.String({ maxLength: 500 })), }); const RecipeParams = Type.Object({ command: Type.String({ maxLength: 1000 }), allowMutating: Type.Optional(Type.Boolean({ default: false })), }); const EvalParams = Type.Object({ language: Type.Union([Type.Literal("js")]), code: Type.String({ maxLength: 5000 }), timeoutMs: Type.Optional(Type.Integer({ minimum: 100, maximum: 5000, default: 1000 })), }); const MermaidParams = Type.Object({ diagram: Type.String({ maxLength: 10000 }) }); type BlockedTool = | "todo_write" | "checkpoint" | "rewind" | "job" | "recipe" | "eval" | "render_mermaid"; const OWNERS: Record = { todo_write: "todo-context/omp-todo-write", checkpoint: "omp-checkpoint-rewind", rewind: "omp-checkpoint-rewind", job: "omp-job", recipe: "omp-bash-approval", eval: "omp-eval", render_mermaid: "omp-render-mermaid", }; export default function devContextTools(pi: ExtensionAPI): void { pi.registerTool({ name: "todo_write", description: "Disabled legacy dev-context todo surface; use the dedicated todo-context plugin instead.", parameters: TodoWriteParams, execute(_toolCallId, params) { const valid = validateParams(TodoWriteParams, params); if (!valid.ok) return valid.result; return blocked("todo_write"); }, }); pi.registerTool({ name: "checkpoint", description: "Disabled checkpoint placeholder until the OMP checkpoint/rewind surface is ported.", parameters: CheckpointParams, execute(_toolCallId, params) { const valid = validateParams(CheckpointParams, params); if (!valid.ok) return valid.result; return blocked("checkpoint", valid.value.action); }, }); pi.registerTool({ name: "rewind", description: "Disabled rewind placeholder until the OMP checkpoint/rewind surface is ported.", parameters: CheckpointParams, execute(_toolCallId, params) { const valid = validateParams(CheckpointParams, params); if (!valid.ok) return valid.result; return blocked("rewind", "rewind"); }, }); pi.registerTool({ name: "job", description: "Disabled job placeholder until the OMP job manager is ported.", parameters: JobParams, execute(_toolCallId, params) { const valid = validateParams(JobParams, params); if (!valid.ok) return valid.result; return blocked("job", valid.value.action); }, }); pi.registerTool({ name: "recipe", description: "Disabled recipe placeholder until OMP bash approval boundaries are ported.", parameters: RecipeParams, execute(_toolCallId, params) { const valid = validateParams(RecipeParams, params); if (!valid.ok) return valid.result; return blocked("recipe"); }, }); pi.registerTool({ name: "eval", description: "Disabled eval placeholder until the OMP eval tool is ported with its own policy.", parameters: EvalParams, execute(_toolCallId, params) { const valid = validateParams(EvalParams, params); if (!valid.ok) return valid.result; return blocked("eval"); }, }); pi.registerTool({ name: "render_mermaid", description: "Disabled render_mermaid placeholder until the OMP rendering surface is ported.", parameters: MermaidParams, execute(_toolCallId, params) { const valid = validateParams(MermaidParams, params); if (!valid.ok) return valid.result; return blocked("render_mermaid"); }, }); } function blocked(tool: BlockedTool, requestedAction?: string): ToolResult { const details = { owner: OWNERS[tool], ported: false, requestedSurface: `tools-dev-context.${tool}`, requestedAction, splitRequired: true, }; return errorResult( [ `${tool} is disabled in tools-dev-context.`, "This mixed high-risk bundle is no longer an executable product surface.", tool === "todo_write" ? "Use the dedicated todo-context plugin for the current OMP-style todo_write compatibility surface." : `Port or wrap ${OWNERS[tool]} as a dedicated OMP-backed plugin before enabling this capability.`, ].join(" "), details, ); }