claude-opencode-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/LICENSE +21 -0
  3. package/README.md +514 -0
  4. package/SECURITY.md +80 -0
  5. package/agents/deepseek-coder.md +32 -0
  6. package/agents/deepseek-researcher.md +36 -0
  7. package/agents/deepseek-reviewer.md +31 -0
  8. package/agents/deepseek-tester.md +31 -0
  9. package/dist/cli/init.d.ts +6 -0
  10. package/dist/cli/init.js +208 -0
  11. package/dist/cli/init.js.map +1 -0
  12. package/dist/config/config.d.ts +109 -0
  13. package/dist/config/config.js +163 -0
  14. package/dist/config/config.js.map +1 -0
  15. package/dist/errors.d.ts +29 -0
  16. package/dist/errors.js +68 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +116 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/mcp/execute.d.ts +30 -0
  22. package/dist/mcp/execute.js +128 -0
  23. package/dist/mcp/execute.js.map +1 -0
  24. package/dist/mcp/server.d.ts +19 -0
  25. package/dist/mcp/server.js +38 -0
  26. package/dist/mcp/server.js.map +1 -0
  27. package/dist/mcp/session-utils.d.ts +5 -0
  28. package/dist/mcp/session-utils.js +55 -0
  29. package/dist/mcp/session-utils.js.map +1 -0
  30. package/dist/mcp/tool-utils.d.ts +11 -0
  31. package/dist/mcp/tool-utils.js +44 -0
  32. package/dist/mcp/tool-utils.js.map +1 -0
  33. package/dist/mcp/tools/abort-session.d.ts +3 -0
  34. package/dist/mcp/tools/abort-session.js +48 -0
  35. package/dist/mcp/tools/abort-session.js.map +1 -0
  36. package/dist/mcp/tools/create-session.d.ts +3 -0
  37. package/dist/mcp/tools/create-session.js +53 -0
  38. package/dist/mcp/tools/create-session.js.map +1 -0
  39. package/dist/mcp/tools/delegate-task.d.ts +4 -0
  40. package/dist/mcp/tools/delegate-task.js +98 -0
  41. package/dist/mcp/tools/delegate-task.js.map +1 -0
  42. package/dist/mcp/tools/get-diff.d.ts +3 -0
  43. package/dist/mcp/tools/get-diff.js +97 -0
  44. package/dist/mcp/tools/get-diff.js.map +1 -0
  45. package/dist/mcp/tools/get-session.d.ts +3 -0
  46. package/dist/mcp/tools/get-session.js +79 -0
  47. package/dist/mcp/tools/get-session.js.map +1 -0
  48. package/dist/mcp/tools/list-agents.d.ts +3 -0
  49. package/dist/mcp/tools/list-agents.js +72 -0
  50. package/dist/mcp/tools/list-agents.js.map +1 -0
  51. package/dist/mcp/tools/send-message.d.ts +3 -0
  52. package/dist/mcp/tools/send-message.js +59 -0
  53. package/dist/mcp/tools/send-message.js.map +1 -0
  54. package/dist/opencode/agents.d.ts +46 -0
  55. package/dist/opencode/agents.js +239 -0
  56. package/dist/opencode/agents.js.map +1 -0
  57. package/dist/opencode/binary.d.ts +19 -0
  58. package/dist/opencode/binary.js +129 -0
  59. package/dist/opencode/binary.js.map +1 -0
  60. package/dist/opencode/client.d.ts +32 -0
  61. package/dist/opencode/client.js +55 -0
  62. package/dist/opencode/client.js.map +1 -0
  63. package/dist/opencode/manager.d.ts +66 -0
  64. package/dist/opencode/manager.js +492 -0
  65. package/dist/opencode/manager.js.map +1 -0
  66. package/dist/opencode/permission-watcher.d.ts +26 -0
  67. package/dist/opencode/permission-watcher.js +144 -0
  68. package/dist/opencode/permission-watcher.js.map +1 -0
  69. package/dist/opencode/run.d.ts +39 -0
  70. package/dist/opencode/run.js +318 -0
  71. package/dist/opencode/run.js.map +1 -0
  72. package/dist/opencode/sessions.d.ts +26 -0
  73. package/dist/opencode/sessions.js +105 -0
  74. package/dist/opencode/sessions.js.map +1 -0
  75. package/dist/opencode/setup.d.ts +38 -0
  76. package/dist/opencode/setup.js +109 -0
  77. package/dist/opencode/setup.js.map +1 -0
  78. package/dist/security/paths.d.ts +20 -0
  79. package/dist/security/paths.js +93 -0
  80. package/dist/security/paths.js.map +1 -0
  81. package/dist/security/policy.d.ts +17 -0
  82. package/dist/security/policy.js +86 -0
  83. package/dist/security/policy.js.map +1 -0
  84. package/dist/types/index.d.ts +131 -0
  85. package/dist/types/index.js +2 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/util/fs.d.ts +12 -0
  88. package/dist/util/fs.js +73 -0
  89. package/dist/util/fs.js.map +1 -0
  90. package/dist/util/git.d.ts +54 -0
  91. package/dist/util/git.js +202 -0
  92. package/dist/util/git.js.map +1 -0
  93. package/dist/util/logger.d.ts +21 -0
  94. package/dist/util/logger.js +129 -0
  95. package/dist/util/logger.js.map +1 -0
  96. package/dist/util/text.d.ts +11 -0
  97. package/dist/util/text.js +126 -0
  98. package/dist/util/text.js.map +1 -0
  99. package/dist/workspace/context.d.ts +12 -0
  100. package/dist/workspace/context.js +67 -0
  101. package/dist/workspace/context.js.map +1 -0
  102. package/dist/workspace/resolver.d.ts +35 -0
  103. package/dist/workspace/resolver.js +112 -0
  104. package/dist/workspace/resolver.js.map +1 -0
  105. package/dist/workspace/validator.d.ts +13 -0
  106. package/dist/workspace/validator.js +102 -0
  107. package/dist/workspace/validator.js.map +1 -0
  108. package/docs/agent-configuration.md +100 -0
  109. package/docs/architecture.md +115 -0
  110. package/docs/claude-code-setup.md +116 -0
  111. package/docs/configuration.md +184 -0
  112. package/docs/contributing.md +71 -0
  113. package/docs/deepseek-setup.md +84 -0
  114. package/docs/development.md +146 -0
  115. package/docs/installation.md +88 -0
  116. package/docs/opencode-setup.md +97 -0
  117. package/docs/security-audit.md +80 -0
  118. package/docs/security.md +128 -0
  119. package/docs/troubleshooting.md +126 -0
  120. package/docs/workspace-model.md +126 -0
  121. package/package.json +79 -0
