agentrinse 0.0.0 → 0.2.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 (173) hide show
  1. package/README.md +165 -83
  2. package/dist/adapters/artifacts/adapter.d.ts +3 -1
  3. package/dist/adapters/artifacts/adapter.d.ts.map +1 -1
  4. package/dist/adapters/artifacts/adapter.js +23 -1
  5. package/dist/adapters/artifacts/adapter.js.map +1 -1
  6. package/dist/adapters/git/adapter.d.ts +8 -1
  7. package/dist/adapters/git/adapter.d.ts.map +1 -1
  8. package/dist/adapters/git/adapter.js +247 -13
  9. package/dist/adapters/git/adapter.js.map +1 -1
  10. package/dist/adapters/git/status.d.ts +14 -0
  11. package/dist/adapters/git/status.d.ts.map +1 -0
  12. package/dist/adapters/git/status.js +81 -0
  13. package/dist/adapters/git/status.js.map +1 -0
  14. package/dist/adapters/provider-adapter.d.ts +3 -0
  15. package/dist/adapters/provider-adapter.d.ts.map +1 -1
  16. package/dist/adapters/provider-adapter.js +16 -0
  17. package/dist/adapters/provider-adapter.js.map +1 -1
  18. package/dist/adapters/provider-reachability.d.ts +6 -0
  19. package/dist/adapters/provider-reachability.d.ts.map +1 -0
  20. package/dist/adapters/provider-reachability.js +207 -0
  21. package/dist/adapters/provider-reachability.js.map +1 -0
  22. package/dist/adapters/provider-specs.d.ts +1 -1
  23. package/dist/adapters/provider-specs.d.ts.map +1 -1
  24. package/dist/adapters/registry.d.ts +7 -1
  25. package/dist/adapters/registry.d.ts.map +1 -1
  26. package/dist/adapters/registry.js +44 -4
  27. package/dist/adapters/registry.js.map +1 -1
  28. package/dist/adapters/runtime/adapter.d.ts +24 -0
  29. package/dist/adapters/runtime/adapter.d.ts.map +1 -0
  30. package/dist/adapters/runtime/adapter.js +319 -0
  31. package/dist/adapters/runtime/adapter.js.map +1 -0
  32. package/dist/cli.js +2 -1
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/adapters.d.ts.map +1 -1
  35. package/dist/commands/adapters.js +1 -0
  36. package/dist/commands/adapters.js.map +1 -1
  37. package/dist/commands/apply.d.ts +6 -0
  38. package/dist/commands/apply.d.ts.map +1 -1
  39. package/dist/commands/apply.js +37 -13
  40. package/dist/commands/apply.js.map +1 -1
  41. package/dist/commands/audit.d.ts +7 -1
  42. package/dist/commands/audit.d.ts.map +1 -1
  43. package/dist/commands/audit.js +103 -12
  44. package/dist/commands/audit.js.map +1 -1
  45. package/dist/commands/clean.d.ts +61 -0
  46. package/dist/commands/clean.d.ts.map +1 -0
  47. package/dist/commands/clean.js +224 -0
  48. package/dist/commands/clean.js.map +1 -0
  49. package/dist/commands/completion.d.ts +4 -0
  50. package/dist/commands/completion.d.ts.map +1 -0
  51. package/dist/commands/completion.js +95 -0
  52. package/dist/commands/completion.js.map +1 -0
  53. package/dist/commands/config.d.ts +17 -0
  54. package/dist/commands/config.d.ts.map +1 -0
  55. package/dist/commands/config.js +41 -0
  56. package/dist/commands/config.js.map +1 -0
  57. package/dist/commands/doctor.d.ts +28 -0
  58. package/dist/commands/doctor.d.ts.map +1 -0
  59. package/dist/commands/doctor.js +582 -0
  60. package/dist/commands/doctor.js.map +1 -0
  61. package/dist/commands/history.d.ts +15 -0
  62. package/dist/commands/history.d.ts.map +1 -0
  63. package/dist/commands/history.js +30 -0
  64. package/dist/commands/history.js.map +1 -0
  65. package/dist/commands/lock.d.ts +21 -0
  66. package/dist/commands/lock.d.ts.map +1 -0
  67. package/dist/commands/lock.js +43 -0
  68. package/dist/commands/lock.js.map +1 -0
  69. package/dist/commands/plan.d.ts +2 -0
  70. package/dist/commands/plan.d.ts.map +1 -1
  71. package/dist/commands/plan.js +9 -2
  72. package/dist/commands/plan.js.map +1 -1
  73. package/dist/commands/show.d.ts +20 -0
  74. package/dist/commands/show.d.ts.map +1 -0
  75. package/dist/commands/show.js +54 -0
  76. package/dist/commands/show.js.map +1 -0
  77. package/dist/config/defaults.d.ts.map +1 -1
  78. package/dist/config/defaults.js +2 -0
  79. package/dist/config/defaults.js.map +1 -1
  80. package/dist/config/load.d.ts +6 -0
  81. package/dist/config/load.d.ts.map +1 -1
  82. package/dist/config/load.js +25 -0
  83. package/dist/config/load.js.map +1 -1
  84. package/dist/config/path.d.ts +5 -0
  85. package/dist/config/path.d.ts.map +1 -0
  86. package/dist/config/path.js +13 -0
  87. package/dist/config/path.js.map +1 -0
  88. package/dist/config/schema.d.ts +23 -0
  89. package/dist/config/schema.d.ts.map +1 -1
  90. package/dist/config/schema.js +48 -0
  91. package/dist/config/schema.js.map +1 -1
  92. package/dist/contracts/doctor.d.ts +35 -0
  93. package/dist/contracts/doctor.d.ts.map +1 -0
  94. package/dist/contracts/doctor.js +15 -0
  95. package/dist/contracts/doctor.js.map +1 -0
  96. package/dist/contracts/output.d.ts +50 -0
  97. package/dist/contracts/output.d.ts.map +1 -0
  98. package/dist/contracts/output.js +23 -0
  99. package/dist/contracts/output.js.map +1 -0
  100. package/dist/contracts/run.d.ts +2 -0
  101. package/dist/contracts/run.d.ts.map +1 -1
  102. package/dist/contracts/run.js +1 -1
  103. package/dist/contracts/run.js.map +1 -1
  104. package/dist/core/apply.d.ts +1 -0
  105. package/dist/core/apply.d.ts.map +1 -1
  106. package/dist/core/apply.js +46 -3
  107. package/dist/core/apply.js.map +1 -1
  108. package/dist/core/audit.d.ts +21 -0
  109. package/dist/core/audit.d.ts.map +1 -1
  110. package/dist/core/audit.js +31 -1
  111. package/dist/core/audit.js.map +1 -1
  112. package/dist/core/duration.d.ts +2 -0
  113. package/dist/core/duration.d.ts.map +1 -0
  114. package/dist/core/duration.js +21 -0
  115. package/dist/core/duration.js.map +1 -0
  116. package/dist/core/interruption.d.ts +5 -0
  117. package/dist/core/interruption.d.ts.map +1 -0
  118. package/dist/core/interruption.js +5 -0
  119. package/dist/core/interruption.js.map +1 -0
  120. package/dist/core/process-identity.d.ts +24 -0
  121. package/dist/core/process-identity.d.ts.map +1 -0
  122. package/dist/core/process-identity.js +104 -0
  123. package/dist/core/process-identity.js.map +1 -0
  124. package/dist/core/reachability.d.ts +29 -0
  125. package/dist/core/reachability.d.ts.map +1 -0
  126. package/dist/core/reachability.js +121 -0
  127. package/dist/core/reachability.js.map +1 -0
  128. package/dist/core/redaction.d.ts +4 -0
  129. package/dist/core/redaction.d.ts.map +1 -0
  130. package/dist/core/redaction.js +91 -0
  131. package/dist/core/redaction.js.map +1 -0
  132. package/dist/core/safety.d.ts +8 -0
  133. package/dist/core/safety.d.ts.map +1 -1
  134. package/dist/core/safety.js +29 -1
  135. package/dist/core/safety.js.map +1 -1
  136. package/dist/index.d.ts +3 -1
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +2 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/machine-output.d.ts +21 -0
  141. package/dist/machine-output.d.ts.map +1 -0
  142. package/dist/machine-output.js +32 -0
  143. package/dist/machine-output.js.map +1 -0
  144. package/dist/main.d.ts.map +1 -1
  145. package/dist/main.js +232 -7
  146. package/dist/main.js.map +1 -1
  147. package/dist/state/json-file.d.ts +6 -1
  148. package/dist/state/json-file.d.ts.map +1 -1
  149. package/dist/state/json-file.js +34 -3
  150. package/dist/state/json-file.js.map +1 -1
  151. package/dist/state/layout.d.ts +2 -0
  152. package/dist/state/layout.d.ts.map +1 -1
  153. package/dist/state/layout.js +2 -0
  154. package/dist/state/layout.js.map +1 -1
  155. package/dist/state/lock.d.ts +54 -1
  156. package/dist/state/lock.d.ts.map +1 -1
  157. package/dist/state/lock.js +237 -33
  158. package/dist/state/lock.js.map +1 -1
  159. package/dist/state/records.d.ts +5 -0
  160. package/dist/state/records.d.ts.map +1 -0
  161. package/dist/state/records.js +35 -0
  162. package/dist/state/records.js.map +1 -0
  163. package/dist/state/run-journal.d.ts +3 -1
  164. package/dist/state/run-journal.d.ts.map +1 -1
  165. package/dist/state/run-journal.js +15 -4
  166. package/dist/state/run-journal.js.map +1 -1
  167. package/dist/version.d.ts +1 -1
  168. package/dist/version.js +1 -1
  169. package/package.json +3 -2
  170. package/schemas/command-envelope.schema.json +78 -0
  171. package/schemas/command-event.schema.json +36 -0
  172. package/schemas/doctor.schema.json +51 -0
  173. package/schemas/run.schema.json +1 -1
