From dc7d665e94cfa66cacf2c3b3d934e8822669d712 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Fri, 8 May 2026 20:22:22 +0000 Subject: [PATCH] chore: generate --- packages/opencode/src/tool/repo_overview.ts | 73 ++++++++++++++++----- packages/opencode/src/util/repository.ts | 6 +- packages/sdk/js/src/v2/gen/types.gen.ts | 6 -- packages/sdk/openapi.json | 53 +++++++++++++++ 4 files changed, 114 insertions(+), 24 deletions(-) diff --git a/packages/opencode/src/tool/repo_overview.ts b/packages/opencode/src/tool/repo_overview.ts index bb788dc084..b08516d2c6 100644 --- a/packages/opencode/src/tool/repo_overview.ts +++ b/packages/opencode/src/tool/repo_overview.ts @@ -17,7 +17,7 @@ export const Parameters = Schema.Struct({ }), depth: Schema.optional(Schema.Number).annotate({ description: "Maximum structure depth to include. Defaults to 3.", - }) + }), }) type Metadata = { @@ -33,7 +33,17 @@ type Metadata = { truncated: boolean } -const IGNORED_DIRS = new Set([".git", "node_modules", "__pycache__", ".venv", "dist", "build", ".next", "target", "vendor"]) +const IGNORED_DIRS = new Set([ + ".git", + "node_modules", + "__pycache__", + ".venv", + "dist", + "build", + ".next", + "target", + "vendor", +]) const STRUCTURE_LIMIT = 200 const DEPENDENCY_FILES = [ "package.json", @@ -73,7 +83,19 @@ function ecosystems(files: Set) { } function commonEntrypoints(files: Set) { - return ["index.ts", "index.tsx", "index.js", "index.mjs", "main.ts", "main.js", "src/index.ts", "src/index.tsx", "src/index.js", "src/main.ts", "src/main.js"].filter((file) => files.has(file)) + return [ + "index.ts", + "index.tsx", + "index.js", + "index.mjs", + "main.ts", + "main.js", + "src/index.ts", + "src/index.tsx", + "src/index.js", + "src/main.ts", + "src/main.js", + ].filter((file) => files.has(file)) } export const RepoOverviewTool = Tool.define( @@ -82,7 +104,9 @@ export const RepoOverviewTool = Tool.define) { + const resolveTarget = Effect.fn("RepoOverviewTool.resolveTarget")(function* ( + params: Schema.Schema.Type, + ) { if (params.path) { const full = path.isAbsolute(params.path) ? params.path : path.resolve(Instance.directory, params.path) return { path: full, repository: params.repository } @@ -104,7 +128,10 @@ export const RepoOverviewTool = Tool.define Effect.Effect = Effect.fnUntraced(function* (dir: string, level: number) { + const visit: (dir: string, level: number) => Effect.Effect = Effect.fnUntraced(function* ( + dir: string, + level: number, + ) { if (level >= depth || lines.length >= STRUCTURE_LIMIT) { truncated = truncated || lines.length >= STRUCTURE_LIMIT return @@ -150,7 +177,8 @@ export const RepoOverviewTool = Tool.define, ctx: Tool.Context) => Effect.gen(function* () { const target = yield* resolveTarget(params) - const depth = !params.depth || !Number.isInteger(params.depth) || params.depth < 1 || params.depth > 6 ? 3 : params.depth + const depth = + !params.depth || !Number.isInteger(params.depth) || params.depth < 1 || params.depth > 6 ? 3 : params.depth yield* assertExternalDirectoryEffect(ctx, target.path, { kind: "directory" }) yield* ctx.ask({ @@ -166,7 +194,8 @@ export const RepoOverviewTool = Tool.define Effect.succeed(undefined))) if (!info) { - if (target.repository) throw new Error(`Repository is not cloned: ${target.repository}. Use repo_clone first.`) + if (target.repository) + throw new Error(`Repository is not cloned: ${target.repository}. Use repo_clone first.`) throw new Error(`Directory not found: ${target.path}`) } if (info.type !== "Directory") throw new Error(`Path is not a directory: ${target.path}`) @@ -175,7 +204,9 @@ export const RepoOverviewTool = Tool.define entry.name)) const dependencyFiles = DEPENDENCY_FILES.filter((file) => topLevel.has(file)) const packageJson = topLevel.has("package.json") - ? (yield* fs.readJson(path.join(target.path, "package.json")).pipe(Effect.orElseSucceed(() => ({})))) as Record + ? ((yield* fs + .readJson(path.join(target.path, "package.json")) + .pipe(Effect.orElseSucceed(() => ({})))) as Record) : {} const entrypoints = [ @@ -187,16 +218,20 @@ export const RepoOverviewTool = Tool.define).map((name) => `bin: ${name}`) : []), ...(packageJson.exports && typeof packageJson.exports === "object" && !Array.isArray(packageJson.exports) - ? Object.keys(packageJson.exports as Record).slice(0, 10).map((name) => `exports: ${name}`) + ? Object.keys(packageJson.exports as Record) + .slice(0, 10) + .map((name) => `exports: ${name}`) : []), ] - const common = commonEntrypoints(new Set([ - ...topLevel, - ...entries - .filter((entry) => entry.name === "src") - .flatMap(() => ["src/index.ts", "src/index.tsx", "src/index.js", "src/main.ts", "src/main.js"]), - ])) + const common = commonEntrypoints( + new Set([ + ...topLevel, + ...entries + .filter((entry) => entry.name === "src") + .flatMap(() => ["src/index.ts", "src/index.tsx", "src/index.js", "src/main.ts", "src/main.js"]), + ]), + ) const structureResult = yield* structure(target.path, depth) const branch = yield* git.branch(target.path) const head = yield* git.run(["rev-parse", "HEAD"], { cwd: target.path }) @@ -225,8 +260,12 @@ export const RepoOverviewTool = Tool.define `- ${entry}`)] : []), + ...(metadata.dependency_files.length + ? [`Dependency files: ${metadata.dependency_files.join(", ")}`] + : []), + ...(metadata.entrypoints.length + ? ["Likely entrypoints:", ...metadata.entrypoints.map((entry) => `- ${entry}`)] + : []), "Top-level structure:", ...structureResult.lines, ...(structureResult.truncated ? ["(Structure truncated)"] : []), diff --git a/packages/opencode/src/util/repository.ts b/packages/opencode/src/util/repository.ts index 279e5af0e4..c7298494f5 100644 --- a/packages/opencode/src/util/repository.ts +++ b/packages/opencode/src/util/repository.ts @@ -14,7 +14,11 @@ export type Reference = { } function normalize(input: string) { - return input.trim().replace(/^git\+/, "").replace(/#.*$/, "").replace(/\/+$/, "") + return input + .trim() + .replace(/^git\+/, "") + .replace(/#.*$/, "") + .replace(/\/+$/, "") } function trimGitSuffix(input: string) { diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index ba1b671c64..7ddaea0a25 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -908,9 +908,6 @@ export type ReferenceConfigEntry = * Git repository URL, host/path reference, or GitHub owner/repo shorthand */ repository: string - /** - * Branch or ref Scout should clone and inspect - */ branch?: string } | { @@ -920,9 +917,6 @@ export type ReferenceConfigEntry = path: string } -/** - * Named git or local directory references that can be @ mentioned as Scout-backed subagents - */ export type ReferenceConfig = { [key: string]: ReferenceConfigEntry } diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 6cb4ce1d5a..23fb1e8414 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -11311,6 +11311,44 @@ "additionalProperties": false, "description": "Server configuration for opencode serve and web commands" }, + "ReferenceConfigEntry": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "repository": { + "type": "string", + "description": "Git repository URL, host/path reference, or GitHub owner/repo shorthand" + }, + "branch": { + "type": "string" + } + }, + "required": ["repository"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Absolute path, ~/ path, or workspace-relative path to a local reference directory" + } + }, + "required": ["path"], + "additionalProperties": false + } + ] + }, + "ReferenceConfig": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ReferenceConfigEntry" + } + }, "PermissionActionConfig": { "type": "string", "enum": ["ask", "allow", "deny"] @@ -11375,6 +11413,15 @@ "websearch": { "$ref": "#/components/schemas/PermissionActionConfig" }, + "codesearch": { + "$ref": "#/components/schemas/PermissionActionConfig" + }, + "repo_clone": { + "$ref": "#/components/schemas/PermissionRuleConfig" + }, + "repo_overview": { + "$ref": "#/components/schemas/PermissionRuleConfig" + }, "lsp": { "$ref": "#/components/schemas/PermissionRuleConfig" }, @@ -11851,6 +11898,9 @@ }, "additionalProperties": false }, + "reference": { + "$ref": "#/components/schemas/ReferenceConfig" + }, "watcher": { "type": "object", "properties": { @@ -11961,6 +12011,9 @@ "explore": { "$ref": "#/components/schemas/AgentConfig" }, + "scout": { + "$ref": "#/components/schemas/AgentConfig" + }, "title": { "$ref": "#/components/schemas/AgentConfig" },