@oharness/engine 0.9.2 → 0.10.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 (119) hide show
  1. package/dist/agent/agent.d.ts +207 -1
  2. package/dist/agent/agent.js +691 -55
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/background.d.ts +135 -0
  5. package/dist/agent/background.js +307 -0
  6. package/dist/agent/background.js.map +1 -0
  7. package/dist/agent/compaction.d.ts +7 -0
  8. package/dist/agent/compaction.js +11 -3
  9. package/dist/agent/compaction.js.map +1 -1
  10. package/dist/agent/goal.d.ts +36 -0
  11. package/dist/agent/goal.js +71 -0
  12. package/dist/agent/goal.js.map +1 -0
  13. package/dist/agent/permissions.d.ts +6 -0
  14. package/dist/agent/permissions.js +2 -1
  15. package/dist/agent/permissions.js.map +1 -1
  16. package/dist/agent/session.d.ts +36 -0
  17. package/dist/agent/session.js +72 -0
  18. package/dist/agent/session.js.map +1 -1
  19. package/dist/agent/store.d.ts +25 -0
  20. package/dist/agent/store.js +21 -0
  21. package/dist/agent/store.js.map +1 -1
  22. package/dist/agent/subagent.d.ts +12 -0
  23. package/dist/agent/subagent.js +11 -1
  24. package/dist/agent/subagent.js.map +1 -1
  25. package/dist/agent/workspace.d.ts +9 -0
  26. package/dist/agent/workspace.js +59 -5
  27. package/dist/agent/workspace.js.map +1 -1
  28. package/dist/auth/manager.d.ts +9 -0
  29. package/dist/auth/manager.js +67 -6
  30. package/dist/auth/manager.js.map +1 -1
  31. package/dist/auth/providers/account.js +5 -4
  32. package/dist/auth/providers/account.js.map +1 -1
  33. package/dist/browser/tools.js +3 -0
  34. package/dist/browser/tools.js.map +1 -1
  35. package/dist/computer/arbiter.d.ts +69 -0
  36. package/dist/computer/arbiter.js +128 -0
  37. package/dist/computer/arbiter.js.map +1 -0
  38. package/dist/computer/cua-driver.d.ts +115 -0
  39. package/dist/computer/cua-driver.js +453 -0
  40. package/dist/computer/cua-driver.js.map +1 -0
  41. package/dist/computer/helper-client.d.ts +78 -0
  42. package/dist/computer/helper-client.js +163 -0
  43. package/dist/computer/helper-client.js.map +1 -0
  44. package/dist/computer/index.d.ts +15 -0
  45. package/dist/computer/index.js +9 -0
  46. package/dist/computer/index.js.map +1 -0
  47. package/dist/computer/mode.d.ts +19 -0
  48. package/dist/computer/mode.js +42 -0
  49. package/dist/computer/mode.js.map +1 -0
  50. package/dist/computer/plugin.d.ts +24 -0
  51. package/dist/computer/plugin.js +17 -0
  52. package/dist/computer/plugin.js.map +1 -0
  53. package/dist/computer/policy.d.ts +29 -0
  54. package/dist/computer/policy.js +127 -0
  55. package/dist/computer/policy.js.map +1 -0
  56. package/dist/computer/session.d.ts +199 -0
  57. package/dist/computer/session.js +392 -0
  58. package/dist/computer/session.js.map +1 -0
  59. package/dist/computer/target.d.ts +187 -0
  60. package/dist/computer/target.js +31 -0
  61. package/dist/computer/target.js.map +1 -0
  62. package/dist/computer/tools.d.ts +8 -0
  63. package/dist/computer/tools.js +537 -0
  64. package/dist/computer/tools.js.map +1 -0
  65. package/dist/core/tokens.js +4 -0
  66. package/dist/core/tokens.js.map +1 -1
  67. package/dist/core/types.d.ts +16 -1
  68. package/dist/core/types.js.map +1 -1
  69. package/dist/harness.d.ts +76 -1
  70. package/dist/harness.js +178 -22
  71. package/dist/harness.js.map +1 -1
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.js +2 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/mcp/transport.js +3 -0
  76. package/dist/mcp/transport.js.map +1 -1
  77. package/dist/providers/catalog.js +6 -0
  78. package/dist/providers/catalog.js.map +1 -1
  79. package/dist/providers/discovery.js +10 -2
  80. package/dist/providers/discovery.js.map +1 -1
  81. package/dist/providers/models-dev.js +1 -0
  82. package/dist/providers/models-dev.js.map +1 -1
  83. package/dist/providers/models-dev.json +114 -102
  84. package/dist/providers/piai.d.ts +16 -1
  85. package/dist/providers/piai.js +84 -7
  86. package/dist/providers/piai.js.map +1 -1
  87. package/dist/providers/types.d.ts +6 -0
  88. package/dist/providers/types.js.map +1 -1
  89. package/dist/runtime-plugins/cloud-connector.js +5 -0
  90. package/dist/runtime-plugins/cloud-connector.js.map +1 -1
  91. package/dist/schedule/scheduler.d.ts +38 -0
  92. package/dist/schedule/scheduler.js +101 -1
  93. package/dist/schedule/scheduler.js.map +1 -1
  94. package/dist/tools/builtin/bash.d.ts +6 -0
  95. package/dist/tools/builtin/bash.js +2 -1
  96. package/dist/tools/builtin/bash.js.map +1 -1
  97. package/dist/tools/builtin/recall.js +4 -0
  98. package/dist/tools/builtin/recall.js.map +1 -1
  99. package/dist/tools/builtin/routine.d.ts +9 -0
  100. package/dist/tools/builtin/routine.js +23 -2
  101. package/dist/tools/builtin/routine.js.map +1 -1
  102. package/dist/tools/builtin/task-control.d.ts +21 -0
  103. package/dist/tools/builtin/task-control.js +120 -0
  104. package/dist/tools/builtin/task-control.js.map +1 -0
  105. package/dist/tools/builtin/task.js +50 -9
  106. package/dist/tools/builtin/task.js.map +1 -1
  107. package/dist/tools/builtin/todo.d.ts +1 -1
  108. package/dist/tools/builtin/worktree.d.ts +10 -0
  109. package/dist/tools/builtin/worktree.js +52 -0
  110. package/dist/tools/builtin/worktree.js.map +1 -0
  111. package/dist/tools/define.d.ts +4 -1
  112. package/dist/tools/define.js +2 -0
  113. package/dist/tools/define.js.map +1 -1
  114. package/dist/tools/types.d.ts +112 -0
  115. package/dist/tools/types.js.map +1 -1
  116. package/dist/worktree/index.d.ts +109 -0
  117. package/dist/worktree/index.js +463 -0
  118. package/dist/worktree/index.js.map +1 -0
  119. package/package.json +3 -3
