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
JavaScript
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);
}