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.
- package/CHANGELOG.md +127 -0
- package/README.md +34 -5
- package/build/src/index.js +32 -15
- package/build/src/index.js.map +1 -1
- package/build/src/modules/shared/execution-report.d.ts +66 -0
- package/build/src/modules/shared/execution-report.d.ts.map +1 -0
- package/build/src/modules/shared/execution-report.js +407 -0
- package/build/src/modules/shared/execution-report.js.map +1 -0
- package/build/src/modules/shared/execution-usage.d.ts +50 -0
- package/build/src/modules/shared/execution-usage.d.ts.map +1 -0
- package/build/src/modules/shared/execution-usage.js +89 -0
- package/build/src/modules/shared/execution-usage.js.map +1 -0
- package/build/src/modules/shared/git-workspace.d.ts +34 -0
- package/build/src/modules/shared/git-workspace.d.ts.map +1 -0
- package/build/src/modules/shared/git-workspace.js +193 -0
- package/build/src/modules/shared/git-workspace.js.map +1 -0
- package/build/src/modules/shared/instructions.d.ts +8 -1
- package/build/src/modules/shared/instructions.d.ts.map +1 -1
- package/build/src/modules/shared/instructions.js +32 -27
- package/build/src/modules/shared/instructions.js.map +1 -1
- package/build/src/modules/shared/message-id.d.ts +3 -0
- package/build/src/modules/shared/message-id.d.ts.map +1 -0
- package/build/src/modules/shared/message-id.js +6 -0
- package/build/src/modules/shared/message-id.js.map +1 -0
- package/build/src/modules/shared/opencode-client.d.ts +42 -4
- package/build/src/modules/shared/opencode-client.d.ts.map +1 -1
- package/build/src/modules/shared/opencode-client.js +214 -38
- package/build/src/modules/shared/opencode-client.js.map +1 -1
- package/build/src/modules/shared/permission-scopes.d.ts +6 -0
- package/build/src/modules/shared/permission-scopes.d.ts.map +1 -0
- package/build/src/modules/shared/permission-scopes.js +60 -0
- package/build/src/modules/shared/permission-scopes.js.map +1 -0
- package/build/src/modules/shared/permissions.d.ts +110 -0
- package/build/src/modules/shared/permissions.d.ts.map +1 -0
- package/build/src/modules/shared/permissions.js +214 -0
- package/build/src/modules/shared/permissions.js.map +1 -0
- package/build/src/modules/shared/prompt-dispatch.d.ts +13 -0
- package/build/src/modules/shared/prompt-dispatch.d.ts.map +1 -0
- package/build/src/modules/shared/prompt-dispatch.js +34 -0
- package/build/src/modules/shared/prompt-dispatch.js.map +1 -0
- package/build/src/modules/shared/run-observer.d.ts +5 -0
- package/build/src/modules/shared/run-observer.d.ts.map +1 -0
- package/build/src/modules/shared/run-observer.js +421 -0
- package/build/src/modules/shared/run-observer.js.map +1 -0
- package/build/src/modules/shared/server-registry.d.ts +4 -0
- package/build/src/modules/shared/server-registry.d.ts.map +1 -1
- package/build/src/modules/shared/server-registry.js.map +1 -1
- package/build/src/modules/shared/task-registry.d.ts +75 -0
- package/build/src/modules/shared/task-registry.d.ts.map +1 -1
- package/build/src/modules/shared/task-registry.js +85 -0
- package/build/src/modules/shared/task-registry.js.map +1 -1
- package/build/src/modules/shared/usage-limits.d.ts +70 -0
- package/build/src/modules/shared/usage-limits.d.ts.map +1 -0
- package/build/src/modules/shared/usage-limits.js +296 -0
- package/build/src/modules/shared/usage-limits.js.map +1 -0
- package/build/src/modules/shared/workspace-manager.d.ts +25 -0
- package/build/src/modules/shared/workspace-manager.d.ts.map +1 -0
- package/build/src/modules/shared/workspace-manager.js +105 -0
- package/build/src/modules/shared/workspace-manager.js.map +1 -0
- package/build/src/modules/tools/cancel_task.d.ts.map +1 -1
- package/build/src/modules/tools/cancel_task.js +30 -1
- package/build/src/modules/tools/cancel_task.js.map +1 -1
- package/build/src/modules/tools/cleanup_workspace.d.ts +3 -0
- package/build/src/modules/tools/cleanup_workspace.d.ts.map +1 -0
- package/build/src/modules/tools/cleanup_workspace.js +82 -0
- package/build/src/modules/tools/cleanup_workspace.js.map +1 -0
- package/build/src/modules/tools/continue_task.d.ts.map +1 -1
- package/build/src/modules/tools/continue_task.js +116 -6
- package/build/src/modules/tools/continue_task.js.map +1 -1
- package/build/src/modules/tools/get_task_result.d.ts.map +1 -1
- package/build/src/modules/tools/get_task_result.js +125 -22
- package/build/src/modules/tools/get_task_result.js.map +1 -1
- package/build/src/modules/tools/get_task_status.d.ts.map +1 -1
- package/build/src/modules/tools/get_task_status.js +69 -6
- package/build/src/modules/tools/get_task_status.js.map +1 -1
- package/build/src/modules/tools/index.d.ts.map +1 -1
- package/build/src/modules/tools/index.js +2 -0
- package/build/src/modules/tools/index.js.map +1 -1
- package/build/src/modules/tools/list_agents.d.ts.map +1 -1
- package/build/src/modules/tools/list_agents.js +48 -7
- package/build/src/modules/tools/list_agents.js.map +1 -1
- package/build/src/modules/tools/start_server.d.ts.map +1 -1
- package/build/src/modules/tools/start_server.js +21 -1
- package/build/src/modules/tools/start_server.js.map +1 -1
- package/build/src/modules/tools/start_task.d.ts.map +1 -1
- package/build/src/modules/tools/start_task.js +218 -13
- package/build/src/modules/tools/start_task.js.map +1 -1
- package/build/src/modules/tools/stop_server.d.ts.map +1 -1
- package/build/src/modules/tools/stop_server.js +17 -0
- package/build/src/modules/tools/stop_server.js.map +1 -1
- package/build/src/modules/tools/wait_for_task.d.ts.map +1 -1
- package/build/src/modules/tools/wait_for_task.js +110 -24
- package/build/src/modules/tools/wait_for_task.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/** Event types that carry a pending permission request. */
|
|
2
|
+
const PERMISSION_EVENTS = new Set(["permission.asked", "permission.updated"]);
|
|
3
|
+
/** The permission kind, reading whichever field this server version emits. */
|
|
4
|
+
export function permissionKind(ask) {
|
|
5
|
+
return ask.permission ?? ask.type;
|
|
6
|
+
}
|
|
7
|
+
/** The originating tool call id, reading whichever field this server emits. */
|
|
8
|
+
export function permissionCallID(ask) {
|
|
9
|
+
return ask.tool?.callID ?? ask.callID;
|
|
10
|
+
}
|
|
11
|
+
export const DEFAULT_EXTERNAL_DIRECTORY_POLICY = "read-only";
|
|
12
|
+
/** The permission type OpenCode raises for any path outside the server cwd. */
|
|
13
|
+
export const EXTERNAL_DIRECTORY = "external_directory";
|
|
14
|
+
/**
|
|
15
|
+
* Tools that only observe. OpenCode raises a single `external_directory`
|
|
16
|
+
* permission for reads and writes alike, so the operation has to be recovered
|
|
17
|
+
* from the tool that triggered it. Names verified against the live catalog
|
|
18
|
+
* (`client.tool.ids()` on opencode 1.18.18) — there is no `list` tool.
|
|
19
|
+
*/
|
|
20
|
+
const READ_ONLY_TOOLS = new Set(["read", "grep", "glob", "webfetch", "websearch"]);
|
|
21
|
+
/** Delay before re-subscribing after the event stream drops. */
|
|
22
|
+
const RECONNECT_DELAY_MS = 1_000;
|
|
23
|
+
/** Attempts to correlate a permission to its tool call before giving up. */
|
|
24
|
+
const CORRELATION_ATTEMPTS = 3;
|
|
25
|
+
/** Delay between correlation attempts, covering the event/message write race. */
|
|
26
|
+
const CORRELATION_DELAY_MS = 100;
|
|
27
|
+
const POLICIES = new Set([
|
|
28
|
+
"read-only",
|
|
29
|
+
"allow",
|
|
30
|
+
"deny",
|
|
31
|
+
]);
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the external-directory policy.
|
|
34
|
+
*
|
|
35
|
+
* Precedence: the `OPENCODE_MCP_EXTERNAL_DIR` environment variable wins over an
|
|
36
|
+
* `OPENCODE_MCP_EXTERNAL_DIR=<policy>` CLI arg, which wins over `read-only`.
|
|
37
|
+
* Unrecognised values fall back to the default.
|
|
38
|
+
*
|
|
39
|
+
* Reads `process.env` / `process.argv` lazily on each call so tests can vary
|
|
40
|
+
* them between invocations without module re-import tricks.
|
|
41
|
+
*/
|
|
42
|
+
export function getExternalDirectoryPolicy() {
|
|
43
|
+
const fromEnv = parsePolicy(process.env.OPENCODE_MCP_EXTERNAL_DIR);
|
|
44
|
+
if (fromEnv !== undefined)
|
|
45
|
+
return fromEnv;
|
|
46
|
+
const argPrefix = "OPENCODE_MCP_EXTERNAL_DIR=";
|
|
47
|
+
const argEntry = process.argv.find((arg) => arg.startsWith(argPrefix));
|
|
48
|
+
if (argEntry !== undefined) {
|
|
49
|
+
const fromArg = parsePolicy(argEntry.slice(argPrefix.length));
|
|
50
|
+
if (fromArg !== undefined)
|
|
51
|
+
return fromArg;
|
|
52
|
+
}
|
|
53
|
+
return DEFAULT_EXTERNAL_DIRECTORY_POLICY;
|
|
54
|
+
}
|
|
55
|
+
function parsePolicy(value) {
|
|
56
|
+
if (value === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
const normalized = value.trim().toLowerCase();
|
|
59
|
+
if (!POLICIES.has(normalized))
|
|
60
|
+
return undefined;
|
|
61
|
+
return normalized;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build the config handed to `createOpencodeServer`.
|
|
65
|
+
*
|
|
66
|
+
* OpenCode deep-merges this over the user's global config per permission key,
|
|
67
|
+
* so only `external_directory` is touched — existing `read` / `edit` / `bash`
|
|
68
|
+
* rules (including deny globs for secrets) survive untouched.
|
|
69
|
+
*
|
|
70
|
+
* `read-only` keeps the key on `ask` on purpose: the permission responder is
|
|
71
|
+
* what applies the read/write split, and it can only do that if OpenCode still
|
|
72
|
+
* raises the request.
|
|
73
|
+
*/
|
|
74
|
+
export function buildServerConfig(policy) {
|
|
75
|
+
const external_directory = policy === "read-only" ? "ask" : policy;
|
|
76
|
+
return { permission: { external_directory } };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Call ids arrive as `<tool>_<n>` (e.g. `read_0`, `write_0`), so the tool name
|
|
80
|
+
* is readable straight off the event with no round-trip and no race.
|
|
81
|
+
*/
|
|
82
|
+
const CALL_ID_TOOL = /^(.+)_\d+$/;
|
|
83
|
+
/**
|
|
84
|
+
* Find the tool that raised a permission.
|
|
85
|
+
*
|
|
86
|
+
* The call id encodes the tool name, which is the fast path. If a future
|
|
87
|
+
* server stops encoding it, fall back to matching the id against the session's
|
|
88
|
+
* tool parts — retried, because the event can land before the part is readable.
|
|
89
|
+
*/
|
|
90
|
+
async function resolveToolName(client, ask, sleep) {
|
|
91
|
+
const callID = permissionCallID(ask);
|
|
92
|
+
if (callID === undefined)
|
|
93
|
+
return undefined;
|
|
94
|
+
const encoded = CALL_ID_TOOL.exec(callID);
|
|
95
|
+
if (encoded)
|
|
96
|
+
return encoded[1];
|
|
97
|
+
for (let attempt = 0; attempt < CORRELATION_ATTEMPTS; attempt++) {
|
|
98
|
+
if (attempt > 0)
|
|
99
|
+
await sleep(CORRELATION_DELAY_MS);
|
|
100
|
+
const res = await client.session.messages({ path: { id: ask.sessionID } });
|
|
101
|
+
for (const message of res.data ?? []) {
|
|
102
|
+
for (const part of message.parts) {
|
|
103
|
+
if (part.type === "tool" && part.callID === callID)
|
|
104
|
+
return part.tool;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Decide how to answer a pending permission request.
|
|
112
|
+
*
|
|
113
|
+
* Anything that is not `external_directory` targets the directory the server
|
|
114
|
+
* was launched in, which the caller already owns — approved with `always` so
|
|
115
|
+
* repeat calls stop round-tripping.
|
|
116
|
+
*
|
|
117
|
+
* External reads are approved with `once` rather than `always` on purpose: an
|
|
118
|
+
* `always` reply persists the approval keyed by directory pattern, not by
|
|
119
|
+
* operation, which would silently let a later write into that same directory
|
|
120
|
+
* through and defeat the read-only boundary.
|
|
121
|
+
*/
|
|
122
|
+
export async function decidePermission(client, ask, policy, sleep = defaultSleep) {
|
|
123
|
+
if (permissionKind(ask) !== EXTERNAL_DIRECTORY) {
|
|
124
|
+
return { response: "always", reason: "inside the server working directory" };
|
|
125
|
+
}
|
|
126
|
+
if (policy === "allow") {
|
|
127
|
+
return { response: "always", reason: "external_directory policy is 'allow'" };
|
|
128
|
+
}
|
|
129
|
+
if (policy === "deny") {
|
|
130
|
+
return { response: "reject", reason: "external_directory policy is 'deny'" };
|
|
131
|
+
}
|
|
132
|
+
// Shell commands carry their own metadata shape and can write through any
|
|
133
|
+
// number of paths, so they never qualify as read-only.
|
|
134
|
+
if (ask.metadata?.command !== undefined) {
|
|
135
|
+
return { response: "reject", reason: "shell command outside the working directory" };
|
|
136
|
+
}
|
|
137
|
+
const tool = await resolveToolName(client, ask, sleep);
|
|
138
|
+
if (tool === undefined) {
|
|
139
|
+
return { response: "reject", reason: "could not identify the tool behind the request" };
|
|
140
|
+
}
|
|
141
|
+
if (!READ_ONLY_TOOLS.has(tool)) {
|
|
142
|
+
return { response: "reject", reason: `'${tool}' writes outside the working directory` };
|
|
143
|
+
}
|
|
144
|
+
return { response: "once", reason: `'${tool}' only reads` };
|
|
145
|
+
}
|
|
146
|
+
function defaultSleep(ms) {
|
|
147
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Answer permission requests for a headless server.
|
|
151
|
+
*
|
|
152
|
+
* Without this, any request configured as `ask` blocks the agent forever: there
|
|
153
|
+
* is no interactive approver behind an MCP-spawned server, so the session stays
|
|
154
|
+
* genuinely busy and the task never completes or fails.
|
|
155
|
+
*/
|
|
156
|
+
export function startPermissionResponder(client, options = {}) {
|
|
157
|
+
const policy = options.policy ?? getExternalDirectoryPolicy();
|
|
158
|
+
const onError = options.onError ?? (() => { });
|
|
159
|
+
const onDecision = options.onDecision ?? (() => { });
|
|
160
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
161
|
+
const allowedSessionIDs = options.allowedSessionIDs;
|
|
162
|
+
const controller = new AbortController();
|
|
163
|
+
let stopped = false;
|
|
164
|
+
const stop = () => {
|
|
165
|
+
stopped = true;
|
|
166
|
+
controller.abort(new Error("permission responder stopped"));
|
|
167
|
+
};
|
|
168
|
+
const waitToReconnect = () => new Promise((resolve) => {
|
|
169
|
+
let settled = false;
|
|
170
|
+
const finish = () => {
|
|
171
|
+
if (settled)
|
|
172
|
+
return;
|
|
173
|
+
settled = true;
|
|
174
|
+
controller.signal.removeEventListener("abort", finish);
|
|
175
|
+
resolve();
|
|
176
|
+
};
|
|
177
|
+
controller.signal.addEventListener("abort", finish, { once: true });
|
|
178
|
+
void sleep(RECONNECT_DELAY_MS).then(finish, finish);
|
|
179
|
+
});
|
|
180
|
+
const done = (async () => {
|
|
181
|
+
while (!stopped) {
|
|
182
|
+
try {
|
|
183
|
+
const { stream } = await client.event.subscribe({ signal: controller.signal });
|
|
184
|
+
for await (const event of stream) {
|
|
185
|
+
if (stopped)
|
|
186
|
+
return;
|
|
187
|
+
if (!PERMISSION_EVENTS.has(event.type))
|
|
188
|
+
continue;
|
|
189
|
+
const ask = event.properties;
|
|
190
|
+
if (allowedSessionIDs && !allowedSessionIDs().has(ask.sessionID))
|
|
191
|
+
continue;
|
|
192
|
+
const decision = await decidePermission(client, ask, policy, sleep);
|
|
193
|
+
const response = await client.postSessionIdPermissionsPermissionId({
|
|
194
|
+
path: { id: ask.sessionID, permissionID: ask.id },
|
|
195
|
+
body: { response: decision.response },
|
|
196
|
+
});
|
|
197
|
+
if (response.error)
|
|
198
|
+
throw response.error;
|
|
199
|
+
onDecision(ask, decision);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (stopped)
|
|
204
|
+
return;
|
|
205
|
+
onError(error);
|
|
206
|
+
}
|
|
207
|
+
if (stopped)
|
|
208
|
+
return;
|
|
209
|
+
await waitToReconnect();
|
|
210
|
+
}
|
|
211
|
+
})();
|
|
212
|
+
return { stop, done };
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../../src/modules/shared/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type PromptDispatchOutcome = {
|
|
2
|
+
state: "accepted";
|
|
3
|
+
} | {
|
|
4
|
+
state: "rejected";
|
|
5
|
+
status: number;
|
|
6
|
+
error: string;
|
|
7
|
+
} | {
|
|
8
|
+
state: "uncertain";
|
|
9
|
+
status?: number;
|
|
10
|
+
error: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function sendPromptAndClassify(dispatch: () => Promise<unknown>): Promise<PromptDispatchOutcome>;
|
|
13
|
+
//# sourceMappingURL=prompt-dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-dispatch.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/prompt-dispatch.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,GACrB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAiB3D,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAmBhC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
function responseStatus(value) {
|
|
2
|
+
if (typeof value !== "object" || value === null || !("response" in value))
|
|
3
|
+
return undefined;
|
|
4
|
+
const response = value.response;
|
|
5
|
+
if (typeof response !== "object" || response === null || !("status" in response))
|
|
6
|
+
return undefined;
|
|
7
|
+
return typeof response.status === "number" ? response.status : undefined;
|
|
8
|
+
}
|
|
9
|
+
function errorMessage(error) {
|
|
10
|
+
if (error instanceof Error)
|
|
11
|
+
return error.message;
|
|
12
|
+
if (typeof error === "object" && error !== null && "message" in error)
|
|
13
|
+
return String(error.message);
|
|
14
|
+
return String(error);
|
|
15
|
+
}
|
|
16
|
+
export async function sendPromptAndClassify(dispatch) {
|
|
17
|
+
try {
|
|
18
|
+
const response = await dispatch();
|
|
19
|
+
if (typeof response !== "object" ||
|
|
20
|
+
response === null ||
|
|
21
|
+
!("error" in response) ||
|
|
22
|
+
!response.error)
|
|
23
|
+
return { state: "accepted" };
|
|
24
|
+
const status = responseStatus(response);
|
|
25
|
+
const error = errorMessage(response.error);
|
|
26
|
+
if (status !== undefined && status >= 400 && status < 500)
|
|
27
|
+
return { state: "rejected", status, error };
|
|
28
|
+
return { state: "uncertain", ...(status === undefined ? {} : { status }), error };
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return { state: "uncertain", error: errorMessage(error) };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=prompt-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-dispatch.js","sourceRoot":"","sources":["../../../../src/modules/shared/prompt-dispatch.ts"],"names":[],"mappings":"AAKA,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5F,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,OAAO,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;QACnE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,EAAE,CAAC;QAClC,IACE,OAAO,QAAQ,KAAK,QAAQ;YAC5B,QAAQ,KAAK,IAAI;YACjB,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC;YACtB,CAAC,QAAQ,CAAC,KAAK;YAEf,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YACvD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IACpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function observeRun(taskId: string, runId: string): void;
|
|
2
|
+
export declare function stopRunObservers(timeoutMs?: number): Promise<boolean>;
|
|
3
|
+
export declare function stopServerObservers(serverId: string, timeoutMs?: number): Promise<boolean>;
|
|
4
|
+
export declare function finishConfirmedCancellation(taskId: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=run-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-observer.d.ts","sourceRoot":"","sources":["../../../../src/modules/shared/run-observer.ts"],"names":[],"mappings":"AAgCA,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAoL9D;AAoFD,wBAAsB,gBAAgB,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAsD1E;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAwD/F;AAED,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD/E"}
|