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,48 @@
1
+ import { z } from "zod";
2
+ import { BridgeError } from "../../errors.js";
3
+ import { requestId } from "../../util/text.js";
4
+ import { assertSession } from "../execute.js";
5
+ import { errorResult, jsonResult } from "../tool-utils.js";
6
+ export function registerAbortSession(server, ctx) {
7
+ server.registerTool("abort_session", {
8
+ title: "Abort a running delegated session",
9
+ description: "Stop a long-running or unwanted delegated task. Safe to call when the session is already idle.",
10
+ inputSchema: {
11
+ session_id: z
12
+ .string()
13
+ .min(1)
14
+ .max(200)
15
+ .describe("Session id returned by delegate_task/create_session."),
16
+ },
17
+ annotations: { destructiveHint: true },
18
+ }, async (args) => {
19
+ const rid = requestId();
20
+ try {
21
+ const session = assertSession(ctx.registry.get(args.session_id), args.session_id);
22
+ const client = ctx.manager.existingClient(session.cwd);
23
+ if (!client) {
24
+ ctx.registry.setStatus(session.id, "aborted");
25
+ return jsonResult({
26
+ session_id: session.id,
27
+ aborted: true,
28
+ note: "No OpenCode server is running for this workspace; session marked as aborted.",
29
+ });
30
+ }
31
+ const result = await client.session.abort({ path: { id: session.id } });
32
+ if (result.error) {
33
+ throw new BridgeError("OPENCODE_ERROR", `OpenCode refused to abort the session: ${JSON.stringify(result.error)}`);
34
+ }
35
+ ctx.registry.setStatus(session.id, "aborted");
36
+ ctx.logger.info("aborted delegated session", { session_id: session.id });
37
+ return jsonResult({ session_id: session.id, aborted: Boolean(result.data) });
38
+ }
39
+ catch (error) {
40
+ ctx.logger.error("abort_session failed", {
41
+ request_id: rid,
42
+ error: error instanceof Error ? error.message : String(error),
43
+ });
44
+ return errorResult(error, rid);
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=abort-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-session.js","sourceRoot":"","sources":["../../../src/mcp/tools/abort-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAe;IACrE,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EACT,gGAAgG;QAClG,WAAW,EAAE;YACX,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,CAAC,sDAAsD,CAAC;SACpE;QACD,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;KACvC,EACD,KAAK,EAAE,IAA4B,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAC9C,OAAO,UAAU,CAAC;oBAChB,UAAU,EAAE,OAAO,CAAC,EAAE;oBACtB,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,8EAA8E;iBACrF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAI,WAAW,CACnB,gBAAgB,EAChB,0CAA0C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;YACJ,CAAC;YACD,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACzE,OAAO,UAAU,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACvC,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { AppContext } from "../execute.js";
3
+ export declare function registerCreateSession(server: McpServer, ctx: AppContext): void;
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { prepareRun } from "../../opencode/setup.js";
3
+ import { requestId } from "../../util/text.js";
4
+ import { createDelegatedSession, defaultSessionTitle } from "../session-utils.js";
5
+ import { errorResult, jsonResult } from "../tool-utils.js";
6
+ export function registerCreateSession(server, ctx) {
7
+ server.registerTool("create_session", {
8
+ title: "Create a persistent OpenCode agent session",
9
+ description: "Create a persistent delegation session in a workspace without running a task yet. Follow up with send_message to keep the agent's context between calls.",
10
+ inputSchema: {
11
+ cwd: z.string().min(1).max(4_096).describe("Workspace directory for the session."),
12
+ agent: z
13
+ .string()
14
+ .max(200)
15
+ .optional()
16
+ .describe("Agent to use (default: deepseek-researcher). See list_agents."),
17
+ model: z
18
+ .string()
19
+ .max(200)
20
+ .optional()
21
+ .describe('Override the model, e.g. "deepseek/deepseek-v4-pro".'),
22
+ title: z.string().max(500).optional().describe("Human-readable session title."),
23
+ },
24
+ annotations: { openWorldHint: true },
25
+ }, async (args) => {
26
+ const rid = requestId();
27
+ try {
28
+ const prepared = await prepareRun(ctx, {
29
+ cwd: args.cwd,
30
+ agent: args.agent,
31
+ model: args.model,
32
+ });
33
+ const session = await createDelegatedSession(ctx, prepared, args.title ?? defaultSessionTitle(prepared.definition.name, "session"));
34
+ return jsonResult({
35
+ session_id: session.id,
36
+ cwd: session.cwd,
37
+ agent: session.agent,
38
+ model: session.model,
39
+ title: session.title,
40
+ status: session.status,
41
+ created_at: session.createdAt,
42
+ });
43
+ }
44
+ catch (error) {
45
+ ctx.logger.error("create_session failed", {
46
+ request_id: rid,
47
+ error: error instanceof Error ? error.message : String(error),
48
+ });
49
+ return errorResult(error, rid);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=create-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../src/mcp/tools/create-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,GAAe;IACtE,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,4CAA4C;QACnD,WAAW,EACT,0JAA0J;QAC5J,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YAClF,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YACnE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAChF;QACD,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;KACrC,EACD,KAAK,EAAE,IAAqE,EAAE,EAAE;QAC9E,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE;gBACrC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAC1C,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CACvE,CAAC;YACF,OAAO,UAAU,CAAC;gBAChB,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,UAAU,EAAE,OAAO,CAAC,SAAS;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACxC,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { AppContext } from "../execute.js";
3
+ export declare const DELEGATE_TASK_DESCRIPTION: string;
4
+ export declare function registerDelegateTask(server: McpServer, ctx: AppContext): void;
@@ -0,0 +1,98 @@
1
+ import { z } from "zod";
2
+ import { resolveExecutionTimeout } from "../../config/config.js";
3
+ import { prepareRun } from "../../opencode/setup.js";
4
+ import { requestId } from "../../util/text.js";
5
+ import { buildTaskPrompt } from "../../workspace/context.js";
6
+ import { resolveWorkspaceHints } from "../../workspace/resolver.js";
7
+ import { executeRun } from "../execute.js";
8
+ import { createDelegatedSession, defaultSessionTitle } from "../session-utils.js";
9
+ import { errorResult, jsonResult } from "../tool-utils.js";
10
+ export const DELEGATE_TASK_DESCRIPTION = [
11
+ "Delegate a software-engineering task to an OpenCode agent (DeepSeek by default) that runs in the same workspace.",
12
+ "The agent explores the repository itself and returns a concise summary plus structured findings.",
13
+ "Read-only agents (deepseek-researcher, deepseek-reviewer) cannot modify files; deepseek-coder can edit and run tests.",
14
+ "Set allow_edits=false to force edit tools off for this call.",
15
+ "Returns { status, session_id, summary, findings, files_changed }.",
16
+ ].join(" ");
17
+ export function registerDelegateTask(server, ctx) {
18
+ server.registerTool("delegate_task", {
19
+ title: "Delegate task to OpenCode agent",
20
+ description: DELEGATE_TASK_DESCRIPTION,
21
+ inputSchema: {
22
+ task: z
23
+ .string()
24
+ .min(1)
25
+ .max(50_000)
26
+ .describe("The task to delegate, written as a clear instruction."),
27
+ agent: z
28
+ .string()
29
+ .max(200)
30
+ .optional()
31
+ .describe("Agent to use (default: deepseek-researcher). See list_agents."),
32
+ cwd: z
33
+ .string()
34
+ .max(4_096)
35
+ .optional()
36
+ .describe("Workspace directory. Defaults to CLAUDE_PROJECT_DIR / the server working directory."),
37
+ paths: z
38
+ .array(z.string().max(4_096))
39
+ .max(200)
40
+ .optional()
41
+ .describe("Starting path hints relative to the workspace. Hints only, not a restriction."),
42
+ model: z
43
+ .string()
44
+ .max(200)
45
+ .optional()
46
+ .describe('Override the model, e.g. "deepseek/deepseek-v4-pro".'),
47
+ timeout: z
48
+ .number()
49
+ .int()
50
+ .positive()
51
+ .max(3_600_000)
52
+ .optional()
53
+ .describe("Execution timeout in milliseconds (default from bridge config)."),
54
+ allow_edits: z
55
+ .boolean()
56
+ .optional()
57
+ .describe("When false, edit/write tools are disabled for this call."),
58
+ },
59
+ annotations: { openWorldHint: true },
60
+ }, async (args, extra) => {
61
+ const rid = requestId();
62
+ try {
63
+ const prepared = await prepareRun(ctx, {
64
+ cwd: args.cwd,
65
+ agent: args.agent,
66
+ model: args.model,
67
+ });
68
+ const hints = resolveWorkspaceHints(prepared.workspace.cwd, args.paths);
69
+ const session = await createDelegatedSession(ctx, prepared, defaultSessionTitle(prepared.definition.name, args.task));
70
+ const text = buildTaskPrompt({
71
+ workspace: prepared.workspace,
72
+ task: args.task,
73
+ hints,
74
+ capabilities: prepared.capabilities,
75
+ agentName: prepared.definition.name,
76
+ });
77
+ const timeoutMs = resolveExecutionTimeout(prepared.config, args.timeout);
78
+ const result = await executeRun(ctx, {
79
+ prepared,
80
+ session,
81
+ text,
82
+ timeoutMs,
83
+ disableEdits: args.allow_edits === false,
84
+ extra,
85
+ requestId: rid,
86
+ });
87
+ return jsonResult(result, { isError: result.status !== "completed" });
88
+ }
89
+ catch (error) {
90
+ ctx.logger.error("delegate_task failed", {
91
+ request_id: rid,
92
+ error: error instanceof Error ? error.message : String(error),
93
+ });
94
+ return errorResult(error, rid);
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=delegate-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate-task.js","sourceRoot":"","sources":["../../../src/mcp/tools/delegate-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type AppContext } from "../execute.js";
3
+ export declare function registerGetDiff(server: McpServer, ctx: AppContext): void;
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ import { BridgeError } from "../../errors.js";
3
+ import { diffSinceBaseline } from "../../util/git.js";
4
+ import { requestId, truncate } from "../../util/text.js";
5
+ import { assertSession, loadWorkspaceConfig } from "../execute.js";
6
+ import { errorResult, jsonResult } from "../tool-utils.js";
7
+ function baselineFromSession(sessionBaseline) {
8
+ return {
9
+ head: sessionBaseline.head,
10
+ stashRef: sessionBaseline.stashRef,
11
+ untracked: sessionBaseline.untracked,
12
+ unborn: sessionBaseline.unborn,
13
+ dirty: sessionBaseline.stashRef !== null,
14
+ };
15
+ }
16
+ async function opencodeDiff(client, sessionId) {
17
+ try {
18
+ const result = await client.session.diff({ path: { id: sessionId } });
19
+ if (result.error || !result.data || result.data.length === 0)
20
+ return null;
21
+ return result.data;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ export function registerGetDiff(server, ctx) {
28
+ server.registerTool("get_diff", {
29
+ title: "Inspect changes made in a session",
30
+ description: "Return the file changes associated with a delegated session: OpenCode's own session diff when available, otherwise a git diff against the baseline captured when the session was created.",
31
+ inputSchema: {
32
+ session_id: z
33
+ .string()
34
+ .min(1)
35
+ .max(200)
36
+ .describe("Session id returned by delegate_task/create_session."),
37
+ },
38
+ annotations: { readOnlyHint: true },
39
+ }, async (args) => {
40
+ const rid = requestId();
41
+ try {
42
+ const session = assertSession(ctx.registry.get(args.session_id), args.session_id);
43
+ const config = await loadWorkspaceConfig(ctx, session.cwd);
44
+ const client = ctx.manager.existingClient(session.cwd);
45
+ const fromOpencode = client ? await opencodeDiff(client, session.id) : null;
46
+ if (fromOpencode && fromOpencode.length > 0) {
47
+ const files = fromOpencode.map((entry) => ({
48
+ file: entry.file,
49
+ additions: entry.additions,
50
+ deletions: entry.deletions,
51
+ status: "modified",
52
+ }));
53
+ const rendered = fromOpencode
54
+ .map((entry) => `diff --git a/${entry.file} b/${entry.file}\n--- a/${entry.file}\n+++ b/${entry.file}\n@@ +${entry.additions} -${entry.deletions} @@`)
55
+ .join("\n");
56
+ const truncated = truncate(rendered, config.limits.diffChars);
57
+ return jsonResult({
58
+ session_id: session.id,
59
+ cwd: session.cwd,
60
+ source: "opencode",
61
+ files,
62
+ diff: truncated.text,
63
+ truncated: truncated.truncated,
64
+ });
65
+ }
66
+ if (!session.baseline) {
67
+ throw new BridgeError("DIFF_UNAVAILABLE", "No file changes are available for this session.", {
68
+ details: {
69
+ session_id: session.id,
70
+ cwd: session.cwd,
71
+ reason: "The workspace was not a git repository when the session was created and OpenCode reported no session diff.",
72
+ },
73
+ });
74
+ }
75
+ const result = await diffSinceBaseline(session.cwd, baselineFromSession(session.baseline), {
76
+ maxPatchChars: config.limits.diffChars,
77
+ });
78
+ return jsonResult({
79
+ session_id: session.id,
80
+ cwd: session.cwd,
81
+ source: "git",
82
+ files: result.files,
83
+ diff: result.patch,
84
+ truncated: result.truncated,
85
+ ...(result.note ? { note: result.note } : {}),
86
+ });
87
+ }
88
+ catch (error) {
89
+ ctx.logger.error("get_diff failed", {
90
+ request_id: rid,
91
+ error: error instanceof Error ? error.message : String(error),
92
+ });
93
+ return errorResult(error, rid);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=get-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-diff.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-diff.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAmB,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3D,SAAS,mBAAmB,CAAC,eAK5B;IACC,OAAO;QACL,IAAI,EAAE,eAAe,CAAC,IAAI;QAC1B,QAAQ,EAAE,eAAe,CAAC,QAAQ;QAClC,SAAS,EAAE,eAAe,CAAC,SAAS;QACpC,MAAM,EAAE,eAAe,CAAC,MAAM;QAC9B,KAAK,EAAE,eAAe,CAAC,QAAQ,KAAK,IAAI;KACzC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAsB,EACtB,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,GAAe;IAChE,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EACT,2LAA2L;QAC7L,WAAW,EAAE;YACX,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,CAAC,sDAAsD,CAAC;SACpE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,EAAE,IAA4B,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEvD,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5E,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACzC,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,MAAM,EAAE,UAAmB;iBAC5B,CAAC,CAAC,CAAC;gBACJ,MAAM,QAAQ,GAAG,YAAY;qBAC1B,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CACR,gBAAgB,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,KAAK,CACxI;qBACA,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC9D,OAAO,UAAU,CAAC;oBAChB,UAAU,EAAE,OAAO,CAAC,EAAE;oBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,MAAM,EAAE,UAAU;oBAClB,KAAK;oBACL,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,SAAS,EAAE,SAAS,CAAC,SAAS;iBAC/B,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,MAAM,IAAI,WAAW,CACnB,kBAAkB,EAClB,iDAAiD,EACjD;oBACE,OAAO,EAAE;wBACP,UAAU,EAAE,OAAO,CAAC,EAAE;wBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;wBAChB,MAAM,EACJ,4GAA4G;qBAC/G;iBACF,CACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACzF,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;aACvC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;gBAChB,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,KAAK;gBAClB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;gBAClC,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type AppContext } from "../execute.js";
3
+ export declare function registerGetSession(server: McpServer, ctx: AppContext): void;
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+ import { BridgeError } from "../../errors.js";
3
+ import { requestId } from "../../util/text.js";
4
+ import { assertSession, loadWorkspaceConfig } from "../execute.js";
5
+ import { errorResult, jsonResult } from "../tool-utils.js";
6
+ export function registerGetSession(server, ctx) {
7
+ server.registerTool("get_session", {
8
+ title: "Get delegated session state",
9
+ description: "Return the stored state of a delegated session plus its live OpenCode status when a server is running. Use get_diff to inspect file changes.",
10
+ inputSchema: {
11
+ session_id: z
12
+ .string()
13
+ .min(1)
14
+ .max(200)
15
+ .describe("Session id returned by delegate_task/create_session."),
16
+ },
17
+ annotations: { readOnlyHint: true },
18
+ }, async (args) => {
19
+ const rid = requestId();
20
+ try {
21
+ const session = assertSession(ctx.registry.get(args.session_id), args.session_id);
22
+ const config = await loadWorkspaceConfig(ctx, session.cwd);
23
+ const maxChars = config.limits.sessionChars;
24
+ const client = ctx.manager.existingClient(session.cwd);
25
+ let liveStatus = null;
26
+ let serverVersion = null;
27
+ let live = false;
28
+ if (client) {
29
+ live = true;
30
+ serverVersion = ctx.manager.getExistingServerVersion(session.cwd);
31
+ try {
32
+ const sessionResult = await client.session.get({ path: { id: session.id } });
33
+ if (sessionResult.error) {
34
+ throw new BridgeError("OPENCODE_SESSION_NOT_FOUND", `OpenCode no longer knows session ${session.id}.`);
35
+ }
36
+ const statuses = await client.session.status();
37
+ liveStatus = statuses.data?.[session.id]?.type ?? "idle";
38
+ }
39
+ catch (error) {
40
+ if (error instanceof BridgeError)
41
+ throw error;
42
+ ctx.logger.debug("could not fetch live session status", {
43
+ session_id: session.id,
44
+ error: error instanceof Error ? error.message : String(error),
45
+ });
46
+ liveStatus = null;
47
+ }
48
+ }
49
+ const summary = session.lastSummary ?? "";
50
+ const clipped = summary.length > maxChars ? `${summary.slice(0, maxChars)}…` : summary;
51
+ return jsonResult({
52
+ session_id: session.id,
53
+ cwd: session.cwd,
54
+ agent: session.agent,
55
+ provider: session.provider,
56
+ model: session.model,
57
+ title: session.title,
58
+ status: session.status,
59
+ created_at: session.createdAt,
60
+ updated_at: session.updatedAt,
61
+ ...(session.lastError ? { last_error: session.lastError } : {}),
62
+ ...(session.lastSummary ? { last_summary: clipped } : {}),
63
+ ...(session.durationMs !== undefined ? { duration_ms: session.durationMs } : {}),
64
+ ...(session.lastMessageID ? { last_message_id: session.lastMessageID } : {}),
65
+ opencode: live
66
+ ? { live: true, status: liveStatus, server_version: serverVersion }
67
+ : { live: false, status: null, server_version: null },
68
+ });
69
+ }
70
+ catch (error) {
71
+ ctx.logger.error("get_session failed", {
72
+ request_id: rid,
73
+ error: error instanceof Error ? error.message : String(error),
74
+ });
75
+ return errorResult(error, rid);
76
+ }
77
+ });
78
+ }
79
+ //# sourceMappingURL=get-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-session.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type AppContext } from "../execute.js";
3
+ export declare function registerListAgents(server: McpServer, ctx: AppContext): void;
@@ -0,0 +1,72 @@
1
+ import { z } from "zod";
2
+ import { agentCapabilities, buildAgentDefinitions, loadProjectAgentDefinitions, } from "../../opencode/agents.js";
3
+ import { getBuiltinDefinitions } from "../../opencode/setup.js";
4
+ import { requestId } from "../../util/text.js";
5
+ import { resolveWorkspace } from "../../workspace/resolver.js";
6
+ import { loadWorkspaceConfig } from "../execute.js";
7
+ import { errorResult, jsonResult } from "../tool-utils.js";
8
+ export function registerListAgents(server, ctx) {
9
+ server.registerTool("list_agents", {
10
+ title: "List available delegated agents",
11
+ description: "List the agents that delegate_task and create_session can use, including project-local agents from .claude-opencode/agents.",
12
+ inputSchema: {
13
+ cwd: z
14
+ .string()
15
+ .max(4_096)
16
+ .optional()
17
+ .describe("Workspace used to discover project-local agents (optional)."),
18
+ },
19
+ annotations: { readOnlyHint: true },
20
+ }, async (args) => {
21
+ const rid = requestId();
22
+ try {
23
+ let config = ctx.globalConfig;
24
+ let cwd = null;
25
+ try {
26
+ const resolution = await resolveWorkspace({
27
+ cwd: args.cwd,
28
+ env: ctx.env,
29
+ globalConfig: ctx.globalConfig,
30
+ ...(ctx.loadProjectConfig ? { loadProjectConfig: ctx.loadProjectConfig } : {}),
31
+ });
32
+ config = resolution.config;
33
+ cwd = resolution.workspace.cwd;
34
+ }
35
+ catch {
36
+ config = await loadWorkspaceConfig(ctx, process.cwd()).catch(() => ctx.globalConfig);
37
+ }
38
+ const [builtin, project] = await Promise.all([
39
+ getBuiltinDefinitions(),
40
+ cwd ? loadProjectAgentDefinitions(cwd) : Promise.resolve([]),
41
+ ]);
42
+ const definitions = buildAgentDefinitions({ builtin, project, config });
43
+ return jsonResult({
44
+ default_agent: config.defaults.agent,
45
+ default_provider: config.defaults.provider,
46
+ default_model: config.defaults.model,
47
+ workspace: cwd,
48
+ agents: definitions.map((definition) => {
49
+ const capabilities = agentCapabilities(definition);
50
+ return {
51
+ name: definition.name,
52
+ description: definition.description,
53
+ mode: definition.mode,
54
+ read_only: capabilities.readOnly,
55
+ can_edit: capabilities.canEdit,
56
+ can_run_bash: capabilities.canRunBash,
57
+ model: definition.model ?? config.defaults.model,
58
+ source: definition.source,
59
+ };
60
+ }),
61
+ });
62
+ }
63
+ catch (error) {
64
+ ctx.logger.error("list_agents failed", {
65
+ request_id: rid,
66
+ error: error instanceof Error ? error.message : String(error),
67
+ });
68
+ return errorResult(error, rid);
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=list-agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-agents.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { AppContext } from "../execute.js";
3
+ export declare function registerSendMessage(server: McpServer, ctx: AppContext): void;
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import { resolveExecutionTimeout } from "../../config/config.js";
3
+ import { prepareRun } from "../../opencode/setup.js";
4
+ import { requestId } from "../../util/text.js";
5
+ import { buildTaskPrompt } from "../../workspace/context.js";
6
+ import { assertSession, executeRun } from "../execute.js";
7
+ import { errorResult, jsonResult } from "../tool-utils.js";
8
+ export function registerSendMessage(server, ctx) {
9
+ server.registerTool("send_message", {
10
+ title: "Send a follow-up message to a session",
11
+ description: "Continue an existing delegated session with another message. The agent keeps its previous context, so follow-ups can build on earlier exploration and edits.",
12
+ inputSchema: {
13
+ session_id: z
14
+ .string()
15
+ .min(1)
16
+ .max(200)
17
+ .describe("Session id returned by delegate_task/create_session."),
18
+ message: z.string().min(1).max(50_000).describe("Follow-up instruction or question."),
19
+ },
20
+ annotations: { openWorldHint: true },
21
+ }, async (args, extra) => {
22
+ const rid = requestId();
23
+ try {
24
+ const session = assertSession(ctx.registry.get(args.session_id), args.session_id);
25
+ const prepared = await prepareRun(ctx, {
26
+ cwd: session.cwd,
27
+ agent: session.agent,
28
+ model: session.model ?? undefined,
29
+ });
30
+ const text = buildTaskPrompt({
31
+ workspace: prepared.workspace,
32
+ task: args.message,
33
+ hints: [],
34
+ capabilities: prepared.capabilities,
35
+ agentName: prepared.definition.name,
36
+ compact: true,
37
+ });
38
+ const timeoutMs = resolveExecutionTimeout(prepared.config);
39
+ const result = await executeRun(ctx, {
40
+ prepared,
41
+ session,
42
+ text,
43
+ timeoutMs,
44
+ disableEdits: false,
45
+ extra,
46
+ requestId: rid,
47
+ });
48
+ return jsonResult(result, { isError: result.status !== "completed" });
49
+ }
50
+ catch (error) {
51
+ ctx.logger.error("send_message failed", {
52
+ request_id: rid,
53
+ error: error instanceof Error ? error.message : String(error),
54
+ });
55
+ return errorResult(error, rid);
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=send-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/mcp/tools/send-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAkB,MAAM,kBAAkB,CAAC;AAE3E,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,GAAe;IACpE,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EACT,8JAA8J;QAChK,WAAW,EAAE;YACX,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,CAAC,sDAAsD,CAAC;YACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;SACtF;QACD,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;KACrC,EACD,KAAK,EAAE,IAA6C,EAAE,KAAgB,EAAE,EAAE;QACxE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE;gBACrC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;aAClC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,eAAe,CAAC;gBAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,IAAI,EAAE,IAAI,CAAC,OAAO;gBAClB,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI;gBACnC,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE;gBACnC,QAAQ;gBACR,OAAO;gBACP,IAAI;gBACJ,SAAS;gBACT,YAAY,EAAE,KAAK;gBACnB,KAAK;gBACL,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;gBACtC,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { ResolvedConfig } from "../config/config.js";
2
+ import { type AgentProfile, type ProfileCapabilities } from "../security/policy.js";
3
+ import type { AgentDefinition, PermissionConfig } from "../types/index.js";
4
+ export declare const BUILTIN_AGENT_NAMES: readonly ["deepseek-researcher", "deepseek-reviewer", "deepseek-coder", "deepseek-tester"];
5
+ export type BuiltinAgentName = (typeof BUILTIN_AGENT_NAMES)[number];
6
+ export declare function packageRoot(): string;
7
+ export declare function builtinAgentsDir(): string;
8
+ interface AgentFrontmatter {
9
+ description?: string;
10
+ mode?: string;
11
+ model?: string;
12
+ temperature?: number;
13
+ profile?: string;
14
+ [key: string]: unknown;
15
+ }
16
+ export interface ParsedAgentFile {
17
+ frontmatter: AgentFrontmatter;
18
+ body: string;
19
+ file: string;
20
+ }
21
+ export declare function parseAgentMarkdown(contents: string, file: string): ParsedAgentFile;
22
+ export declare function loadBuiltinAgentDefinitions(): Promise<AgentDefinition[]>;
23
+ export declare function loadProjectAgentDefinitions(cwd: string): Promise<AgentDefinition[]>;
24
+ export interface BuildDefinitionsInput {
25
+ builtin: AgentDefinition[];
26
+ project: AgentDefinition[];
27
+ config: ResolvedConfig;
28
+ }
29
+ export declare function buildAgentDefinitions(input: BuildDefinitionsInput): AgentDefinition[];
30
+ export declare function agentProfile(definition: AgentDefinition): AgentProfile;
31
+ export declare function agentCapabilities(definition: AgentDefinition): ProfileCapabilities;
32
+ export declare function agentPermissions(definition: AgentDefinition, config: ResolvedConfig): PermissionConfig;
33
+ export interface OpenCodeAgentEntry {
34
+ description: string;
35
+ mode: "primary" | "subagent" | "all";
36
+ prompt: string;
37
+ permission: PermissionConfig;
38
+ model?: string;
39
+ temperature?: number;
40
+ }
41
+ export declare function toOpenCodeAgentConfig(definitions: AgentDefinition[], config: ResolvedConfig): Record<string, OpenCodeAgentEntry>;
42
+ export declare function normalizeModel(model: string, config: ResolvedConfig): string;
43
+ export declare function findAgentDefinition(definitions: AgentDefinition[], name: string): AgentDefinition | null;
44
+ export declare function isBuiltinAgent(name: string): name is BuiltinAgentName;
45
+ export declare function fallbackProfileForUnknownAgent(name: string): AgentProfile | null;
46
+ export {};