mcp-server-opencode 1.1.5 → 1.3.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 (94) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +34 -5
  3. package/build/src/index.js +32 -15
  4. package/build/src/index.js.map +1 -1
  5. package/build/src/modules/shared/execution-report.d.ts +66 -0
  6. package/build/src/modules/shared/execution-report.d.ts.map +1 -0
  7. package/build/src/modules/shared/execution-report.js +407 -0
  8. package/build/src/modules/shared/execution-report.js.map +1 -0
  9. package/build/src/modules/shared/execution-usage.d.ts +50 -0
  10. package/build/src/modules/shared/execution-usage.d.ts.map +1 -0
  11. package/build/src/modules/shared/execution-usage.js +89 -0
  12. package/build/src/modules/shared/execution-usage.js.map +1 -0
  13. package/build/src/modules/shared/git-workspace.d.ts +34 -0
  14. package/build/src/modules/shared/git-workspace.d.ts.map +1 -0
  15. package/build/src/modules/shared/git-workspace.js +193 -0
  16. package/build/src/modules/shared/git-workspace.js.map +1 -0
  17. package/build/src/modules/shared/instructions.d.ts +8 -1
  18. package/build/src/modules/shared/instructions.d.ts.map +1 -1
  19. package/build/src/modules/shared/instructions.js +32 -27
  20. package/build/src/modules/shared/instructions.js.map +1 -1
  21. package/build/src/modules/shared/message-id.d.ts +3 -0
  22. package/build/src/modules/shared/message-id.d.ts.map +1 -0
  23. package/build/src/modules/shared/message-id.js +6 -0
  24. package/build/src/modules/shared/message-id.js.map +1 -0
  25. package/build/src/modules/shared/opencode-client.d.ts +42 -4
  26. package/build/src/modules/shared/opencode-client.d.ts.map +1 -1
  27. package/build/src/modules/shared/opencode-client.js +214 -38
  28. package/build/src/modules/shared/opencode-client.js.map +1 -1
  29. package/build/src/modules/shared/permission-scopes.d.ts +6 -0
  30. package/build/src/modules/shared/permission-scopes.d.ts.map +1 -0
  31. package/build/src/modules/shared/permission-scopes.js +60 -0
  32. package/build/src/modules/shared/permission-scopes.js.map +1 -0
  33. package/build/src/modules/shared/permissions.d.ts +110 -0
  34. package/build/src/modules/shared/permissions.d.ts.map +1 -0
  35. package/build/src/modules/shared/permissions.js +214 -0
  36. package/build/src/modules/shared/permissions.js.map +1 -0
  37. package/build/src/modules/shared/prompt-dispatch.d.ts +13 -0
  38. package/build/src/modules/shared/prompt-dispatch.d.ts.map +1 -0
  39. package/build/src/modules/shared/prompt-dispatch.js +34 -0
  40. package/build/src/modules/shared/prompt-dispatch.js.map +1 -0
  41. package/build/src/modules/shared/run-observer.d.ts +5 -0
  42. package/build/src/modules/shared/run-observer.d.ts.map +1 -0
  43. package/build/src/modules/shared/run-observer.js +421 -0
  44. package/build/src/modules/shared/run-observer.js.map +1 -0
  45. package/build/src/modules/shared/server-registry.d.ts +4 -0
  46. package/build/src/modules/shared/server-registry.d.ts.map +1 -1
  47. package/build/src/modules/shared/server-registry.js.map +1 -1
  48. package/build/src/modules/shared/task-registry.d.ts +75 -0
  49. package/build/src/modules/shared/task-registry.d.ts.map +1 -1
  50. package/build/src/modules/shared/task-registry.js +85 -0
  51. package/build/src/modules/shared/task-registry.js.map +1 -1
  52. package/build/src/modules/shared/usage-limits.d.ts +70 -0
  53. package/build/src/modules/shared/usage-limits.d.ts.map +1 -0
  54. package/build/src/modules/shared/usage-limits.js +296 -0
  55. package/build/src/modules/shared/usage-limits.js.map +1 -0
  56. package/build/src/modules/shared/workspace-manager.d.ts +25 -0
  57. package/build/src/modules/shared/workspace-manager.d.ts.map +1 -0
  58. package/build/src/modules/shared/workspace-manager.js +105 -0
  59. package/build/src/modules/shared/workspace-manager.js.map +1 -0
  60. package/build/src/modules/tools/cancel_task.d.ts.map +1 -1
  61. package/build/src/modules/tools/cancel_task.js +30 -1
  62. package/build/src/modules/tools/cancel_task.js.map +1 -1
  63. package/build/src/modules/tools/cleanup_workspace.d.ts +3 -0
  64. package/build/src/modules/tools/cleanup_workspace.d.ts.map +1 -0
  65. package/build/src/modules/tools/cleanup_workspace.js +82 -0
  66. package/build/src/modules/tools/cleanup_workspace.js.map +1 -0
  67. package/build/src/modules/tools/continue_task.d.ts.map +1 -1
  68. package/build/src/modules/tools/continue_task.js +116 -6
  69. package/build/src/modules/tools/continue_task.js.map +1 -1
  70. package/build/src/modules/tools/get_task_result.d.ts.map +1 -1
  71. package/build/src/modules/tools/get_task_result.js +125 -22
  72. package/build/src/modules/tools/get_task_result.js.map +1 -1
  73. package/build/src/modules/tools/get_task_status.d.ts.map +1 -1
  74. package/build/src/modules/tools/get_task_status.js +69 -6
  75. package/build/src/modules/tools/get_task_status.js.map +1 -1
  76. package/build/src/modules/tools/index.d.ts.map +1 -1
  77. package/build/src/modules/tools/index.js +2 -0
  78. package/build/src/modules/tools/index.js.map +1 -1
  79. package/build/src/modules/tools/list_agents.d.ts.map +1 -1
  80. package/build/src/modules/tools/list_agents.js +48 -7
  81. package/build/src/modules/tools/list_agents.js.map +1 -1
  82. package/build/src/modules/tools/start_server.d.ts.map +1 -1
  83. package/build/src/modules/tools/start_server.js +21 -1
  84. package/build/src/modules/tools/start_server.js.map +1 -1
  85. package/build/src/modules/tools/start_task.d.ts.map +1 -1
  86. package/build/src/modules/tools/start_task.js +218 -13
  87. package/build/src/modules/tools/start_task.js.map +1 -1
  88. package/build/src/modules/tools/stop_server.d.ts.map +1 -1
  89. package/build/src/modules/tools/stop_server.js +17 -0
  90. package/build/src/modules/tools/stop_server.js.map +1 -1
  91. package/build/src/modules/tools/wait_for_task.d.ts.map +1 -1
  92. package/build/src/modules/tools/wait_for_task.js +110 -24
  93. package/build/src/modules/tools/wait_for_task.js.map +1 -1
  94. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/tools/index.ts"],"names":[],"mappings":"AACA,QAAQ;AACR,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/tools/index.ts"],"names":[],"mappings":"AACA,QAAQ;AACR,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,gCAAgC,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list_agents.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/list_agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAgD3D"}
