Skip to content

Commit db7a7a0

Browse files
committed
feat: add annotation/audit tools with sql.js backend
Adds MCP tools for annotation of query results and auditing of queried codebases, as inspired by `GitHubSecurityLab/seclab-taskflow-agent`: ref -> https://github.com/GitHubSecurityLab/seclab-taskflow-agent Replace lowdb with sql.js (asm.js build) as the unified storage backend. The asm.js build bundles inline with esbuild — no external deps, no WASM binary, single self-contained JS output preserved. Annotation & audit tools (opt-in via ENABLE_ANNOTATION_TOOLS): - annotation_{create,get,list,update,delete,search}: general-purpose notes/bookmarks on any entity with SQL-backed filtering - audit_{store_findings,list_findings,add_notes,clear_repo}: repo-keyed finding management for MRVA triage workflows - Consolidated behind single ENABLE_ANNOTATION_TOOLS flag CallGraphFromTo external predicates: - Wire sourceFunction + targetFunction CSV handling in cli-tool-registry Integration test fixtures: - 3 CallGraphFromTo tests (cpp, javascript, python) - 4 annotation tool tests (create, list, search, delete) - 4 audit tool tests (store, list, triage notes, clear) - 1 MRVA workflow test (6-step finding triage) - 3 extension integration tests (opt-in gating, MRVA+annotation e2e) Storage migration: - SessionDataManager now uses SqliteStore instead of lowdb - 20 new SqliteStore unit tests, all 1019 server tests passing
1 parent dcfd0a9 commit db7a7a0

File tree

51 files changed

+130980
-771
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+130980
-771
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"toolName": "annotation_create",
3+
"parameters": {
4+
"category": "note",
5+
"entityKey": "file:test/Example1.ql:L10",
6+
"content": "Potential SQL injection via string concatenation",
7+
"label": "sql-injection-candidate",
8+
"metadata": "{\"severity\":\"high\",\"cwe\":\"CWE-89\"}"
9+
},
10+
"success": true,
11+
"description": "Successfully created a note annotation with content, label, and structured metadata"
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"toolName": "annotation_create",
3+
"parameters": {
4+
"category": "note",
5+
"entityKey": "file:test/Example1.ql:L10",
6+
"content": "Potential SQL injection via string concatenation",
7+
"label": "sql-injection-candidate",
8+
"metadata": "{\"severity\":\"high\",\"cwe\":\"CWE-89\"}"
9+
},
10+
"expectedSuccess": true,
11+
"description": "Test annotation_create tool creates a note annotation with content, label, and metadata"
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"toolName": "annotation_create",
3+
"arguments": {
4+
"category": "note",
5+
"entityKey": "file:test/Example1.ql:L10",
6+
"content": "Potential SQL injection via string concatenation",
7+
"label": "sql-injection-candidate",
8+
"metadata": "{\"severity\":\"high\",\"cwe\":\"CWE-89\"}"
9+
}
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"toolName": "annotation_delete",
3+
"parameters": {
4+
"entityKeyPrefix": "file:test/"
5+
},
6+
"success": true,
7+
"description": "Successfully deleted annotations matching the entity key prefix"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"toolName": "annotation_delete",
3+
"parameters": {
4+
"entityKeyPrefix": "file:test/"
5+
},
6+
"expectedSuccess": true,
7+
"description": "Test annotation_delete tool deletes annotations matching an entity key prefix"
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"toolName": "annotation_delete",
3+
"arguments": {
4+
"entityKeyPrefix": "file:test/"
5+
}
6+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"toolName": "annotation_list",
3+
"parameters": {
4+
"category": "note",
5+
"entityKeyPrefix": "file:test/",
6+
"limit": 10
7+
},
8+
"success": true,
9+
"description": "Successfully listed annotations filtered by category and entity key prefix"
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"toolName": "annotation_list",
3+
"parameters": {
4+
"category": "note",
5+
"entityKeyPrefix": "file:test/",
6+
"limit": 10
7+
},
8+
"expectedSuccess": true,
9+
"description": "Test annotation_list tool filters annotations by category and entity key prefix"
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"toolName": "annotation_list",
3+
"arguments": {
4+
"category": "note",
5+
"entityKeyPrefix": "file:test/",
6+
"limit": 10
7+
}
8+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"toolName": "annotation_search",
3+
"parameters": {
4+
"query": "SQL injection",
5+
"limit": 20
6+
},
7+
"success": true,
8+
"description": "Successfully searched annotations by content text"
9+
}

0 commit comments

Comments
 (0)