From 0f99a0c92707b44aef7c627012c4711bad5a8efd Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Tue, 2 Jun 2026 16:33:02 +0900 Subject: feat: add search_code tool wrapping the cs code-search engine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a dedicated, permission-gated search_code tool that wraps boyter/cs (code spelunker) — a fast, relevance-ranked, structure-aware code search engine — giving agents a better default than grep/find for exploratory 'where is X / how does Y work' searches (ranked results, snippets, ~5x smaller payloads). - packages/core/src/tools/search-code.ts: createSearchCodeTool factory; -f json invocation, workdir path containment, graceful missing-binary handling (DISPATCH_CS_BIN override), readable per-file formatted output. - Wire-up: export from core; register in agent-manager (both child-whitelist and parent perm paths) behind new perm_search_code; add to summon catalog + tools enum; frontend ToolPermissions + settings. - Docker: build a patched, statically-linked cs (pinned v3.1.0 commit) in a golang builder stage and bundle at /usr/local/bin/cs. - docker/cs/luau-declarations.patch: additive Luau declaration table so --only-declarations / definition ranking works for Roblox .luau files (upstream has Lua but not Luau). Applied during the Docker build. - Tests: new search-code.test.ts (stubbed JSON formatting + live-cs integration, skipped when cs absent); agent-manager/routes mocks + perm-gating assertions; loader pass-through. All tests (596), biome, and tsc (core/api/frontend) pass. cs-builder Docker stage verified to build and produce a working patched binary. --- docker/cs/luau-declarations.patch | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docker/cs/luau-declarations.patch (limited to 'docker/cs') diff --git a/docker/cs/luau-declarations.patch b/docker/cs/luau-declarations.patch new file mode 100644 index 0000000..794ecac --- /dev/null +++ b/docker/cs/luau-declarations.patch @@ -0,0 +1,32 @@ +Add a Luau declaration-pattern table to the cs structural ranker. + +Upstream cs (v3.1.0) ships a "Lua" entry in languageDeclarationPatterns but no +"Luau" entry, even though its bundled scc database recognises ".luau" files as a +distinct "Luau" language. Without a matching declaration table, every match in a +.luau file is classified as a plain "usage": --only-declarations returns nothing +and the structural ranker gives definitions no boost. This is the dominant file +type in Roblox codebases, so we add a Luau entry that mirrors Lua's function +prefixes and additionally covers Luau's `type` / `export type` declarations. + +This is a purely additive change (one new map entry); it does not alter any +existing language's behaviour and passes cs's own pkg/ranker test suite. Applied +during the Docker build via `git apply` against the pinned v3.1.0 checkout +(see Dockerfile / Dockerfile.dev). Candidate for upstreaming to boyter/cs. + +diff --git a/pkg/ranker/declarations.go b/pkg/ranker/declarations.go +index 42cd934..36f9f68 100644 +--- a/pkg/ranker/declarations.go ++++ b/pkg/ranker/declarations.go +@@ -187,6 +187,12 @@ var languageDeclarationPatterns = map[string][]DeclarationPattern{ + {Prefix: []byte("function ")}, + {Prefix: []byte("local function ")}, + }, ++ "Luau": { ++ {Prefix: []byte("function ")}, ++ {Prefix: []byte("local function ")}, ++ {Prefix: []byte("type ")}, ++ {Prefix: []byte("export type ")}, ++ }, + "Scala": { + {Prefix: []byte("def ")}, + {Prefix: []byte("val ")}, -- cgit v1.2.3