{name:'dsh_tree',description:'List directory tree (skips node_modules/.git)',params:{path:'string?',depth:'int? default 3'}},
{name:'dsh_read',description:'Read a text file fragment (1-based lines with line numbers; returns sha256 for edit verification)',params:{path:'string',offset:'int? default 1',limit:'int? default 200'}},
{name:'dsh_tree',description:'List directory tree (skips node_modules/.git). ifMoreThan: return meta only if entries exceed this.',params:{path:'string?',depth:'int? default 3',ifMoreThan:'int? if entries > N, return meta instead of tree'}},
{name:'dsh_read',description:'Read a text file fragment (1-based lines with line numbers; returns sha256 for edit verification). maxBytes: return meta only if file exceeds this.',params:{path:'string',offset:'int? default 1',limit:'int? default 200',maxBytes:'int? if file size > N, return meta instead of content'}},
{name:'dsh_write',description:'Write file (creates parent dirs). mode: overwrite (default) | create (fail if exists) | append (append to existing)',params:{path:'string',content:'string',mode:'string? overwrite|create|append, default overwrite',expectedSha256:'string? reject if current content differs (stale-write guard)'}},
{name:'dsh_edit',description:'Replace a unique fragment in a file',params:{path:'string',oldText:'string',newText:'string',expectedSha256:'string? sha256 from dsh_read; reject if file changed'}},
{name:'dsh_search',description:'Search file contents (plain or regex)',params:{query:'string',path:'string?',regex:'bool?',caseSensitive:'bool?',maxResults:'int? default 50'}},
{name:'dsh_search',description:'Search file contents (plain or regex). ifMoreThan: return meta only if matches exceed this.',params:{query:'string',path:'string?',regex:'bool?',caseSensitive:'bool?',maxResults:'int? default 50',ifMoreThan:'int? if matches > N, return meta instead of matches'}},
{name:'dsh_bash',description:'Run a whitelisted command in the workspace',params:{command:'string',timeoutMs:'int? default 20000'}},
{name:'dsh_script',description:'Run a named python/mjs script with declared inputs/outputs. Requires user confirm. inputs are sha-checked before/after, outputs are verified after.',params:{name:'string snake_case',language:'python|mjs',code:'string source',inputs:'string[]? relative paths that must exist before run',outputs:'string[]? relative paths verified after run',timeoutMs:'int? default bashTimeoutMs'}},
{name:'dsh_git_status',description:'git status (read-only porcelain)',params:{path:'string?'}},
@ -213,6 +213,15 @@ function toolTree(ctx, args) {
@@ -213,6 +213,15 @@ function toolTree(ctx, args) {