harness-dispatch 0.4.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 (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +582 -0
  3. package/config.default.yaml +397 -0
  4. package/data/coding_benchmarks.json +431 -0
  5. package/dist/auth.d.ts +9 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +73 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/billing.d.ts +7 -0
  10. package/dist/billing.d.ts.map +1 -0
  11. package/dist/billing.js +201 -0
  12. package/dist/billing.js.map +1 -0
  13. package/dist/bin.d.ts +6 -0
  14. package/dist/bin.d.ts.map +1 -0
  15. package/dist/bin.js +488 -0
  16. package/dist/bin.js.map +1 -0
  17. package/dist/breaker-store.d.ts +31 -0
  18. package/dist/breaker-store.d.ts.map +1 -0
  19. package/dist/breaker-store.js +103 -0
  20. package/dist/breaker-store.js.map +1 -0
  21. package/dist/circuit-breaker.d.ts +47 -0
  22. package/dist/circuit-breaker.d.ts.map +1 -0
  23. package/dist/circuit-breaker.js +102 -0
  24. package/dist/circuit-breaker.js.map +1 -0
  25. package/dist/config.d.ts +48 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +1248 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/dashboard/live.d.ts +49 -0
  30. package/dist/dashboard/live.d.ts.map +1 -0
  31. package/dist/dashboard/live.js +149 -0
  32. package/dist/dashboard/live.js.map +1 -0
  33. package/dist/dispatch-log.d.ts +46 -0
  34. package/dist/dispatch-log.d.ts.map +1 -0
  35. package/dist/dispatch-log.js +89 -0
  36. package/dist/dispatch-log.js.map +1 -0
  37. package/dist/dispatchers/base.d.ts +55 -0
  38. package/dist/dispatchers/base.d.ts.map +1 -0
  39. package/dist/dispatchers/base.js +80 -0
  40. package/dist/dispatchers/base.js.map +1 -0
  41. package/dist/dispatchers/generic-cli.d.ts +30 -0
  42. package/dist/dispatchers/generic-cli.d.ts.map +1 -0
  43. package/dist/dispatchers/generic-cli.js +471 -0
  44. package/dist/dispatchers/generic-cli.js.map +1 -0
  45. package/dist/dispatchers/openai-compatible.d.ts +57 -0
  46. package/dist/dispatchers/openai-compatible.d.ts.map +1 -0
  47. package/dist/dispatchers/openai-compatible.js +662 -0
  48. package/dist/dispatchers/openai-compatible.js.map +1 -0
  49. package/dist/dispatchers/shared/kill-tree.d.ts +21 -0
  50. package/dist/dispatchers/shared/kill-tree.d.ts.map +1 -0
  51. package/dist/dispatchers/shared/kill-tree.js +35 -0
  52. package/dist/dispatchers/shared/kill-tree.js.map +1 -0
  53. package/dist/dispatchers/shared/rate-limit-headers.d.ts +22 -0
  54. package/dist/dispatchers/shared/rate-limit-headers.d.ts.map +1 -0
  55. package/dist/dispatchers/shared/rate-limit-headers.js +124 -0
  56. package/dist/dispatchers/shared/rate-limit-headers.js.map +1 -0
  57. package/dist/dispatchers/shared/stream-subprocess.d.ts +53 -0
  58. package/dist/dispatchers/shared/stream-subprocess.d.ts.map +1 -0
  59. package/dist/dispatchers/shared/stream-subprocess.js +274 -0
  60. package/dist/dispatchers/shared/stream-subprocess.js.map +1 -0
  61. package/dist/dispatchers/shared/subprocess.d.ts +25 -0
  62. package/dist/dispatchers/shared/subprocess.d.ts.map +1 -0
  63. package/dist/dispatchers/shared/subprocess.js +110 -0
  64. package/dist/dispatchers/shared/subprocess.js.map +1 -0
  65. package/dist/dispatchers/shared/which-available.d.ts +2 -0
  66. package/dist/dispatchers/shared/which-available.d.ts.map +1 -0
  67. package/dist/dispatchers/shared/which-available.js +8 -0
  68. package/dist/dispatchers/shared/which-available.js.map +1 -0
  69. package/dist/dispatchers/shared/windows-cmd.d.ts +38 -0
  70. package/dist/dispatchers/shared/windows-cmd.d.ts.map +1 -0
  71. package/dist/dispatchers/shared/windows-cmd.js +91 -0
  72. package/dist/dispatchers/shared/windows-cmd.js.map +1 -0
  73. package/dist/http/server.d.ts +15 -0
  74. package/dist/http/server.d.ts.map +1 -0
  75. package/dist/http/server.js +495 -0
  76. package/dist/http/server.js.map +1 -0
  77. package/dist/index.d.ts +27 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +29 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/job-runner.d.ts +19 -0
  82. package/dist/job-runner.d.ts.map +1 -0
  83. package/dist/job-runner.js +42 -0
  84. package/dist/job-runner.js.map +1 -0
  85. package/dist/jobs.d.ts +116 -0
  86. package/dist/jobs.d.ts.map +1 -0
  87. package/dist/jobs.js +542 -0
  88. package/dist/jobs.js.map +1 -0
  89. package/dist/leaderboard.d.ts +62 -0
  90. package/dist/leaderboard.d.ts.map +1 -0
  91. package/dist/leaderboard.js +287 -0
  92. package/dist/leaderboard.js.map +1 -0
  93. package/dist/mcp/config-hot-reload.d.ts +64 -0
  94. package/dist/mcp/config-hot-reload.d.ts.map +1 -0
  95. package/dist/mcp/config-hot-reload.js +144 -0
  96. package/dist/mcp/config-hot-reload.js.map +1 -0
  97. package/dist/mcp/dispatcher-factory.d.ts +20 -0
  98. package/dist/mcp/dispatcher-factory.d.ts.map +1 -0
  99. package/dist/mcp/dispatcher-factory.js +30 -0
  100. package/dist/mcp/dispatcher-factory.js.map +1 -0
  101. package/dist/mcp/resources.d.ts +8 -0
  102. package/dist/mcp/resources.d.ts.map +1 -0
  103. package/dist/mcp/resources.js +45 -0
  104. package/dist/mcp/resources.js.map +1 -0
  105. package/dist/mcp/server.d.ts +36 -0
  106. package/dist/mcp/server.d.ts.map +1 -0
  107. package/dist/mcp/server.js +80 -0
  108. package/dist/mcp/server.js.map +1 -0
  109. package/dist/mcp/tools.d.ts +171 -0
  110. package/dist/mcp/tools.d.ts.map +1 -0
  111. package/dist/mcp/tools.js +658 -0
  112. package/dist/mcp/tools.js.map +1 -0
  113. package/dist/observability/index.d.ts +52 -0
  114. package/dist/observability/index.d.ts.map +1 -0
  115. package/dist/observability/index.js +111 -0
  116. package/dist/observability/index.js.map +1 -0
  117. package/dist/observability/spans.d.ts +47 -0
  118. package/dist/observability/spans.d.ts.map +1 -0
  119. package/dist/observability/spans.js +72 -0
  120. package/dist/observability/spans.js.map +1 -0
  121. package/dist/quota.d.ts +91 -0
  122. package/dist/quota.d.ts.map +1 -0
  123. package/dist/quota.js +331 -0
  124. package/dist/quota.js.map +1 -0
  125. package/dist/route-policy.d.ts +24 -0
  126. package/dist/route-policy.d.ts.map +1 -0
  127. package/dist/route-policy.js +92 -0
  128. package/dist/route-policy.js.map +1 -0
  129. package/dist/router.d.ts +162 -0
  130. package/dist/router.d.ts.map +1 -0
  131. package/dist/router.js +878 -0
  132. package/dist/router.js.map +1 -0
  133. package/dist/safety.d.ts +7 -0
  134. package/dist/safety.d.ts.map +1 -0
  135. package/dist/safety.js +33 -0
  136. package/dist/safety.js.map +1 -0
  137. package/dist/status.d.ts +100 -0
  138. package/dist/status.d.ts.map +1 -0
  139. package/dist/status.js +228 -0
  140. package/dist/status.js.map +1 -0
  141. package/dist/types.d.ts +402 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +9 -0
  144. package/dist/types.js.map +1 -0
  145. package/dist/version.d.ts +2 -0
  146. package/dist/version.d.ts.map +1 -0
  147. package/dist/version.js +13 -0
  148. package/dist/version.js.map +1 -0
  149. package/dist/working-dir.d.ts +15 -0
  150. package/dist/working-dir.d.ts.map +1 -0
  151. package/dist/working-dir.js +22 -0
  152. package/dist/working-dir.js.map +1 -0
  153. package/dist/workspaces.d.ts +19 -0
  154. package/dist/workspaces.d.ts.map +1 -0
  155. package/dist/workspaces.js +352 -0
  156. package/dist/workspaces.js.map +1 -0
  157. package/package.json +96 -0
@@ -0,0 +1,352 @@
1
+ import { execFile as execFileCb } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { copyFile, mkdir, readdir, readFile, readlink, rm, stat, symlink, } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { promisify } from "node:util";
7
+ const execFile = promisify(execFileCb);
8
+ const EXCLUDED_DIRS = new Set([
9
+ ".git",
10
+ "node_modules",
11
+ "dist",
12
+ "build",
13
+ "coverage",
14
+ ".next",
15
+ ".turbo",
16
+ "target",
17
+ "bin",
18
+ "obj",
19
+ ".venv",
20
+ "venv",
21
+ "__pycache__",
22
+ ]);
23
+ export function workspacePolicyFor(svc, safetyProfile, requestedPolicy) {
24
+ if (requestedPolicy)
25
+ return requestedPolicy;
26
+ if (svc.workspacePolicy)
27
+ return svc.workspacePolicy;
28
+ return safetyProfile === "read_only" ? "shared" : "shared_locked";
29
+ }
30
+ export function isIsolatedWorkspacePolicy(policy) {
31
+ return policy === "copy" || policy === "git_worktree";
32
+ }
33
+ function safeName(value) {
34
+ return value.replace(/[^A-Za-z0-9_.-]/g, "_").slice(0, 80) || "route";
35
+ }
36
+ function workspaceRunId(routeName) {
37
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
38
+ return `${stamp}-${process.pid}-${safeName(routeName)}-${randomUUID().slice(0, 8)}`;
39
+ }
40
+ function resolveDir(workingDir) {
41
+ return path.resolve(workingDir || process.cwd());
42
+ }
43
+ function workspaceRootFor(originalWorkingDir) {
44
+ return (process.env.HARNESS_DISPATCH_WORKSPACES_DIR ??
45
+ path.join(originalWorkingDir, ".harness-dispatch", "workspaces"));
46
+ }
47
+ function gitWorkspaceRootFor(originalWorkingDir) {
48
+ return (process.env.HARNESS_DISPATCH_WORKSPACES_DIR ??
49
+ path.join(os.tmpdir(), "harness-dispatch", "workspaces", safeName(path.basename(originalWorkingDir))));
50
+ }
51
+ const DEFAULT_WORKSPACE_MAX_AGE_MS = 24 * 60 * 60 * 1000;
52
+ function workspaceMaxAgeMs() {
53
+ const raw = process.env.HARNESS_DISPATCH_WORKSPACE_MAX_AGE_MS;
54
+ const parsed = raw ? Number(raw) : NaN;
55
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_WORKSPACE_MAX_AGE_MS;
56
+ }
57
+ /**
58
+ * Every isolated (copy/git_worktree) dispatch leaves its workspace on disk
59
+ * on purpose — the caller may still want to inspect changedFiles/diffSummary
60
+ * after the tool call returns, so finish() never deletes anything itself.
61
+ * Without SOME reclamation, that's unbounded growth (and for git_worktree,
62
+ * .git/worktrees bloat that can eventually slow or break `git worktree add`
63
+ * itself). Prune anything past the retention window each time a new one is
64
+ * about to be created — self-limiting, no separate scheduler needed. Best
65
+ * effort: a prune failure must never block or fail the actual dispatch.
66
+ */
67
+ async function pruneStaleCopyWorkspaces(root) {
68
+ const maxAgeMs = workspaceMaxAgeMs();
69
+ let entries;
70
+ try {
71
+ entries = await readdir(root, { withFileTypes: true });
72
+ }
73
+ catch {
74
+ return;
75
+ }
76
+ const now = Date.now();
77
+ for (const entry of entries) {
78
+ if (!entry.isDirectory())
79
+ continue;
80
+ const full = path.join(root, entry.name);
81
+ try {
82
+ const info = await stat(full);
83
+ if (now - info.mtimeMs > maxAgeMs) {
84
+ await rm(full, { recursive: true, force: true });
85
+ }
86
+ }
87
+ catch {
88
+ // best effort — a locked/already-gone/permission-denied entry is skipped
89
+ }
90
+ }
91
+ }
92
+ async function pruneStaleGitWorktrees(gitRoot, root) {
93
+ const maxAgeMs = workspaceMaxAgeMs();
94
+ let entries;
95
+ try {
96
+ entries = await readdir(root, { withFileTypes: true });
97
+ }
98
+ catch {
99
+ return;
100
+ }
101
+ const now = Date.now();
102
+ let removedAny = false;
103
+ for (const entry of entries) {
104
+ if (!entry.isDirectory())
105
+ continue;
106
+ const workspaceRoot = path.join(root, entry.name);
107
+ try {
108
+ const info = await stat(workspaceRoot);
109
+ if (now - info.mtimeMs <= maxAgeMs)
110
+ continue;
111
+ const worktreeRoot = path.join(workspaceRoot, "worktree");
112
+ try {
113
+ await git(["worktree", "remove", "--force", worktreeRoot], gitRoot);
114
+ removedAny = true;
115
+ }
116
+ catch {
117
+ // Worktree already gone/never registered — fall through to the
118
+ // filesystem cleanup below either way.
119
+ }
120
+ await rm(workspaceRoot, { recursive: true, force: true });
121
+ }
122
+ catch {
123
+ // best effort
124
+ }
125
+ }
126
+ if (removedAny) {
127
+ try {
128
+ await git(["worktree", "prune"], gitRoot);
129
+ }
130
+ catch {
131
+ // best effort
132
+ }
133
+ }
134
+ }
135
+ function shouldExclude(relPath, direntName) {
136
+ if (EXCLUDED_DIRS.has(direntName))
137
+ return true;
138
+ const normalized = relPath.split(path.sep).join("/");
139
+ return normalized === ".harness-dispatch/workspaces" || normalized.startsWith(".harness-dispatch/workspaces/");
140
+ }
141
+ async function copyTree(sourceRoot, destRoot, rel = "") {
142
+ const sourceDir = rel ? path.join(sourceRoot, rel) : sourceRoot;
143
+ const destDir = rel ? path.join(destRoot, rel) : destRoot;
144
+ await mkdir(destDir, { recursive: true });
145
+ const entries = await readdir(sourceDir, { withFileTypes: true });
146
+ for (const entry of entries) {
147
+ const childRel = rel ? path.join(rel, entry.name) : entry.name;
148
+ if (entry.isDirectory()) {
149
+ if (shouldExclude(childRel, entry.name))
150
+ continue;
151
+ await copyTree(sourceRoot, destRoot, childRel);
152
+ continue;
153
+ }
154
+ if (entry.isFile()) {
155
+ await copyFile(path.join(sourceRoot, childRel), path.join(destRoot, childRel));
156
+ continue;
157
+ }
158
+ if (entry.isSymbolicLink()) {
159
+ // Preserve relative symlinks, but do not resolve links during copying.
160
+ try {
161
+ const target = await readlink(path.join(sourceRoot, childRel));
162
+ await symlink(target, path.join(destRoot, childRel));
163
+ }
164
+ catch {
165
+ // Symlink preservation is best effort; agents can still work with the copied files.
166
+ }
167
+ }
168
+ }
169
+ }
170
+ async function fingerprintFile(filePath) {
171
+ const data = await readFile(filePath);
172
+ return {
173
+ hash: createHash("sha256").update(data).digest("hex"),
174
+ size: data.byteLength,
175
+ };
176
+ }
177
+ async function fingerprintTree(root, rel = "", out = new Map()) {
178
+ const current = rel ? path.join(root, rel) : root;
179
+ const entries = await readdir(current, { withFileTypes: true });
180
+ for (const entry of entries) {
181
+ const childRel = rel ? path.join(rel, entry.name) : entry.name;
182
+ if (entry.isDirectory()) {
183
+ if (shouldExclude(childRel, entry.name))
184
+ continue;
185
+ await fingerprintTree(root, childRel, out);
186
+ continue;
187
+ }
188
+ if (!entry.isFile())
189
+ continue;
190
+ out.set(childRel.split(path.sep).join("/"), await fingerprintFile(path.join(root, childRel)));
191
+ }
192
+ return out;
193
+ }
194
+ function diffFingerprints(before, after) {
195
+ const changes = [];
196
+ const paths = new Set([...before.keys(), ...after.keys()]);
197
+ for (const filePath of [...paths].sort()) {
198
+ const oldFile = before.get(filePath);
199
+ const newFile = after.get(filePath);
200
+ if (!oldFile && newFile) {
201
+ changes.push({ path: filePath, kind: "added" });
202
+ continue;
203
+ }
204
+ if (oldFile && !newFile) {
205
+ changes.push({ path: filePath, kind: "deleted" });
206
+ continue;
207
+ }
208
+ if (oldFile && newFile && (oldFile.hash !== newFile.hash || oldFile.size !== newFile.size)) {
209
+ changes.push({ path: filePath, kind: "modified" });
210
+ }
211
+ }
212
+ return changes;
213
+ }
214
+ function mapFiles(files, originalWorkingDir, effectiveWorkingDir) {
215
+ return files.map((file) => {
216
+ const resolved = path.resolve(file);
217
+ const rel = path.relative(originalWorkingDir, resolved);
218
+ if (rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel))) {
219
+ return path.join(effectiveWorkingDir, rel);
220
+ }
221
+ return file;
222
+ });
223
+ }
224
+ function diffSummary(changes) {
225
+ if (changes.length === 0)
226
+ return "No file changes detected in the agent workspace.";
227
+ const counts = { added: 0, modified: 0, deleted: 0 };
228
+ for (const change of changes)
229
+ counts[change.kind] += 1;
230
+ return `${changes.length} changed file(s): ${counts.added} added, ${counts.modified} modified, ${counts.deleted} deleted.`;
231
+ }
232
+ function attachWorkspace(result, workspace) {
233
+ return {
234
+ ...result,
235
+ workspace,
236
+ };
237
+ }
238
+ async function prepareSharedWorkspace(policy, workingDir, files) {
239
+ const originalWorkingDir = resolveDir(workingDir);
240
+ return {
241
+ policy,
242
+ originalWorkingDir,
243
+ effectiveWorkingDir: originalWorkingDir,
244
+ files,
245
+ isolated: false,
246
+ async finish(result) {
247
+ return attachWorkspace(result, {
248
+ policy,
249
+ originalWorkingDir,
250
+ effectiveWorkingDir: originalWorkingDir,
251
+ isolated: false,
252
+ securityBoundary: "none",
253
+ notes: policy === "shared_locked"
254
+ ? ["Write-capable shared workspace dispatches are serialized within this router process."]
255
+ : ["Shared workspace dispatches run directly in the caller's working directory."],
256
+ });
257
+ },
258
+ };
259
+ }
260
+ async function prepareCopyWorkspace(routeName, workingDir, files) {
261
+ const originalWorkingDir = resolveDir(workingDir);
262
+ const root = workspaceRootFor(originalWorkingDir);
263
+ await pruneStaleCopyWorkspaces(root);
264
+ const workspaceRoot = path.join(root, workspaceRunId(routeName));
265
+ const effectiveWorkingDir = path.join(workspaceRoot, "workspace");
266
+ await copyTree(originalWorkingDir, effectiveWorkingDir);
267
+ const before = await fingerprintTree(effectiveWorkingDir);
268
+ return {
269
+ policy: "copy",
270
+ originalWorkingDir,
271
+ effectiveWorkingDir,
272
+ files: mapFiles(files, originalWorkingDir, effectiveWorkingDir),
273
+ isolated: true,
274
+ workspaceRoot,
275
+ async finish(result) {
276
+ const after = await fingerprintTree(effectiveWorkingDir);
277
+ const changedFiles = diffFingerprints(before, after);
278
+ return attachWorkspace(result, {
279
+ policy: "copy",
280
+ originalWorkingDir,
281
+ effectiveWorkingDir,
282
+ workspaceRoot,
283
+ isolated: true,
284
+ securityBoundary: "project_state_and_process_cwd",
285
+ changedFiles,
286
+ diffSummary: diffSummary(changedFiles),
287
+ cleanupHint: `Remove ${workspaceRoot} when the isolated result is no longer needed.`,
288
+ notes: [
289
+ "The source workspace was copied before dispatch, so edits in the agent workspace are not applied automatically.",
290
+ "This isolates project state, but it is not a hardened OS sandbox for commands with host filesystem access.",
291
+ ],
292
+ });
293
+ },
294
+ };
295
+ }
296
+ async function git(args, cwd) {
297
+ const { stdout } = await execFile("git", args, { cwd, windowsHide: true });
298
+ return String(stdout).trim();
299
+ }
300
+ async function prepareGitWorktreeWorkspace(routeName, workingDir, files) {
301
+ const originalWorkingDir = resolveDir(workingDir);
302
+ const gitRoot = await git(["rev-parse", "--show-toplevel"], originalWorkingDir);
303
+ const prefix = await git(["rev-parse", "--show-prefix"], originalWorkingDir);
304
+ const gitWorkspaceRoot = gitWorkspaceRootFor(gitRoot);
305
+ await pruneStaleGitWorktrees(gitRoot, gitWorkspaceRoot);
306
+ const workspaceRoot = path.join(gitWorkspaceRoot, workspaceRunId(routeName));
307
+ const worktreeRoot = path.join(workspaceRoot, "worktree");
308
+ await mkdir(workspaceRoot, { recursive: true });
309
+ await git(["worktree", "add", "--detach", worktreeRoot, "HEAD"], gitRoot);
310
+ const effectiveWorkingDir = prefix ? path.join(worktreeRoot, prefix) : worktreeRoot;
311
+ await stat(effectiveWorkingDir);
312
+ const before = await fingerprintTree(worktreeRoot);
313
+ return {
314
+ policy: "git_worktree",
315
+ originalWorkingDir,
316
+ effectiveWorkingDir,
317
+ files: mapFiles(files, gitRoot, worktreeRoot),
318
+ isolated: true,
319
+ workspaceRoot,
320
+ async finish(result) {
321
+ const after = await fingerprintTree(worktreeRoot);
322
+ const changedFiles = diffFingerprints(before, after);
323
+ return attachWorkspace(result, {
324
+ policy: "git_worktree",
325
+ originalWorkingDir,
326
+ effectiveWorkingDir,
327
+ workspaceRoot,
328
+ isolated: true,
329
+ securityBoundary: "project_state_and_process_cwd",
330
+ changedFiles,
331
+ diffSummary: diffSummary(changedFiles),
332
+ cleanupHint: `Run git -C ${gitRoot} worktree remove ${worktreeRoot} when the isolated result is no longer needed.`,
333
+ notes: [
334
+ "The git worktree starts from HEAD; uncommitted source-workspace changes are not copied into it.",
335
+ "This isolates project state, but it is not a hardened OS sandbox for commands with host filesystem access.",
336
+ ],
337
+ });
338
+ },
339
+ };
340
+ }
341
+ export async function prepareWorkspace(opts) {
342
+ switch (opts.policy) {
343
+ case "shared":
344
+ case "shared_locked":
345
+ return prepareSharedWorkspace(opts.policy, opts.workingDir, opts.files);
346
+ case "copy":
347
+ return prepareCopyWorkspace(opts.routeName, opts.workingDir, opts.files);
348
+ case "git_worktree":
349
+ return prepareGitWorktreeWorkspace(opts.routeName, opts.workingDir, opts.files);
350
+ }
351
+ }
352
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../src/workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,IAAI,EACJ,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAWtC,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAEvC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;CACd,CAAC,CAAC;AAmBH,MAAM,UAAU,kBAAkB,CAChC,GAAkB,EAClB,aAAwC,EACxC,eAAiC;IAEjC,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAC5C,IAAI,GAAG,CAAC,eAAe;QAAE,OAAO,GAAG,CAAC,eAAe,CAAC;IACpD,OAAO,aAAa,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAuB;IAC/D,OAAO,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,cAAc,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CAAC,kBAA0B;IAClD,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAC3C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,kBAA0B;IACrD,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,+BAA+B;QAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CACtG,CAAC;AACJ,CAAC;AAED,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzD,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,4BAA4B,CAAC;AACxF,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,wBAAwB,CAAC,IAAY;IAClD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;gBAClC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,OAAe,EAAE,IAAY;IACjE,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC;YACvC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ;gBAAE,SAAS;YAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;gBACpE,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;gBAC/D,uCAAuC;YACzC,CAAC;YACD,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,UAAkB;IACxD,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,UAAU,KAAK,8BAA8B,IAAI,UAAU,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;AACjH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,UAAkB,EAAE,QAAgB,EAAE,GAAG,GAAG,EAAE;IACpE,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClD,MAAM,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,uEAAuE;YACvE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC/D,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,oFAAoF;YACtF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACrD,IAAI,EAAE,IAAI,CAAC,UAAU;KACtB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,GAAG,GAAG,EAAE,EAAE,MAAsB,IAAI,GAAG,EAAE;IACpF,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClD,MAAM,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAS;QAC9B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAsB,EAAE,KAAqB;IACrE,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAe,EAAE,kBAA0B,EAAE,mBAA2B;IACxF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,OAA8B;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,kDAAkD,CAAC;IACpF,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACrD,KAAK,MAAM,MAAM,IAAI,OAAO;QAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,GAAG,OAAO,CAAC,MAAM,qBAAqB,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,OAAO,WAAW,CAAC;AAC7H,CAAC;AAED,SAAS,eAAe,CAAC,MAAsB,EAAE,SAAuB;IACtE,OAAO;QACL,GAAG,MAAM;QACT,SAAS;KACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,MAAkC,EAClC,UAAkB,EAClB,KAAe;IAEf,MAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClD,OAAO;QACL,MAAM;QACN,kBAAkB;QAClB,mBAAmB,EAAE,kBAAkB;QACvC,KAAK;QACL,QAAQ,EAAE,KAAK;QACf,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,OAAO,eAAe,CAAC,MAAM,EAAE;gBAC7B,MAAM;gBACN,kBAAkB;gBAClB,mBAAmB,EAAE,kBAAkB;gBACvC,QAAQ,EAAE,KAAK;gBACf,gBAAgB,EAAE,MAAM;gBACxB,KAAK,EACH,MAAM,KAAK,eAAe;oBACxB,CAAC,CAAC,CAAC,sFAAsF,CAAC;oBAC1F,CAAC,CAAC,CAAC,6EAA6E,CAAC;aACtF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,SAAiB,EACjB,UAAkB,EAClB,KAAe;IAEf,MAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,QAAQ,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAC1D,OAAO;QACL,MAAM,EAAE,MAAM;QACd,kBAAkB;QAClB,mBAAmB;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,CAAC;QAC/D,QAAQ,EAAE,IAAI;QACd,aAAa;QACb,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,mBAAmB,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,eAAe,CAAC,MAAM,EAAE;gBAC7B,MAAM,EAAE,MAAM;gBACd,kBAAkB;gBAClB,mBAAmB;gBACnB,aAAa;gBACb,QAAQ,EAAE,IAAI;gBACd,gBAAgB,EAAE,+BAA+B;gBACjD,YAAY;gBACZ,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC;gBACtC,WAAW,EAAE,UAAU,aAAa,gDAAgD;gBACpF,KAAK,EAAE;oBACL,iHAAiH;oBACjH,4GAA4G;iBAC7G;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,GAAW;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,SAAiB,EACjB,UAAkB,EAClB,KAAe;IAEf,MAAM,kBAAkB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC7E,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACpF,MAAM,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;IACnD,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,kBAAkB;QAClB,mBAAmB;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC;QAC7C,QAAQ,EAAE,IAAI;QACd,aAAa;QACb,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrD,OAAO,eAAe,CAAC,MAAM,EAAE;gBAC7B,MAAM,EAAE,cAAc;gBACtB,kBAAkB;gBAClB,mBAAmB;gBACnB,aAAa;gBACb,QAAQ,EAAE,IAAI;gBACd,gBAAgB,EAAE,+BAA+B;gBACjD,YAAY;gBACZ,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC;gBACtC,WAAW,EAAE,cAAc,OAAO,oBAAoB,YAAY,gDAAgD;gBAClH,KAAK,EAAE;oBACL,iGAAiG;oBACjG,4GAA4G;iBAC7G;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAKtC;IACC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe;YAClB,OAAO,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1E,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3E,KAAK,cAAc;YACjB,OAAO,2BAA2B,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "harness-dispatch",
3
+ "version": "0.4.0",
4
+ "description": "Turn locally installed coding harnesses (Claude Code, Codex, Cursor, Antigravity) and local/remote API endpoints into tools any AI can call, with async job handling for long-running agent work.",
5
+ "keywords": [
6
+ "mcp",
7
+ "claude",
8
+ "coding",
9
+ "ai-agents",
10
+ "llm",
11
+ "cursor",
12
+ "codex",
13
+ "dispatch",
14
+ "antigravity"
15
+ ],
16
+ "license": "MIT",
17
+ "author": "Felix Stubner",
18
+ "homepage": "https://fstubner.github.io/harness-dispatch/",
19
+ "type": "module",
20
+ "main": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js"
26
+ }
27
+ },
28
+ "bin": {
29
+ "harness-dispatch": "./dist/bin.js"
30
+ },
31
+ "files": [
32
+ "dist/",
33
+ "data/",
34
+ "config.default.yaml",
35
+ "README.md"
36
+ ],
37
+ "engines": {
38
+ "node": ">=24.15.0"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public",
42
+ "provenance": true
43
+ },
44
+ "scripts": {
45
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
46
+ "build": "npm run clean && tsc -p tsconfig.json",
47
+ "check": "npm run typecheck && npm test",
48
+ "dev": "tsx src/bin.ts",
49
+ "smoke": "node scripts/smoke.mjs",
50
+ "smoke:agents": "node scripts/smoke-agents.mjs",
51
+ "test": "vitest run",
52
+ "test:coverage": "vitest run --coverage",
53
+ "test:watch": "vitest",
54
+ "test:parity": "vitest run tests/scoring-parity.test.ts",
55
+ "typecheck": "tsc --noEmit",
56
+ "prepublishOnly": "npm run build",
57
+ "prepack": "npm run build"
58
+ },
59
+ "dependencies": {
60
+ "@modelcontextprotocol/sdk": "^1.29.0",
61
+ "@opentelemetry/api": "^1.9.1",
62
+ "@opentelemetry/auto-instrumentations-node": "^0.79.0",
63
+ "@opentelemetry/core": "^2.8.0",
64
+ "@opentelemetry/exporter-trace-otlp-http": "^0.221.0",
65
+ "@opentelemetry/sdk-node": "^0.221.0",
66
+ "cross-spawn": "^7.0.6",
67
+ "js-yaml": "^4.2.0",
68
+ "which": "^7.0.0",
69
+ "zod": "^4.4.3"
70
+ },
71
+ "devDependencies": {
72
+ "@types/cross-spawn": "^6.0.6",
73
+ "@types/js-yaml": "^4.0.9",
74
+ "@types/node": "^24.0.0",
75
+ "@types/which": "^3.0.4",
76
+ "@vitest/coverage-v8": "^4.1.10",
77
+ "tsx": "^4.23.1",
78
+ "typescript": "^6.0.3",
79
+ "vitest": "^4.1.10"
80
+ },
81
+ "overrides": {
82
+ "fast-uri": "^3.1.4",
83
+ "body-parser": "^2.3.0",
84
+ "@opentelemetry/core": "^2.8.0",
85
+ "@opentelemetry/propagator-jaeger": "^2.9.0",
86
+ "esbuild": "^0.28.1",
87
+ "@hono/node-server": "^2.0.11"
88
+ },
89
+ "repository": {
90
+ "type": "git",
91
+ "url": "https://github.com/fstubner/harness-dispatch"
92
+ },
93
+ "bugs": {
94
+ "url": "https://github.com/fstubner/harness-dispatch/issues"
95
+ }
96
+ }