Files
openchamber/packages/ui/src/lib/messages/agentMentions.ts
T
00821700de chore: remove dead code (59 unused files + ~125 unused exports) (#1835)
* 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>
2026-06-26 19:27:53 +03:00

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,
};
};