@@ -0,0 +1,32 @@
1
+ ---
2
+ description: DeepSeek coding agent for implementation, code modification, refactoring, test execution and fixing implementation issues.
3
+ mode: all
4
+ temperature: 0.1
5
+ ---
6
+
7
+ You are a senior software engineer implementing a task in an existing
8
+ repository. You work directly on the files in the workspace.
9
+
10
+ How to work:
11
+ - Read the surrounding code before editing; follow the project's existing
12
+ conventions, libraries and patterns.
13
+ - Make the smallest change that fully solves the task. Do not add unrelated
14
+ refactors, comments or dependencies.
15
+ - After editing, run the most relevant tests, type checks or build commands
16
+ available in the project and fix what you broke.
17
+ - Inspect additional files beyond any path hints when needed.
18
+ - Do not run `git commit`, `git push`, `git reset --hard`, or any other
19
+ command that rewrites history or publishes changes.
20
+
21
+ Final response format:
22
+ ## Summary
23
+ What you changed and why.
24
+
25
+ ## Changes
26
+ - `path/to/file` — what changed
27
+
28
+ ## Verification
29
+ - `command` — result (pass/fail and key output)
30
+
31
+ ## Follow-ups
32
+ Anything left undone, uncertain, or worth reviewing.
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Read-only DeepSeek agent for architecture analysis, repository exploration, dependency investigation and implementation recommendations.
3
+ mode: all
4
+ temperature: 0.1
5
+ ---
6
+
7
+ You are a senior software engineer acting as a research agent for a larger
8
+ orchestration system. Your job is to understand a codebase and report facts,
9
+ not to change it.
10
+
11
+ Focus on:
12
+ - Locating the files, modules and symbols relevant to the task.
13
+ - Tracing how data and control flow through the system.
14
+ - Identifying dependencies, configuration and external interfaces.
15
+ - Surfacing constraints, risks and open questions.
16
+ - Recommending concrete implementation approaches.
17
+
18
+ Rules:
19
+ - You are strictly read-only. Never modify, create or delete files, and never
20
+ use shell commands that write to disk.
21
+ - Read files directly instead of asking for their contents.
22
+ - Prefer evidence (file paths, line numbers, exact symbol names) over guesses.
23
+ - If something cannot be determined from the repository, say so explicitly.
24
+
25
+ Final response format:
26
+ ## Summary
27
+ A short paragraph describing what you found.
28
+
29
+ ## Relevant Files
30
+ - `path/to/file` — why it matters
31
+
32
+ ## Findings
33
+ - [severity: high|medium|low] Short title (path/to/file:line) — supporting detail
34
+
35
+ ## Recommendation
36
+ The approach you would take, with trade-offs.
@@ -0,0 +1,31 @@
1
+ ---
2
+ description: Read-only DeepSeek agent for code review, bug detection, regression analysis, security review and architecture review.
3
+ mode: all
4
+ temperature: 0.1
5
+ ---
6
+
7
+ You are a senior engineer performing a rigorous code review. You are strictly
8
+ read-only: never modify files, never run mutating commands.
9
+
10
+ Review for:
11
+ - Correctness bugs and edge cases.
12
+ - Regressions and broken assumptions.
13
+ - Security issues (injection, authz/authn, secret handling, unsafe input).
14
+ - Concurrency, resource and error-handling problems.
15
+ - Architecture and maintainability concerns that materially matter.
16
+
17
+ Rules:
18
+ - Ground every finding in code you actually read. Include file paths and lines.
19
+ - Do not report style nits unless they cause real defects.
20
+ - Rank findings by severity and be explicit about impact.
21
+ - If you find nothing material, say so instead of inventing issues.
22
+
23
+ Final response format:
24
+ ## Summary
25
+ What you reviewed and the overall verdict.
26
+
27
+ ## Findings
28
+ - [severity: critical|high|medium|low] Short title (path/to/file:line) — impact and why it is a problem, plus a suggested fix
29
+
30
+ ## Verdict
31
+ Approve / approve with changes / request changes, with the one-line reason.
@@ -0,0 +1,31 @@
1
+ ---
2
+ description: DeepSeek testing agent that runs test suites, inspects failures, identifies root causes and suggests fixes without editing code.
3
+ mode: all
4
+ temperature: 0.1
5
+ ---
6
+
7
+ You are a test engineer. Your job is to run the project's tests, understand
8
+ failures, and explain root causes. You do not modify files.
9
+
10
+ How to work:
11
+ - Discover the test commands from package.json, Makefile, CI config or
12
+ project documentation before running anything.
13
+ - Run the narrowest relevant test first, then widen if needed.
14
+ - Capture exact command output for failures (test name, assertion, stack).
15
+ - Read the production and test code involved to determine the root cause.
16
+ - Never modify files: report suggested fixes as descriptions or diffs inside
17
+ your final message instead.
18
+ - Do not run `git commit`, `git push` or other history-changing commands.
19
+
20
+ Final response format:
21
+ ## Summary
22
+ What you ran and the overall state.
23
+
24
+ ## Test Results
25
+ - `command` — pass/fail, with the key failure output
26
+
27
+ ## Root Causes
28
+ - [severity: high|medium|low] Short title (path/to/file:line) — why it fails
29
+
30
+ ## Suggested Fixes
31
+ - `path/to/file` — the change you would make and why
@@ -0,0 +1,6 @@
1
+ export interface InitOptions {
2
+ dir?: string;
3
+ force?: boolean;
4
+ writeMcp?: boolean;
5
+ }
6
+ export declare function runInit(options: InitOptions): Promise<number>;
@@ -0,0 +1,208 @@
1
+ import { execFile } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { globalConfigPath, loadConfig, projectConfigDir } from "../config/config.js";
5
+ import { BridgeError } from "../errors.js";
6
+ import { loadBuiltinAgentDefinitions, packageRoot } from "../opencode/agents.js";
7
+ import { resolveOpenCodeBinary } from "../opencode/binary.js";
8
+ import { createLogger } from "../util/logger.js";
9
+ import { validateWorkspace } from "../workspace/validator.js";
10
+ const CONFIG_TEMPLATE = {
11
+ defaults: {
12
+ agent: "deepseek-researcher",
13
+ provider: "deepseek",
14
+ model: null,
15
+ },
16
+ workspace: {
17
+ allowedRoots: [],
18
+ defaultCwd: null,
19
+ },
20
+ security: {
21
+ protectEnvFiles: true,
22
+ denyGitPush: true,
23
+ denyGitCommit: true,
24
+ },
25
+ timeouts: {
26
+ execution: 600000,
27
+ },
28
+ };
29
+ function line(marker, text, detail) {
30
+ const symbol = marker === "ok" ? "✓" : marker === "warn" ? "!" : "✗";
31
+ process.stdout.write(`${symbol} ${text}${detail ? `: ${detail}` : ""}\n`);
32
+ }
33
+ function run(command, args, cwd) {
34
+ return new Promise((resolve) => {
35
+ execFile(command, args, { cwd, timeout: 60_000, windowsHide: true, maxBuffer: 4 * 1024 * 1024 }, (error, stdout, stderr) => {
36
+ resolve({
37
+ code: error ? 1 : 0,
38
+ stdout: typeof stdout === "string" ? stdout : "",
39
+ stderr: typeof stderr === "string" ? stderr : "",
40
+ });
41
+ });
42
+ });
43
+ }
44
+ export async function runInit(options) {
45
+ const cwd = path.resolve(options.dir ?? process.cwd());
46
+ const logger = createLogger({ level: "warn" });
47
+ let failures = 0;
48
+ process.stdout.write(`claude-opencode init\n\n`);
49
+ let stat = null;
50
+ try {
51
+ stat = await fs.promises.stat(cwd);
52
+ }
53
+ catch {
54
+ stat = null;
55
+ }
56
+ if (!stat?.isDirectory()) {
57
+ line("fail", "Project directory not found", cwd);
58
+ return 1;
59
+ }
60
+ const hasPackageJson = await fs.promises
61
+ .access(path.join(cwd, "package.json"))
62
+ .then(() => true)
63
+ .catch(() => false);
64
+ const detectedMarkers = await fs.promises
65
+ .readdir(cwd)
66
+ .then((entries) => entries.filter((entry) => !entry.startsWith(".")).length)
67
+ .catch(() => 0);
68
+ line("ok", "Project detected", hasPackageJson ? `${cwd} (package.json present)` : `${cwd} (${detectedMarkers} entries)`);
69
+ const { config } = await loadConfig({ cwd });
70
+ let validated;
71
+ try {
72
+ validated = await validateWorkspace({
73
+ requestedPath: cwd,
74
+ allowedRoots: config.workspace.allowedRoots,
75
+ });
76
+ }
77
+ catch (error) {
78
+ line("fail", "Workspace validation failed", error instanceof Error ? error.message : String(error));
79
+ return 1;
80
+ }
81
+ if (validated.gitRoot) {
82
+ line("ok", "Git repository detected", validated.gitRoot);
83
+ }
84
+ else {
85
+ line("warn", "No git repository detected", "get_diff will rely on OpenCode session diffs");
86
+ }
87
+ line("ok", "Workspace validated", validated.cwd);
88
+ let binaryPath = null;
89
+ try {
90
+ const binary = await resolveOpenCodeBinary({
91
+ configured: config.opencode.binary,
92
+ env: process.env,
93
+ });
94
+ binaryPath = binary.command;
95
+ line("ok", "OpenCode detected", `${binary.version} (${binary.command})`);
96
+ }
97
+ catch (error) {
98
+ failures += 1;
99
+ line("fail", "OpenCode not found", error instanceof BridgeError ? error.message : String(error));
100
+ }
101
+ if (binaryPath) {
102
+ const models = await run(binaryPath, ["models"], cwd);
103
+ const providerLines = models.stdout
104
+ .split("\n")
105
+ .map((entry) => entry.trim())
106
+ .filter(Boolean);
107
+ const deepseekModels = providerLines.filter((entry) => entry.startsWith("deepseek/"));
108
+ if (deepseekModels.length > 0) {
109
+ line("ok", "DeepSeek provider detected", deepseekModels.slice(0, 3).join(", "));
110
+ }
111
+ else {
112
+ line("warn", "DeepSeek provider not detected", "connect it with `opencode auth login` or set defaults.provider/model in the bridge config");
113
+ }
114
+ }
115
+ const mcpJsonPath = path.join(cwd, ".mcp.json");
116
+ let mcpConfigured = false;
117
+ try {
118
+ const raw = await fs.promises.readFile(mcpJsonPath, "utf8");
119
+ mcpConfigured = raw.includes("claude-opencode-mcp");
120
+ }
121
+ catch {
122
+ mcpConfigured = false;
123
+ }
124
+ if (mcpConfigured) {
125
+ line("ok", "MCP configuration detected", mcpJsonPath);
126
+ }
127
+ else if (options.writeMcp) {
128
+ const entry = {
129
+ mcpServers: {
130
+ opencode: {
131
+ command: "npx",
132
+ args: ["-y", "claude-opencode-mcp"],
133
+ type: "stdio",
134
+ timeout: 600000,
135
+ },
136
+ },
137
+ };
138
+ let existing = entry;
139
+ try {
140
+ const raw = JSON.parse(await fs.promises.readFile(mcpJsonPath, "utf8"));
141
+ const servers = (raw.mcpServers ?? {});
142
+ existing = { ...raw, mcpServers: { ...servers, ...entry.mcpServers } };
143
+ }
144
+ catch {
145
+ // no existing .mcp.json
146
+ }
147
+ await fs.promises.writeFile(mcpJsonPath, `${JSON.stringify(existing, null, 2)}\n`, "utf8");
148
+ line("ok", "Wrote MCP configuration", mcpJsonPath);
149
+ }
150
+ else {
151
+ line("warn", "MCP configuration not found", "run `claude-opencode init --write-mcp` to create .mcp.json");
152
+ }
153
+ const projectDir = projectConfigDir(cwd);
154
+ const created = [];
155
+ const configFile = path.join(projectDir, "config.json");
156
+ const configExists = await fs.promises
157
+ .access(configFile)
158
+ .then(() => true)
159
+ .catch(() => false);
160
+ if (!configExists || options.force) {
161
+ await fs.promises.mkdir(projectDir, { recursive: true });
162
+ await fs.promises.writeFile(configFile, `${JSON.stringify(CONFIG_TEMPLATE, null, 2)}\n`, "utf8");
163
+ created.push(path.relative(cwd, configFile));
164
+ }
165
+ const agentsDir = path.join(projectDir, "agents");
166
+ await fs.promises.mkdir(agentsDir, { recursive: true });
167
+ const builtinAgents = await loadBuiltinAgentDefinitions();
168
+ for (const definition of builtinAgents) {
169
+ const target = path.join(agentsDir, `${definition.name}.md`);
170
+ const exists = await fs.promises
171
+ .access(target)
172
+ .then(() => true)
173
+ .catch(() => false);
174
+ if (exists && !options.force)
175
+ continue;
176
+ const source = path.join(packageRoot(), "agents", `${definition.name}.md`);
177
+ await fs.promises.copyFile(source, target);
178
+ created.push(path.relative(cwd, target));
179
+ }
180
+ process.stdout.write("\n");
181
+ if (created.length > 0) {
182
+ process.stdout.write("Created:\n");
183
+ for (const file of created)
184
+ process.stdout.write(` ${file}\n`);
185
+ }
186
+ else {
187
+ process.stdout.write("Project already initialized; nothing to create.\n");
188
+ }
189
+ process.stdout.write([
190
+ "",
191
+ "Next steps:",
192
+ " 1. Add the MCP server to Claude Code (project scope):",
193
+ " claude mcp add opencode --scope project -- npx -y claude-opencode-mcp",
194
+ " or commit a .mcp.json entry (see README).",
195
+ " 2. Restart Claude Code and confirm the server is connected with /mcp.",
196
+ ' 3. Ask Claude: "Use delegate_task with deepseek-researcher to map this project."',
197
+ "",
198
+ `Global configuration file: ${globalConfigPath()}`,
199
+ "",
200
+ ].join("\n"));
201
+ if (failures > 0) {
202
+ process.stdout.write("Initialization finished with errors; fix them before delegating.\n");
203
+ return 1;
204
+ }
205
+ logger.debug("init complete", { cwd });
206
+ return 0;
207
+ }
208
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAQ9D,MAAM,eAAe,GAAG;IACtB,QAAQ,EAAE;QACR,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,IAAI;KACZ;IACD,SAAS,EAAE;QACT,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,IAAI;KACjB;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;KACpB;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM;KAClB;CACF,CAAC;AAEF,SAAS,IAAI,CAAC,MAA8B,EAAE,IAAY,EAAE,MAAe;IACzE,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,GAAG,CACV,OAAe,EACf,IAAc,EACd,GAAW;IAEX,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,OAAO,EACP,IAAI,EACJ,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,EACvE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxB,OAAO,CAAC;gBACN,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;gBAChD,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;aACjD,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEjD,IAAI,IAAI,GAAoB,IAAI,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ;SACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;SACtC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ;SACtC,OAAO,CAAC,GAAG,CAAC;SACZ,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;SAC3E,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CACF,IAAI,EACJ,kBAAkB,EAClB,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,yBAAyB,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,eAAe,WAAW,CACzF,CAAC;IAEF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,IAAI,SAAwD,CAAC;IAC7D,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,iBAAiB,CAAC;YAClC,aAAa,EAAE,GAAG;YAClB,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CACF,MAAM,EACN,6BAA6B,EAC7B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,yBAAyB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,EAAE,4BAA4B,EAAE,8CAA8C,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAClC,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,IAAI,CAAC,CAAC;QACd,IAAI,CACF,MAAM,EACN,oBAAoB,EACpB,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM;aAChC,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QACtF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE,4BAA4B,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,IAAI,CACF,MAAM,EACN,gCAAgC,EAChC,2FAA2F,CAC5F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC5D,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,EAAE,4BAA4B,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG;YACZ,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC;oBACnC,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,MAAM;iBAChB;aACF;SACF,CAAC;QACF,IAAI,QAAQ,GAA4B,KAAK,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAGrE,CAAC;YACF,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;YAClE,QAAQ,GAAG,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QACD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,EAAE,yBAAyB,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,IAAI,CACF,MAAM,EACN,6BAA6B,EAC7B,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ;SACnC,MAAM,CAAC,UAAU,CAAC;SAClB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,UAAU,EACV,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC/C,MAAM,CACP,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,2BAA2B,EAAE,CAAC;IAC1D,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ;aAC7B,MAAM,CAAC,MAAM,CAAC;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;aAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,SAAS;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,EAAE;QACF,aAAa;QACb,yDAAyD;QACzD,8EAA8E;QAC9E,gDAAgD;QAChD,yEAAyE;QACzE,oFAAoF;QACpF,EAAE;QACF,8BAA8B,gBAAgB,EAAE,EAAE;QAClD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC3F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { z } from "zod";
2
+ export declare const SecurityConfigSchema: z.ZodPrefault<z.ZodObject<{
3
+ protectEnvFiles: z.ZodDefault<z.ZodBoolean>;
4
+ denyGitPush: z.ZodDefault<z.ZodBoolean>;
5
+ denyGitCommit: z.ZodDefault<z.ZodBoolean>;
6
+ externalDirectory: z.ZodDefault<z.ZodEnum<{
7
+ allow: "allow";
8
+ ask: "ask";
9
+ deny: "deny";
10
+ }>>;
11
+ extraProtectedPatterns: z.ZodDefault<z.ZodArray<z.ZodString>>;
12
+ }, z.core.$strip>>;
13
+ export type SecurityConfig = z.infer<typeof SecurityConfigSchema>;
14
+ export declare const AgentOverrideSchema: z.ZodObject<{
15
+ description: z.ZodOptional<z.ZodString>;
16
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
17
+ provider: z.ZodOptional<z.ZodString>;
18
+ temperature: z.ZodOptional<z.ZodNumber>;
19
+ prompt: z.ZodOptional<z.ZodString>;
20
+ profile: z.ZodOptional<z.ZodEnum<{
21
+ read: "read";
22
+ review: "review";
23
+ code: "code";
24
+ test: "test";
25
+ }>>;
26
+ enabled: z.ZodOptional<z.ZodBoolean>;
27
+ }, z.core.$strip>;
28
+ export type AgentOverride = z.infer<typeof AgentOverrideSchema>;
29
+ export declare const BridgeConfigSchema: z.ZodObject<{
30
+ opencode: z.ZodPrefault<z.ZodObject<{
31
+ url: z.ZodDefault<z.ZodNullable<z.ZodString>>;
32
+ autoStart: z.ZodDefault<z.ZodBoolean>;
33
+ hostname: z.ZodDefault<z.ZodString>;
34
+ port: z.ZodDefault<z.ZodNumber>;
35
+ startupTimeout: z.ZodDefault<z.ZodNumber>;
36
+ binary: z.ZodDefault<z.ZodNullable<z.ZodString>>;
37
+ username: z.ZodDefault<z.ZodNullable<z.ZodString>>;
38
+ password: z.ZodDefault<z.ZodNullable<z.ZodString>>;
39
+ logLevel: z.ZodDefault<z.ZodNullable<z.ZodEnum<{
40
+ DEBUG: "DEBUG";
41
+ INFO: "INFO";
42
+ WARN: "WARN";
43
+ ERROR: "ERROR";
44
+ }>>>;
45
+ maxServers: z.ZodDefault<z.ZodNumber>;
46
+ }, z.core.$strip>>;
47
+ workspace: z.ZodPrefault<z.ZodObject<{
48
+ allowedRoots: z.ZodDefault<z.ZodArray<z.ZodString>>;
49
+ defaultCwd: z.ZodDefault<z.ZodNullable<z.ZodString>>;
50
+ }, z.core.$strip>>;
51
+ defaults: z.ZodPrefault<z.ZodObject<{
52
+ agent: z.ZodDefault<z.ZodString>;
53
+ provider: z.ZodDefault<z.ZodString>;
54
+ model: z.ZodDefault<z.ZodNullable<z.ZodString>>;
55
+ }, z.core.$strip>>;
56
+ timeouts: z.ZodPrefault<z.ZodObject<{
57
+ execution: z.ZodDefault<z.ZodNumber>;
58
+ }, z.core.$strip>>;
59
+ security: z.ZodPrefault<z.ZodObject<{
60
+ protectEnvFiles: z.ZodDefault<z.ZodBoolean>;
61
+ denyGitPush: z.ZodDefault<z.ZodBoolean>;
62
+ denyGitCommit: z.ZodDefault<z.ZodBoolean>;
63
+ externalDirectory: z.ZodDefault<z.ZodEnum<{
64
+ allow: "allow";
65
+ ask: "ask";
66
+ deny: "deny";
67
+ }>>;
68
+ extraProtectedPatterns: z.ZodDefault<z.ZodArray<z.ZodString>>;
69
+ }, z.core.$strip>>;
70
+ limits: z.ZodPrefault<z.ZodObject<{
71
+ summaryChars: z.ZodDefault<z.ZodNumber>;
72
+ sessionChars: z.ZodDefault<z.ZodNumber>;
73
+ diffChars: z.ZodDefault<z.ZodNumber>;
74
+ }, z.core.$strip>>;
75
+ agents: z.ZodPrefault<z.ZodRecord<z.ZodString, z.ZodObject<{
76
+ description: z.ZodOptional<z.ZodString>;
77
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
78
+ provider: z.ZodOptional<z.ZodString>;
79
+ temperature: z.ZodOptional<z.ZodNumber>;
80
+ prompt: z.ZodOptional<z.ZodString>;
81
+ profile: z.ZodOptional<z.ZodEnum<{
82
+ read: "read";
83
+ review: "review";
84
+ code: "code";
85
+ test: "test";
86
+ }>>;
87
+ enabled: z.ZodOptional<z.ZodBoolean>;
88
+ }, z.core.$strip>>>;
89
+ }, z.core.$strip>;
90
+ export type BridgeConfigInput = z.input<typeof BridgeConfigSchema>;
91
+ export type ResolvedConfig = z.output<typeof BridgeConfigSchema>;
92
+ export declare const DEFAULT_CONFIG: ResolvedConfig;
93
+ export declare function globalConfigDir(env?: NodeJS.ProcessEnv): string;
94
+ export declare function globalConfigPath(env?: NodeJS.ProcessEnv): string;
95
+ export declare function projectConfigDir(cwd: string): string;
96
+ export declare function projectConfigPath(cwd: string): string;
97
+ export declare function deepMerge<T>(base: T, override: unknown): T;
98
+ export interface LoadConfigOptions {
99
+ cwd?: string;
100
+ env?: NodeJS.ProcessEnv;
101
+ /** Extra config file loaded last (highest precedence). */
102
+ explicitPath?: string | null;
103
+ }
104
+ export interface LoadedConfig {
105
+ config: ResolvedConfig;
106
+ sources: string[];
107
+ }
108
+ export declare function loadConfig(options?: LoadConfigOptions): Promise<LoadedConfig>;
109
+ export declare function resolveExecutionTimeout(config: ResolvedConfig, override?: number): number;
@@ -0,0 +1,163 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { BridgeError } from "../errors.js";
5
+ import { readJsonFile } from "../util/fs.js";
6
+ const PermissionActionSchema = z.enum(["allow", "ask", "deny"]);
7
+ export const SecurityConfigSchema = z
8
+ .object({
9
+ /** Protect `.env` files and common credential material from read/edit tools. */
10
+ protectEnvFiles: z.boolean().default(true),
11
+ denyGitPush: z.boolean().default(true),
12
+ denyGitCommit: z.boolean().default(true),
13
+ /** Policy for paths outside the workspace (headless bridge defaults to deny). */
14
+ externalDirectory: PermissionActionSchema.default("deny"),
15
+ /** Extra wildcard patterns to protect, e.g. `secrets/*`. */
16
+ extraProtectedPatterns: z.array(z.string()).default([]),
17
+ })
18
+ .prefault({});
19
+ export const AgentOverrideSchema = z.object({
20
+ description: z.string().optional(),
21
+ model: z.string().nullable().optional(),
22
+ provider: z.string().optional(),
23
+ temperature: z.number().optional(),
24
+ prompt: z.string().optional(),
25
+ profile: z.enum(["read", "review", "code", "test"]).optional(),
26
+ enabled: z.boolean().optional(),
27
+ });
28
+ export const BridgeConfigSchema = z.object({
29
+ opencode: z
30
+ .object({
31
+ /** Connect to an already-running OpenCode server instead of starting one. */
32
+ url: z.string().nullable().default(null),
33
+ autoStart: z.boolean().default(true),
34
+ hostname: z.string().default("127.0.0.1"),
35
+ port: z.number().int().min(0).max(65535).default(0),
36
+ startupTimeout: z.number().int().positive().default(30_000),
37
+ /** Explicit path to the OpenCode executable. */
38
+ binary: z.string().nullable().default(null),
39
+ username: z.string().nullable().default(null),
40
+ password: z.string().nullable().default(null),
41
+ logLevel: z.enum(["DEBUG", "INFO", "WARN", "ERROR"]).nullable().default(null),
42
+ /** Maximum number of lazily started OpenCode servers kept alive. */
43
+ maxServers: z.number().int().positive().default(4),
44
+ })
45
+ .prefault({}),
46
+ workspace: z
47
+ .object({
48
+ /** When non-empty, workspaces must resolve inside one of these roots. */
49
+ allowedRoots: z.array(z.string()).default([]),
50
+ defaultCwd: z.string().nullable().default(null),
51
+ })
52
+ .prefault({}),
53
+ defaults: z
54
+ .object({
55
+ agent: z.string().default("deepseek-researcher"),
56
+ provider: z.string().default("deepseek"),
57
+ /** `provider/model` or bare model id. When null the provider default is used. */
58
+ model: z.string().nullable().default(null),
59
+ })
60
+ .prefault({}),
61
+ timeouts: z
62
+ .object({
63
+ execution: z.number().int().positive().default(600_000),
64
+ })
65
+ .prefault({}),
66
+ security: SecurityConfigSchema,
67
+ limits: z
68
+ .object({
69
+ summaryChars: z.number().int().positive().default(6_000),
70
+ sessionChars: z.number().int().positive().default(20_000),
71
+ diffChars: z.number().int().positive().default(60_000),
72
+ })
73
+ .prefault({}),
74
+ /** Per-agent overrides keyed by agent name. */
75
+ agents: z.record(z.string(), AgentOverrideSchema).prefault({}),
76
+ });
77
+ export const DEFAULT_CONFIG = BridgeConfigSchema.parse({});
78
+ export function globalConfigDir(env = process.env) {
79
+ const xdg = env.XDG_CONFIG_HOME;
80
+ const base = xdg?.trim() ? xdg : path.join(os.homedir(), ".config");
81
+ return path.join(base, "claude-opencode-mcp");
82
+ }
83
+ export function globalConfigPath(env = process.env) {
84
+ return path.join(globalConfigDir(env), "config.json");
85
+ }
86
+ export function projectConfigDir(cwd) {
87
+ return path.join(cwd, ".claude-opencode");
88
+ }
89
+ export function projectConfigPath(cwd) {
90
+ return path.join(projectConfigDir(cwd), "config.json");
91
+ }
92
+ function isPlainObject(value) {
93
+ return typeof value === "object" && value !== null && !Array.isArray(value);
94
+ }
95
+ export function deepMerge(base, override) {
96
+ if (!isPlainObject(base) || !isPlainObject(override)) {
97
+ return (override === undefined ? base : override);
98
+ }
99
+ const result = { ...base };
100
+ for (const [key, value] of Object.entries(override)) {
101
+ if (value === undefined)
102
+ continue;
103
+ const existing = result[key];
104
+ result[key] =
105
+ isPlainObject(existing) && isPlainObject(value) ? deepMerge(existing, value) : value;
106
+ }
107
+ return result;
108
+ }
109
+ function parseConfigFile(file, raw) {
110
+ const result = BridgeConfigSchema.safeParse(raw);
111
+ if (!result.success) {
112
+ throw new BridgeError("CONFIG_INVALID", `Invalid configuration in ${file}`, {
113
+ details: { file, issues: result.error.issues.slice(0, 10) },
114
+ });
115
+ }
116
+ // Merge the raw (validated) values rather than result.data: applying schema
117
+ // defaults per file would let a default in a later file clobber an explicit
118
+ // value from an earlier one. Defaults are applied once, after merging.
119
+ return raw;
120
+ }
121
+ export async function loadConfig(options = {}) {
122
+ const env = options.env ?? process.env;
123
+ const cwd = options.cwd ? path.resolve(options.cwd) : null;
124
+ const sources = [];
125
+ let merged = {};
126
+ const files = [globalConfigPath(env)];
127
+ if (cwd)
128
+ files.push(projectConfigPath(cwd));
129
+ const explicit = options.explicitPath ?? env.CLAUDE_OPENCODE_CONFIG ?? null;
130
+ if (explicit?.trim())
131
+ files.push(path.resolve(explicit));
132
+ for (const file of files) {
133
+ let raw;
134
+ try {
135
+ raw = await readJsonFile(file);
136
+ }
137
+ catch (error) {
138
+ throw new BridgeError("CONFIG_INVALID", `Could not read configuration file ${file}`, {
139
+ details: { file, reason: error instanceof Error ? error.message : String(error) },
140
+ cause: error,
141
+ });
142
+ }
143
+ if (raw === null || raw === undefined)
144
+ continue;
145
+ const parsed = parseConfigFile(file, raw);
146
+ merged = deepMerge(merged, parsed);
147
+ sources.push(file);
148
+ }
149
+ const config = BridgeConfigSchema.parse(merged);
150
+ return { config, sources };
151
+ }
152
+ export function resolveExecutionTimeout(config, override) {
153
+ if (override !== undefined) {
154
+ if (!Number.isFinite(override) || override <= 0) {
155
+ throw new BridgeError("INVALID_ARGUMENT", "timeout must be a positive number of milliseconds", {
156
+ details: { timeout: override },
157
+ });
158
+ }
159
+ return Math.floor(override);
160
+ }
161
+ return config.timeouts.execution;
162
+ }
163
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,CAAC;IACN,gFAAgF;IAChF,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACtC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACxC,iFAAiF;IACjF,iBAAiB,EAAE,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC;IACzD,4DAA4D;IAC5D,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACxD,CAAC;KACD,QAAQ,CAAC,EAAE,CAAC,CAAC;AAIhB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,6EAA6E;QAC7E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACxC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3D,gDAAgD;QAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7E,oEAAoE;QACpE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;KACnD,CAAC;SACD,QAAQ,CAAC,EAAE,CAAC;IACf,SAAS,EAAE,CAAC;SACT,MAAM,CAAC;QACN,yEAAyE;QACzE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAChD,CAAC;SACD,QAAQ,CAAC,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;QAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;QACxC,iFAAiF;QACjF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KAC3C,CAAC;SACD,QAAQ,CAAC,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;KACxD,CAAC;SACD,QAAQ,CAAC,EAAE,CAAC;IACf,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,CAAC;SACN,MAAM,CAAC;QACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACxD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;KACvD,CAAC;SACD,QAAQ,CAAC,EAAE,CAAC;IACf,+CAA+C;IAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC/D,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,cAAc,GAAmB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAE3E,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,IAAO,EAAE,QAAiB;IACrD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,QAAc,CAAM,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,GAAI,IAAgC,EAAE,CAAC;IACjF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC;YACT,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACzF,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,GAAY;IACjD,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,4BAA4B,IAAI,EAAE,EAAE;YAC1E,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,4EAA4E;IAC5E,4EAA4E;IAC5E,uEAAuE;IACvE,OAAO,GAAwB,CAAC;AAClC,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAsB,EAAE,CAAC;IAEnC,MAAM,KAAK,GAAa,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC;IAC5E,IAAI,QAAQ,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,YAAY,CAAU,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,qCAAqC,IAAI,EAAE,EAAE;gBACnF,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACjF,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAsB,EAAE,QAAiB;IAC/E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,WAAW,CACnB,kBAAkB,EAClB,mDAAmD,EACnD;gBACE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;aAC/B,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;AACnC,CAAC"}