@@ -1,58 +1,264 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { spawn } from "node:child_process";
2
3
  import { lstat, mkdir, open, readFile, rm } from "node:fs/promises";
3
4
  import { hostname } from "node:os";
4
5
  import { join } from "node:path";
6
+ import { inspectProcessIdentity, } from "../core/process-identity.js";
5
7
  import { syncDirectory } from "./json-file.js";
6
8
  export class LockHeldError extends Error {
7
9
  name = "LockHeldError";
8
10
  }
11
+ export class LockRecoveryError extends Error {
12
+ name = "LockRecoveryError";
13
+ }
14
+ function isErrno(error, code) {
15
+ return (error instanceof Error && "code" in error && error.code === code);
16
+ }
17
+ function parseOwner(value) {
18
+ if (typeof value !== "object" ||
19
+ value === null ||
20
+ !("token" in value) ||
21
+ typeof value.token !== "string" ||
22
+ !("pid" in value) ||
23
+ typeof value.pid !== "number" ||
24
+ !Number.isSafeInteger(value.pid) ||
25
+ value.pid <= 0 ||
26
+ !("hostname" in value) ||
27
+ typeof value.hostname !== "string" ||
28
+ !("command" in value) ||
29
+ typeof value.command !== "string" ||
30
+ !("planId" in value) ||
31
+ typeof value.planId !== "string" ||
32
+ !("runId" in value) ||
33
+ typeof value.runId !== "string" ||
34
+ !("createdAt" in value) ||
35
+ typeof value.createdAt !== "string" ||
36
+ ("processStartIdentity" in value &&
37
+ value.processStartIdentity !== undefined &&
38
+ typeof value.processStartIdentity !== "string")) {
39
+ return undefined;
40
+ }
41
+ return value;
42
+ }
9
43
  async function readOwner(path) {
10
44
  try {
11
- const value = JSON.parse(await readFile(path, "utf8"));
12
- if (typeof value === "object" &&
13
- value !== null &&
14
- "token" in value &&
15
- typeof value.token === "string" &&
16
- "pid" in value &&
17
- typeof value.pid === "number" &&
18
- "hostname" in value &&
19
- typeof value.hostname === "string" &&
20
- "planId" in value &&
21
- typeof value.planId === "string" &&
22
- "createdAt" in value &&
23
- typeof value.createdAt === "string") {
24
- return value;
25
- }
45
+ return parseOwner(JSON.parse(await readFile(path, "utf8")));
26
46
  }
27
47
  catch {
28
48
  return undefined;
29
49
  }
30
- return undefined;
31
50
  }
