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.
Files changed (169) hide show
  1. package/README.md +33 -2
  2. package/dist/agent-identity.d.ts +12 -0
  3. package/dist/agent-identity.js +2 -0
  4. package/dist/agent-identity.js.map +1 -1
  5. package/dist/batch-spawn.d.ts +39 -0
  6. package/dist/batch-spawn.js +287 -69
  7. package/dist/batch-spawn.js.map +1 -1
  8. package/dist/capabilities/build-capabilities.js +2 -0
  9. package/dist/capabilities/build-capabilities.js.map +1 -1
  10. package/dist/capabilities/discovery.d.ts +51 -0
  11. package/dist/capabilities/discovery.js +87 -0
  12. package/dist/capabilities/discovery.js.map +1 -0
  13. package/dist/capabilities/lifecycle.d.ts +6 -0
  14. package/dist/capabilities/lifecycle.js +17 -1
  15. package/dist/capabilities/lifecycle.js.map +1 -1
  16. package/dist/capabilities/tool-groups.js +1 -0
  17. package/dist/capabilities/tool-groups.js.map +1 -1
  18. package/dist/child-supervision.d.ts +6 -0
  19. package/dist/child-supervision.js +12 -0
  20. package/dist/child-supervision.js.map +1 -1
  21. package/dist/cli/args.d.ts +24 -2
  22. package/dist/cli/args.js +97 -2
  23. package/dist/cli/args.js.map +1 -1
  24. package/dist/cli/cli.js +42 -3
  25. package/dist/cli/cli.js.map +1 -1
  26. package/dist/cli/help-text.d.ts +1 -0
  27. package/dist/cli/help-text.js +71 -3
  28. package/dist/cli/help-text.js.map +1 -1
  29. package/dist/cli/json-guards.d.ts +2 -0
  30. package/dist/cli/json-guards.js +5 -0
  31. package/dist/cli/json-guards.js.map +1 -0
  32. package/dist/cli/setup-command.d.ts +88 -0
  33. package/dist/cli/setup-command.js +444 -0
  34. package/dist/cli/setup-command.js.map +1 -0
  35. package/dist/cli/update-command.d.ts +30 -0
  36. package/dist/cli/update-command.js +271 -0
  37. package/dist/cli/update-command.js.map +1 -0
  38. package/dist/compile-verify.d.ts +3 -0
  39. package/dist/compile-verify.js +4 -0
  40. package/dist/compile-verify.js.map +1 -1
  41. package/dist/constants.d.ts +10 -2
  42. package/dist/constants.js +10 -2
  43. package/dist/constants.js.map +1 -1
  44. package/dist/dialog-dismiss.d.ts +108 -12
  45. package/dist/dialog-dismiss.js +294 -109
  46. package/dist/dialog-dismiss.js.map +1 -1
  47. package/dist/dialog-policy.d.ts +55 -9
  48. package/dist/dialog-policy.js +85 -15
  49. package/dist/dialog-policy.js.map +1 -1
  50. package/dist/editor-search.d.ts +2 -0
  51. package/dist/editor-search.js +8 -0
  52. package/dist/editor-search.js.map +1 -0
  53. package/dist/gate-error.d.ts +3 -0
  54. package/dist/gate-error.js.map +1 -1
  55. package/dist/index.js +55 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/instance-discovery.d.ts +16 -0
  58. package/dist/instance-discovery.js +45 -0
  59. package/dist/instance-discovery.js.map +1 -1
  60. package/dist/jobs/adapters.d.ts +15 -0
  61. package/dist/jobs/adapters.js +147 -0
  62. package/dist/jobs/adapters.js.map +1 -0
  63. package/dist/jobs/handler.d.ts +3 -0
  64. package/dist/jobs/handler.js +29 -0
  65. package/dist/jobs/handler.js.map +1 -0
  66. package/dist/jobs/job-manager.d.ts +123 -0
  67. package/dist/jobs/job-manager.js +290 -0
  68. package/dist/jobs/job-manager.js.map +1 -0
  69. package/dist/live-client.d.ts +50 -2
  70. package/dist/live-client.js +221 -26
  71. package/dist/live-client.js.map +1 -1
  72. package/dist/local-tools.d.ts +17 -0
  73. package/dist/local-tools.js +47 -0
  74. package/dist/local-tools.js.map +1 -0
  75. package/dist/project-path.d.ts +86 -0
  76. package/dist/project-path.js +159 -0
  77. package/dist/project-path.js.map +1 -0
  78. package/dist/release-lookup.d.ts +32 -0
  79. package/dist/release-lookup.js +147 -0
  80. package/dist/release-lookup.js.map +1 -0
  81. package/dist/routers.d.ts +17 -3
  82. package/dist/routers.js +28 -8
  83. package/dist/routers.js.map +1 -1
  84. package/dist/running-unity.d.ts +21 -0
  85. package/dist/running-unity.js +50 -0
  86. package/dist/running-unity.js.map +1 -1
  87. package/dist/schema-defaults.d.ts +4 -3
  88. package/dist/schema-defaults.js +20 -6
  89. package/dist/schema-defaults.js.map +1 -1
  90. package/dist/server-instructions.js +7 -1
  91. package/dist/server-instructions.js.map +1 -1
  92. package/dist/server.d.ts +10 -3
  93. package/dist/server.js +24 -25
  94. package/dist/server.js.map +1 -1
  95. package/dist/setup/portable-config.d.ts +60 -0
  96. package/dist/setup/portable-config.js +249 -0
  97. package/dist/setup/portable-config.js.map +1 -0
  98. package/dist/skill/SKILL.md +68 -0
  99. package/dist/skill/copy-references.d.ts +2 -0
  100. package/dist/skill/copy-references.js +16 -0
  101. package/dist/skill/copy-references.js.map +1 -0
  102. package/dist/skill/generate-skill.js +5 -3
  103. package/dist/skill/generate-skill.js.map +1 -1
  104. package/dist/skill/references/batch-and-gates.md +142 -0
  105. package/dist/skill/references/compile-and-safe-mode.md +163 -0
  106. package/dist/skill/references/discovery-and-groups.md +30 -0
  107. package/dist/skill/references/routing-and-lifecycle.md +62 -0
  108. package/dist/skill/references/senses-and-tests.md +41 -0
  109. package/dist/skill/references/yaml-and-offline-work.md +33 -0
  110. package/dist/templates/mcp-wrapper.sh +35 -0
  111. package/dist/tool-contract.d.ts +8 -0
  112. package/dist/tool-contract.js +253 -0
  113. package/dist/tool-contract.js.map +1 -0
  114. package/dist/tool-router.d.ts +62 -7
  115. package/dist/tool-router.js +455 -17
  116. package/dist/tool-router.js.map +1 -1
  117. package/dist/tool-session-state.d.ts +6 -0
  118. package/dist/tool-session-state.js +14 -0
  119. package/dist/tool-session-state.js.map +1 -1
  120. package/dist/tools/agent-capabilities.js +9 -0
  121. package/dist/tools/agent-capabilities.js.map +1 -1
  122. package/dist/tools/batch-execute.js +17 -14
  123. package/dist/tools/batch-execute.js.map +1 -1
  124. package/dist/tools/bridge-status.js +4 -5
  125. package/dist/tools/bridge-status.js.map +1 -1
  126. package/dist/tools/compile-check.js +6 -4
  127. package/dist/tools/compile-check.js.map +1 -1
  128. package/dist/tools/component-get.js +2 -2
  129. package/dist/tools/component-get.js.map +1 -1
  130. package/dist/tools/component-modify.js +4 -4
  131. package/dist/tools/component-modify.js.map +1 -1
  132. package/dist/tools/execute-csharp.js +8 -4
  133. package/dist/tools/execute-csharp.js.map +1 -1
  134. package/dist/tools/gameobject-modify.js +2 -1
  135. package/dist/tools/gameobject-modify.js.map +1 -1
  136. package/dist/tools/index.d.ts +2 -0
  137. package/dist/tools/index.js +10 -2
  138. package/dist/tools/index.js.map +1 -1
  139. package/dist/tools/inputsim-key.js +12 -14
  140. package/dist/tools/inputsim-key.js.map +1 -1
  141. package/dist/tools/inputsim-pointer.js +3 -3
  142. package/dist/tools/inputsim-pointer.js.map +1 -1
  143. package/dist/tools/inputsim-step.js +7 -8
  144. package/dist/tools/inputsim-step.js.map +1 -1
  145. package/dist/tools/inputsim-touch.js +9 -10
  146. package/dist/tools/inputsim-touch.js.map +1 -1
  147. package/dist/tools/jobs.d.ts +40 -0
  148. package/dist/tools/jobs.js +18 -0
  149. package/dist/tools/jobs.js.map +1 -0
  150. package/dist/tools/manage-tools.js +10 -5
  151. package/dist/tools/manage-tools.js.map +1 -1
  152. package/dist/tools/project-commands.d.ts +40 -0
  153. package/dist/tools/project-commands.js +23 -0
  154. package/dist/tools/project-commands.js.map +1 -0
  155. package/dist/tools/read-compile-errors.js +14 -93
  156. package/dist/tools/read-compile-errors.js.map +1 -1
  157. package/dist/tools/scan-paths.js +4 -4
  158. package/dist/tools/scan-paths.js.map +1 -1
  159. package/dist/tools/schema-fragments.d.ts +15 -3
  160. package/dist/tools/schema-fragments.js +23 -13
  161. package/dist/tools/schema-fragments.js.map +1 -1
  162. package/dist/tools/upgrade.d.ts +40 -0
  163. package/dist/tools/upgrade.js +55 -0
  164. package/dist/tools/upgrade.js.map +1 -0
  165. package/dist/unity-install-discovery.d.ts +24 -0
  166. package/dist/unity-install-discovery.js +113 -4
  167. package/dist/unity-install-discovery.js.map +1 -1
  168. package/package.json +4 -3
  169. package/templates/mcp-wrapper.sh +35 -0