@@ -0,0 +1,463 @@
1
+ import { execFile } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { constants } from "node:fs";
4
+ import { access, cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
5
+ import { tmpdir } from "node:os";
6
+ import path from "node:path";
7
+ import { samePath, userPath, within } from "../paths.js";
8
+ import { readProjectManifest, renameProjectManifest } from "../storage/project.js";
9
+ import { renameWithRetry } from "../util/fs.js";
10
+ export const BRANCH_TYPES = ["feat", "fix", "chore", "docs"];
11
+ // --- naming ---------------------------------------------------------------
12
+ /**
13
+ * A directory- and branch-safe name from free text: lowercase ASCII words
14
+ * joined by hyphens, at most 40 characters, cut at a word boundary.
15
+ *
16
+ * Returns "" when nothing ASCII is left — a title written in Chinese, say —
17
+ * so the caller can ask for a slug instead of inventing a meaningless one.
18
+ */
19
+ export function slugify(text) {
20
+ const words = text
21
+ .normalize("NFKD")
22
+ .replace(/[̀-ͯ]/g, "")
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9]+/g, " ")
25
+ .trim()
26
+ .split(/\s+/)
27
+ .filter(Boolean);
28
+ let slug = "";
29
+ for (const word of words) {
30
+ const next = slug ? `${slug}-${word}` : word;
31
+ if (next.length > 40)
32
+ break;
33
+ slug = next;
34
+ }
35
+ return slug || (words[0] ?? "").slice(0, 40);
36
+ }
37
+ /** The branch type a task reads as. `feat` unless it says otherwise. */
38
+ export function branchType(task) {
39
+ const text = task.trim().toLowerCase();
40
+ if (/^(fix|bug|hotfix|repair)\b|修复|修正|修 ?bug|报错/.test(text))
41
+ return "fix";
42
+ if (/^docs?\b|readme|文档/.test(text))
43
+ return "docs";
44
+ if (/^(chore|bump|upgrade|clean ?up|refactor|rename)\b|升级|清理|重构|改名/.test(text))
45
+ return "chore";
46
+ return "feat";
47
+ }
48
+ /** A fallback slug for a task with no ASCII in it: `task-1002-1530`. */
49
+ function stampSlug(now = new Date()) {
50
+ const two = (n) => String(n).padStart(2, "0");
51
+ return `task-${two(now.getMonth() + 1)}${two(now.getDate())}-${two(now.getHours())}${two(now.getMinutes())}`;
52
+ }
53
+ function run(file, args, opts = {}) {
54
+ return new Promise((resolve, reject) => {
55
+ execFile(file, args, {
56
+ cwd: opts.cwd,
57
+ timeout: opts.timeout ?? 60_000,
58
+ maxBuffer: 256 * 1024 * 1024,
59
+ windowsHide: true,
60
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0", ...opts.env },
61
+ }, (err, stdout, stderr) => {
62
+ if (err) {
63
+ const detail = String(stderr || "").trim() || err.message;
64
+ reject(new Error(`${file} ${args[0] ?? ""}: ${detail}`));
65
+ return;
66
+ }
67
+ resolve(String(stdout));
68
+ });
69
+ });
70
+ }
71
+ const git = (cwd, args, opts = {}) => run("git", args, { ...opts, cwd });
72
+ /** git against a shadow repository whose work tree is somewhere else. */
73
+ const shadowGit = (shadow, tree, args) => run("git", [`--git-dir=${shadow}`, `--work-tree=${tree}`, "-c", "user.name=OHarness", "-c", "user.email=worktree@oharness.local", ...args], {
74
+ cwd: tree,
75
+ });
76
+ async function ok(promise) {
77
+ try {
78
+ await promise;
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ async function exists(target) {
86
+ return ok(stat(target));
87
+ }
88
+ async function writable(dir) {
89
+ return ok(access(dir, constants.W_OK));
90
+ }
91
+ // --- the registry ----------------------------------------------------------
92
+ const FILE = () => userPath("worktrees.json");
93
+ export async function listWorktrees() {
94
+ try {
95
+ const parsed = JSON.parse(await readFile(FILE(), "utf8"));
96
+ return Array.isArray(parsed.worktrees) ? parsed.worktrees.filter((one) => typeof one?.path === "string") : [];
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ }
102
+ async function saveWorktrees(list) {
103
+ const file = FILE();
104
+ await mkdir(path.dirname(file), { recursive: true });
105
+ const temp = `${file}.${process.pid}.${randomUUID()}.tmp`;
106
+ try {
107
+ await writeFile(temp, `${JSON.stringify({ version: 1, worktrees: list }, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
108
+ await renameWithRetry(temp, file);
109
+ }
110
+ finally {
111
+ await rm(temp, { force: true });
112
+ }
113
+ }
114
+ /** The worktree a directory belongs to: its root, its session cwd, or anything inside. */
115
+ export async function findWorktree(dir) {
116
+ const resolved = path.resolve(dir);
117
+ const list = await listWorktrees();
118
+ return (list.find((one) => samePath(one.cwd, resolved) || samePath(one.path, resolved)) ??
119
+ list.find((one) => within([one.path], resolved)));
120
+ }
121
+ async function forget(one) {
122
+ await serialized(async () => {
123
+ const list = await listWorktrees();
124
+ await saveWorktrees(list.filter((entry) => entry.id !== one.id));
125
+ });
126
+ }
127
+ /**
128
+ * One change to the registry at a time, within this process.
129
+ *
130
+ * Several subagents can be handed worktrees at once, and each creation reads
131
+ * the list and writes it back: run side by side, the last write drops the
132
+ * others' entries. Creation itself goes through here too, because choosing a
133
+ * free name and taking it are two steps another creation can fall between.
134
+ */
135
+ let registryChain = Promise.resolve();
136
+ function serialized(work) {
137
+ const next = registryChain.then(work, work);
138
+ registryChain = next.catch(() => { });
139
+ return next;
140
+ }
141
+ async function gitShape(dir) {
142
+ try {
143
+ const top = (await git(dir, ["rev-parse", "--show-toplevel"], { timeout: 5000 })).trim();
144
+ const common = (await git(dir, ["rev-parse", "--path-format=absolute", "--git-common-dir"], { timeout: 5000 })).trim();
145
+ // The main worktree is the one holding `.git`; a worktree of a worktree is
146
+ // still named after it, never `OHarness-a-b`.
147
+ const repo = path.basename(common) === ".git" ? path.dirname(common) : top;
148
+ return { top: path.resolve(top), repo: path.resolve(repo) };
149
+ }
150
+ catch {
151
+ return undefined;
152
+ }
153
+ }
154
+ /** What a new branch starts from: the remote's default branch, freshly fetched, or HEAD. */
155
+ async function defaultBase(repo, fetch) {
156
+ if (!(await ok(git(repo, ["remote", "get-url", "origin"], { timeout: 5000 }))))
157
+ return "HEAD";
158
+ let ref = "";
159
+ try {
160
+ ref = (await git(repo, ["symbolic-ref", "--short", "refs/remotes/origin/HEAD"], { timeout: 5000 })).trim();
161
+ }
162
+ catch {
163
+ for (const guess of ["origin/main", "origin/master"]) {
164
+ if (await ok(git(repo, ["rev-parse", "--verify", "--quiet", `${guess}^{commit}`], { timeout: 5000 }))) {
165
+ ref = guess;
166
+ break;
167
+ }
168
+ }
169
+ }
170
+ if (!ref)
171
+ return "HEAD";
172
+ if (fetch) {
173
+ // Best effort: offline, the last fetched state is still a better start
174
+ // than whatever branch the main checkout happens to be on.
175
+ await ok(git(repo, ["fetch", "--quiet", "origin", ref.replace(/^origin\//, "")], { timeout: 30_000 }));
176
+ }
177
+ return (await ok(git(repo, ["rev-parse", "--verify", "--quiet", `${ref}^{commit}`], { timeout: 5000 }))) ? ref : "HEAD";
178
+ }
179
+ /**
180
+ * Where the worktree goes and what it is called: `<parent>/<name>-<slug>`,
181
+ * `-2`, `-3` when taken. Falls back to the user directory when the parent
182
+ * cannot be written to.
183
+ */
184
+ async function place(root, slug, taken) {
185
+ const name = path.basename(root);
186
+ const parent = (await writable(path.dirname(root))) ? path.dirname(root) : userPath("worktrees");
187
+ await mkdir(parent, { recursive: true });
188
+ for (let n = 1; n < 100; n++) {
189
+ const suffix = n === 1 ? "" : `-${n}`;
190
+ const dir = path.join(parent, `${name}-${slug}${suffix}`);
191
+ if (!(await exists(dir)) && !(await taken(dir, suffix)))
192
+ return { dir, suffix };
193
+ }
194
+ throw new Error(`no free name for ${name}-${slug}`);
195
+ }
196
+ /**
197
+ * The name a worktree for this task would get, without making it — what a
198
+ * dialog shows before the person confirms.
199
+ */
200
+ export async function previewWorktree(projectDir, opts) {
201
+ const slug = slugify(opts.slug || "") || slugify(opts.task) || stampSlug();
202
+ const type = opts.type ?? branchType(opts.task);
203
+ const shape = await gitShape(projectDir);
204
+ if (shape) {
205
+ const { dir, suffix } = await place(shape.repo, slug, (_dir, suffix) => ok(git(shape.repo, ["rev-parse", "--verify", "--quiet", `refs/heads/${type}/${slug}${suffix}`], { timeout: 5000 })));
206
+ return { kind: "git", path: dir, branch: `${type}/${slug}${suffix}`, slug, type };
207
+ }
208
+ const { dir } = await place(path.resolve(projectDir), slug, async () => false);
209
+ return { kind: "clone", path: dir, slug, type };
210
+ }
211
+ export function createWorktree(projectDir, opts) {
212
+ return serialized(() => createUnserialized(projectDir, opts));
213
+ }
214
+ async function createUnserialized(projectDir, opts) {
215
+ const source = path.resolve(projectDir);
216
+ const task = opts.task.trim();
217
+ const slug = slugify(opts.slug || "") || slugify(task) || stampSlug();
218
+ const type = opts.type ?? branchType(task);
219
+ const id = randomUUID().replaceAll("-", "").slice(0, 12);
220
+ const shape = await gitShape(source);
221
+ const one = shape
222
+ ? await createGit(source, shape, { id, task, slug, type, base: opts.base, fetch: opts.fetch !== false })
223
+ : await createClone(source, { id, task, slug, type });
224
+ await saveWorktrees([...(await listWorktrees()), one]);
225
+ return one;
226
+ }
227
+ async function createGit(source, shape, o) {
228
+ const baseRef = o.base ?? (await defaultBase(shape.repo, o.fetch));
229
+ const base = (await git(shape.repo, ["rev-parse", "--verify", `${baseRef}^{commit}`], { timeout: 5000 })).trim();
230
+ const { dir, suffix } = await place(shape.repo, o.slug, (_dir, suffix) => ok(git(shape.repo, ["rev-parse", "--verify", "--quiet", `refs/heads/${o.type}/${o.slug}${suffix}`], { timeout: 5000 })));
231
+ const branch = `${o.type}/${o.slug}${suffix}`;
232
+ // --no-track: a branch made from origin/main must not push to main.
233
+ await git(shape.repo, ["worktree", "add", "--no-track", "-b", branch, dir, base]);
234
+ const rel = path.relative(shape.top, source);
235
+ return {
236
+ id: o.id,
237
+ kind: "git",
238
+ path: dir,
239
+ cwd: rel ? path.join(dir, rel) : dir,
240
+ source,
241
+ repo: shape.repo,
242
+ branch,
243
+ baseRef,
244
+ base,
245
+ task: o.task,
246
+ slug: o.slug,
247
+ type: o.type,
248
+ createdAt: Date.now(),
249
+ };
250
+ }
251
+ /** Copy a tree, sharing blocks where the filesystem can. */
252
+ async function cloneTree(from, to) {
253
+ if (process.platform === "darwin") {
254
+ // -c: clonefile(2) on APFS, instant and free until something changes.
255
+ if (await ok(run("cp", ["-cR", from, to], { timeout: 600_000 })))
256
+ return;
257
+ await rm(to, { recursive: true, force: true });
258
+ await run("cp", ["-R", from, to], { timeout: 600_000 });
259
+ return;
260
+ }
261
+ if (process.platform === "linux") {
262
+ await run("cp", ["-a", "--reflink=auto", from, to], { timeout: 600_000 });
263
+ return;
264
+ }
265
+ await cp(from, to, { recursive: true, preserveTimestamps: true });
266
+ }
267
+ async function createClone(source, o) {
268
+ const { dir } = await place(source, o.slug, async () => false);
269
+ await cloneTree(source, dir);
270
+ // The copy carries the original's identity, which keeps their sessions under
271
+ // one project; its display name is its own, or the two read the same.
272
+ if (await readProjectManifest(dir))
273
+ await renameProjectManifest(dir, path.basename(dir));
274
+ let shadow = userPath("worktrees", `${o.id}.git`);
275
+ let base;
276
+ try {
277
+ await mkdir(path.dirname(shadow), { recursive: true });
278
+ await shadowGit(shadow, dir, ["init", "--quiet"]);
279
+ await shadowGit(shadow, dir, ["add", "-A"]);
280
+ await shadowGit(shadow, dir, ["commit", "--quiet", "--allow-empty", "--no-verify", "-m", `baseline: ${o.task}`]);
281
+ base = (await shadowGit(shadow, dir, ["rev-parse", "HEAD"])).trim();
282
+ }
283
+ catch {
284
+ // No git on this machine. The copy still isolates the task; it just cannot
285
+ // say what changed or carry it back.
286
+ await rm(shadow, { recursive: true, force: true });
287
+ shadow = undefined;
288
+ }
289
+ return {
290
+ id: o.id,
291
+ kind: "clone",
292
+ path: dir,
293
+ cwd: dir,
294
+ source,
295
+ ...(base ? { base } : {}),
296
+ ...(shadow ? { shadow } : {}),
297
+ task: o.task,
298
+ slug: o.slug,
299
+ type: o.type,
300
+ createdAt: Date.now(),
301
+ };
302
+ }
303
+ // --- status ----------------------------------------------------------------
304
+ /**
305
+ * What opening a directory as a project writes into it. Not the task's work:
306
+ * a worktree nobody touched must still read as clean, and a commit or an
307
+ * apply-back must not carry the copy's identity file into the original.
308
+ */
309
+ const HARNESS_LOCAL = ".oharness/project.json";
310
+ const HARNESS_EXCLUDE = `:(exclude)${HARNESS_LOCAL}`;
311
+ const harnessLocal = (line) => {
312
+ const file = line.slice(3).trim();
313
+ return file === HARNESS_LOCAL || (line.startsWith("??") && file === ".oharness/");
314
+ };
315
+ const porcelain = (out) => out.split("\n").filter((line) => line.trim().length > 0 && !harnessLocal(line));
316
+ export async function worktreeStatus(one) {
317
+ if (!(await exists(one.path)))
318
+ return { exists: false, changes: [], commits: 0, clean: true };
319
+ let changes = [];
320
+ let commits = 0;
321
+ if (one.kind === "git") {
322
+ changes = porcelain(await git(one.path, ["status", "--porcelain"]));
323
+ if (one.base) {
324
+ commits = Number((await git(one.path, ["rev-list", "--count", `${one.base}..HEAD`])).trim()) || 0;
325
+ }
326
+ }
327
+ else if (one.shadow) {
328
+ changes = porcelain(await shadowGit(one.shadow, one.path, ["status", "--porcelain"]));
329
+ }
330
+ else {
331
+ // Untracked copy: nothing can be said, so it is not called clean.
332
+ return { exists: true, changes: ["(changes are not tracked)"], commits: 0, clean: false };
333
+ }
334
+ return { exists: true, changes, commits, clean: changes.length === 0 && commits === 0 };
335
+ }
336
+ // --- finishing -------------------------------------------------------------
337
+ /** Remove the worktree and everything made for it. Loses its changes. */
338
+ async function dispose(one) {
339
+ if (one.kind === "git" && one.repo) {
340
+ if (await exists(one.path)) {
341
+ await git(one.repo, ["worktree", "remove", "--force", one.path]).catch(async () => {
342
+ await rm(one.path, { recursive: true, force: true });
343
+ });
344
+ }
345
+ await ok(git(one.repo, ["worktree", "prune"]));
346
+ if (one.branch)
347
+ await ok(git(one.repo, ["branch", "-D", one.branch]));
348
+ }
349
+ else {
350
+ await rm(one.path, { recursive: true, force: true });
351
+ if (one.shadow)
352
+ await rm(one.shadow, { recursive: true, force: true });
353
+ }
354
+ await forget(one);
355
+ }
356
+ /** `git@github.com:a/b.git` or `https://github.com/a/b(.git)` → `https://github.com/a/b`. */
357
+ export function webUrl(remote) {
358
+ const text = remote.trim();
359
+ const ssh = /^git@([^:]+):(.+?)(?:\.git)?$/.exec(text);
360
+ if (ssh)
361
+ return `https://${ssh[1]}/${ssh[2]}`;
362
+ const http = /^https?:\/\/(?:[^@/]+@)?([^/]+)\/(.+?)(?:\.git)?\/?$/.exec(text);
363
+ if (http)
364
+ return `https://${http[1]}/${http[2]}`;
365
+ return undefined;
366
+ }
367
+ export async function finishWorktree(one, action, opts = {}) {
368
+ const status = await worktreeStatus(one);
369
+ switch (action) {
370
+ case "remove": {
371
+ if (!status.clean) {
372
+ throw new Error(`${path.basename(one.path)} has ${status.commits ? `${status.commits} commit(s)` : `${status.changes.length} changed file(s)`}; keep it, or discard it explicitly`);
373
+ }
374
+ await dispose(one);
375
+ return { action, removed: true, message: `removed ${path.basename(one.path)}` };
376
+ }
377
+ case "discard": {
378
+ await dispose(one);
379
+ return { action, removed: true, message: `discarded ${path.basename(one.path)}` };
380
+ }
381
+ case "commit": {
382
+ if (one.kind !== "git")
383
+ throw new Error("only a git worktree has commits");
384
+ if (!status.changes.length)
385
+ return { action, removed: false, message: "nothing to commit" };
386
+ await git(one.path, ["add", "-A", "--", ".", HARNESS_EXCLUDE]);
387
+ await git(one.path, ["commit", "--quiet", "-m", (opts.message || one.task).trim() || one.task]);
388
+ return { action, removed: false, message: `committed on ${one.branch}` };
389
+ }
390
+ case "push": {
391
+ if (one.kind !== "git" || !one.branch)
392
+ throw new Error("only a git worktree can be pushed");
393
+ if (status.changes.length)
394
+ throw new Error("commit or discard the uncommitted changes first");
395
+ if (!status.commits)
396
+ throw new Error(`${one.branch} has no commits to push`);
397
+ await git(one.path, ["push", "--quiet", "-u", "origin", one.branch], { timeout: 120_000 });
398
+ const remote = await git(one.path, ["remote", "get-url", "origin"]).catch(() => "");
399
+ const web = webUrl(remote);
400
+ const target = (one.baseRef ?? "").replace(/^origin\//, "");
401
+ const url = web && /github\.com/.test(web)
402
+ ? `${web}/compare/${target && target !== "HEAD" ? `${target}...` : ""}${one.branch}?expand=1`
403
+ : undefined;
404
+ return { action, removed: false, message: `pushed ${one.branch}`, ...(url ? { url } : {}) };
405
+ }
406
+ case "merge": {
407
+ if (one.kind !== "git" || !one.repo || !one.branch)
408
+ throw new Error("only a git worktree can be merged");
409
+ if (status.changes.length)
410
+ throw new Error("commit or discard the uncommitted changes first");
411
+ if (!status.commits)
412
+ throw new Error(`${one.branch} has no commits to merge`);
413
+ if (porcelain(await git(one.repo, ["status", "--porcelain", "--untracked-files=no"])).length) {
414
+ throw new Error(`${path.basename(one.repo)} has uncommitted changes; merge there by hand`);
415
+ }
416
+ const into = (await git(one.repo, ["rev-parse", "--abbrev-ref", "HEAD"])).trim();
417
+ try {
418
+ await git(one.repo, ["merge", "--no-ff", "--no-edit", one.branch]);
419
+ }
420
+ catch (err) {
421
+ await ok(git(one.repo, ["merge", "--abort"]));
422
+ throw new Error(`merging ${one.branch} into ${into} conflicts; nothing was changed (${err.message})`);
423
+ }
424
+ await dispose(one);
425
+ return { action, removed: true, message: `merged ${one.branch} into ${into}` };
426
+ }
427
+ case "apply": {
428
+ if (one.kind !== "clone")
429
+ throw new Error("apply is for a copied folder; merge or push a git worktree");
430
+ if (!one.shadow || !one.base)
431
+ throw new Error("this copy's changes are not tracked, so they cannot be applied back");
432
+ await shadowGit(one.shadow, one.path, ["add", "-A"]);
433
+ const patch = await shadowGit(one.shadow, one.path, ["diff", "--cached", "--binary", one.base, "--", ".", HARNESS_EXCLUDE]);
434
+ if (!patch.trim()) {
435
+ await dispose(one);
436
+ return { action, removed: true, message: "no changes to apply; removed the copy" };
437
+ }
438
+ const file = path.join(tmpdir(), `oharness-worktree-${one.id}.patch`);
439
+ await writeFile(file, patch, "utf8");
440
+ try {
441
+ // Outside any repository, git apply is a plain patch tool. Checked
442
+ // first so a conflict leaves the original exactly as it was.
443
+ // The ceiling keeps git from finding a repository above the folder and
444
+ // reading the patch's paths against that one's root.
445
+ const env = { GIT_CEILING_DIRECTORIES: path.dirname(one.source) };
446
+ try {
447
+ await run("git", ["apply", "--check", "--binary", file], { cwd: one.source, env });
448
+ }
449
+ catch (err) {
450
+ throw new Error(`the original changed since the copy was made; nothing was applied (${err.message})`);
451
+ }
452
+ await run("git", ["apply", "--binary", file], { cwd: one.source, env });
453
+ }
454
+ finally {
455
+ await rm(file, { force: true });
456
+ }
457
+ const count = status.changes.length;
458
+ await dispose(one);
459
+ return { action, removed: true, message: `applied ${count} change(s) to ${path.basename(one.source)}` };
460
+ }
461
+ }
462
+ }
463
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worktree/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oharness/engine",
3
- "version": "0.9.2",
3
+ "version": "0.10.0",
4
4
  "description": "The agent loop, tool execution, context management and permissions. No frontend, no transport.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -48,8 +48,8 @@
48
48
  "postpack": "node scripts/write-official.mjs --clean"
49
49
  },
50
50
  "dependencies": {
51
- "@earendil-works/pi-ai": "^0.85.1",
52
- "ottoport": "1.9.0",
51
+ "@earendil-works/pi-ai": "^0.99.1",
52
+ "ottoport": "1.10.0",
53
53
  "zod": "^4.1.5"
54
54
  }
55
55
  }