32
- export async function acquireApplyLock(locksDirectory, planId) {
51
+ async function acquireRecoveryMutex(locksDirectory) {
52
+ await mkdir(locksDirectory, { recursive: true, mode: 0o700 });
53
+ const path = join(locksDirectory, "apply.recovery.lock");
54
+ const holdCommand = 'printf "agentrinse-recovery-lock\\n"; cat >/dev/null';
55
+ const command = process.platform === "darwin" ? "lockf" : process.platform === "linux" ? "flock" : undefined;
56
+ if (command === undefined) {
57
+ throw new LockRecoveryError(`apply lock recovery is unsupported on ${process.platform}`);
58
+ }
59
+ const args = command === "lockf"
60
+ ? ["-k", "-s", "-t", "0", path, "sh", "-c", holdCommand]
61
+ : ["-n", path, "sh", "-c", holdCommand];
62
+ const child = spawn(command, args, { stdio: ["pipe", "pipe", "pipe"] });
63
+ child.stdout.setEncoding("utf8");
64
+ child.stderr.setEncoding("utf8");
65
+ let stderr = "";
66
+ let ready = false;
67
+ let released = false;
68
+ child.stderr.on("data", (chunk) => {
69
+ stderr += chunk;
70
+ });
71
+ let stdout = "";
72
+ const exit = new Promise((resolve, reject) => {
73
+ child.once("error", reject);
74
+ child.once("exit", (code, signal) => resolve({ code, signal }));
75
+ });
76
+ await new Promise((resolve, reject) => {
77
+ child.stdout.on("data", (chunk) => {
78
+ stdout += chunk;
79
+ if (!ready && stdout.includes("agentrinse-recovery-lock\n")) {
80
+ ready = true;
81
+ resolve();
82
+ }
83
+ });
84
+ void exit.then(({ code, signal }) => {
85
+ if (!ready) {
86
+ const detail = stderr.trim();
87
+ reject(new LockRecoveryError(code === 1 || code === 75
88
+ ? "apply lock recovery is already in progress"
89
+ : `could not acquire recovery mutex${detail === "" ? "" : `: ${detail}`}${signal === null ? "" : ` (${signal})`}`));
90
+ }
91
+ }, (error) => {
92
+ reject(new LockRecoveryError(`could not start ${command} for recovery mutex: ${error instanceof Error ? error.message : String(error)}`));
93
+ });
94
+ });
95
+ return {
96
+ assertHeld() {
97
+ if (released || child.exitCode !== null || child.signalCode !== null) {
98
+ throw new LockRecoveryError("apply lock recovery mutex was lost");
99
+ }
100
+ },
101
+ async release() {
102
+ if (released) {
103
+ return;
104
+ }
105
+ released = true;
106
+ child.stdin.end();
107
+ const result = await exit;
108
+ if (result.code !== 0) {
109
+ throw new LockRecoveryError(`recovery mutex exited unexpectedly${result.signal === null ? ` with code ${String(result.code)}` : ` (${result.signal})`}`);
110
+ }
111
+ },
112
+ };
113
+ }
114
+ async function inspectLockSnapshot(locksDirectory, dependencies = {}) {
115
+ const path = join(locksDirectory, "apply.lock");
116
+ let raw;
117
+ let identity;
118
+ try {
119
+ [raw, identity] = await Promise.all([readFile(path, "utf8"), lstat(path)]);
120
+ }
121
+ catch (error) {
122
+ if (isErrno(error, "ENOENT")) {
123
+ return { status: { status: "absent", path } };
124
+ }
125
+ throw error;
126
+ }
127
+ let owner;
128
+ try {
129
+ owner = parseOwner(JSON.parse(raw));
130
+ }
131
+ catch {
132
+ owner = undefined;
133
+ }
134
+ if (owner === undefined) {
135
+ return {
136
+ status: { status: "malformed", path, reason: "lock record is not valid AgentRinse JSON" },
137
+ identity,
138
+ };
139
+ }
140
+ const localHostname = (dependencies.currentHostname ?? hostname)();
141
+ if (owner.hostname !== localHostname) {
142
+ return {
143
+ status: {
144
+ status: "remote",
145
+ path,
146
+ owner,
147
+ reason: `lock belongs to host ${owner.hostname}; local host is ${localHostname}`,
148
+ },
149
+ identity,
150
+ };
151
+ }
152
+ const processIdentity = await (dependencies.inspectProcess ?? inspectProcessIdentity)(owner.pid);
153
+ if (processIdentity.status === "dead") {
154
+ return {
155
+ status: {
156
+ status: "stale",
157
+ path,
158
+ owner,
159
+ reason: `recorded process ${owner.pid} no longer exists`,
160
+ },
161
+ identity,
162
+ };
163
+ }
164
+ if (processIdentity.status === "unknown") {
165
+ return {
166
+ status: {
167
+ status: "unknown",
168
+ path,
169
+ owner,
170
+ reason: processIdentity.reason,
171
+ },
172
+ identity,
173
+ };
174
+ }
175
+ if (owner.processStartIdentity === undefined) {
176
+ return {
177
+ status: {
178
+ status: "unknown",
179
+ path,
180
+ owner,
181
+ reason: `lock has no process start identity for live PID ${owner.pid}`,
182
+ },
183
+ identity,
184
+ };
185
+ }
186
+ if (owner.processStartIdentity !== processIdentity.identity) {
187
+ return {
188
+ status: {
189
+ status: "stale",
190
+ path,
191
+ owner,
192
+ reason: `PID ${owner.pid} was reused by a different process`,
193
+ },
194
+ identity,
195
+ };
196
+ }
197
+ return { status: { status: "active", path, owner }, identity };
198
+ }
199
+ export async function inspectApplyLock(locksDirectory, dependencies = {}) {
200
+ return (await inspectLockSnapshot(locksDirectory, dependencies)).status;
201
+ }
202
+ export async function recoverStaleApplyLock(locksDirectory, dependencies = {}) {
203
+ const recoveryMutex = await acquireRecoveryMutex(locksDirectory);
204
+ try {
205
+ const snapshot = await inspectLockSnapshot(locksDirectory, dependencies);
206
+ if (snapshot.status.status !== "stale" || snapshot.identity === undefined) {
207
+ throw new LockRecoveryError(`apply lock is ${snapshot.status.status}; recovery requires a proven stale local owner`);
208
+ }
209
+ await dependencies.beforeRecoveryRemove?.();
210
+ const [owner, current] = await Promise.all([
211
+ readOwner(snapshot.status.path),
212
+ lstat(snapshot.status.path),
213
+ ]).catch((error) => {
214
+ if (isErrno(error, "ENOENT")) {
215
+ throw new LockRecoveryError("apply lock changed before recovery");
216
+ }
217
+ throw error;
218
+ });
219
+ if (owner?.token !== snapshot.status.owner.token ||
220
+ current.dev !== snapshot.identity.dev ||
221
+ current.ino !== snapshot.identity.ino) {
222
+ throw new LockRecoveryError("apply lock changed before recovery");
223
+ }
224
+ recoveryMutex.assertHeld();
225
+ await rm(snapshot.status.path);
226
+ await syncDirectory(locksDirectory);
227
+ return snapshot.status.owner;
228
+ }
229
+ finally {
230
+ await recoveryMutex.release();
231
+ }
232
+ }
233
+ export async function acquireApplyLock(locksDirectory, options) {
33
234
  await mkdir(locksDirectory, { recursive: true, mode: 0o700 });
34
235
  const path = join(locksDirectory, "apply.lock");
35
236
  const token = randomUUID();
237
+ const processIdentity = await inspectProcessIdentity(process.pid);
238
+ const owner = {
239
+ token,
240
+ pid: process.pid,
241
+ ...(processIdentity.status === "alive"
242
+ ? { processStartIdentity: processIdentity.identity }
243
+ : {}),
244
+ hostname: hostname(),
245
+ command: options.command,
246
+ planId: options.planId,
247
+ runId: options.runId,
248
+ createdAt: new Date().toISOString(),
249
+ };
36
250
  let handle;
37
251
  try {
38
252
  handle = await open(path, "wx", 0o600);
39
253
  }
40
254
  catch (error) {
41
- if (error instanceof Error &&
42
- "code" in error &&
43
- error.code === "EEXIST") {
44
- throw new LockHeldError(`apply lock exists at ${path}; verify its recorded process before removing a stale lock`);
255
+ if (isErrno(error, "EEXIST")) {
256
+ throw new LockHeldError(`apply lock exists at ${path}; inspect it with "agentrinse lock status"`);
45
257
  }
46
258
  throw error;
47
259
  }
48
260
  try {
49
- await handle.writeFile(`${JSON.stringify({
50
- token,
51
- pid: process.pid,
52
- hostname: hostname(),
53
- planId,
54
- createdAt: new Date().toISOString(),
55
- })}\n`, "utf8");
261
+ await handle.writeFile(`${JSON.stringify(owner)}\n`, "utf8");
56
262
  await handle.sync();
57
263
  await syncDirectory(locksDirectory);
58
264
  const identity = await handle.stat();
@@ -66,8 +272,8 @@ export async function acquireApplyLock(locksDirectory, planId) {
66
272
  released = true;
67
273
  await handle.close();
68
274
  try {
69
- const [owner, current] = await Promise.all([readOwner(path), lstat(path)]);
70
- if (owner?.token === token &&
275
+ const [currentOwner, current] = await Promise.all([readOwner(path), lstat(path)]);
276
+ if (currentOwner?.token === token &&
71
277
  current.dev === identity.dev &&
72
278
  current.ino === identity.ino) {
73
279
  await rm(path);
@@ -75,9 +281,7 @@ export async function acquireApplyLock(locksDirectory, planId) {
75
281
  }
76
282
  }
77
283
  catch (error) {
78
- if (!(error instanceof Error &&
79
- "code" in error &&
80
- error.code === "ENOENT")) {
284
+ if (!isErrno(error, "ENOENT")) {
81
285
  throw error;
82
286
  }
83
287
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/state/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAmB,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpB,IAAI,GAAG,eAAe,CAAC;CAC1C;AAeD,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACd,OAAO,IAAI,KAAK;YAChB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,IAAI,KAAK;YACd,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;YAC7B,UAAU,IAAI,KAAK;YACnB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;YAClC,QAAQ,IAAI,KAAK;YACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,WAAW,IAAI,KAAK;YACpB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EACnC,CAAC;YACD,OAAO,KAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,cAAsB,EAAE,MAAc;IAC3E,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAE3B,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAClD,CAAC;YACD,MAAM,IAAI,aAAa,CACrB,wBAAwB,IAAI,4DAA4D,CACzF,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CACpB,GAAG,IAAI,CAAC,SAAS,CAAC;YAChB,KAAK;YACL,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,QAAQ,EAAE;YACpB,MAAM;YACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,IAAI,EACN,MAAM,CACP,CAAC;QACF,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAErC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO;YACL,IAAI;YACJ,KAAK,CAAC,OAAO;gBACX,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO;gBACT,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBAErB,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC3E,IACE,KAAK,EAAE,KAAK,KAAK,KAAK;wBACtB,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;wBAC5B,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAC5B,CAAC;wBACD,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;wBACf,MAAM,aAAa,CAAC,cAAc,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IACE,CAAC,CACC,KAAK,YAAY,KAAK;wBACtB,MAAM,IAAI,KAAK;wBACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,EACD,CAAC;wBACD,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/state/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ZodType } from "zod";
2
+ export declare function listJsonRecords<T>(directory: string, schema: ZodType<T>): Promise<T[]>;
3
+ export declare function readJsonRecord<T>(directory: string, idOrPath: string, schema: ZodType<T>): Promise<T>;
4
+ export declare function resolveJsonRecordPath(directory: string, idOrPath: string): string;
5
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/state/records.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAUnC,wBAAsB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAgB5F;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,CAGZ;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOjF"}
@@ -0,0 +1,35 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { readJsonFile } from "./json-file.js";
4
+ function isMissing(error) {
5
+ return (error instanceof Error && "code" in error && error.code === "ENOENT");
6
+ }
7
+ export async function listJsonRecords(directory, schema) {
8
+ let names;
9
+ try {
10
+ names = await readdir(directory);
11
+ }
12
+ catch (error) {
13
+ if (isMissing(error)) {
14
+ return [];
15
+ }
16
+ throw error;
17
+ }
18
+ const records = [];
19
+ for (const name of names.filter((entry) => entry.endsWith(".json")).sort()) {
20
+ records.push(schema.parse(await readJsonFile(resolve(directory, name))));
21
+ }
22
+ return records;
23
+ }
24
+ export async function readJsonRecord(directory, idOrPath, schema) {
25
+ const path = resolveJsonRecordPath(directory, idOrPath);
26
+ return schema.parse(await readJsonFile(path));
27
+ }
28
+ export function resolveJsonRecordPath(directory, idOrPath) {
29
+ const explicitPath = isAbsolute(idOrPath) ||
30
+ idOrPath.endsWith(".json") ||
31
+ idOrPath.includes("/") ||
32
+ idOrPath.includes("\\");
33
+ return explicitPath ? resolve(idOrPath) : resolve(directory, `${idOrPath}.json`);
34
+ }
35
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/state/records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,SAAiB,EAAE,MAAkB;IAC5E,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,QAAgB,EAChB,MAAkB;IAElB,MAAM,IAAI,GAAG,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,QAAgB;IACvE,MAAM,YAAY,GAChB,UAAU,CAAC,QAAQ,CAAC;QACpB,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AACnF,CAAC"}
@@ -1,10 +1,12 @@
1
1
  import type { CleanupPlan } from "../contracts/plan.js";
2
+ import type { Diagnostic } from "../contracts/diagnostic.js";
2
3
  import { type ActionExecution, type CleanupRun } from "../contracts/run.js";
3
4
  export type RunJournal = {
4
5
  path: string;
5
6
  snapshot(): CleanupRun;
6
7
  updateAction(actionId: string, patch: Partial<ActionExecution>): Promise<CleanupRun>;
7
8
  complete(completedAt?: Date): Promise<CleanupRun>;
9
+ interrupt(diagnostic: Diagnostic, completedAt?: Date): Promise<CleanupRun>;
8
10
  };
9
- export declare function createRunJournal(runsDirectory: string, plan: CleanupPlan, startedAt?: Date): Promise<RunJournal>;
11
+ export declare function createRunJournal(runsDirectory: string, plan: CleanupPlan, startedAt?: Date, runId?: string): Promise<RunJournal>;
10
12
  //# sourceMappingURL=run-journal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-journal.d.ts","sourceRoot":"","sources":["../../src/state/run-journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG9F,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,IAAI,UAAU,CAAC;IACvB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,WAAW,EACjB,SAAS,OAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CA4DrB"}
1
+ {"version":3,"file":"run-journal.d.ts","sourceRoot":"","sources":["../../src/state/run-journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG9F,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,IAAI,UAAU,CAAC;IACvB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5E,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,WAAW,EACjB,SAAS,OAAa,EACtB,KAAK,GAAE,MAAqB,GAC3B,OAAO,CAAC,UAAU,CAAC,CA0ErB"}
@@ -2,10 +2,10 @@ import { randomUUID } from "node:crypto";
2
2
  import { join } from "node:path";
3
3
  import { cleanupRunSchema } from "../contracts/run.js";
4
4
  import { writeJsonAtomic } from "./json-file.js";
5
- export async function createRunJournal(runsDirectory, plan, startedAt = new Date()) {
5
+ export async function createRunJournal(runsDirectory, plan, startedAt = new Date(), runId = randomUUID()) {
6
6
  let run = cleanupRunSchema.parse({
7
7
  schemaVersion: 1,
8
- runId: randomUUID(),
8
+ runId,
9
9
  planId: plan.planId,
10
10
  startedAt: startedAt.toISOString(),
11
11
  status: "running",
@@ -18,10 +18,11 @@ export async function createRunJournal(runsDirectory, plan, startedAt = new Date
18
18
  diagnostics: [],
19
19
  });
20
20
  const path = join(runsDirectory, `${run.runId}.json`);
21
- await writeJsonAtomic(path, run);
21
+ const privateDirectories = [runsDirectory];
22
+ await writeJsonAtomic(path, run, { privateDirectories });
22
23
  const persist = async () => {
23
24
  run = cleanupRunSchema.parse(run);
24
- await writeJsonAtomic(path, run);
25
+ await writeJsonAtomic(path, run, { privateDirectories });
25
26
  return structuredClone(run);
26
27
  };
27
28
  return {
@@ -52,6 +53,16 @@ export async function createRunJournal(runsDirectory, plan, startedAt = new Date
52
53
  };
53
54
  return persist();
54
55
  },
56
+ async interrupt(diagnostic, completedAt = new Date()) {
57
+ run = {
58
+ ...run,
59
+ completedAt: completedAt.toISOString(),
60
+ status: "interrupted",
61
+ reclaimedBytes: run.actions.reduce((total, action) => total + (action.reclaimedBytes ?? 0), 0),
62
+ diagnostics: [...run.diagnostics, diagnostic],
63
+ };
64
+ return persist();
65
+ },
55
66
  };
56
67
  }
57
68
  //# sourceMappingURL=run-journal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-journal.js","sourceRoot":"","sources":["../../src/state/run-journal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-journal.js","sourceRoot":"","sources":["../../src/state/run-journal.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.0.0";
1
+ export declare const VERSION = "0.2.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.0.0";
1
+ export const VERSION = "0.2.0";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "agentrinse",
3
- "version": "0.0.0",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
- "description": "Reservation release for safe agentic-development cleanup.",
5
+ "description": "Safe, local-first cleanup for agentic development.",
6
6
  "keywords": [
7
7
  "agents",
8
8
  "cleanup",
@@ -50,6 +50,7 @@
50
50
  "schemas:check": "pnpm build && node scripts/generate-schemas.mjs --check",
51
51
  "schemas:generate": "pnpm build && node scripts/generate-schemas.mjs",
52
52
  "smoke": "pnpm build && node scripts/smoke.mjs",
53
+ "smoke:package": "pnpm build && node scripts/smoke-package.mjs",
53
54
  "test": "vitest run",
54
55
  "test:watch": "vitest",
55
56
  "typecheck": "tsc -p tsconfig.json --noEmit"
@@ -0,0 +1,78 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "schemaVersion": {
6
+ "type": "number",
7
+ "const": 1
8
+ },
9
+ "command": {
10
+ "type": "string",
11
+ "minLength": 1
12
+ },
13
+ "agentrinseVersion": {
14
+ "type": "string",
15
+ "minLength": 1
16
+ },
17
+ "startedAt": {
18
+ "type": "string",
19
+ "format": "date-time",
20
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
21
+ },
22
+ "completedAt": {
23
+ "type": "string",
24
+ "format": "date-time",
25
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
26
+ },
27
+ "status": {
28
+ "type": "string",
29
+ "enum": ["ok", "degraded", "failed"]
30
+ },
31
+ "data": {},
32
+ "diagnostics": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "object",
36
+ "properties": {
37
+ "severity": {
38
+ "type": "string",
39
+ "enum": ["info", "warning", "error"]
40
+ },
41
+ "code": {
42
+ "type": "string",
43
+ "minLength": 1
44
+ },
45
+ "message": {
46
+ "type": "string",
47
+ "minLength": 1
48
+ },
49
+ "adapter": {
50
+ "type": "string",
51
+ "minLength": 1
52
+ },
53
+ "resourceId": {
54
+ "type": "string",
55
+ "minLength": 1
56
+ },
57
+ "remediation": {
58
+ "type": "string",
59
+ "minLength": 1
60
+ }
61
+ },
62
+ "required": ["severity", "code", "message"]
63
+ }
64
+ }
65
+ },
66
+ "required": [
67
+ "schemaVersion",
68
+ "command",
69
+ "agentrinseVersion",
70
+ "startedAt",
71
+ "completedAt",
72
+ "status",
73
+ "data",
74
+ "diagnostics"
75
+ ],
76
+ "$id": "https://agentrinse.com/schemas/command-envelope.schema.json",
77
+ "title": "AgentRinse command-envelope schema"
78
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "schemaVersion": {
6
+ "type": "number",
7
+ "const": 1
8
+ },
9
+ "event": {
10
+ "type": "string",
11
+ "minLength": 1
12
+ },
13
+ "timestamp": {
14
+ "type": "string",
15
+ "format": "date-time",
16
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
17
+ },
18
+ "command": {
19
+ "type": "string",
20
+ "minLength": 1
21
+ },
22
+ "commandId": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "sequence": {
27
+ "type": "integer",
28
+ "exclusiveMinimum": 0,
29
+ "maximum": 9007199254740991
30
+ },
31
+ "data": {}
32
+ },
33
+ "required": ["schemaVersion", "event", "timestamp", "command", "commandId", "sequence"],
34
+ "$id": "https://agentrinse.com/schemas/command-event.schema.json",
35
+ "title": "AgentRinse command-event schema"
36
+ }