harnery 0.43.0 → 0.44.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 (278) hide show
  1. package/README.md +3 -3
  2. package/dist/commands/agents.d.ts.map +1 -1
  3. package/dist/commands/agents.js +41 -48
  4. package/dist/commands/browse.d.ts.map +1 -1
  5. package/dist/commands/browse.js +38 -11
  6. package/dist/commands/diagnostics.d.ts.map +1 -1
  7. package/dist/commands/diagnostics.js +10 -0
  8. package/dist/commands/doctor.d.ts +12 -0
  9. package/dist/commands/doctor.d.ts.map +1 -1
  10. package/dist/commands/doctor.js +22 -7
  11. package/dist/commands/governor.js +22 -10
  12. package/dist/commands/inbox.d.ts +1 -1
  13. package/dist/commands/inbox.d.ts.map +1 -1
  14. package/dist/commands/inbox.js +55 -2
  15. package/dist/commands/rm.d.ts.map +1 -1
  16. package/dist/commands/rm.js +28 -4
  17. package/dist/commands/servers.d.ts.map +1 -1
  18. package/dist/commands/servers.js +16 -1
  19. package/dist/commands/supervisor.d.ts.map +1 -1
  20. package/dist/commands/supervisor.js +7 -2
  21. package/dist/commands/toc.d.ts +14 -0
  22. package/dist/commands/toc.d.ts.map +1 -1
  23. package/dist/commands/toc.js +7 -4
  24. package/dist/commands/workflow.js +24 -30
  25. package/dist/core/agents/live-authority-v3.d.ts +1 -0
  26. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  27. package/dist/core/agents/live-authority-v3.js +11 -0
  28. package/dist/core/agents/live-lifecycle-v3.d.ts +4 -2
  29. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -1
  30. package/dist/core/agents/live-lifecycle-v3.js +28 -7
  31. package/dist/core/agents/mailbox.d.ts +9 -8
  32. package/dist/core/agents/mailbox.d.ts.map +1 -1
  33. package/dist/core/agents/mailbox.js +24 -17
  34. package/dist/core/agents/render/prompt-context.d.ts +2 -0
  35. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  36. package/dist/core/agents/render/prompt-context.js +8 -12
  37. package/dist/core/agents/render/session-context.d.ts +2 -8
  38. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  39. package/dist/core/agents/render/session-context.js +7 -30
  40. package/dist/core/agents/rules/stop-hook.js +3 -3
  41. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  42. package/dist/core/agents/state/heartbeat-writer.js +25 -14
  43. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -1
  44. package/dist/core/agents/state/live-coordination-writer.js +5 -0
  45. package/dist/core/agents/state/pidmap.d.ts.map +1 -1
  46. package/dist/core/agents/state/pidmap.js +5 -0
  47. package/dist/core/agents/state/proc-start.d.ts +19 -0
  48. package/dist/core/agents/state/proc-start.d.ts.map +1 -1
  49. package/dist/core/agents/state/proc-start.js +41 -0
  50. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  51. package/dist/core/agents/state/stale-sweep.js +180 -70
  52. package/dist/core/agents/state/unchanged-file.d.ts +44 -0
  53. package/dist/core/agents/state/unchanged-file.d.ts.map +1 -0
  54. package/dist/core/agents/state/unchanged-file.js +390 -0
  55. package/dist/core/context/index.d.ts +22 -10
  56. package/dist/core/context/index.d.ts.map +1 -1
  57. package/dist/core/context/index.js +381 -119
  58. package/dist/core/context/observation.d.ts +26 -0
  59. package/dist/core/context/observation.d.ts.map +1 -0
  60. package/dist/core/context/observation.js +11 -0
  61. package/dist/core/diagnostics/bundle.d.ts.map +1 -1
  62. package/dist/core/diagnostics/bundle.js +25 -14
  63. package/dist/core/diagnostics/path-identity.d.ts +3 -0
  64. package/dist/core/diagnostics/path-identity.d.ts.map +1 -0
  65. package/dist/core/diagnostics/path-identity.js +12 -0
  66. package/dist/core/diagnostics/sanitize.d.ts.map +1 -1
  67. package/dist/core/diagnostics/sanitize.js +4 -3
  68. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  69. package/dist/core/events/v3/authority-outbox.js +29 -0
  70. package/dist/core/events/v3/generation-custody.d.ts +5 -0
  71. package/dist/core/events/v3/generation-custody.d.ts.map +1 -0
  72. package/dist/core/events/v3/generation-custody.js +50 -0
  73. package/dist/core/events/v3/producers/coordination-recorder.d.ts +1 -0
  74. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  75. package/dist/core/events/v3/producers/coordination-recorder.js +7 -0
  76. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  77. package/dist/core/events/v3/producers/recorder.js +77 -64
  78. package/dist/core/governor/planning.d.ts.map +1 -1
  79. package/dist/core/governor/planning.js +14 -1
  80. package/dist/core/governor/service-read.d.ts +10 -2
  81. package/dist/core/governor/service-read.d.ts.map +1 -1
  82. package/dist/core/governor/service-read.js +105 -22
  83. package/dist/core/governor/service.d.ts +20 -2
  84. package/dist/core/governor/service.d.ts.map +1 -1
  85. package/dist/core/governor/service.js +72 -47
  86. package/dist/core/hooks/cli.js +33 -5
  87. package/dist/core/inbox/contract.d.ts +2 -1
  88. package/dist/core/inbox/contract.d.ts.map +1 -1
  89. package/dist/core/inbox/index.d.ts +2 -0
  90. package/dist/core/inbox/index.d.ts.map +1 -1
  91. package/dist/core/inbox/index.js +2 -0
  92. package/dist/core/inbox/peer-messages.d.ts +37 -0
  93. package/dist/core/inbox/peer-messages.d.ts.map +1 -0
  94. package/dist/core/inbox/peer-messages.js +72 -0
  95. package/dist/core/inbox/service.d.ts +8 -1
  96. package/dist/core/inbox/service.d.ts.map +1 -1
  97. package/dist/core/inbox/service.js +67 -21
  98. package/dist/core/inbox/targets.d.ts +22 -0
  99. package/dist/core/inbox/targets.d.ts.map +1 -0
  100. package/dist/core/inbox/targets.js +108 -0
  101. package/dist/core/inbox/watcher.js +7 -3
  102. package/dist/core/journal/index.d.ts.map +1 -1
  103. package/dist/core/journal/index.js +17 -2
  104. package/dist/core/resources/contract.d.ts +3 -0
  105. package/dist/core/resources/contract.d.ts.map +1 -1
  106. package/dist/core/resources/service-status.d.ts +14 -1
  107. package/dist/core/resources/service-status.d.ts.map +1 -1
  108. package/dist/core/resources/service-status.js +23 -13
  109. package/dist/core/resources/service.d.ts +9 -1
  110. package/dist/core/resources/service.d.ts.map +1 -1
  111. package/dist/core/resources/service.js +47 -27
  112. package/dist/core/resources/status.d.ts +2 -5
  113. package/dist/core/resources/status.d.ts.map +1 -1
  114. package/dist/core/resources/status.js +36 -7
  115. package/dist/core/servers/index.d.ts +24 -13
  116. package/dist/core/servers/index.d.ts.map +1 -1
  117. package/dist/core/servers/index.js +132 -92
  118. package/dist/core/servers/tunnels.d.ts +3 -5
  119. package/dist/core/servers/tunnels.d.ts.map +1 -1
  120. package/dist/core/servers/tunnels.js +3 -9
  121. package/dist/core/supervisor/contract.d.ts +12 -0
  122. package/dist/core/supervisor/contract.d.ts.map +1 -1
  123. package/dist/core/supervisor/explanations.d.ts.map +1 -1
  124. package/dist/core/supervisor/explanations.js +2 -1
  125. package/dist/core/supervisor/findings.d.ts.map +1 -1
  126. package/dist/core/supervisor/findings.js +54 -9
  127. package/dist/core/supervisor/service.d.ts +9 -1
  128. package/dist/core/supervisor/service.d.ts.map +1 -1
  129. package/dist/core/supervisor/service.js +59 -29
  130. package/dist/core/supervisor/services.d.ts.map +1 -1
  131. package/dist/core/supervisor/services.js +22 -1
  132. package/dist/core/supervisor/status.d.ts +17 -2
  133. package/dist/core/supervisor/status.d.ts.map +1 -1
  134. package/dist/core/supervisor/status.js +70 -12
  135. package/dist/core/supervisor/timeline.d.ts.map +1 -1
  136. package/dist/core/supervisor/timeline.js +2 -1
  137. package/dist/core/work/state.js +7 -7
  138. package/dist/core/workflow/engine.d.ts.map +1 -1
  139. package/dist/core/workflow/engine.js +105 -32
  140. package/dist/core/workflow/failure-evidence.d.ts +16 -0
  141. package/dist/core/workflow/failure-evidence.d.ts.map +1 -0
  142. package/dist/core/workflow/failure-evidence.js +114 -0
  143. package/dist/core/workflow/index.d.ts +1 -1
  144. package/dist/core/workflow/index.d.ts.map +1 -1
  145. package/dist/core/workflow/index.js +1 -1
  146. package/dist/core/workflow/live-session-v3.d.ts +6 -0
  147. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  148. package/dist/core/workflow/live-session-v3.js +126 -5
  149. package/dist/core/workflow/proof.d.ts +5 -5
  150. package/dist/core/workflow/proof.d.ts.map +1 -1
  151. package/dist/core/workflow/proof.js +115 -20
  152. package/dist/core/workflow/run-state.d.ts +3 -1
  153. package/dist/core/workflow/run-state.d.ts.map +1 -1
  154. package/dist/core/workflow/run-state.js +31 -27
  155. package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
  156. package/dist/core/workflow/spawn-claude.js +19 -0
  157. package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
  158. package/dist/core/workflow/spawn-codex.js +13 -0
  159. package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
  160. package/dist/core/workflow/spawn-cursor.js +19 -0
  161. package/dist/core/workflow/spawn-opencode.d.ts.map +1 -1
  162. package/dist/core/workflow/spawn-opencode.js +14 -0
  163. package/dist/core/workflow/types.d.ts +64 -17
  164. package/dist/core/workflow/types.d.ts.map +1 -1
  165. package/dist/core/workflow/workspaces/index.d.ts +0 -1
  166. package/dist/core/workflow/workspaces/index.d.ts.map +1 -1
  167. package/dist/core/workflow/workspaces/index.js +0 -1
  168. package/dist/core/workflow/workspaces/leases.d.ts +3 -1
  169. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  170. package/dist/core/workflow/workspaces/leases.js +30 -16
  171. package/dist/core/workflow/workspaces/local-git.d.ts +6 -2
  172. package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
  173. package/dist/core/workflow/workspaces/local-git.js +270 -6
  174. package/dist/core/workflow/workspaces/ownership.d.ts +11 -0
  175. package/dist/core/workflow/workspaces/ownership.d.ts.map +1 -0
  176. package/dist/core/workflow/workspaces/ownership.js +194 -0
  177. package/dist/core/workflow/workspaces/reclaim.d.ts +35 -0
  178. package/dist/core/workflow/workspaces/reclaim.d.ts.map +1 -1
  179. package/dist/core/workflow/workspaces/reclaim.js +14 -0
  180. package/dist/core/workflow/workspaces/recovery.d.ts.map +1 -1
  181. package/dist/core/workflow/workspaces/recovery.js +21 -13
  182. package/dist/core/workflow/workspaces/state.d.ts +1 -0
  183. package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
  184. package/dist/core/workflow/workspaces/state.js +21 -1
  185. package/dist/lib/browser/windows-chrome.d.ts +100 -12
  186. package/dist/lib/browser/windows-chrome.d.ts.map +1 -1
  187. package/dist/lib/browser/windows-chrome.js +262 -73
  188. package/dist/lib/docs-links.d.ts.map +1 -1
  189. package/dist/lib/docs-links.js +45 -2
  190. package/dist/lib/guarded-remove.d.ts +7 -0
  191. package/dist/lib/guarded-remove.d.ts.map +1 -1
  192. package/dist/lib/guarded-remove.js +106 -12
  193. package/dist/lib/identities/assume.d.ts.map +1 -1
  194. package/dist/lib/identities/assume.js +4 -0
  195. package/dist/lib/zip/index.d.ts +41 -0
  196. package/dist/lib/zip/index.d.ts.map +1 -0
  197. package/dist/lib/zip/index.js +398 -0
  198. package/package.json +7 -1
  199. package/src/commands/agents.ts +54 -63
  200. package/src/commands/browse.ts +50 -14
  201. package/src/commands/diagnostics.ts +10 -0
  202. package/src/commands/doctor.ts +26 -7
  203. package/src/commands/governor.ts +23 -10
  204. package/src/commands/inbox.ts +52 -2
  205. package/src/commands/rm.ts +43 -4
  206. package/src/commands/servers.ts +16 -4
  207. package/src/commands/supervisor.ts +7 -2
  208. package/src/commands/toc.ts +14 -6
  209. package/src/commands/workflow.ts +30 -30
  210. package/src/core/agents/live-authority-v3.ts +17 -0
  211. package/src/core/agents/live-lifecycle-v3.ts +52 -14
  212. package/src/core/agents/mailbox.ts +26 -17
  213. package/src/core/agents/render/prompt-context.ts +10 -12
  214. package/src/core/agents/render/session-context.ts +9 -32
  215. package/src/core/agents/rules/stop-hook.ts +3 -3
  216. package/src/core/agents/state/heartbeat-writer.ts +29 -12
  217. package/src/core/agents/state/live-coordination-writer.ts +29 -0
  218. package/src/core/agents/state/pidmap.ts +13 -0
  219. package/src/core/agents/state/proc-start.ts +57 -0
  220. package/src/core/agents/state/stale-sweep.ts +247 -82
  221. package/src/core/agents/state/unchanged-file.ts +456 -0
  222. package/src/core/context/index.ts +446 -136
  223. package/src/core/context/observation.ts +29 -0
  224. package/src/core/diagnostics/bundle.ts +23 -18
  225. package/src/core/diagnostics/path-identity.ts +15 -0
  226. package/src/core/diagnostics/sanitize.ts +4 -3
  227. package/src/core/events/v3/authority-outbox.ts +56 -0
  228. package/src/core/events/v3/generation-custody.ts +59 -0
  229. package/src/core/events/v3/producers/coordination-recorder.ts +15 -0
  230. package/src/core/events/v3/producers/recorder.ts +94 -68
  231. package/src/core/governor/planning.ts +20 -8
  232. package/src/core/governor/service-read.ts +128 -20
  233. package/src/core/governor/service.ts +119 -42
  234. package/src/core/hooks/cli.ts +33 -5
  235. package/src/core/inbox/contract.ts +2 -1
  236. package/src/core/inbox/index.ts +2 -0
  237. package/src/core/inbox/peer-messages.ts +94 -0
  238. package/src/core/inbox/service.ts +88 -22
  239. package/src/core/inbox/targets.ts +148 -0
  240. package/src/core/inbox/watcher.ts +8 -9
  241. package/src/core/journal/index.ts +19 -2
  242. package/src/core/resources/contract.ts +4 -0
  243. package/src/core/resources/service-status.ts +35 -12
  244. package/src/core/resources/service.ts +71 -24
  245. package/src/core/resources/status.ts +57 -8
  246. package/src/core/servers/index.ts +177 -91
  247. package/src/core/servers/tunnels.ts +3 -11
  248. package/src/core/supervisor/contract.ts +13 -0
  249. package/src/core/supervisor/explanations.ts +4 -1
  250. package/src/core/supervisor/findings.ts +68 -10
  251. package/src/core/supervisor/service.ts +88 -26
  252. package/src/core/supervisor/services.ts +26 -8
  253. package/src/core/supervisor/status.ts +89 -12
  254. package/src/core/supervisor/timeline.ts +2 -1
  255. package/src/core/work/state.ts +7 -7
  256. package/src/core/workflow/engine.ts +131 -49
  257. package/src/core/workflow/failure-evidence.ts +141 -0
  258. package/src/core/workflow/index.ts +0 -1
  259. package/src/core/workflow/live-session-v3.ts +146 -5
  260. package/src/core/workflow/proof.ts +134 -26
  261. package/src/core/workflow/run-state.ts +31 -29
  262. package/src/core/workflow/spawn-claude.ts +18 -0
  263. package/src/core/workflow/spawn-codex.ts +13 -0
  264. package/src/core/workflow/spawn-cursor.ts +18 -0
  265. package/src/core/workflow/spawn-opencode.ts +14 -0
  266. package/src/core/workflow/types.ts +51 -17
  267. package/src/core/workflow/workspaces/index.ts +0 -1
  268. package/src/core/workflow/workspaces/leases.ts +48 -17
  269. package/src/core/workflow/workspaces/local-git.ts +315 -5
  270. package/src/core/workflow/workspaces/ownership.ts +232 -0
  271. package/src/core/workflow/workspaces/reclaim.ts +58 -0
  272. package/src/core/workflow/workspaces/recovery.ts +25 -13
  273. package/src/core/workflow/workspaces/state.ts +20 -0
  274. package/src/lib/browser/windows-chrome.ts +346 -86
  275. package/src/lib/docs-links.ts +49 -2
  276. package/src/lib/guarded-remove.ts +132 -14
  277. package/src/lib/identities/assume.ts +4 -0
  278. package/src/lib/zip/index.ts +483 -0
