unity-open-mcp 1.2.3 → 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/README.md +33 -2
- package/dist/agent-identity.d.ts +12 -0
- package/dist/agent-identity.js +2 -0
- package/dist/agent-identity.js.map +1 -1
- package/dist/batch-spawn.d.ts +39 -0
- package/dist/batch-spawn.js +287 -69
- package/dist/batch-spawn.js.map +1 -1
- package/dist/capabilities/build-capabilities.js +2 -0
- package/dist/capabilities/build-capabilities.js.map +1 -1
- package/dist/capabilities/discovery.d.ts +51 -0
- package/dist/capabilities/discovery.js +87 -0
- package/dist/capabilities/discovery.js.map +1 -0
- package/dist/capabilities/lifecycle.d.ts +6 -0
- package/dist/capabilities/lifecycle.js +17 -1
- package/dist/capabilities/lifecycle.js.map +1 -1
- package/dist/capabilities/tool-groups.js +1 -0
- package/dist/capabilities/tool-groups.js.map +1 -1
- package/dist/child-supervision.d.ts +6 -0
- package/dist/child-supervision.js +12 -0
- package/dist/child-supervision.js.map +1 -1
- package/dist/cli/args.d.ts +24 -2
- package/dist/cli/args.js +97 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/cli.js +42 -3
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/help-text.d.ts +1 -0
- package/dist/cli/help-text.js +71 -3
- package/dist/cli/help-text.js.map +1 -1
- package/dist/cli/json-guards.d.ts +2 -0
- package/dist/cli/json-guards.js +5 -0
- package/dist/cli/json-guards.js.map +1 -0
- package/dist/cli/setup-command.d.ts +88 -0
- package/dist/cli/setup-command.js +444 -0
- package/dist/cli/setup-command.js.map +1 -0
- package/dist/cli/update-command.d.ts +30 -0
- package/dist/cli/update-command.js +271 -0
- package/dist/cli/update-command.js.map +1 -0
- package/dist/compile-verify.d.ts +3 -0
- package/dist/compile-verify.js +4 -0
- package/dist/compile-verify.js.map +1 -1
- package/dist/constants.d.ts +10 -2
- package/dist/constants.js +10 -2
- package/dist/constants.js.map +1 -1
- package/dist/dialog-dismiss.d.ts +108 -12
- package/dist/dialog-dismiss.js +294 -109
- package/dist/dialog-dismiss.js.map +1 -1
- package/dist/dialog-policy.d.ts +55 -9
- package/dist/dialog-policy.js +85 -15
- package/dist/dialog-policy.js.map +1 -1
- package/dist/editor-search.d.ts +2 -0
- package/dist/editor-search.js +8 -0
- package/dist/editor-search.js.map +1 -0
- package/dist/gate-error.d.ts +3 -0
- package/dist/gate-error.js.map +1 -1
- package/dist/index.js +55 -1
- package/dist/index.js.map +1 -1
- package/dist/instance-discovery.d.ts +16 -0
- package/dist/instance-discovery.js +45 -0
- package/dist/instance-discovery.js.map +1 -1
- package/dist/jobs/adapters.d.ts +15 -0
- package/dist/jobs/adapters.js +147 -0
- package/dist/jobs/adapters.js.map +1 -0
- package/dist/jobs/handler.d.ts +3 -0
- package/dist/jobs/handler.js +29 -0
- package/dist/jobs/handler.js.map +1 -0
- package/dist/jobs/job-manager.d.ts +123 -0
- package/dist/jobs/job-manager.js +290 -0
- package/dist/jobs/job-manager.js.map +1 -0
- package/dist/live-client.d.ts +50 -2
- package/dist/live-client.js +221 -26
- package/dist/live-client.js.map +1 -1
- package/dist/local-tools.d.ts +17 -0
- package/dist/local-tools.js +47 -0
- package/dist/local-tools.js.map +1 -0
- package/dist/project-path.d.ts +86 -0
- package/dist/project-path.js +159 -0
- package/dist/project-path.js.map +1 -0
- package/dist/release-lookup.d.ts +32 -0
- package/dist/release-lookup.js +147 -0
- package/dist/release-lookup.js.map +1 -0
- package/dist/routers.d.ts +17 -3
- package/dist/routers.js +28 -8
- package/dist/routers.js.map +1 -1
- package/dist/running-unity.d.ts +21 -0
- package/dist/running-unity.js +50 -0
- package/dist/running-unity.js.map +1 -1
- package/dist/schema-defaults.d.ts +4 -3
- package/dist/schema-defaults.js +20 -6
- package/dist/schema-defaults.js.map +1 -1
- package/dist/server-instructions.js +7 -1
- package/dist/server-instructions.js.map +1 -1
- package/dist/server.d.ts +10 -3
- package/dist/server.js +24 -25
- package/dist/server.js.map +1 -1
- package/dist/setup/portable-config.d.ts +60 -0
- package/dist/setup/portable-config.js +249 -0
- package/dist/setup/portable-config.js.map +1 -0
- package/dist/skill/SKILL.md +68 -0
- package/dist/skill/copy-references.d.ts +2 -0
- package/dist/skill/copy-references.js +16 -0
- package/dist/skill/copy-references.js.map +1 -0
- package/dist/skill/generate-skill.js +5 -3
- package/dist/skill/generate-skill.js.map +1 -1
- package/dist/skill/references/batch-and-gates.md +142 -0
- package/dist/skill/references/compile-and-safe-mode.md +163 -0
- package/dist/skill/references/discovery-and-groups.md +30 -0
- package/dist/skill/references/routing-and-lifecycle.md +62 -0
- package/dist/skill/references/senses-and-tests.md +41 -0
- package/dist/skill/references/yaml-and-offline-work.md +33 -0
- package/dist/templates/mcp-wrapper.sh +35 -0
- package/dist/tool-contract.d.ts +8 -0
- package/dist/tool-contract.js +253 -0
- package/dist/tool-contract.js.map +1 -0
- package/dist/tool-router.d.ts +62 -7
- package/dist/tool-router.js +455 -17
- package/dist/tool-router.js.map +1 -1
- package/dist/tool-session-state.d.ts +6 -0
- package/dist/tool-session-state.js +14 -0
- package/dist/tool-session-state.js.map +1 -1
- package/dist/tools/agent-capabilities.js +9 -0
- package/dist/tools/agent-capabilities.js.map +1 -1
- package/dist/tools/batch-execute.js +17 -14
- package/dist/tools/batch-execute.js.map +1 -1
- package/dist/tools/bridge-status.js +4 -5
- package/dist/tools/bridge-status.js.map +1 -1
- package/dist/tools/compile-check.js +6 -4
- package/dist/tools/compile-check.js.map +1 -1
- package/dist/tools/component-get.js +2 -2
- package/dist/tools/component-get.js.map +1 -1
- package/dist/tools/component-modify.js +4 -4
- package/dist/tools/component-modify.js.map +1 -1
- package/dist/tools/execute-csharp.js +8 -4
- package/dist/tools/execute-csharp.js.map +1 -1
- package/dist/tools/gameobject-modify.js +2 -1
- package/dist/tools/gameobject-modify.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +10 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inputsim-key.js +12 -14
- package/dist/tools/inputsim-key.js.map +1 -1
- package/dist/tools/inputsim-pointer.js +3 -3
- package/dist/tools/inputsim-pointer.js.map +1 -1
- package/dist/tools/inputsim-step.js +7 -8
- package/dist/tools/inputsim-step.js.map +1 -1
- package/dist/tools/inputsim-touch.js +9 -10
- package/dist/tools/inputsim-touch.js.map +1 -1
- package/dist/tools/jobs.d.ts +40 -0
- package/dist/tools/jobs.js +18 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/manage-tools.js +10 -5
- package/dist/tools/manage-tools.js.map +1 -1
- package/dist/tools/project-commands.d.ts +40 -0
- package/dist/tools/project-commands.js +23 -0
- package/dist/tools/project-commands.js.map +1 -0
- package/dist/tools/read-compile-errors.js +14 -93
- package/dist/tools/read-compile-errors.js.map +1 -1
- package/dist/tools/scan-paths.js +4 -4
- package/dist/tools/scan-paths.js.map +1 -1
- package/dist/tools/schema-fragments.d.ts +15 -3
- package/dist/tools/schema-fragments.js +23 -13
- package/dist/tools/schema-fragments.js.map +1 -1
- package/dist/tools/upgrade.d.ts +40 -0
- package/dist/tools/upgrade.js +55 -0
- package/dist/tools/upgrade.js.map +1 -0
- package/dist/unity-install-discovery.d.ts +24 -0
- package/dist/unity-install-discovery.js +113 -4
- package/dist/unity-install-discovery.js.map +1 -1
- package/package.json +4 -3
- package/templates/mcp-wrapper.sh +35 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
export const JOB_STATES = ["queued", "running", "succeeded", "failed", "cancel_requested", "cancelled", "orphaned"];
|
|
3
|
+
export class JobManagerError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(code, message) { super(message); this.code = code; }
|
|
6
|
+
}
|
|
7
|
+
const terminal = (state) => ["succeeded", "failed", "cancelled", "orphaned"].includes(state);
|
|
8
|
+
const sameProject = (a, b) => a.project === b.project && a.port === b.port;
|
|
9
|
+
const sameOwner = (a, b) => sameProject(a, b) && a.agent === b.agent;
|
|
10
|
+
function canonical(value) {
|
|
11
|
+
if (Array.isArray(value))
|
|
12
|
+
return `[${value.map(canonical).join(",")}]`;
|
|
13
|
+
if (value && typeof value === "object")
|
|
14
|
+
return `{${Object.keys(value).sort().map(k => `${JSON.stringify(k)}:${canonical(value[k])}`).join(",")}}`;
|
|
15
|
+
return JSON.stringify(value);
|
|
16
|
+
}
|
|
17
|
+
const defaults = {
|
|
18
|
+
maxJobs: 256, retentionMs: 30 * 60_000, maxConcurrent: 4, perProject: 1, perAgent: 1,
|
|
19
|
+
maxEvents: 32, maxPayloadBytes: 256 * 1024, maxWaiters: 128,
|
|
20
|
+
};
|
|
21
|
+
/** Session-only owner. No replay, disk persistence, or automatic transport retries. */
|
|
22
|
+
export class JobManager {
|
|
23
|
+
operations = new Map();
|
|
24
|
+
entries = new Map();
|
|
25
|
+
keys = new Map();
|
|
26
|
+
sequence = 0;
|
|
27
|
+
session = randomUUID();
|
|
28
|
+
options;
|
|
29
|
+
cleanupTimer;
|
|
30
|
+
closed = false;
|
|
31
|
+
now;
|
|
32
|
+
constructor(options = {}, now = Date.now) {
|
|
33
|
+
this.now = now;
|
|
34
|
+
this.options = { ...defaults, ...options };
|
|
35
|
+
for (const value of Object.values(this.options))
|
|
36
|
+
if (!Number.isSafeInteger(value) || value < 1)
|
|
37
|
+
throw new Error("Job limits must be positive integers");
|
|
38
|
+
this.cleanupTimer = setInterval(() => this.cleanup(), Math.min(this.options.retentionMs, 60_000));
|
|
39
|
+
this.cleanupTimer.unref();
|
|
40
|
+
}
|
|
41
|
+
hasOperation(name) { return this.operations.has(name); }
|
|
42
|
+
/** Whether an owner's idempotency key already names a retained job, whose retried start needs no adapter resolution. */
|
|
43
|
+
hasKey(owner, key) {
|
|
44
|
+
this.cleanup();
|
|
45
|
+
return this.keys.has(this.scopedKey(owner, key));
|
|
46
|
+
}
|
|
47
|
+
operation(name) { return this.operations.get(name); }
|
|
48
|
+
/** `replace` swaps an adapter whose bridge-side contract changed; jobs already running keep the operation they started with. */
|
|
49
|
+
register(name, operation, replace = false) {
|
|
50
|
+
if (!replace && this.operations.has(name))
|
|
51
|
+
throw new Error(`Duplicate job operation: ${name}`);
|
|
52
|
+
this.operations.set(name, operation);
|
|
53
|
+
}
|
|
54
|
+
copy(value) {
|
|
55
|
+
const json = JSON.stringify(value);
|
|
56
|
+
if (json === undefined || Buffer.byteLength(json) > this.options.maxPayloadBytes)
|
|
57
|
+
throw new JobManagerError("job_payload_too_large", "Job payload exceeds the configured JSON byte limit.");
|
|
58
|
+
return JSON.parse(json);
|
|
59
|
+
}
|
|
60
|
+
/** A terminal result above the payload limit is dropped, never allowed to turn a known outcome into an orphan. */
|
|
61
|
+
boundedResult(value) {
|
|
62
|
+
if (value === undefined)
|
|
63
|
+
return undefined;
|
|
64
|
+
try {
|
|
65
|
+
return this.copy(value);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (!(error instanceof JobManagerError) || error.code !== "job_payload_too_large")
|
|
69
|
+
throw error;
|
|
70
|
+
return { truncated: true, code: error.code, message: `Result exceeded ${this.options.maxPayloadBytes} bytes and was not retained; the job state is authoritative.` };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
event(entry, kind, detail) {
|
|
74
|
+
entry.view.updated_at = this.now();
|
|
75
|
+
entry.view.events.push({ at: entry.view.updated_at, kind, detail: detail.slice(0, 1024) });
|
|
76
|
+
entry.view.events = entry.view.events.slice(-this.options.maxEvents);
|
|
77
|
+
}
|
|
78
|
+
transition(entry, state) {
|
|
79
|
+
if (terminal(entry.view.state))
|
|
80
|
+
return;
|
|
81
|
+
entry.view.state = state;
|
|
82
|
+
this.event(entry, "state", state);
|
|
83
|
+
if (terminal(state)) {
|
|
84
|
+
entry.view.finished_at = this.now();
|
|
85
|
+
entry.args = {};
|
|
86
|
+
for (const wake of entry.waiters)
|
|
87
|
+
wake();
|
|
88
|
+
entry.waiters.clear();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
snapshot(entry) { return structuredClone(entry.view); }
|
|
92
|
+
scopedKey(owner, key) { return JSON.stringify([owner.project, owner.port ?? null, owner.agent, key]); }
|
|
93
|
+
find(owner, id) {
|
|
94
|
+
this.cleanup();
|
|
95
|
+
const entry = this.entries.get(id);
|
|
96
|
+
if (!entry || !sameOwner(owner, entry.view.owner))
|
|
97
|
+
throw new JobManagerError("job_not_found", "Job is unknown, expired, or belongs to another project/agent.");
|
|
98
|
+
return entry;
|
|
99
|
+
}
|
|
100
|
+
start(owner, name, args, key) {
|
|
101
|
+
if (this.closed)
|
|
102
|
+
throw new JobManagerError("jobs_closed", "Job manager is closed.");
|
|
103
|
+
if (!owner.project || !owner.agent)
|
|
104
|
+
throw new JobManagerError("invalid_job_owner", "Project and agent identity are required.");
|
|
105
|
+
this.cleanup();
|
|
106
|
+
const safeArgs = this.copy(args);
|
|
107
|
+
const fingerprint = canonical({ name, args: safeArgs });
|
|
108
|
+
const scopedKey = key === undefined ? undefined : this.scopedKey(owner, key);
|
|
109
|
+
const existing = scopedKey === undefined ? undefined : this.keys.get(scopedKey);
|
|
110
|
+
if (existing) {
|
|
111
|
+
const entry = this.entries.get(existing);
|
|
112
|
+
if (entry.fingerprint !== fingerprint)
|
|
113
|
+
throw new JobManagerError("idempotency_conflict", "Key already identifies a different operation or arguments.");
|
|
114
|
+
return this.snapshot(entry);
|
|
115
|
+
}
|
|
116
|
+
const operation = this.operations.get(name);
|
|
117
|
+
if (!operation)
|
|
118
|
+
throw new JobManagerError("job_operation_unsupported", "Operation has no registered asynchronous job adapter.");
|
|
119
|
+
if ((operation.mutating || key !== undefined) && (!key?.trim() || key.length > 256))
|
|
120
|
+
throw new JobManagerError("idempotency_key_required", "Provide a nonempty idempotency_key of at most 256 characters.");
|
|
121
|
+
operation.validate(safeArgs);
|
|
122
|
+
// Never evict unexpired idempotency records to make room for new starts.
|
|
123
|
+
if (this.entries.size >= this.options.maxJobs)
|
|
124
|
+
throw new JobManagerError("job_capacity", "Job retention capacity reached; retry after terminal records expire.");
|
|
125
|
+
const at = this.now();
|
|
126
|
+
const entry = {
|
|
127
|
+
view: { job_id: randomUUID(), operation: name, owner: { ...owner }, state: "queued", created_at: at, updated_at: at,
|
|
128
|
+
started_at: null, finished_at: null, progress: null, cancellable: operation.cancellable,
|
|
129
|
+
lifecycle: { state: "not_started", evidence: null }, events: [] },
|
|
130
|
+
sequence: ++this.sequence, key: scopedKey, fingerprint, args: safeArgs, operation,
|
|
131
|
+
controller: new AbortController(), executing: false, waiters: new Set(),
|
|
132
|
+
};
|
|
133
|
+
this.entries.set(entry.view.job_id, entry);
|
|
134
|
+
if (scopedKey !== undefined)
|
|
135
|
+
this.keys.set(scopedKey, entry.view.job_id);
|
|
136
|
+
this.event(entry, "state", "queued");
|
|
137
|
+
// Scheduling is independent of the lifetime of start/wait MCP calls.
|
|
138
|
+
setImmediate(() => this.pump());
|
|
139
|
+
return this.snapshot(entry);
|
|
140
|
+
}
|
|
141
|
+
status(owner, id) { return this.snapshot(this.find(owner, id)); }
|
|
142
|
+
async wait(owner, id, timeoutMs = 10_000) {
|
|
143
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs < 0 || timeoutMs > 30_000)
|
|
144
|
+
throw new JobManagerError("invalid_arguments", "wait timeout_ms must be between 0 and 30000.");
|
|
145
|
+
const entry = this.find(owner, id);
|
|
146
|
+
if (terminal(entry.view.state) || timeoutMs === 0)
|
|
147
|
+
return this.snapshot(entry);
|
|
148
|
+
const waiters = [...this.entries.values()].reduce((sum, e) => sum + e.waiters.size, 0);
|
|
149
|
+
if (waiters >= this.options.maxWaiters)
|
|
150
|
+
throw new JobManagerError("job_wait_capacity", "Too many concurrent observers.");
|
|
151
|
+
await new Promise(resolve => {
|
|
152
|
+
const wake = () => { clearTimeout(timer); entry.waiters.delete(wake); resolve(); };
|
|
153
|
+
const timer = setTimeout(wake, timeoutMs);
|
|
154
|
+
entry.waiters.add(wake);
|
|
155
|
+
});
|
|
156
|
+
return this.snapshot(entry);
|
|
157
|
+
}
|
|
158
|
+
cancel(owner, id) {
|
|
159
|
+
const entry = this.find(owner, id);
|
|
160
|
+
if (!entry.operation.cancellable)
|
|
161
|
+
throw new JobManagerError("not_cancellable", "Operation has no cooperative cancellation contract.");
|
|
162
|
+
if (terminal(entry.view.state) || entry.view.state === "cancel_requested")
|
|
163
|
+
return this.snapshot(entry);
|
|
164
|
+
if (entry.view.state === "queued")
|
|
165
|
+
this.transition(entry, "cancelled");
|
|
166
|
+
else {
|
|
167
|
+
this.transition(entry, "cancel_requested");
|
|
168
|
+
entry.controller.abort();
|
|
169
|
+
}
|
|
170
|
+
return this.snapshot(entry);
|
|
171
|
+
}
|
|
172
|
+
list(owner, filters = {}, cursor, limit = 20) {
|
|
173
|
+
this.cleanup();
|
|
174
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 100)
|
|
175
|
+
throw new JobManagerError("invalid_arguments", "limit must be 1..100.");
|
|
176
|
+
const binding = canonical({ owner, filters, session: this.session });
|
|
177
|
+
let after = 0, ceiling = this.sequence;
|
|
178
|
+
if (cursor) {
|
|
179
|
+
try {
|
|
180
|
+
const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString());
|
|
181
|
+
if (parsed.binding !== binding || !Number.isSafeInteger(parsed.after) || !Number.isSafeInteger(parsed.ceiling) || parsed.after < 0 || parsed.ceiling < parsed.after || parsed.ceiling > this.sequence)
|
|
182
|
+
throw new Error();
|
|
183
|
+
after = parsed.after;
|
|
184
|
+
ceiling = parsed.ceiling;
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
throw new JobManagerError("invalid_cursor", "Cursor does not match this owner/filter or server session.");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const matches = [...this.entries.values()].filter(e => sameOwner(owner, e.view.owner) && e.sequence > after && e.sequence <= ceiling
|
|
191
|
+
&& (!filters.state || e.view.state === filters.state) && (!filters.operation || e.view.operation === filters.operation));
|
|
192
|
+
const page = matches.slice(0, limit);
|
|
193
|
+
return { jobs: page.map(e => this.snapshot(e)), next_cursor: matches.length > limit
|
|
194
|
+
? Buffer.from(JSON.stringify({ binding, after: page.at(-1).sequence, ceiling })).toString("base64url") : null };
|
|
195
|
+
}
|
|
196
|
+
cleanup() {
|
|
197
|
+
for (const [id, entry] of this.entries) {
|
|
198
|
+
if (!entry.executing && entry.view.finished_at !== null && this.now() - entry.view.finished_at >= this.options.retentionMs) {
|
|
199
|
+
this.entries.delete(id);
|
|
200
|
+
if (entry.key !== undefined)
|
|
201
|
+
this.keys.delete(entry.key);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
close() {
|
|
206
|
+
this.closed = true;
|
|
207
|
+
clearInterval(this.cleanupTimer);
|
|
208
|
+
for (const entry of this.entries.values())
|
|
209
|
+
if (!terminal(entry.view.state)) {
|
|
210
|
+
entry.view.error = { code: "job_owner_lost", message: "Server job manager closed; execution outcome is unknown." };
|
|
211
|
+
this.transition(entry, "orphaned");
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
pump() {
|
|
215
|
+
if (this.closed)
|
|
216
|
+
return;
|
|
217
|
+
for (const entry of this.entries.values()) {
|
|
218
|
+
if (entry.view.state !== "queued")
|
|
219
|
+
continue;
|
|
220
|
+
const active = [...this.entries.values()].filter(e => e.executing);
|
|
221
|
+
if (active.length >= this.options.maxConcurrent)
|
|
222
|
+
break;
|
|
223
|
+
if (active.filter(e => sameProject(e.view.owner, entry.view.owner)).length >= this.options.perProject ||
|
|
224
|
+
active.filter(e => sameOwner(e.view.owner, entry.view.owner)).length >= this.options.perAgent)
|
|
225
|
+
continue;
|
|
226
|
+
entry.executing = true;
|
|
227
|
+
entry.view.started_at = this.now();
|
|
228
|
+
this.transition(entry, "running");
|
|
229
|
+
void this.execute(entry);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async execute(entry) {
|
|
233
|
+
const context = {
|
|
234
|
+
jobId: entry.view.job_id, owner: { ...entry.view.owner }, signal: entry.controller.signal,
|
|
235
|
+
report: progress => {
|
|
236
|
+
if (terminal(entry.view.state))
|
|
237
|
+
return;
|
|
238
|
+
if (typeof progress.phase !== "string" || (progress.fraction !== undefined && (!Number.isFinite(progress.fraction) || progress.fraction < 0 || progress.fraction > 1)))
|
|
239
|
+
throw new JobManagerError("invalid_progress", "Progress requires a phase and optional fraction in [0,1].");
|
|
240
|
+
entry.view.progress = { phase: progress.phase.slice(0, 1024),
|
|
241
|
+
...(progress.fraction === undefined ? {} : { fraction: progress.fraction }) };
|
|
242
|
+
this.event(entry, "progress", progress.phase);
|
|
243
|
+
},
|
|
244
|
+
lifecycle: (state, evidence, ownershipProven) => {
|
|
245
|
+
if (terminal(entry.view.state))
|
|
246
|
+
return;
|
|
247
|
+
entry.view.lifecycle = { state, evidence: evidence.slice(0, 1024) };
|
|
248
|
+
this.event(entry, "lifecycle", `${state}: ${evidence}`);
|
|
249
|
+
if (!ownershipProven || !evidence.trim()) {
|
|
250
|
+
entry.view.error = { code: "job_owner_lost", message: "Operation ownership cannot be proven; do not blindly retry." };
|
|
251
|
+
this.transition(entry, "orphaned");
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
try {
|
|
256
|
+
const outcome = await entry.operation.run(entry.args, context);
|
|
257
|
+
if (terminal(entry.view.state)) {
|
|
258
|
+
// The adapter orphaned the job through lifecycle() (or the manager
|
|
259
|
+
// closed) and only THEN returned: the terminal state stays
|
|
260
|
+
// authoritative, but the payload it came back with — e.g. the bridge's
|
|
261
|
+
// own timeout envelope with the run id — is the evidence an operator
|
|
262
|
+
// needs, so keep it instead of dropping it on the floor.
|
|
263
|
+
if ("result" in outcome && entry.view.result === undefined)
|
|
264
|
+
entry.view.result = this.boundedResult(outcome.result);
|
|
265
|
+
if (outcome.state === "failed")
|
|
266
|
+
this.event(entry, "adapter_outcome", `${outcome.error.code}: ${outcome.error.message}`);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if ("result" in outcome)
|
|
270
|
+
entry.view.result = this.boundedResult(outcome.result);
|
|
271
|
+
if (outcome.state === "failed")
|
|
272
|
+
entry.view.error = this.copy(outcome.error);
|
|
273
|
+
else if (outcome.state !== "succeeded" && (outcome.state !== "cancelled" || !entry.operation.cancellable || !entry.controller.signal.aborted))
|
|
274
|
+
throw new Error("Invalid terminal outcome or cancellation without acknowledgement");
|
|
275
|
+
this.transition(entry, outcome.state);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (!terminal(entry.view.state)) {
|
|
279
|
+
// A thrown transport/runtime error does not prove that remote work failed.
|
|
280
|
+
entry.view.error = { code: "job_outcome_unknown", message: String(error).slice(0, 1024) };
|
|
281
|
+
this.transition(entry, "orphaned");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
finally {
|
|
285
|
+
entry.executing = false;
|
|
286
|
+
this.pump();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=job-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-manager.js","sourceRoot":"","sources":["../../src/jobs/job-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAgD7H,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IACtB,YAAY,IAAY,EAAE,OAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;CACjF;AACD,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvG,MAAM,WAAW,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AAC/F,MAAM,SAAS,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;AACzF,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/K,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAKD,MAAM,QAAQ,GAAsB;IAClC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpF,SAAS,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG;CAC5D,CAAC;AAEF,uFAAuF;AACvF,MAAM,OAAO,UAAU;IACJ,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC7C,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACnC,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,QAAQ,GAAG,CAAC,CAAC;IACJ,OAAO,GAAG,UAAU,EAAE,CAAC;IACvB,OAAO,CAAoB;IAC3B,YAAY,CAAiC;IACtD,MAAM,GAAG,KAAK,CAAC;IACN,GAAG,CAAe;IACnC,YAAY,UAAsC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG;QAClE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACxJ,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,YAAY,CAAC,IAAY,IAAa,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE,wHAAwH;IACxH,MAAM,CAAC,KAAe,EAAE,GAAW;QACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,SAAS,CAAC,IAAY,IAA8B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvF,gIAAgI;IAChI,QAAQ,CAAC,IAAY,EAAE,SAAuB,EAAE,OAAO,GAAG,KAAK;QAC7D,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IACO,IAAI,CAAI,KAAQ;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe;YAC9E,MAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,qDAAqD,CAAC,CAAC;QAC5G,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IACD,kHAAkH;IAC1G,aAAa,CAAC,KAAc;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QAChC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,KAAK,YAAY,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB;gBAAE,MAAM,KAAK,CAAC;YAC/F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,IAAI,CAAC,OAAO,CAAC,eAAe,8DAA8D,EAAE,CAAC;QACvK,CAAC;IACH,CAAC;IACO,KAAK,CAAC,KAAY,EAAE,IAAY,EAAE,MAAc;QACtD,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IACO,UAAU,CAAC,KAAY,EAAE,KAAe;QAC9C,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO;QACvC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO;gBAAE,IAAI,EAAE,CAAC;YACzC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IACO,QAAQ,CAAC,KAAY,IAAiB,OAAO,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3E,SAAS,CAAC,KAAe,EAAE,GAAW,IAAY,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjI,IAAI,CAAC,KAAe,EAAE,EAAU;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,+DAA+D,CAAC,CAAC;QAC/J,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,KAAe,EAAE,IAAY,EAAE,IAA6B,EAAE,GAAY;QAC9E,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,0CAA0C,CAAC,CAAC;QAC/H,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;gBAAE,MAAM,IAAI,eAAe,CAAC,sBAAsB,EAAE,4DAA4D,CAAC,CAAC;YACvJ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE,uDAAuD,CAAC,CAAC;QAChI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,GAAG,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjF,MAAM,IAAI,eAAe,CAAC,0BAA0B,EAAE,+DAA+D,CAAC,CAAC;QACzH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7B,yEAAyE;QACzE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,sEAAsE,CAAC,CAAC;QACjK,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAU;YACnB,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE;gBACjH,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW;gBACvF,SAAS,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACnE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS;YACjF,UAAU,EAAE,IAAI,eAAe,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE;SACxE,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,qEAAqE;QACrE,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,CAAC,KAAe,EAAE,EAAU,IAAiB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,KAAK,CAAC,IAAI,CAAC,KAAe,EAAE,EAAU,EAAE,SAAS,GAAG,MAAM;QACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,MAAM;YAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,8CAA8C,CAAC,CAAC;QACxK,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,gCAAgC,CAAC,CAAC;QACzH,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAChC,MAAM,IAAI,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC1C,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,CAAC,KAAe,EAAE,EAAU;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;YAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,qDAAqD,CAAC,CAAC;QACtI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,kBAAkB;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;aAClE,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;YAC3C,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,KAAe,EAAE,UAAoD,EAAE,EAAE,MAAe,EAAE,KAAK,GAAG,EAAE;QACvG,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG;YAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,CAAC;QAClI,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvE,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;gBACzN,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,IAAI,eAAe,CAAC,gBAAgB,EAAE,4DAA4D,CAAC,CAAC;YAAC,CAAC;QACxH,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO;eAC/H,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3H,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK;gBACjF,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrH,CAAC;IACD,OAAO;QACL,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC3H,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;oBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3E,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,0DAA0D,EAAE,CAAC;gBACnH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACrC,CAAC;IACH,CAAC;IACO,IAAI;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;gBAAE,MAAM;YACvD,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU;gBACjG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAAE,SAAS;YAC5G,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACO,KAAK,CAAC,OAAO,CAAC,KAAY;QAChC,MAAM,OAAO,GAAe;YAC1B,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;YACzF,MAAM,EAAE,QAAQ,CAAC,EAAE;gBACjB,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO;gBACvC,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;oBACpK,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,2DAA2D,CAAC,CAAC;gBAC7G,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;oBAC1D,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;gBAChF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC;YACD,SAAS,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE;gBAC9C,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO;gBACvC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC;oBACtH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;SACF,CAAC;QACF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/D,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,mEAAmE;gBACnE,2DAA2D;gBAC3D,uEAAuE;gBACvE,qEAAqE;gBACrE,yDAAyD;gBACzD,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;oBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnH,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;oBAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxH,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBACvE,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3I,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACtF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,2EAA2E;gBAC3E,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC1F,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
package/dist/live-client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
2
|
import type { Router } from "./router.js";
|
|
3
|
-
import
|
|
3
|
+
import { PingCache, type PingSnapshot } from "./ping-cache.js";
|
|
4
4
|
import type { BridgeToolsInventory } from "./bridge-tools-cache.js";
|
|
5
5
|
import { type PollAndDismissOptions } from "./dialog-dismiss.js";
|
|
6
6
|
/**
|
|
@@ -33,6 +33,11 @@ import { type PollAndDismissOptions } from "./dialog-dismiss.js";
|
|
|
33
33
|
* (TypeError).
|
|
34
34
|
*/
|
|
35
35
|
export declare function shouldRetryPostAfterFailure(err: unknown, endpointChanged: boolean): boolean;
|
|
36
|
+
/** `/project-command-jobs` answered without a job snapshot; `status` is its non-OK HTTP status. */
|
|
37
|
+
export declare class ProjectJobHttpError extends Error {
|
|
38
|
+
readonly status: number;
|
|
39
|
+
constructor(status: number);
|
|
40
|
+
}
|
|
36
41
|
export declare class LiveClient implements Router {
|
|
37
42
|
private baseUrl;
|
|
38
43
|
private pingCache;
|
|
@@ -67,6 +72,8 @@ export declare class LiveClient implements Router {
|
|
|
67
72
|
/** specs/feedback.md 2026-07-03 — opt-in for the "Unsaved changes to scene"
|
|
68
73
|
* modal (destructive under every policy, off by default). */
|
|
69
74
|
private allowUnsavedSceneDismiss;
|
|
75
|
+
/** Explicit opt-in for continuing through a non-matching Editor warning. */
|
|
76
|
+
private allowVersionMismatch;
|
|
70
77
|
/** M14 — per-session bearer token auto-discovered from the instance lock.
|
|
71
78
|
* Undefined when no live lock was found (older bridge / env port override);
|
|
72
79
|
* in that case no Authorization header is sent and the bridge must be in
|
|
@@ -97,6 +104,8 @@ export declare class LiveClient implements Router {
|
|
|
97
104
|
* the constructor used; without it a refresh would silently switch from an
|
|
98
105
|
* env-pinned port to the lock port. */
|
|
99
106
|
private readonly envPort;
|
|
107
|
+
/** Memoized outcome of the bridge-vs-server project-path comparison. */
|
|
108
|
+
private projectMatch;
|
|
100
109
|
constructor(port: number, pingCache: PingCache, authToken?: string, projectPath?: string, agentId?: string, envPort?: number);
|
|
101
110
|
/**
|
|
102
111
|
* Emit the server/bridge version-compatibility warning at most once per
|
|
@@ -104,6 +113,22 @@ export declare class LiveClient implements Router {
|
|
|
104
113
|
* entirely by UNITY_OPEN_MCP_SKIP_VERSION_CHECK=1. See docs/versioning.md.
|
|
105
114
|
*/
|
|
106
115
|
private maybeWarnCompat;
|
|
116
|
+
/** Bounded read-only main-thread snapshot; unavailable bridges fail open to logs. */
|
|
117
|
+
readCompileState(): Promise<Record<string, unknown> | null>;
|
|
118
|
+
/** The compile state that qualifies a tool result: the snapshot the bridge
|
|
119
|
+
* took inside the call's own dispatch when the call asked for it
|
|
120
|
+
* (COMPILE_STATE_HEADER), else a fresh read. An older bridge never attaches
|
|
121
|
+
* one, and the bridge leaves it off once a compile ran during the call's
|
|
122
|
+
* settle wait, so neither path can qualify a result with a state older
|
|
123
|
+
* than the call. */
|
|
124
|
+
private compileStateFor;
|
|
125
|
+
/** A well-formed compile state reported for this client's project, else null. */
|
|
126
|
+
private acceptCompileState;
|
|
127
|
+
/** The bridge reports DirectoryInfo.FullName while the server holds a
|
|
128
|
+
* path.resolve'd string; separators, drive-letter case and /private-style
|
|
129
|
+
* symlinks can differ for the same project, and a strict compare would
|
|
130
|
+
* silently disable live compile state. Compare canonical forms instead. */
|
|
131
|
+
private sameProject;
|
|
107
132
|
isLiveAvailable(fetchTimeoutMs?: number): Promise<boolean>;
|
|
108
133
|
/**
|
|
109
134
|
* M14 — return the most recent cached /ping snapshot (any age), or null when
|
|
@@ -112,9 +137,28 @@ export declare class LiveClient implements Router {
|
|
|
112
137
|
* "what's its state?" without a second `/ping` round-trip per poll.
|
|
113
138
|
*/
|
|
114
139
|
getCachedPing(): PingSnapshot | null;
|
|
115
|
-
route(toolName: string, args: Record<string, unknown
|
|
140
|
+
route(toolName: string, args: Record<string, unknown>, commandLifecycle?: string): Promise<CallToolResult>;
|
|
116
141
|
private handlePing;
|
|
117
142
|
private handleToolCall;
|
|
143
|
+
/**
|
|
144
|
+
* Transient client for a per-request `_meta.port` override. The override
|
|
145
|
+
* names a bridge, not a project, so the client binds to the project whose
|
|
146
|
+
* instance lock claims that port: its lock-derived diagnostics
|
|
147
|
+
* (bridge_compile_failed, cold Safe Mode, the ping lockCheck, the offline
|
|
148
|
+
* hint) and its bearer token then describe the Editor actually called, not
|
|
149
|
+
* the configured project. With no claiming lock it binds to the configured
|
|
150
|
+
* project only when that project has no lock and the port is its
|
|
151
|
+
* deterministic one; otherwise it runs without a project, so a failure
|
|
152
|
+
* reports plain bridge_offline instead of another Editor's state. The port
|
|
153
|
+
* is passed as envPort: an explicit override never re-resolves from a lock.
|
|
154
|
+
* A private PingCache keeps the default bridge's readiness snapshot from
|
|
155
|
+
* short-circuiting this bridge's own /ping.
|
|
156
|
+
*/
|
|
157
|
+
static forPortOverride(port: number, defaultProjectPath: string | undefined, agentId: string): LiveClient;
|
|
158
|
+
/** Preserve configured endpoint/auth when attaching an independent job owner. */
|
|
159
|
+
forAgent(agent: string): LiveClient;
|
|
160
|
+
/** Job-owned test start has no transport replay; poll the existing file handoff. */
|
|
161
|
+
runTestsJob(args: Record<string, unknown>, onStarted: () => void): Promise<CallToolResult>;
|
|
118
162
|
private handleRunTests;
|
|
119
163
|
private pollTestResults;
|
|
120
164
|
/**
|
|
@@ -261,6 +305,10 @@ export declare class LiveClient implements Router {
|
|
|
261
305
|
*/
|
|
262
306
|
protected runDismissLoop(opts: PollAndDismissOptions): Promise<void>;
|
|
263
307
|
readResource(route: string): Promise<Record<string, unknown>>;
|
|
308
|
+
/** Private job transport: one bounded request, never an automatic mutation retry. */
|
|
309
|
+
projectCommandJob(args: Record<string, unknown>): Promise<Record<string, any>>;
|
|
310
|
+
/** Fresh authenticated bounded catalog read; no disk/session cache can hide a reload. */
|
|
311
|
+
projectCommands(args: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
264
312
|
/**
|
|
265
313
|
* M18 Plan 2 / T18.2.3 — fetch the compiled-state tool inventory from the
|
|
266
314
|
* bridge (`GET /tools`). Returns the set of tool names the bridge compiled
|