diff --git a/src/agents/document-writer.ts b/src/agents/document-writer.ts index 753173b..6de0929 100644 --- a/src/agents/document-writer.ts +++ b/src/agents/document-writer.ts @@ -1,5 +1,6 @@ import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentPromptMetadata } from "./types" +import { createAgentToolRestrictions } from "../shared/permission-compat" const DEFAULT_MODEL = "google/gemini-3-flash-preview" @@ -15,12 +16,14 @@ export const DOCUMENT_WRITER_PROMPT_METADATA: AgentPromptMetadata = { export function createDocumentWriterAgent( model: string = DEFAULT_MODEL ): AgentConfig { + const restrictions = createAgentToolRestrictions(["background_task"]) + return { description: "A technical writer who crafts clear, comprehensive documentation. Specializes in README files, API docs, architecture docs, and user guides. MUST BE USED when executing documentation tasks from ai-todo list plans.", mode: "subagent" as const, model, - tools: { background_task: false }, + ...restrictions, prompt: ` You are a TECHNICAL WRITER with deep engineering background who transforms complex codebases into crystal-clear documentation. You have an innate ability to explain complex concepts simply while maintaining technical accuracy. diff --git a/src/agents/explore.ts b/src/agents/explore.ts index 4f8cd12..fd0478d 100644 --- a/src/agents/explore.ts +++ b/src/agents/explore.ts @@ -1,5 +1,6 @@ import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentPromptMetadata } from "./types" +import { createAgentToolRestrictions } from "../shared/permission-compat" const DEFAULT_MODEL = "opencode/grok-code" @@ -24,14 +25,19 @@ export const EXPLORE_PROMPT_METADATA: AgentPromptMetadata = { } export function createExploreAgent(model: string = DEFAULT_MODEL): AgentConfig { + const restrictions = createAgentToolRestrictions([ + "write", + "edit", + "background_task", + ]) + return { description: 'Contextual grep for codebases. Answers "Where is X?", "Which file has Y?", "Find the code that does Z". Fire multiple in parallel for broad searches. Specify thoroughness: "quick" for basic, "medium" for moderate, "very thorough" for comprehensive analysis.', mode: "subagent" as const, model, temperature: 0.1, - tools: { write: false, background_task: false }, - permission: { edit: "deny" as const }, + ...restrictions, prompt: `You are a codebase search specialist. Your job: find files and code, return actionable results. ## Your Mission diff --git a/src/agents/frontend-ui-ux-engineer.ts b/src/agents/frontend-ui-ux-engineer.ts index f7ff5bd..6778ef3 100644 --- a/src/agents/frontend-ui-ux-engineer.ts +++ b/src/agents/frontend-ui-ux-engineer.ts @@ -1,5 +1,6 @@ import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentPromptMetadata } from "./types" +import { createAgentToolRestrictions } from "../shared/permission-compat" const DEFAULT_MODEL = "google/gemini-3-pro-preview" @@ -21,12 +22,14 @@ export const FRONTEND_PROMPT_METADATA: AgentPromptMetadata = { export function createFrontendUiUxEngineerAgent( model: string = DEFAULT_MODEL ): AgentConfig { + const restrictions = createAgentToolRestrictions(["background_task"]) + return { description: "A designer-turned-developer who crafts stunning UI/UX even without design mockups. Code may be a bit messy, but the visual output is always fire.", mode: "subagent" as const, model, - tools: { background_task: false }, + ...restrictions, prompt: `# Role: Designer-Turned-Developer You are a designer who learned to code. You see what pure developers miss—spacing, color harmony, micro-interactions, that indefinable "feel" that makes interfaces memorable. Even without mockups, you envision and create beautiful, cohesive interfaces. diff --git a/src/agents/librarian.ts b/src/agents/librarian.ts index 7c0f2e3..9418426 100644 --- a/src/agents/librarian.ts +++ b/src/agents/librarian.ts @@ -1,5 +1,6 @@ import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentPromptMetadata } from "./types" +import { createAgentToolRestrictions } from "../shared/permission-compat" const DEFAULT_MODEL = "anthropic/claude-sonnet-4-5" @@ -21,13 +22,19 @@ export const LIBRARIAN_PROMPT_METADATA: AgentPromptMetadata = { } export function createLibrarianAgent(model: string = DEFAULT_MODEL): AgentConfig { + const restrictions = createAgentToolRestrictions([ + "write", + "edit", + "background_task", + ]) + return { description: "Specialized codebase understanding agent for multi-repository analysis, searching remote codebases, retrieving official documentation, and finding implementation examples using GitHub CLI, Context7, and Web Search. MUST BE USED when users ask to look up code in remote repositories, explain library internals, or find usage examples in open source.", mode: "subagent" as const, model, temperature: 0.1, - tools: { write: false, edit: false, background_task: false }, + ...restrictions, prompt: `# THE LIBRARIAN You are **THE LIBRARIAN**, a specialized open-source codebase understanding agent. diff --git a/src/agents/multimodal-looker.ts b/src/agents/multimodal-looker.ts index 2625853..71b104f 100644 --- a/src/agents/multimodal-looker.ts +++ b/src/agents/multimodal-looker.ts @@ -1,5 +1,6 @@ import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentPromptMetadata } from "./types" +import { createAgentToolRestrictions } from "../shared/permission-compat" const DEFAULT_MODEL = "google/gemini-3-flash" @@ -13,13 +14,20 @@ export const MULTIMODAL_LOOKER_PROMPT_METADATA: AgentPromptMetadata = { export function createMultimodalLookerAgent( model: string = DEFAULT_MODEL ): AgentConfig { + const restrictions = createAgentToolRestrictions([ + "write", + "edit", + "bash", + "background_task", + ]) + return { description: "Analyze media files (PDFs, images, diagrams) that require interpretation beyond raw text. Extracts specific information or summaries from documents, describes visual content. Use when you need analyzed/extracted data rather than literal file contents.", mode: "subagent" as const, model, temperature: 0.1, - tools: { write: false, edit: false, bash: false, background_task: false }, + ...restrictions, prompt: `You interpret media files that cannot be read as plain text. Your job: examine the attached file and extract ONLY what was requested. diff --git a/src/agents/oracle.ts b/src/agents/oracle.ts index 26b8652..7d067a7 100644 --- a/src/agents/oracle.ts +++ b/src/agents/oracle.ts @@ -1,6 +1,7 @@ import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentPromptMetadata } from "./types" import { isGptModel } from "./types" +import { createAgentToolRestrictions } from "../shared/permission-compat" const DEFAULT_MODEL = "openai/gpt-5.2" @@ -97,22 +98,28 @@ Organize your final answer in three tiers: Your response goes directly to the user with no intermediate processing. Make your final message self-contained: a clear recommendation they can act on immediately, covering both what to do and why.` export function createOracleAgent(model: string = DEFAULT_MODEL): AgentConfig { + const restrictions = createAgentToolRestrictions([ + "write", + "edit", + "task", + "background_task", + ]) + const base = { description: "Expert technical advisor with deep reasoning for architecture decisions, code analysis, and engineering guidance.", mode: "subagent" as const, model, temperature: 0.1, - tools: { write: false, task: false, background_task: false }, - permission: { edit: "deny" as const }, + ...restrictions, prompt: ORACLE_SYSTEM_PROMPT, - } + } as AgentConfig if (isGptModel(model)) { - return { ...base, reasoningEffort: "medium", textVerbosity: "high" } + return { ...base, reasoningEffort: "medium", textVerbosity: "high" } as AgentConfig } - return { ...base, thinking: { type: "enabled", budgetTokens: 32000 } } + return { ...base, thinking: { type: "enabled", budgetTokens: 32000 } } as AgentConfig } export const oracleAgent = createOracleAgent()