@@ -0,0 +1,390 @@
1
+ import { closeSync, constants, fstatSync, fsyncSync, linkSync, lstatSync, mkdtempSync, openSync, readdirSync, readFileSync, readlinkSync, realpathSync, renameSync, rmdirSync, unlinkSync, writeFileSync, } from "node:fs";
2
+ import { hostname } from "node:os";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ import { stateFileMode } from "../../storage/modes.js";
5
+ const PRIVATE_PREFIX = ".harnery-delete-";
6
+ const MANIFEST = "intent.json";
7
+ const PIN = "pinned";
8
+ function errorMessage(error) {
9
+ return error instanceof Error ? error.message : String(error);
10
+ }
11
+ function errorCode(error) {
12
+ return error?.code;
13
+ }
14
+ function sameRevision(a, b, includeCtime = true) {
15
+ return (a.dev === b.dev &&
16
+ a.ino === b.ino &&
17
+ a.size === b.size &&
18
+ a.mtimeNs === b.mtimeNs &&
19
+ (!includeCtime || a.ctimeNs === b.ctimeNs) &&
20
+ a.bytes.equals(b.bytes));
21
+ }
22
+ function sameCanonicalPath(a, b) {
23
+ return process.platform === "win32" ? a.toLowerCase() === b.toLowerCase() : a === b;
24
+ }
25
+ function processNamespace() {
26
+ if (process.platform === "linux") {
27
+ try {
28
+ const namespace = readlinkSync("/proc/self/ns/pid");
29
+ return /^pid:\[\d+\]$/.test(namespace) ? namespace : "unknown";
30
+ }
31
+ catch {
32
+ return "unknown";
33
+ }
34
+ }
35
+ return process.platform === "win32" || process.platform === "darwin" ? "host" : "unknown";
36
+ }
37
+ /** Refuse symlink parents and protocol-private paths rather than following them. */
38
+ function safePath(filePath) {
39
+ const path = resolve(filePath);
40
+ if (basename(path).startsWith(PRIVATE_PREFIX))
41
+ return null;
42
+ try {
43
+ if (!sameCanonicalPath(realpathSync(dirname(path)), dirname(path)))
44
+ return null;
45
+ return path;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /** A stable read of one regular file, including its exact bytes and revision. */
52
+ export function captureFileRevision(filePath) {
53
+ const path = safePath(filePath);
54
+ if (!path)
55
+ return null;
56
+ let fd;
57
+ try {
58
+ const namedBefore = lstatSync(path, { bigint: true });
59
+ if (!namedBefore.isFile())
60
+ return null;
61
+ fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
62
+ const before = fstatSync(fd, { bigint: true });
63
+ const bytes = readFileSync(fd);
64
+ const after = fstatSync(fd, { bigint: true });
65
+ const namedAfter = lstatSync(path, { bigint: true });
66
+ const snapshot = { ...before, bytes };
67
+ if (!after.isFile() ||
68
+ !namedAfter.isFile() ||
69
+ before.size !== BigInt(bytes.length) ||
70
+ !sameRevision(snapshot, { ...after, bytes }) ||
71
+ !sameRevision(snapshot, { ...namedBefore, bytes }) ||
72
+ !sameRevision(snapshot, { ...namedAfter, bytes })) {
73
+ return null;
74
+ }
75
+ return {
76
+ bytes,
77
+ dev: before.dev,
78
+ ino: before.ino,
79
+ size: before.size,
80
+ mtimeNs: before.mtimeNs,
81
+ ctimeNs: before.ctimeNs,
82
+ };
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ finally {
88
+ if (fd !== undefined)
89
+ closeSync(fd);
90
+ }
91
+ }
92
+ export function fileRevisionMatches(filePath, expected) {
93
+ const actual = captureFileRevision(filePath);
94
+ return actual !== null && sameRevision(actual, expected);
95
+ }
96
+ function capturePrivateDirectory(path) {
97
+ try {
98
+ const stat = lstatSync(path, { bigint: true });
99
+ // Windows mode bits do not describe its ACL. The caller-owned parent's
100
+ // inherited ACL defines authorized principals there; random private names
101
+ // separate these operations from cooperating publishers on every platform.
102
+ if (!/^\.harnery-delete-[A-Za-z0-9]{6}$/.test(basename(path)) ||
103
+ !stat.isDirectory() ||
104
+ (process.platform !== "win32" && (stat.mode & 63n) !== 0n) ||
105
+ !sameCanonicalPath(realpathSync(path), path)) {
106
+ return null;
107
+ }
108
+ return { path, dev: stat.dev, ino: stat.ino, birthtimeNs: stat.birthtimeNs };
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ function privateDirectoryMatches(expected) {
115
+ const actual = capturePrivateDirectory(expected.path);
116
+ return (actual !== null &&
117
+ actual.dev === expected.dev &&
118
+ actual.ino === expected.ino &&
119
+ actual.birthtimeNs === expected.birthtimeNs);
120
+ }
121
+ function writeIntent(directory, intent, create) {
122
+ if (!privateDirectoryMatches(directory))
123
+ throw new Error("unsafe_file_deletion_directory");
124
+ const target = join(directory.path, create ? MANIFEST : "intent.next");
125
+ const fd = openSync(target, constants.O_WRONLY | constants.O_NOFOLLOW | constants.O_CREAT | constants.O_EXCL, stateFileMode());
126
+ try {
127
+ writeFileSync(fd, JSON.stringify(intent));
128
+ fsyncSync(fd);
129
+ }
130
+ finally {
131
+ closeSync(fd);
132
+ }
133
+ if (!create)
134
+ renameSync(target, join(directory.path, MANIFEST));
135
+ }
136
+ function removeEmptyPrivateDirectory(directory) {
137
+ if (!privateDirectoryMatches(directory))
138
+ throw new Error("unsafe_file_deletion_directory");
139
+ unlinkSync(join(directory.path, MANIFEST));
140
+ rmdirSync(directory.path);
141
+ }
142
+ function present(path) {
143
+ try {
144
+ lstatSync(path);
145
+ return true;
146
+ }
147
+ catch (error) {
148
+ if (errorCode(error) === "ENOENT")
149
+ return false;
150
+ throw error;
151
+ }
152
+ }
153
+ /**
154
+ * Restore by a no-clobber hard link. A newer publication always wins its name;
155
+ * an unresolved pin stays available as evidence and for restart recovery.
156
+ */
157
+ function restore(directory, source) {
158
+ const pin = join(directory.path, PIN);
159
+ const result = { recoveryPath: pin, sourcePath: source };
160
+ try {
161
+ if (!privateDirectoryMatches(directory) || !safePath(source)) {
162
+ return { ...result, state: "retained", error: "unsafe_file_deletion_path" };
163
+ }
164
+ const pinned = captureFileRevision(pin);
165
+ if (!pinned)
166
+ return { ...result, state: "retained", error: "unsafe_file_deletion_pin" };
167
+ try {
168
+ linkSync(pin, source);
169
+ }
170
+ catch (error) {
171
+ // A previous recovery may have linked successfully before it was killed.
172
+ const current = captureFileRevision(source);
173
+ if (errorCode(error) !== "EEXIST" || !current || !sameRevision(current, pinned)) {
174
+ return { ...result, state: "retained", error: errorMessage(error) };
175
+ }
176
+ }
177
+ if (!privateDirectoryMatches(directory)) {
178
+ return { ...result, state: "retained", error: "unsafe_file_deletion_directory" };
179
+ }
180
+ unlinkSync(pin);
181
+ removeEmptyPrivateDirectory(directory);
182
+ return { ...result, state: "restored" };
183
+ }
184
+ catch (error) {
185
+ return { ...result, state: "error", error: errorMessage(error) };
186
+ }
187
+ }
188
+ /**
189
+ * Writers must publish by atomic rename, never by an open descriptor to the old
190
+ * inode. The private directory is outside their publication namespace. Moving
191
+ * the row gives deletion custody over that inode without owning its live name.
192
+ * The caller owns the state parent and keeps its topology stable. Its platform
193
+ * permissions define which principals can modify it; this protocol does not
194
+ * exclude principals already authorized to change that parent.
195
+ */
196
+ export function deleteFileIfUnchanged(filePath, expected, validate) {
197
+ const path = safePath(filePath);
198
+ if (!path ||
199
+ path.split(/[\\/]/).some((part) => part.startsWith(PRIVATE_PREFIX)) ||
200
+ typeof validate !== "function") {
201
+ return { state: "rejected" };
202
+ }
203
+ const observed = { ...expected, bytes: Buffer.from(expected.bytes) };
204
+ const before = captureFileRevision(path);
205
+ if (!before) {
206
+ try {
207
+ return { state: present(path) ? "rejected" : "missing" };
208
+ }
209
+ catch (error) {
210
+ return { state: "error", error: errorMessage(error) };
211
+ }
212
+ }
213
+ if (!sameRevision(before, observed))
214
+ return { state: "changed" };
215
+ let directory;
216
+ let moved = false;
217
+ let intent;
218
+ const retain = (state, error) => {
219
+ if (!directory || !intent)
220
+ return { state: "error", error: errorMessage(error) };
221
+ try {
222
+ writeIntent(directory, { ...intent, state: "retained" }, false);
223
+ }
224
+ catch {
225
+ // The still-active manifest remains recoverable when its process exits.
226
+ }
227
+ const recovered = restore(directory, path);
228
+ if (recovered.state !== "restored") {
229
+ return {
230
+ state: "recovery-required",
231
+ recoveryPath: recovered.recoveryPath,
232
+ error: error === undefined ? recovered.error : errorMessage(error),
233
+ };
234
+ }
235
+ return state === "error" ? { state, error: errorMessage(error) } : { state };
236
+ };
237
+ try {
238
+ const privatePath = mkdtempSync(join(dirname(path), PRIVATE_PREFIX));
239
+ directory = capturePrivateDirectory(privatePath) ?? undefined;
240
+ if (!directory)
241
+ throw new Error("unsafe_file_deletion_directory");
242
+ intent = {
243
+ version: 1,
244
+ source: basename(path),
245
+ ownerPid: process.pid,
246
+ ownerHost: hostname(),
247
+ ownerPlatform: process.platform,
248
+ ownerProcessNamespace: processNamespace(),
249
+ state: "active",
250
+ };
251
+ writeIntent(directory, intent, true);
252
+ const pin = join(directory.path, PIN);
253
+ renameSync(path, pin);
254
+ moved = true;
255
+ const pinned = captureFileRevision(pin);
256
+ // rename may update ctime; the pre-move check included the observed ctime.
257
+ if (!pinned || !sameRevision(pinned, observed, false))
258
+ return retain("changed");
259
+ if (!validate({ ...pinned, bytes: Buffer.from(pinned.bytes) }))
260
+ return retain("rejected");
261
+ if (!privateDirectoryMatches(directory) || !fileRevisionMatches(pin, pinned) || present(path)) {
262
+ return retain("changed");
263
+ }
264
+ unlinkSync(pin);
265
+ moved = false;
266
+ removeEmptyPrivateDirectory(directory);
267
+ // A publication at the unlink boundary belongs to the writer, even though
268
+ // the obsolete private inode was successfully removed.
269
+ return { state: present(path) ? "changed" : "deleted" };
270
+ }
271
+ catch (error) {
272
+ if (moved)
273
+ return retain("error", error);
274
+ if (directory && privateDirectoryMatches(directory)) {
275
+ try {
276
+ removeEmptyPrivateDirectory(directory);
277
+ }
278
+ catch {
279
+ // Keep any unknown private contents rather than remove them recursively.
280
+ }
281
+ }
282
+ return errorCode(error) === "ENOENT"
283
+ ? { state: "missing" }
284
+ : { state: "error", error: errorMessage(error) };
285
+ }
286
+ }
287
+ /**
288
+ * Recover same-host/platform/PID-namespace pins after process termination. File fsync
289
+ * protects manifest contents; directory entries are not fsynced, so this does
290
+ * not promise recovery after an OS crash or power loss.
291
+ */
292
+ export function recoverInterruptedFileDeletions(directoryPath, validate) {
293
+ const directory = resolve(directoryPath);
294
+ if (typeof validate !== "function")
295
+ return [];
296
+ try {
297
+ if (!sameCanonicalPath(realpathSync(directory), directory))
298
+ return [];
299
+ const results = [];
300
+ for (const entry of readdirSync(directory).sort()) {
301
+ const privatePath = join(directory, entry);
302
+ const privateRevision = capturePrivateDirectory(privatePath);
303
+ if (!privateRevision)
304
+ continue;
305
+ const unknownPin = () => ({
306
+ state: "error",
307
+ recoveryPath: join(privatePath, PIN),
308
+ error: "file_deletion_manifest_invalid",
309
+ });
310
+ const manifest = captureFileRevision(join(privatePath, MANIFEST));
311
+ if (!manifest) {
312
+ if (present(join(privatePath, PIN)))
313
+ results.push(unknownPin());
314
+ continue;
315
+ }
316
+ let intent;
317
+ try {
318
+ intent = JSON.parse(manifest.bytes.toString("utf8"));
319
+ }
320
+ catch {
321
+ if (present(join(privatePath, PIN)))
322
+ results.push(unknownPin());
323
+ continue;
324
+ }
325
+ if (intent?.version !== 1 ||
326
+ typeof intent.source !== "string" ||
327
+ intent.source.length === 0 ||
328
+ intent.source !== basename(intent.source) ||
329
+ intent.source === "." ||
330
+ intent.source === ".." ||
331
+ intent.source.startsWith(PRIVATE_PREFIX) ||
332
+ !Number.isSafeInteger(intent.ownerPid) ||
333
+ intent.ownerPid <= 0 ||
334
+ (intent.state !== "active" && intent.state !== "retained")) {
335
+ if (present(join(privatePath, PIN)))
336
+ results.push(unknownPin());
337
+ continue;
338
+ }
339
+ const source = join(directory, intent.source);
340
+ const retained = {
341
+ state: "retained",
342
+ recoveryPath: join(privatePath, PIN),
343
+ sourcePath: source,
344
+ };
345
+ if (typeof intent.ownerHost !== "string" ||
346
+ !intent.ownerHost ||
347
+ typeof intent.ownerPlatform !== "string" ||
348
+ !intent.ownerPlatform ||
349
+ typeof intent.ownerProcessNamespace !== "string" ||
350
+ !intent.ownerProcessNamespace ||
351
+ intent.ownerProcessNamespace === "unknown" ||
352
+ processNamespace() === "unknown") {
353
+ results.push({ ...retained, error: "file_deletion_owner_unknown" });
354
+ continue;
355
+ }
356
+ if (intent.ownerHost !== hostname() ||
357
+ intent.ownerPlatform !== process.platform ||
358
+ intent.ownerProcessNamespace !== processNamespace()) {
359
+ results.push({ ...retained, error: "file_deletion_owner_foreign" });
360
+ continue;
361
+ }
362
+ if (intent.state === "active") {
363
+ try {
364
+ process.kill(intent.ownerPid, 0);
365
+ results.push({ ...retained, error: "file_deletion_owner_alive" });
366
+ continue;
367
+ }
368
+ catch (error) {
369
+ if (errorCode(error) !== "ESRCH") {
370
+ results.push({ ...retained, error: "file_deletion_owner_unknown" });
371
+ continue;
372
+ }
373
+ }
374
+ }
375
+ if (!validate(source)) {
376
+ results.push({ ...retained, error: "file_deletion_recovery_rejected" });
377
+ continue;
378
+ }
379
+ if (!present(join(privatePath, PIN))) {
380
+ removeEmptyPrivateDirectory(privateRevision);
381
+ continue;
382
+ }
383
+ results.push(restore(privateRevision, source));
384
+ }
385
+ return results;
386
+ }
387
+ catch (error) {
388
+ return [{ state: "error", recoveryPath: directory, error: errorMessage(error) }];
389
+ }
390
+ }
@@ -5,6 +5,9 @@
5
5
  * state before compaction, and renders a verified recovery briefing after it.
6
6
  */
7
7
  import type { Adapter } from "../adapter.js";
8
+ import type { RepoSnapshot } from "./observation.js";
9
+ export type { RepoObservation, RepoSnapshot } from "./observation.js";
10
+ export { observationsComparable } from "./observation.js";
8
11
  export declare const CONTEXT_SCHEMA_VERSION: 1;
9
12
  export declare const MAX_CAPSULE_BYTES: number;
10
13
  export type ContextSampleSource = "hook" | "native_event" | "result" | "transcript" | "estimate";
@@ -35,14 +38,6 @@ export interface ContextContinuityState {
35
38
  compaction_completed_at?: string;
36
39
  degraded_reason?: string;
37
40
  }
38
- export interface RepoSnapshot {
39
- cwd: string;
40
- root?: string;
41
- branch?: string;
42
- head?: string;
43
- dirty_paths: string[];
44
- dirty_paths_truncated?: boolean;
45
- }
46
41
  export interface ContinuityCapsule {
47
42
  schema_version: typeof CONTEXT_SCHEMA_VERSION;
48
43
  capsule_id: string;
@@ -93,7 +88,19 @@ export interface RecoverContextResult {
93
88
  briefing: string;
94
89
  recovered: boolean;
95
90
  }
91
+ /**
92
+ * Authority for accepting exactly the capsule supplied during preparation.
93
+ * It is returned by prepareContextRecovery, not reconstructed from latest state.
94
+ */
95
+ export interface PreparedContextCheckpoint {
96
+ session_id: string;
97
+ instance_id: string;
98
+ generation: number;
99
+ capsule_id: string;
100
+ capsule_sha256: string;
101
+ }
96
102
  export interface PreparedContextRecovery {
103
+ checkpoint: Readonly<PreparedContextCheckpoint>;
97
104
  state: ContextContinuityState;
98
105
  capsule: ContinuityCapsule;
99
106
  briefing: string;
@@ -117,11 +124,16 @@ export declare function prepareContextRecovery(coordRoot: string, input: {
117
124
  instanceId: string;
118
125
  cwd: string;
119
126
  }): PreparedContextRecovery | null;
120
- /** Advance continuity only after the adapter context channel accepted the briefing. */
127
+ /**
128
+ * Advance continuity only after the adapter accepted the prepared briefing.
129
+ * Missing, altered, foreign or superseded checkpoints refuse without writing.
130
+ * Repeating the same accepted checkpoint is an exact no-op.
131
+ */
121
132
  export declare function completeContextRecovery(coordRoot: string, input: {
122
133
  sessionId: string;
123
134
  instanceId: string;
124
- }): ContextContinuityState;
135
+ checkpoint: Readonly<PreparedContextCheckpoint>;
136
+ }): ContextContinuityState | null;
125
137
  /** Record that the adapter, rather than Harnery, reported compaction complete. */
126
138
  export declare function markContextCompactionCompleted(coordRoot: string, input: {
127
139
  sessionId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/context/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/context/index.ts"],"names":[],"mappings":"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"}