* chore: remove dead/unreferenced files across ui, vscode Remove 59 unused source files (components, hooks, lib utils, stores, barrels, and orphaned vscode github modules) that are not imported by any entry-reachable code. Also drop a stale test mock for the removed execCommands module. Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com> * refactor: remove unused exported symbols (types, functions, consts, hooks) Remove exported symbols whose identifier is referenced nowhere in the repository (verified via repo-wide search), across ui types/contracts, lib utilities, sync layer, stores, and components. Also drop the few imports/private helpers orphaned by these removals. Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com> * refactor: remove more unused exports (desktop, shortcuts, worktree, vscode) Continue removing repo-wide unreferenced exported functions, consts and types across lib/desktop, shortcuts, worktreeSessionCreator, sync, and vscode gitService, with cascading orphaned helpers/imports cleaned up. Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com> * chore: add dead-code cleanup tooling * refactor: checkpoint dead-code cleanup * refactor: remove dead-code suppressions --------- Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com> Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
77 lines
1.8 KiB
TypeScript
77 lines
1.8 KiB
TypeScript
import type { Agent } from "@opencode-ai/sdk/v2";
|
|
|
|
interface AgentMentionSource {
|
|
value: string;
|
|
start: number;
|
|
end: number;
|
|
}
|
|
|
|
interface ParsedAgentMention {
|
|
name: string;
|
|
source?: AgentMentionSource;
|
|
}
|
|
|
|
export interface ParsedAgentResult {
|
|
sanitizedText: string;
|
|
mention: ParsedAgentMention | null;
|
|
}
|
|
|
|
const isWordBoundaryChar = (char: string | null): boolean => {
|
|
if (!char) {
|
|
return true;
|
|
}
|
|
return /(\s|\(|\)|\[|\]|\{|\}|"|'|`|,|\.|;|:)/.test(char);
|
|
};
|
|
|
|
export const parseAgentMentions = (rawText: string, agents: Agent[]): ParsedAgentResult => {
|
|
if (typeof rawText !== "string" || rawText.length === 0) {
|
|
return { sanitizedText: rawText, mention: null };
|
|
}
|
|
|
|
const nonPrimaryAgents = agents.filter((agent) => agent.mode && agent.mode !== "primary");
|
|
if (nonPrimaryAgents.length === 0 || !rawText.includes("@")) {
|
|
return { sanitizedText: rawText, mention: null };
|
|
}
|
|
|
|
let firstMention: ParsedAgentMention | null = null;
|
|
|
|
for (const agent of nonPrimaryAgents) {
|
|
const escapedAgentName = agent.name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
const pattern = new RegExp(`@${escapedAgentName}\\b`, "gi");
|
|
let match: RegExpExecArray | null;
|
|
|
|
while ((match = pattern.exec(rawText)) !== null) {
|
|
const start = match.index;
|
|
const end = start + match[0].length;
|
|
const charBefore = start > 0 ? rawText[start - 1] : null;
|
|
|
|
if (!isWordBoundaryChar(charBefore)) {
|
|
continue;
|
|
}
|
|
|
|
const mention: ParsedAgentMention = {
|
|
name: agent.name,
|
|
source: {
|
|
value: match[0],
|
|
start,
|
|
end,
|
|
},
|
|
};
|
|
|
|
if (!firstMention) {
|
|
firstMention = mention;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if (!firstMention) {
|
|
return { sanitizedText: rawText, mention: null };
|
|
}
|
|
|
|
return {
|
|
sanitizedText: rawText,
|
|
mention: firstMention,
|
|
};
|
|
};
|