UNPKG

scai

Version:

> **A local-first AI CLI for understanding, querying, and iterating on large codebases.** > **100% local • No token costs • No cloud • No prompt injection • Private by design**

106 lines (105 loc) 4.18 kB
export const resolveExecutionModeStep = { name: "resolveExecutionMode", description: "Derive a hard execution mode from the interpreted user intent. " + "This decision is authoritative and must not be changed later.", run: async (context) => { const intent = context.analysis?.intent; if (!intent) { throw new Error("resolveExecutionMode: missing analysis.intent"); } const normalizedQuery = intent.normalizedQuery?.trim() ?? context.initContext?.userQuery?.trim() ?? ""; // ───── Defaults: safe, read-only ───── let mode = "analyze"; let rationale = "Defaulted to analysis mode."; let constraints = { allowAnalysis: true, allowPlanning: true, allowFileWrites: false, docsOnly: false }; switch (intent.intentCategory) { // ───── Code-changing intents ───── case "codingTask": case "refactorTask": mode = "transform"; rationale = "User intent implies code modification."; constraints = { allowAnalysis: true, allowPlanning: true, allowFileWrites: true, docsOnly: false }; break; // ───── Docs / comments only ───── case "docsAndComments": case "docsandcomments": case "docsAndComment": case "docs": case "comments": case "comment": mode = "transform"; rationale = "User intent requests documentation/comments only."; constraints = { allowAnalysis: false, allowPlanning: false, allowFileWrites: true, docsOnly: true }; break; // ───── Generic requests: promote to transform when edit intent is explicit ───── case "request": if (hasExplicitWriteIntent(normalizedQuery)) { mode = "transform"; rationale = "Request contains explicit edit intent."; constraints = { allowAnalysis: true, allowPlanning: true, allowFileWrites: true, docsOnly: false }; } break; // ───── Everything else is analysis ───── case "debugging": case "planning": case "question": case "explanation": case "writing": // keep defaults rationale = "User intent implies investigation or explanation."; break; } // Safety override: question-form prompts should remain read-only unless // they explicitly ask for edits (e.g. "How do I update README?"). if (isQuestionLikeQuery(normalizedQuery) && !hasExplicitWriteIntent(normalizedQuery)) { mode = "analyze"; rationale = "Question-form intent without explicit edit verb — forced analysis mode."; constraints = { allowAnalysis: true, allowPlanning: true, allowFileWrites: false, docsOnly: false }; } context.executionControl = { mode, rationale, confidence: intent.confidence, constraints }; } }; function isQuestionLikeQuery(query) { const q = query.trim().toLowerCase(); if (!q) return false; if (q.endsWith("?")) return true; return /^(what|why|how|which|where|when|who)\b/.test(q); } function hasExplicitWriteIntent(query) { const q = query.toLowerCase(); return /\b(add|update|edit|modify|refactor|rewrite|implement|fix|create|remove|delete|replace|rename|write|patch|change|increment|bump|set)\b/.test(q); }