@@ -144,6 +144,51 @@ export function readInstanceLock(projectPath) {
144
144
  return null;
145
145
  }
146
146
  }
147
+ /**
148
+ * The instance lock whose bridge claims `port`, scanning every lock in
149
+ * {@link instancesDir}. A per-request port override names a bridge, not a
150
+ * project, so this is how the server learns which Editor (and therefore which
151
+ * lock) the override targets. A lock with a live PID wins; otherwise the most
152
+ * recently heartbeated stale claim is returned so the caller classifies it as
153
+ * "gone" exactly like a stale lock found by project path. Locks whose
154
+ * `projectPath` does not hash to their own file name are skipped — re-reading
155
+ * them by project path would land on a different file. Returns null when no
156
+ * lock claims the port. Never throws.
157
+ *
158
+ * @param port bridge port to match against each lock's `port`
159
+ * @param dir lock directory (injectable for tests). Defaults to
160
+ * {@link instancesDir}.
161
+ */
162
+ export function findInstanceLockByPort(port, dir = instancesDir()) {
163
+ let entries;
164
+ try {
165
+ entries = readdirSync(dir);
166
+ }
167
+ catch {
168
+ return null;
169
+ }
170
+ let stale = null;
171
+ for (const entry of entries) {
172
+ if (!entry.endsWith(".json"))
173
+ continue;
174
+ let lock;
175
+ try {
176
+ lock = JSON.parse(readFileSync(join(dir, entry), "utf8"));
177
+ }
178
+ catch {
179
+ continue;
180
+ }
181
+ if (!lock || lock.port !== port || typeof lock.projectPath !== "string" || !lock.projectPath)
182
+ continue;
183
+ if (`${projectHash(lock.projectPath)}.json` !== entry)
184
+ continue;
185
+ if (isPidAlive(lock.pid))
186
+ return lock;
187
+ if (!stale || heartbeatAgeMs(lock) < heartbeatAgeMs(stale))
188
+ stale = lock;
189
+ }
190
+ return stale;
191
+ }
147
192
  /**
148
193
  * kill -0 equivalent. Returns true if a process with the given pid exists.
149
194
  * Wrapped in try/catch: EPERM (exists but can't be probed) → true,
@@ -1 +1 @@
1
- {"version":3,"file":"instance-discovery.js","sourceRoot":"","sources":["../src/instance-discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instance-discovery.js","sourceRoot":"","sources":["../src/instance-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type LiveClient } from "../live-client.js";
2
+ import { type JobOperation, type JobOwner } from "./job-manager.js";
3
+ type ClientFor = (owner: JobOwner) => LiveClient;
4
+ export declare function testRunOperation(client: ClientFor): JobOperation;
5
+ /** Bound the bridge status poll so a hung async command cannot own the project queue forever. */
6
+ export declare const PROJECT_JOB_DEFAULT_DEADLINE_MS: number;
7
+ /** How long the bridge may leave status polls unanswered before the job's outcome counts as unknown. */
8
+ export declare const PROJECT_JOB_DEFAULT_UNREACHABLE_MS: number;
9
+ export interface ProjectJobPollOptions {
10
+ deadlineMs?: number;
11
+ pollIntervalMs?: number;
12
+ unreachableMs?: number;
13
+ }
14
+ export declare function projectCommandOperation(id: string, cancellable: boolean, client: ClientFor, poll?: ProjectJobPollOptions): JobOperation;
15
+ export {};
@@ -0,0 +1,147 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { ProjectJobHttpError } from "../live-client.js";
3
+ import { validateSchema } from "../tool-contract.js";
4
+ import { runTests } from "../tools/run-tests.js";
5
+ import { JobManagerError } from "./job-manager.js";
6
+ function invalid(errors) {
7
+ if (errors.length)
8
+ throw new JobManagerError("invalid_arguments", errors.join("; "));
9
+ }
10
+ export function testRunOperation(client) {
11
+ return {
12
+ // A test run has side effects even though the legacy tool is classified as a sense.
13
+ mutating: true, cancellable: false,
14
+ validate(args) {
15
+ invalid(validateSchema(args, runTests.inputSchema));
16
+ if (args.run_id !== undefined)
17
+ throw new JobManagerError("invalid_arguments", "Jobs own run_id; use idempotency_key to retry.");
18
+ },
19
+ async run(args, context) {
20
+ context.report({ phase: "starting test run" });
21
+ const response = await client(context.owner).runTestsJob({ ...args, run_id: context.jobId, timeout_ms: args.timeout_ms ?? 600000 }, () => {
22
+ context.lifecycle("connected", `Test results owned by run id ${context.jobId}`, true);
23
+ context.report({ phase: "awaiting test result file" });
24
+ });
25
+ const text = response.content.find(item => item.type === "text");
26
+ const result = text?.type === "text" ? JSON.parse(text.text) : {};
27
+ if (result.error?.code === "test_results_timeout" || result.error?.code === "timeout") {
28
+ context.lifecycle("disconnected", "Test result observation budget expired; run may still be executing.", false);
29
+ }
30
+ if (response.isError || result.status === "aborted" || result.summary?.failed > 0)
31
+ return { state: "failed", error: { code: result.error?.code ?? "test_run_failed", message: result.error?.message ?? "Test run did not pass." }, result };
32
+ if (result.status !== "completed" || result.runId !== context.jobId || !result.summary)
33
+ throw new Error("Test result did not confirm terminal ownership.");
34
+ context.report({ phase: "test results received" });
35
+ return { state: "succeeded", result };
36
+ },
37
+ };
38
+ }
39
+ /** Bound the bridge status poll so a hung async command cannot own the project queue forever. */
40
+ export const PROJECT_JOB_DEFAULT_DEADLINE_MS = 30 * 60_000;
41
+ /** How long the bridge may leave status polls unanswered before the job's outcome counts as unknown. */
42
+ export const PROJECT_JOB_DEFAULT_UNREACHABLE_MS = 5 * 60_000;
43
+ export function projectCommandOperation(id, cancellable, client, poll = {}) {
44
+ const deadlineMs = poll.deadlineMs ?? PROJECT_JOB_DEFAULT_DEADLINE_MS;
45
+ const pollIntervalMs = poll.pollIntervalMs ?? 500;
46
+ const unreachableMs = poll.unreachableMs ?? PROJECT_JOB_DEFAULT_UNREACHABLE_MS;
47
+ return {
48
+ mutating: true, cancellable,
49
+ validate(args) {
50
+ const allowed = ["args", "schema_version", "paths_hint", "gate", "ignore_scene_dirty", "confirm_bypass"];
51
+ invalid(Object.keys(args).filter(key => !allowed.includes(key)).map(key => `Unknown project job option: ${key}`));
52
+ },
53
+ async run(args, context) {
54
+ const live = client(context.owner);
55
+ context.report({ phase: "preflight" });
56
+ const catalog = await live.projectCommands({ action: "describe", id });
57
+ const command = catalog.command;
58
+ if (!command?.available || !command.async || command.cancellable !== cancellable)
59
+ return { state: "failed", error: { code: "command_unavailable", message: "Describe the command again; async contract is unavailable or changed." } };
60
+ const errors = validateSchema(args.args ?? {}, command.inputSchema);
61
+ if (errors.length)
62
+ return { state: "failed", error: { code: "invalid_arguments", message: errors.join("; ") } };
63
+ let response = await live.projectCommandJob({ action: "start", job_id: context.jobId,
64
+ invocation: { ...args, action: "invoke", command_id: id, schema_version: args.schema_version ?? command.schemaVersion } });
65
+ let cancelSent = false;
66
+ let phase;
67
+ let ownershipConfirmed = false;
68
+ const startedAt = Date.now();
69
+ while (true) {
70
+ if (response.error || response.mutation?.success === false) {
71
+ if (response.error?.code === "job_not_found")
72
+ context.lifecycle("disconnected", "Bridge lost domain-local job ownership.", false);
73
+ return { state: "failed", error: { code: response.error?.code ?? response.mutation?.error?.code ?? "command_rejected", message: response.error?.message ?? response.mutation?.error?.message ?? "Bridge rejected command." }, result: response };
74
+ }
75
+ if (response.job_id !== context.jobId)
76
+ throw new Error("Bridge did not confirm job ownership");
77
+ if (!ownershipConfirmed) {
78
+ context.lifecycle("connected", `Bridge owns job ${context.jobId}`, true);
79
+ ownershipConfirmed = true;
80
+ }
81
+ if (phase !== response.phase) {
82
+ phase = response.phase;
83
+ context.report({ phase: response.phase });
84
+ }
85
+ if (response.state === "succeeded")
86
+ return { state: "succeeded", result: response.result };
87
+ if (response.state === "cancelled")
88
+ return { state: "cancelled", result: response.result };
89
+ if (response.state === "failed")
90
+ return { state: "failed", error: { code: "command_failed", message: "See terminal gate/command result." }, result: response.result };
91
+ // A poll only observes work the bridge keeps running. A main thread busy
92
+ // past the bridge's dispatch timeout (an import, synchronous project code)
93
+ // answers HTTP 500 or not at all, so an unanswered poll is retried with
94
+ // backoff. A cancel is not resent: it may still be queued, and the status
95
+ // polls after it show whether it was acknowledged.
96
+ const answeredAt = Date.now();
97
+ let failures = 0;
98
+ while (true) {
99
+ if (Date.now() - startedAt >= deadlineMs) {
100
+ // The bridge never reported a terminal state. Ask it to stop when the
101
+ // contract allows, then release this job's execution slot as orphaned:
102
+ // the remote outcome is unknown, so a blind retry is not safe.
103
+ if (cancellable && !cancelSent) {
104
+ cancelSent = true;
105
+ try {
106
+ await live.projectCommandJob({ action: "cancel", job_id: context.jobId });
107
+ }
108
+ catch { /* best effort */ }
109
+ }
110
+ context.lifecycle("disconnected", `Bridge job reported no terminal state within ${deadlineMs} ms; outcome unknown.`, false);
111
+ return { state: "failed", error: { code: "job_deadline_exceeded", message: `No terminal state within ${deadlineMs} ms.` }, result: response };
112
+ }
113
+ if (failures && Date.now() - answeredAt >= unreachableMs) {
114
+ context.lifecycle("disconnected", `Bridge answered no job poll for ${unreachableMs} ms; outcome unknown.`, false);
115
+ return { state: "failed", error: { code: "job_status_unavailable", message: `No job status within ${unreachableMs} ms.` }, result: response };
116
+ }
117
+ // The backoff yields to a cancel request: an abort while sleeping
118
+ // ends the sleep so the cancel goes out now, not after the backoff.
119
+ // Once the cancel has been sent the signal stays aborted, so the
120
+ // remaining status polls sleep without it.
121
+ try {
122
+ await delay(pollIntervalMs * 2 ** Math.min(failures, 3), undefined, cancelSent ? undefined : { signal: context.signal });
123
+ }
124
+ catch { /* aborted: forward the cancel below */ }
125
+ const action = context.signal.aborted && !cancelSent ? "cancel" : "status";
126
+ if (action === "cancel")
127
+ cancelSent = true;
128
+ try {
129
+ response = await live.projectCommandJob({ action, job_id: context.jobId });
130
+ break;
131
+ }
132
+ catch (error) {
133
+ // A 4xx is the bridge refusing the transport itself; retrying cannot help.
134
+ if (error instanceof ProjectJobHttpError && error.status < 500)
135
+ throw error;
136
+ if (failures++ === 0) {
137
+ // Ownership was confirmed by the last answer; the next answer reconfirms it.
138
+ ownershipConfirmed = false;
139
+ context.lifecycle("disconnected", `Job poll failed (${String(error).slice(0, 200)}); retrying while the bridge owns job ${context.jobId}.`, true);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/jobs/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { JobManager, type JobOwner } from "./job-manager.js";
2
+ /** Action-specific validation also applies when invoked outside the stdio server. */
3
+ export declare function handleJobs(manager: JobManager, owner: JobOwner, args: Record<string, unknown>): Promise<unknown>;
@@ -0,0 +1,29 @@
1
+ import { JobManagerError } from "./job-manager.js";
2
+ /** Action-specific validation also applies when invoked outside the stdio server. */
3
+ export async function handleJobs(manager, owner, args) {
4
+ const allowed = {
5
+ start: ["tool_or_command", "args", "idempotency_key"], status: ["job_id"],
6
+ wait: ["job_id", "timeout_ms"], cancel: ["job_id"], list: ["state", "operation", "cursor", "limit"],
7
+ };
8
+ const action = String(args.action);
9
+ if (!Object.hasOwn(allowed, action) || Object.keys(args).some(key => key !== "action" && !allowed[action].includes(key)))
10
+ throw new JobManagerError("invalid_arguments", "Use only arguments belonging to the selected jobs action.");
11
+ if (action === "start") {
12
+ if (typeof args.tool_or_command !== "string" || !args.tool_or_command.trim())
13
+ throw new JobManagerError("invalid_arguments", "start requires tool_or_command.");
14
+ return manager.start(owner, args.tool_or_command, (args.args ?? {}), args.idempotency_key);
15
+ }
16
+ if (action === "list")
17
+ return manager.list(owner, {
18
+ ...(args.state === undefined ? {} : { state: args.state }),
19
+ ...(args.operation === undefined ? {} : { operation: args.operation }),
20
+ }, args.cursor, args.limit);
21
+ if (typeof args.job_id !== "string" || !args.job_id.trim())
22
+ throw new JobManagerError("invalid_arguments", `${action} requires job_id.`);
23
+ if (action === "status")
24
+ return manager.status(owner, args.job_id);
25
+ if (action === "cancel")
26
+ return manager.cancel(owner, args.job_id);
27
+ return manager.wait(owner, args.job_id, args.timeout_ms);
28
+ }
29
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/jobs/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAgC,MAAM,kBAAkB,CAAC;AAE7F,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAmB,EAAE,KAAe,EAAE,IAA6B;IAClG,MAAM,OAAO,GAA6B;QACxC,KAAK,EAAE,CAAC,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC;QACzE,IAAI,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;KACpG,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtH,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,2DAA2D,CAAC,CAAC;IAC9G,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,iCAAiC,CAAC,CAAC;QAChK,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAA4B,EAAE,IAAI,CAAC,eAAqC,CAAC,CAAC;IAC9I,CAAC;IACD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;YAChD,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAiB,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAmB,EAAE,CAAC;SACjF,EAAE,IAAI,CAAC,MAA4B,EAAE,IAAI,CAAC,KAA2B,CAAC,CAAC;IACxE,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,eAAe,CAAC,mBAAmB,EAAE,GAAG,MAAM,mBAAmB,CAAC,CAAC;IACzI,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAgC,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,123 @@
1
+ export declare const JOB_STATES: readonly ["queued", "running", "succeeded", "failed", "cancel_requested", "cancelled", "orphaned"];
2
+ export type JobState = typeof JOB_STATES[number];
3
+ export interface JobOwner {
4
+ project: string;
5
+ agent: string;
6
+ port?: number;
7
+ }
8
+ export interface JobError {
9
+ code: string;
10
+ message: string;
11
+ }
12
+ export type JobOutcome = {
13
+ state: "succeeded";
14
+ result: unknown;
15
+ } | {
16
+ state: "failed";
17
+ error: JobError;
18
+ result?: unknown;
19
+ } | {
20
+ state: "cancelled";
21
+ result?: unknown;
22
+ };
23
+ export interface JobContext {
24
+ jobId: string;
25
+ owner: JobOwner;
26
+ signal: AbortSignal;
27
+ report(progress: {
28
+ phase: string;
29
+ fraction?: number;
30
+ }): void;
31
+ /** Call on disconnect/reload. Only operation-specific ownership evidence permits continuation. */
32
+ lifecycle(state: "connected" | "reloading" | "disconnected", evidence: string, ownershipProven: boolean): void;
33
+ }
34
+ export interface JobOperation {
35
+ mutating: boolean;
36
+ cancellable: boolean;
37
+ /** Pure preflight. Execution must preserve the owning operation's scope/gate/validation contract. */
38
+ validate(args: Record<string, unknown>): void;
39
+ /** Must yield promptly; use callbacks/async transport, never a blocking main-thread operation. */
40
+ run(args: Record<string, unknown>, context: JobContext): Promise<JobOutcome>;
41
+ }
42
+ export interface JobSnapshot {
43
+ job_id: string;
44
+ operation: string;
45
+ owner: JobOwner;
46
+ state: JobState;
47
+ created_at: number;
48
+ updated_at: number;
49
+ started_at: number | null;
50
+ finished_at: number | null;
51
+ progress: {
52
+ phase: string;
53
+ fraction?: number;
54
+ } | null;
55
+ cancellable: boolean;
56
+ lifecycle: {
57
+ state: "not_started" | "connected" | "reloading" | "disconnected";
58
+ evidence: string | null;
59
+ };
60
+ events: Array<{
61
+ at: number;
62
+ kind: string;
63
+ detail: string;
64
+ }>;
65
+ result?: unknown;
66
+ error?: JobError;
67
+ }
68
+ export declare class JobManagerError extends Error {
69
+ readonly code: string;
70
+ constructor(code: string, message: string);
71
+ }
72
+ export interface JobManagerOptions {
73
+ maxJobs: number;
74
+ retentionMs: number;
75
+ maxConcurrent: number;
76
+ perProject: number;
77
+ perAgent: number;
78
+ maxEvents: number;
79
+ maxPayloadBytes: number;
80
+ maxWaiters: number;
81
+ }
82
+ /** Session-only owner. No replay, disk persistence, or automatic transport retries. */
83
+ export declare class JobManager {
84
+ private readonly operations;
85
+ private readonly entries;
86
+ private readonly keys;
87
+ private sequence;
88
+ private readonly session;
89
+ private readonly options;
90
+ private readonly cleanupTimer;
91
+ private closed;
92
+ private readonly now;
93
+ constructor(options?: Partial<JobManagerOptions>, now?: () => number);
94
+ hasOperation(name: string): boolean;
95
+ /** Whether an owner's idempotency key already names a retained job, whose retried start needs no adapter resolution. */
96
+ hasKey(owner: JobOwner, key: string): boolean;
97
+ operation(name: string): JobOperation | undefined;
98
+ /** `replace` swaps an adapter whose bridge-side contract changed; jobs already running keep the operation they started with. */
99
+ register(name: string, operation: JobOperation, replace?: boolean): void;
100
+ private copy;
101
+ /** A terminal result above the payload limit is dropped, never allowed to turn a known outcome into an orphan. */
102
+ private boundedResult;
103
+ private event;
104
+ private transition;
105
+ private snapshot;
106
+ private scopedKey;
107
+ private find;
108
+ start(owner: JobOwner, name: string, args: Record<string, unknown>, key?: string): JobSnapshot;
109
+ status(owner: JobOwner, id: string): JobSnapshot;
110
+ wait(owner: JobOwner, id: string, timeoutMs?: number): Promise<JobSnapshot>;
111
+ cancel(owner: JobOwner, id: string): JobSnapshot;
112
+ list(owner: JobOwner, filters?: {
113
+ state?: JobState;
114
+ operation?: string;
115
+ }, cursor?: string, limit?: number): {
116
+ jobs: JobSnapshot[];
117
+ next_cursor: string | null;
118
+ };
119
+ cleanup(): void;
120
+ close(): void;
121
+ private pump;
122
+ private execute;
123
+ }