From 26509680eab9b4d25fec4155642c366a725de89f Mon Sep 17 00:00:00 2001 From: bendtherules Date: Thu, 9 Apr 2026 09:51:43 +0530 Subject: [PATCH] feat(tool): add recursive flag to section content retrieval - Introduce `recursive` boolean argument (default true) to the getSectionContent tool schema. - Update descriptions to clarify that recursive fetching occurs only when `recursive=true`. - Pass the `recursive` parameter from the CLI wrapper to the core tool function. - Modify the content fetching logic to traverse child sections only when `recursive` is enabled. --- .opencode/tools/ask262-get-section-content.ts | 14 +++++++++++--- src/agent-tools/getSectionContent.ts | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.opencode/tools/ask262-get-section-content.ts b/.opencode/tools/ask262-get-section-content.ts index ef09293..8d90406 100644 --- a/.opencode/tools/ask262-get-section-content.ts +++ b/.opencode/tools/ask262-get-section-content.ts @@ -10,7 +10,7 @@ import { createGetSectionContentTool } from "../../src/agent-tools"; export default tool({ description: "Retrieves all text chunks from a specific ECMAScript specification section by section ID. " + - "Supports recursive fetching - if a section has children, it will fetch all descendants. " + + "Supports recursive fetching - if recursive=true and the section has children, it will fetch all descendants. " + "Use this to get complete spec text when you know the section ID (e.g., 'sec-if-statement').", args: { sectionId: tool.schema @@ -18,9 +18,17 @@ export default tool({ .describe( "The section ID (e.g., 'sec-if-statement', 'sec-array-prototype-map') to fetch content for", ), + recursive: tool.schema + .boolean() + .default(true) + .describe( + "If true, recursively fetches content from all child sections and descendants. " + + "If false, only returns content from the specified section itself. " + + "Use false when you only need the specific section's content without subsections.", + ), }, async execute(args, context) { - const { sectionId } = args; + const { sectionId, recursive } = args; const { worktree } = context; // Connect to LanceDB @@ -30,7 +38,7 @@ export default tool({ // Create and execute tool const contentTool = createGetSectionContentTool(table); - const result = await contentTool.func({ sectionId }); + const result = await contentTool.func({ sectionId, recursive }); return result; }, diff --git a/src/agent-tools/getSectionContent.ts b/src/agent-tools/getSectionContent.ts index 403fe09..d05a564 100644 --- a/src/agent-tools/getSectionContent.ts +++ b/src/agent-tools/getSectionContent.ts @@ -11,6 +11,14 @@ const getSectionContentSchema = z.object({ sectionId: z .string() .describe("The section ID (e.g., 'sec-if-statement') to fetch chunks for"), + recursive: z + .boolean() + .default(true) + .describe( + "If true, recursively fetches content from all child sections and their descendants. " + + "If false, only returns content from the specified section itself. " + + "Use false when you only need the specific section's content without subsections.", + ), }); /** @@ -24,10 +32,10 @@ export function createGetSectionContentTool(table: Table) { name: "ask262_get_section_content", description: "Retrieves all text chunks from a specific specification section by sectionid. " + - "Supports recursive fetching - if a section has children, it will fetch all descendants. " + + "Supports recursive fetching - if recursive=true and the section has children, it will fetch all descendants. " + "Use this to get complete content when you see 'Subsection available' or 'partial section' references.", schema: getSectionContentSchema, - func: async ({ sectionId }) => { + func: async ({ sectionId, recursive }) => { const allDocs: string[] = []; const queue: string[] = [sectionId]; const visited = new Set(); @@ -61,8 +69,9 @@ export function createGetSectionContentTool(table: Table) { allDocs.push(typedResult.text); } - // Add children to queue for recursive fetching + // Add children to queue for recursive fetching only if recursive is true if ( + recursive && typedResult.childrensectionids && Array.isArray(typedResult.childrensectionids) ) {