Scope duplicate detection to same type (notes vs tasks)
create_note now only checks against existing notes (is_task=False); create_task only checks against existing tasks (is_task=True). All three checks (exact title, fuzzy title, semantic similarity) pass the type filter through to list_notes and semantic_search_notes. Adds is_task param to semantic_search_notes() so callers can restrict results to notes or tasks independently. Prevents a note titled "Design enemy AI" from blocking a task with the same title, and vice versa. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -80,6 +80,7 @@ async def semantic_search_notes(
|
||||
limit: int = 8,
|
||||
threshold: float = _SIMILARITY_THRESHOLD,
|
||||
project_id: int | None = None,
|
||||
is_task: bool | None = None,
|
||||
) -> list[tuple[float, Note]]:
|
||||
"""Return up to *limit* (score, note) pairs most relevant to *query*.
|
||||
|
||||
@@ -102,6 +103,10 @@ async def semantic_search_notes(
|
||||
)
|
||||
if project_id is not None:
|
||||
stmt = stmt.where(Note.project_id == project_id)
|
||||
if is_task is True:
|
||||
stmt = stmt.where(Note.status.isnot(None))
|
||||
elif is_task is False:
|
||||
stmt = stmt.where(Note.status.is_(None))
|
||||
if exclude_ids:
|
||||
stmt = stmt.where(NoteEmbedding.note_id.notin_(exclude_ids))
|
||||
rows = list((await session.execute(stmt)).all())
|
||||
|
||||
Reference in New Issue
Block a user