1
+ {"version":3,"file":"list_agents.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/list_agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyEzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QA0E3D"}
@@ -1,7 +1,10 @@
1
- import { createOpencodeClient } from "@opencode-ai/sdk";
1
+ import { realpath, stat } from "node:fs/promises";
2
+ import { resolve } from "node:path";
2
3
  import { z } from "zod";
3
4
  import { jsonError, jsonResult } from "../shared/mcp-result.js";
5
+ import { clientForServer } from "../shared/opencode-client.js";
4
6
  import { getServer } from "../shared/server-registry.js";
7
+ import { getUsageLimits, quotaByModelId, quotaTier, } from "../shared/usage-limits.js";
5
8
  // Current opencode servers report the built-in flag as `native`; the SDK types
6
9
  // still declare the older `builtIn` field, so check both.
7
10
  function isNativeAgent(agent) {
@@ -15,13 +18,25 @@ function toAgentSummary(agent) {
15
18
  ...(agent.model ? { model: `${agent.model.providerID}/${agent.model.modelID}` } : {}),
16
19
  };
17
20
  }
18
- function toProviderSummary(provider) {
21
+ function toProviderSummary(provider, quotas) {
19
22
  return {
20
23
  provider: provider.id,
21
24
  name: provider.name,
22
- models: Object.keys(provider.models),
25
+ models: Object.keys(provider.models).map((id) => toModelSummary(id, quotas.get(id))),
23
26
  };
24
27
  }
28
+ function toModelSummary(id, quota) {
29
+ if (!quota)
30
+ return { id, quota: null };
31
+ return { id, quota: { per_5h: quota.perFiveHours, tier: quotaTier(quota.perFiveHours) } };
32
+ }
33
+ // Tells the caller whether a `quota: null` means "not an OpenCode Go model" or
34
+ // "we never got the table" — the two are indistinguishable per model.
35
+ function toQuotaSnapshot(limits) {
36
+ if (!limits)
37
+ return null;
38
+ return { source: limits.source, checked: limits.fetchedAt.slice(0, 10) };
39
+ }
25
40
  function errorMessage(error) {
26
41
  if (error instanceof Error)
27
42
  return error.message;
@@ -35,17 +50,40 @@ export function registerOpencodeListAgents(server) {
35
50
  description: "List agents (native and custom) and available models/providers on an OpenCode server instance",
36
51
  inputSchema: {
37
52
  server_id: z.string().describe("Id of the server instance to query"),
53
+ directory: z
54
+ .string()
55
+ .optional()
56
+ .describe("Project directory, relative to the server directory unless absolute"),
38
57
  },
39
- }, async ({ server_id }) => {
58
+ }, async ({ server_id, directory }) => {
40
59
  const instance = getServer(server_id);
41
60
  if (!instance) {
42
61
  return jsonError({ server_id, status: "not_found" });
43
62
  }
44
63
  try {
45
- const client = createOpencodeClient({ baseUrl: instance.baseUrl });
46
- const [agentsResult, providersResult] = await Promise.all([
64
+ let projectDirectory;
65
+ try {
66
+ projectDirectory = await realpath(resolve(instance.directory ?? process.cwd(), directory ?? "."));
67
+ if (!(await stat(projectDirectory)).isDirectory()) {
68
+ return jsonError({ server_id, status: "invalid_directory", directory });
69
+ }
70
+ }
71
+ catch (error) {
72
+ const code = error.code;
73
+ if (code === "ENOENT" || code === "ENOTDIR") {
74
+ return jsonError({ server_id, status: "invalid_directory", directory });
75
+ }
76
+ throw error;
77
+ }
78
+ const client = clientForServer(server_id, projectDirectory);
79
+ if (!client)
80
+ return jsonError({ server_id, status: "not_found" });
81
+ // getUsageLimits() reads a once-a-day snapshot from disk, so this adds
82
+ // no network round-trip on a warm cache and never throws.
83
+ const [agentsResult, providersResult, limits] = await Promise.all([
47
84
  client.app.agents(),
48
85
  client.config.providers(),
86
+ getUsageLimits(),
49
87
  ]);
50
88
  const failure = agentsResult.error ?? providersResult.error;
51
89
  if (failure) {
@@ -54,15 +92,18 @@ export function registerOpencodeListAgents(server) {
54
92
  const allAgents = agentsResult.data ?? [];
55
93
  const providers = providersResult.data?.providers ?? [];
56
94
  const defaults = providersResult.data?.default ?? {};
95
+ const quotas = limits ? quotaByModelId(limits) : new Map();
57
96
  return jsonResult({
58
97
  server_id,
98
+ directory: projectDirectory,
59
99
  agents: {
60
100
  native: allAgents.filter(isNativeAgent).map(toAgentSummary),
61
101
  custom: allAgents.filter((a) => !isNativeAgent(a)).map(toAgentSummary),
62
102
  },
63
103
  models: {
64
104
  defaults,
65
- providers: providers.map(toProviderSummary),
105
+ quota_snapshot: toQuotaSnapshot(limits),
106
+ providers: providers.map((provider) => toProviderSummary(provider, quotas)),
66
107
  },
67
108
  });
68
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list_agents.js","sourceRoot":"","sources":["../../../../src/modules/tools/list_agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list_agents.js","sourceRoot":"","sources":["../../../../src/modules/tools/list_agents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"start_server.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/start_server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QAgD5D"}
1
+ {"version":3,"file":"start_server.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/start_server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QAmE5D"}
@@ -1,6 +1,9 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { realpath } from "node:fs/promises";
2
3
  import { createOpencodeServer } from "@opencode-ai/sdk";
3
4
  import { z } from "zod";
5
+ import { stopPermissionScopesForServer } from "../shared/permission-scopes.js";
6
+ import { buildServerConfig, getExternalDirectoryPolicy } from "../shared/permissions.js";
4
7
  import { registerServer } from "../shared/server-registry.js";
5
8
  const DEFAULT_PORT = 4096;
6
9
  export function registerOpencodeStartServer(server) {
@@ -11,14 +14,27 @@ export function registerOpencodeStartServer(server) {
11
14
  },
12
15
  }, async ({ port }) => {
13
16
  try {
17
+ const policy = getExternalDirectoryPolicy();
14
18
  // The server inherits this process' cwd, so its project worktree is the
15
19
  // directory the MCP host was launched in — no cwd argument needed.
16
20
  const instance = await createOpencodeServer({
17
21
  hostname: "127.0.0.1",
18
22
  port: port ?? DEFAULT_PORT,
23
+ config: buildServerConfig(policy),
19
24
  });
20
25
  const serverId = randomUUID();
21
- registerServer({ serverId, baseUrl: instance.url, close: instance.close });
26
+ const directory = await realpath(process.cwd());
27
+ registerServer({
28
+ serverId,
29
+ baseUrl: instance.url,
30
+ directory,
31
+ permissionPolicy: policy,
32
+ permissionScopesEnabled: true,
33
+ close: () => {
34
+ stopPermissionScopesForServer(serverId);
35
+ instance.close();
36
+ },
37
+ });
22
38
  return {
23
39
  content: [
24
40
  {
@@ -27,6 +43,10 @@ export function registerOpencodeStartServer(server) {
27
43
  server_id: serverId,
28
44
  baseUrl: instance.url,
29
45
  status: "running",
46
+ permissions: {
47
+ external_directory: policy,
48
+ auto_approved: true,
49
+ },
30
50
  }),
31
51
  },
32
52
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"start_server.js","sourceRoot":"","sources":["../../../../src/modules/tools/start_server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;SAClF;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,wEAAwE;YACxE,mEAAmE;YACnE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;gBAC1C,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,IAAI,IAAI,YAAY;aAC3B,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;YAC9B,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAE3E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,SAAS,EAAE,QAAQ;4BACnB,OAAO,EAAE,QAAQ,CAAC,GAAG;4BACrB,MAAM,EAAE,SAAS;yBAClB,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,OAAO;4BACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAChE,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"start_server.js","sourceRoot":"","sources":["../../../../src/modules/tools/start_server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;SAClF;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;YAE5C,wEAAwE;YACxE,mEAAmE;YACnE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC;gBAC1C,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,IAAI,IAAI,YAAY;gBAC1B,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC;aAClC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;YAE9B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAChD,cAAc,CAAC;gBACb,QAAQ;gBACR,OAAO,EAAE,QAAQ,CAAC,GAAG;gBACrB,SAAS;gBACT,gBAAgB,EAAE,MAAM;gBACxB,uBAAuB,EAAE,IAAI;gBAC7B,KAAK,EAAE,GAAG,EAAE;oBACV,6BAA6B,CAAC,QAAQ,CAAC,CAAC;oBACxC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,SAAS,EAAE,QAAQ;4BACnB,OAAO,EAAE,QAAQ,CAAC,GAAG;4BACrB,MAAM,EAAE,SAAS;4BACjB,WAAW,EAAE;gCACX,kBAAkB,EAAE,MAAM;gCAC1B,aAAa,EAAE,IAAI;6BACpB;yBACF,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,MAAM,EAAE,OAAO;4BACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAChE,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"start_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QAqG1D"}
1
+ {"version":3,"file":"start_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA0S1D"}
@@ -1,8 +1,27 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { realpath, stat } from "node:fs/promises";
3
+ import { resolve } from "node:path";
2
4
  import { z } from "zod";
5
+ import { captureWorkspace, releaseWorkspace, reserveWorkspace, validateRelativeCwd, validateRelativePath, } from "../shared/execution-report.js";
3
6
  import { jsonError, jsonResult } from "../shared/mcp-result.js";
4
- import { clientForServer } from "../shared/opencode-client.js";
5
- import { registerTask } from "../shared/task-registry.js";
7
+ import { createMessageId } from "../shared/message-id.js";
8
+ import { clientForServer, sdkResponseError } from "../shared/opencode-client.js";
9
+ import { registerPermissionSession, unregisterPermissionSession, } from "../shared/permission-scopes.js";
10
+ import { sendPromptAndClassify } from "../shared/prompt-dispatch.js";
11
+ import { observeRun } from "../shared/run-observer.js";
12
+ import { getServer } from "../shared/server-registry.js";
13
+ import { registerTask, removeTask } from "../shared/task-registry.js";
14
+ import { acquireManagedWorkspaceDispatch, associateManagedWorkspaceTask, createManagedWorkspace, registerManagedWorkspaceSession, sharedWorkspaceMetadata, } from "../shared/workspace-manager.js";
15
+ const expectedChangeSchema = z.object({
16
+ path: z.string().refine(validateRelativePath),
17
+ change: z.enum(["created", "modified", "deleted"]),
18
+ });
19
+ const checkSchema = z.object({
20
+ executable: z.string().min(1),
21
+ argv: z.array(z.string()),
22
+ cwd: z.string().refine(validateRelativeCwd).optional(),
23
+ timeout_ms: z.number().int().positive().max(300_000).optional(),
24
+ });
6
25
  /** Parse a "providerID/modelID" string into the shape the SDK expects. */
7
26
  function parseModel(model) {
8
27
  const slash = model.indexOf("/");
@@ -15,6 +34,18 @@ export function registerOpencodeStartTask(server) {
15
34
  description: "Delegate a task to an OpenCode agent: create a session and start the prompt without waiting for it to finish",
16
35
  inputSchema: {
17
36
  server_id: z.string().describe("Id of the server instance to run the task on"),
37
+ directory: z
38
+ .string()
39
+ .optional()
40
+ .describe("Project directory, relative to the server directory unless absolute"),
41
+ workspace_mode: z
42
+ .enum(["shared", "worktree"])
43
+ .default("shared")
44
+ .describe("Use the selected directory directly or create an isolated managed Git worktree"),
45
+ base_ref: z
46
+ .string()
47
+ .optional()
48
+ .describe("Committed Git base for workspace_mode=worktree (default HEAD)"),
18
49
  prompt: z.string().describe("Prompt/instructions for the agent"),
19
50
  agent: z
20
51
  .string()
@@ -24,10 +55,12 @@ export function registerOpencodeStartTask(server) {
24
55
  .string()
25
56
  .optional()
26
57
  .describe("Model override as 'providerID/modelID', copied verbatim from opencode_list_agents output — never guess or construct the id from a model's display name. Overrides the agent's pre-assigned model for this task only. An unknown model is rejected with status 'unknown_model' and the list of available models"),
58
+ expected_changes: z.array(expectedChangeSchema).optional(),
59
+ checks: z.array(checkSchema).optional(),
27
60
  },
28
- }, async ({ server_id, prompt, agent, model }) => {
29
- const client = clientForServer(server_id);
30
- if (!client) {
61
+ }, async ({ server_id, prompt, agent, model, expected_changes, checks, directory, workspace_mode, base_ref, }) => {
62
+ const server = getServer(server_id);
63
+ if (!server) {
31
64
  return jsonError({ server_id, status: "server_not_found" });
32
65
  }
33
66
  let parsedModel;
@@ -41,7 +74,53 @@ export function registerOpencodeStartTask(server) {
41
74
  });
42
75
  }
43
76
  }
77
+ let provisionalLease;
78
+ let workspaceMetadata;
79
+ let releaseManagedDispatch;
44
80
  try {
81
+ let sourceDirectory;
82
+ try {
83
+ sourceDirectory = await realpath(resolve(server.directory ?? process.cwd(), directory ?? "."));
84
+ if (!(await stat(sourceDirectory)).isDirectory()) {
85
+ return jsonError({ server_id, status: "invalid_directory", directory });
86
+ }
87
+ }
88
+ catch (error) {
89
+ const code = error.code;
90
+ if (code === "ENOENT" || code === "ENOTDIR") {
91
+ return jsonError({ server_id, status: "invalid_directory", directory });
92
+ }
93
+ throw error;
94
+ }
95
+ if (base_ref !== undefined && workspace_mode !== "worktree") {
96
+ return jsonError({ server_id, status: "base_ref_requires_worktree" });
97
+ }
98
+ workspaceMetadata =
99
+ workspace_mode === "worktree"
100
+ ? await createManagedWorkspace(server_id, sourceDirectory, base_ref)
101
+ : sharedWorkspaceMetadata(sourceDirectory);
102
+ const workspace = workspaceMetadata.execution_directory;
103
+ const workspaceId = workspaceMetadata.workspace_id;
104
+ if (workspaceId) {
105
+ releaseManagedDispatch = acquireManagedWorkspaceDispatch(workspaceId);
106
+ if (!releaseManagedDispatch) {
107
+ return jsonError({
108
+ server_id,
109
+ status: "workspace_unavailable",
110
+ workspace_id: workspaceId,
111
+ workspace: workspaceMetadata,
112
+ });
113
+ }
114
+ }
115
+ const client = clientForServer(server_id, workspace);
116
+ if (!client)
117
+ return jsonError({
118
+ server_id,
119
+ status: "server_not_found",
120
+ ...(workspaceMetadata.managed
121
+ ? { workspace: workspaceMetadata, workspace_id: workspaceId }
122
+ : {}),
123
+ });
45
124
  if (parsedModel) {
46
125
  const requested = parsedModel;
47
126
  // Validate against the server's real provider/model catalog: promptAsync is
@@ -56,6 +135,9 @@ export function registerOpencodeStartTask(server) {
56
135
  server_id,
57
136
  status: "unknown_model",
58
137
  model,
138
+ ...(workspaceMetadata.managed
139
+ ? { workspace: workspaceMetadata, workspace_id: workspaceId }
140
+ : {}),
59
141
  message: "model is not available on this server; copy an exact 'providerID/modelID' from opencode_list_agents (or from available_models below) instead of guessing",
60
142
  available_models: providers.flatMap((p) => Object.keys(p.models).map((m) => `${p.id}/${m}`)),
61
143
  });
@@ -63,36 +145,159 @@ export function registerOpencodeStartTask(server) {
63
145
  }
64
146
  }
65
147
  const created = await client.session.create({ body: { title: prompt.slice(0, 60) } });
148
+ if (sdkResponseError(created))
149
+ throw sdkResponseError(created);
66
150
  const sessionId = created.data?.id;
67
151
  if (!sessionId) {
68
- return jsonError({ server_id, status: "error", message: "failed to create session" });
152
+ return jsonError({
153
+ server_id,
154
+ status: "error",
155
+ message: "failed to create session",
156
+ ...(workspaceMetadata?.managed
157
+ ? { workspace: workspaceMetadata, workspace_id: workspaceMetadata.workspace_id }
158
+ : {}),
159
+ });
160
+ }
161
+ if (workspaceId) {
162
+ if (!registerManagedWorkspaceSession(workspaceId, sessionId)) {
163
+ return jsonError({
164
+ server_id,
165
+ status: "workspace_unavailable",
166
+ workspace_id: workspaceId,
167
+ workspace: workspaceMetadata,
168
+ });
169
+ }
69
170
  }
70
- // Fire-and-forget: promptAsync returns as soon as the prompt is accepted,
71
- // the agent keeps working in the background. Poll with get_task_status.
72
- await client.session.promptAsync({
171
+ else {
172
+ registerPermissionSession(server_id, sourceDirectory, sessionId, server.permissionPolicy);
173
+ }
174
+ const verified = Boolean(expected_changes?.length || checks?.length);
175
+ const lease = await reserveWorkspace(workspace, verified);
176
+ if (!lease) {
177
+ unregisterPermissionSession(server_id, workspace, sessionId);
178
+ return jsonError({
179
+ server_id,
180
+ status: "workspace_busy",
181
+ workspace: workspaceMetadata,
182
+ workspace_id: workspaceId,
183
+ });
184
+ }
185
+ provisionalLease = lease;
186
+ let baseline;
187
+ let baselineError;
188
+ try {
189
+ baseline = await captureWorkspace(workspace, expected_changes?.map((item) => item.path));
190
+ }
191
+ catch (error) {
192
+ baselineError = error instanceof Error ? error.message : String(error);
193
+ }
194
+ const taskId = randomUUID();
195
+ const runId = randomUUID();
196
+ const messageId = createMessageId();
197
+ const startedAt = Date.now();
198
+ const run = {
199
+ run_id: runId,
200
+ message_id: messageId,
201
+ startedAt,
202
+ expectedChanges: expected_changes,
203
+ checks: checks,
204
+ baseline,
205
+ baselineError,
206
+ workspaceLease: lease,
207
+ controller: new AbortController(),
208
+ dispatchState: "dispatching",
209
+ };
210
+ registerTask({
211
+ taskId,
212
+ serverId: server_id,
213
+ sessionId,
214
+ directory: workspace,
215
+ workspace: workspaceMetadata,
216
+ workspaceId,
217
+ createdAt: startedAt,
218
+ currentRunId: runId,
219
+ runs: [run],
220
+ });
221
+ provisionalLease = undefined;
222
+ if (workspaceId)
223
+ associateManagedWorkspaceTask(workspaceId, taskId);
224
+ const outcome = await sendPromptAndClassify(() => client.session.promptAsync({
73
225
  path: { id: sessionId },
74
226
  body: {
227
+ messageID: messageId,
75
228
  parts: [{ type: "text", text: prompt }],
76
229
  ...(agent ? { agent } : {}),
77
230
  ...(parsedModel ? { model: parsedModel } : {}),
78
231
  },
79
- });
80
- const taskId = randomUUID();
81
- registerTask({ taskId, serverId: server_id, sessionId, createdAt: Date.now() });
232
+ }));
233
+ if (outcome.state === "rejected") {
234
+ if (workspaceId) {
235
+ run.dispatchState = "rejected";
236
+ run.executionState = "failed";
237
+ run.reportReady = true;
238
+ run.result = {
239
+ task_id: taskId,
240
+ run_id: runId,
241
+ status: "failed",
242
+ result: null,
243
+ error: outcome.error,
244
+ };
245
+ releaseWorkspace(lease);
246
+ run.workspaceLease = undefined;
247
+ }
248
+ else {
249
+ removeTask(taskId);
250
+ }
251
+ unregisterPermissionSession(server_id, workspace, sessionId);
252
+ return jsonError({
253
+ server_id,
254
+ task_id: workspaceId ? taskId : undefined,
255
+ run_id: workspaceId ? runId : undefined,
256
+ status: "prompt_rejected",
257
+ http_status: outcome.status,
258
+ message: outcome.error,
259
+ workspace: workspaceMetadata,
260
+ workspace_id: workspaceMetadata.workspace_id,
261
+ });
262
+ }
263
+ run.dispatchState = outcome.state;
264
+ if (outcome.state === "uncertain")
265
+ run.dispatchError = outcome.error;
266
+ observeRun(taskId, runId);
82
267
  return jsonResult({
83
268
  task_id: taskId,
269
+ run_id: runId,
84
270
  server_id,
85
271
  session_id: sessionId,
86
- status: "pending",
272
+ workspace: workspaceMetadata,
273
+ ...(workspaceId ? { workspace_id: workspaceId } : {}),
274
+ status: outcome.state === "accepted" ? "pending" : "dispatch_uncertain",
275
+ ...(outcome.state === "uncertain"
276
+ ? {
277
+ dispatch: {
278
+ state: outcome.state,
279
+ error: outcome.error,
280
+ http_status: outcome.status,
281
+ },
282
+ }
283
+ : {}),
87
284
  });
88
285
  }
89
286
  catch (error) {
287
+ if (provisionalLease)
288
+ releaseWorkspace(provisionalLease);
90
289
  return jsonError({
91
290
  server_id,
92
291
  status: "error",
93
292
  message: error instanceof Error ? error.message : String(error),
293
+ ...(workspaceMetadata?.managed
294
+ ? { workspace: workspaceMetadata, workspace_id: workspaceMetadata.workspace_id }
295
+ : {}),
94
296
  });
95
297
  }
298
+ finally {
299
+ releaseManagedDispatch?.();
300
+ }
96
301
  });
97
302
  }
98
303
  //# sourceMappingURL=start_task.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start_task.js","sourceRoot":"","sources":["../../../../src/modules/tools/start_task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,gBAAgB,EAEhB,gBAAgB,EAChB,gBAAgB,EAEhB,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAsB,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EACL,+BAA+B,EAC/B,6BAA6B,EAC7B,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAExC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;CACnD,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE;IACtD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;CAChE,CAAC,CAAC;AAEH,0EAA0E;AAC1E,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EACT,8GAA8G;QAChH,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC9E,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,qEAAqE,CAAC;YAClF,cAAc,EAAE,CAAC;iBACd,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;iBAC5B,OAAO,CAAC,QAAQ,CAAC;iBACjB,QAAQ,CACP,gFAAgF,CACjF;YACH,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAChE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,+IAA+I,CAChJ;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,gTAAgT,CACjT;YACH,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE;YAC1D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;SACxC;KACF,EACD,KAAK,EAAE,EACL,SAAS,EACT,MAAM,EACN,KAAK,EACL,KAAK,EACL,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,cAAc,EACd,QAAQ,GACT,EAAE,EAAE;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,WAAgE,CAAC;QACrE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,SAAS,CAAC;oBACf,SAAS;oBACT,MAAM,EAAE,eAAe;oBACvB,OAAO,EAAE,8CAA8C;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,gBAAoC,CAAC;QACzC,IAAI,iBAAyE,CAAC;QAC9E,IAAI,sBAAgD,CAAC;QACrD,IAAI,CAAC;YACH,IAAI,eAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,eAAe,GAAG,MAAM,QAAQ,CAC9B,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,IAAI,GAAG,CAAC,CAC7D,CAAC;gBACF,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBACjD,OAAO,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;gBACnD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5C,OAAO,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;gBAC5D,OAAO,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,iBAAiB;gBACf,cAAc,KAAK,UAAU;oBAC3B,CAAC,CAAC,MAAM,sBAAsB,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAC;oBACpE,CAAC,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,iBAAiB,CAAC,mBAAmB,CAAC;YACxD,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,CAAC;YACnD,IAAI,WAAW,EAAE,CAAC;gBAChB,sBAAsB,GAAG,+BAA+B,CAAC,WAAW,CAAC,CAAC;gBACtE,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAC5B,OAAO,SAAS,CAAC;wBACf,SAAS;wBACT,MAAM,EAAE,uBAAuB;wBAC/B,YAAY,EAAE,WAAW;wBACzB,SAAS,EAAE,iBAAiB;qBAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM;gBACT,OAAO,SAAS,CAAC;oBACf,SAAS;oBACT,MAAM,EAAE,kBAAkB;oBAC1B,GAAG,CAAC,iBAAiB,CAAC,OAAO;wBAC3B,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE;wBAC7D,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,WAAW,CAAC;gBAC9B,4EAA4E;gBAC5E,6EAA6E;gBAC7E,gFAAgF;gBAChF,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC;gBAC/C,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC;oBACtE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBACzD,OAAO,SAAS,CAAC;4BACf,SAAS;4BACT,MAAM,EAAE,eAAe;4BACvB,KAAK;4BACL,GAAG,CAAC,iBAAiB,CAAC,OAAO;gCAC3B,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE;gCAC7D,CAAC,CAAC,EAAE,CAAC;4BACP,OAAO,EACL,0JAA0J;4BAC5J,gBAAgB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CACjD;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,gBAAgB,CAAC,OAAO,CAAC;gBAAE,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC;oBACf,SAAS;oBACT,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,0BAA0B;oBACnC,GAAG,CAAC,iBAAiB,EAAE,OAAO;wBAC5B,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,EAAE;wBAChF,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,+BAA+B,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;oBAC7D,OAAO,SAAS,CAAC;wBACf,SAAS;wBACT,MAAM,EAAE,uBAAuB;wBAC/B,YAAY,EAAE,WAAW;wBACzB,SAAS,EAAE,iBAAiB;qBAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,yBAAyB,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,CAAC,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,2BAA2B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC7D,OAAO,SAAS,CAAC;oBACf,SAAS;oBACT,MAAM,EAAE,gBAAgB;oBACxB,SAAS,EAAE,iBAAiB;oBAC5B,YAAY,EAAE,WAAW;iBAC1B,CAAC,CAAC;YACL,CAAC;YACD,gBAAgB,GAAG,KAAK,CAAC;YACzB,IAAI,QAAuC,CAAC;YAC5C,IAAI,aAAiC,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,gBAAgB,CAC/B,SAAS,EACT,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3C,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAkB;gBACzB,MAAM,EAAE,KAAK;gBACb,UAAU,EAAE,SAAS;gBACrB,SAAS;gBACT,eAAe,EAAE,gBAAgD;gBACjE,MAAM,EAAE,MAAyC;gBACjD,QAAQ;gBACR,aAAa;gBACb,cAAc,EAAE,KAAK;gBACrB,UAAU,EAAE,IAAI,eAAe,EAAE;gBACjC,aAAa,EAAE,aAAsB;aACtC,CAAC;YACF,YAAY,CAAC;gBACX,MAAM;gBACN,QAAQ,EAAE,SAAS;gBACnB,SAAS;gBACT,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,iBAAiB;gBAC5B,WAAW;gBACX,SAAS,EAAE,SAAS;gBACpB,YAAY,EAAE,KAAK;gBACnB,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC,CAAC;YACH,gBAAgB,GAAG,SAAS,CAAC;YAC7B,IAAI,WAAW;gBAAE,6BAA6B,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAEpE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,CAC/C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBACzB,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;gBACvB,IAAI,EAAE;oBACJ,SAAS,EAAE,SAAS;oBACpB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBACvC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/C;aACF,CAAC,CACH,CAAC;YACF,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACjC,IAAI,WAAW,EAAE,CAAC;oBAChB,GAAG,CAAC,aAAa,GAAG,UAAU,CAAC;oBAC/B,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC;oBAC9B,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;oBACvB,GAAG,CAAC,MAAM,GAAG;wBACX,OAAO,EAAE,MAAM;wBACf,MAAM,EAAE,KAAK;wBACb,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,IAAI;wBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;qBACrB,CAAC;oBACF,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACxB,GAAG,CAAC,cAAc,GAAG,SAAS,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;gBACD,2BAA2B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC7D,OAAO,SAAS,CAAC;oBACf,SAAS;oBACT,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;oBACzC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;oBACvC,MAAM,EAAE,iBAAiB;oBACzB,WAAW,EAAE,OAAO,CAAC,MAAM;oBAC3B,OAAO,EAAE,OAAO,CAAC,KAAK;oBACtB,SAAS,EAAE,iBAAiB;oBAC5B,YAAY,EAAE,iBAAiB,CAAC,YAAY;iBAC7C,CAAC,CAAC;YACL,CAAC;YACD,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;YAClC,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW;gBAAE,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;YACrE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAE1B,OAAO,UAAU,CAAC;gBAChB,OAAO,EAAE,MAAM;gBACf,MAAM,EAAE,KAAK;gBACb,SAAS;gBACT,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,iBAAiB;gBAC5B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB;gBACvE,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,WAAW;oBAC/B,CAAC,CAAC;wBACE,QAAQ,EAAE;4BACR,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,KAAK,EAAE,OAAO,CAAC,KAAK;4BACpB,WAAW,EAAE,OAAO,CAAC,MAAM;yBAC5B;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,gBAAgB;gBAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;YACzD,OAAO,SAAS,CAAC;gBACf,SAAS;gBACT,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/D,GAAG,CAAC,iBAAiB,EAAE,OAAO;oBAC5B,CAAC,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,EAAE;oBAChF,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,sBAAsB,EAAE,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stop_server.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/stop_server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAoC3D"}
1
+ {"version":3,"file":"stop_server.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/stop_server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,QAqD3D"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { stopServerObservers } from "../shared/run-observer.js";
2
3
  import { getServer, removeServer } from "../shared/server-registry.js";
3
4
  export function registerOpencodeStopServer(server) {
4
5
  server.registerTool("opencode_stop_server", {
@@ -19,6 +20,22 @@ export function registerOpencodeStopServer(server) {
19
20
  ],
20
21
  };
21
22
  }
23
+ const checksDrained = await stopServerObservers(server_id);
24
+ if (!checksDrained) {
25
+ return {
26
+ isError: true,
27
+ content: [
28
+ {
29
+ type: "text",
30
+ text: JSON.stringify({
31
+ server_id,
32
+ status: "cleanup_pending",
33
+ message: "Check process termination could not be confirmed; server and workspace lease remain active. Retry opencode_stop_server after cleanup settles.",
34
+ }),
35
+ },
36
+ ],
37
+ };
38
+ }
22
39
  instance.close();
23
40
  removeServer(server_id);
24
41
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"stop_server.js","sourceRoot":"","sources":["../../../../src/modules/tools/stop_server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEvE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SACpE;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;qBACzD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;iBACvD;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"stop_server.js","sourceRoot":"","sources":["../../../../src/modules/tools/stop_server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEvE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SACpE;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;qBACzD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,SAAS;4BACT,MAAM,EAAE,iBAAiB;4BACzB,OAAO,EACL,+IAA+I;yBAClJ,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;iBACvD;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wait_for_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/wait_for_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwDzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QAuG5D"}
1
+ {"version":3,"file":"wait_for_task.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/wait_for_task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6FzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,QAuL5D"}