agentrinse 0.4.0 → 0.5.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 (134) hide show
  1. package/README.md +57 -48
  2. package/dist/adapters/claude-cache.d.ts +3 -0
  3. package/dist/adapters/claude-cache.d.ts.map +1 -0
  4. package/dist/adapters/claude-cache.js +67 -0
  5. package/dist/adapters/claude-cache.js.map +1 -0
  6. package/dist/adapters/claude-debug.d.ts +3 -0
  7. package/dist/adapters/claude-debug.d.ts.map +1 -0
  8. package/dist/adapters/claude-debug.js +100 -0
  9. package/dist/adapters/claude-debug.js.map +1 -0
  10. package/dist/adapters/claude-retention.d.ts +36 -0
  11. package/dist/adapters/claude-retention.d.ts.map +1 -0
  12. package/dist/adapters/claude-retention.js +176 -0
  13. package/dist/adapters/claude-retention.js.map +1 -0
  14. package/dist/adapters/copilot-maintenance.d.ts +23 -0
  15. package/dist/adapters/copilot-maintenance.d.ts.map +1 -0
  16. package/dist/adapters/copilot-maintenance.js +53 -0
  17. package/dist/adapters/copilot-maintenance.js.map +1 -0
  18. package/dist/adapters/provider-adapter.d.ts +1 -0
  19. package/dist/adapters/provider-adapter.d.ts.map +1 -1
  20. package/dist/adapters/provider-adapter.js +209 -4
  21. package/dist/adapters/provider-adapter.js.map +1 -1
  22. package/dist/adapters/provider-root.d.ts +8 -0
  23. package/dist/adapters/provider-root.d.ts.map +1 -0
  24. package/dist/adapters/provider-root.js +27 -0
  25. package/dist/adapters/provider-root.js.map +1 -0
  26. package/dist/adapters/provider-specs.d.ts.map +1 -1
  27. package/dist/adapters/provider-specs.js +10 -0
  28. package/dist/adapters/provider-specs.js.map +1 -1
  29. package/dist/adapters/registry.d.ts.map +1 -1
  30. package/dist/adapters/registry.js +1 -0
  31. package/dist/adapters/registry.js.map +1 -1
  32. package/dist/commands/doctor.d.ts.map +1 -1
  33. package/dist/commands/doctor.js +2 -0
  34. package/dist/commands/doctor.js.map +1 -1
  35. package/dist/commands/purge.d.ts +7 -1
  36. package/dist/commands/purge.d.ts.map +1 -1
  37. package/dist/commands/purge.js +23 -0
  38. package/dist/commands/purge.js.map +1 -1
  39. package/dist/commands/show.d.ts.map +1 -1
  40. package/dist/commands/show.js +3 -0
  41. package/dist/commands/show.js.map +1 -1
  42. package/dist/commands/undo.d.ts +4 -1
  43. package/dist/commands/undo.d.ts.map +1 -1
  44. package/dist/commands/undo.js +18 -1
  45. package/dist/commands/undo.js.map +1 -1
  46. package/dist/contracts/action.d.ts +335 -2
  47. package/dist/contracts/action.d.ts.map +1 -1
  48. package/dist/contracts/action.js +52 -1
  49. package/dist/contracts/action.js.map +1 -1
  50. package/dist/contracts/finding.d.ts +153 -2
  51. package/dist/contracts/finding.d.ts.map +1 -1
  52. package/dist/contracts/plan.d.ts +152 -2
  53. package/dist/contracts/plan.d.ts.map +1 -1
  54. package/dist/contracts/plan.js +1 -1
  55. package/dist/contracts/plan.js.map +1 -1
  56. package/dist/contracts/provider-file-quarantine.d.ts +221 -0
  57. package/dist/contracts/provider-file-quarantine.d.ts.map +1 -0
  58. package/dist/contracts/provider-file-quarantine.js +61 -0
  59. package/dist/contracts/provider-file-quarantine.js.map +1 -0
  60. package/dist/contracts/report.d.ts +153 -2
  61. package/dist/contracts/report.d.ts.map +1 -1
  62. package/dist/contracts/resource.d.ts +3 -0
  63. package/dist/contracts/resource.d.ts.map +1 -1
  64. package/dist/contracts/resource.js +1 -0
  65. package/dist/contracts/resource.js.map +1 -1
  66. package/dist/contracts/run.d.ts +94 -0
  67. package/dist/contracts/run.d.ts.map +1 -1
  68. package/dist/contracts/run.js +7 -0
  69. package/dist/contracts/run.js.map +1 -1
  70. package/dist/core/apply.d.ts +5 -1
  71. package/dist/core/apply.d.ts.map +1 -1
  72. package/dist/core/apply.js +74 -3
  73. package/dist/core/apply.js.map +1 -1
  74. package/dist/core/no-clobber-rename.d.ts +1 -0
  75. package/dist/core/no-clobber-rename.d.ts.map +1 -1
  76. package/dist/core/no-clobber-rename.js +44 -0
  77. package/dist/core/no-clobber-rename.js.map +1 -1
  78. package/dist/core/pinned-file.d.ts +37 -0
  79. package/dist/core/pinned-file.d.ts.map +1 -0
  80. package/dist/core/pinned-file.js +228 -0
  81. package/dist/core/pinned-file.js.map +1 -0
  82. package/dist/core/plan.d.ts.map +1 -1
  83. package/dist/core/plan.js +4 -1
  84. package/dist/core/plan.js.map +1 -1
  85. package/dist/core/process-ownership.d.ts +1 -0
  86. package/dist/core/process-ownership.d.ts.map +1 -1
  87. package/dist/core/process-ownership.js +17 -3
  88. package/dist/core/process-ownership.js.map +1 -1
  89. package/dist/core/provider-file-executor.d.ts +40 -0
  90. package/dist/core/provider-file-executor.d.ts.map +1 -0
  91. package/dist/core/provider-file-executor.js +259 -0
  92. package/dist/core/provider-file-executor.js.map +1 -0
  93. package/dist/core/provider-file-identity.d.ts +8 -0
  94. package/dist/core/provider-file-identity.d.ts.map +1 -0
  95. package/dist/core/provider-file-identity.js +113 -0
  96. package/dist/core/provider-file-identity.js.map +1 -0
  97. package/dist/core/provider-file-policy.d.ts +19 -0
  98. package/dist/core/provider-file-policy.d.ts.map +1 -0
  99. package/dist/core/provider-file-policy.js +72 -0
  100. package/dist/core/provider-file-policy.js.map +1 -0
  101. package/dist/core/provider-file-recovery.d.ts +25 -0
  102. package/dist/core/provider-file-recovery.d.ts.map +1 -0
  103. package/dist/core/provider-file-recovery.js +393 -0
  104. package/dist/core/provider-file-recovery.js.map +1 -0
  105. package/dist/core/provider-file-revalidation.d.ts +20 -0
  106. package/dist/core/provider-file-revalidation.d.ts.map +1 -0
  107. package/dist/core/provider-file-revalidation.js +60 -0
  108. package/dist/core/provider-file-revalidation.js.map +1 -0
  109. package/dist/core/provider-processes.d.ts +18 -0
  110. package/dist/core/provider-processes.d.ts.map +1 -0
  111. package/dist/core/provider-processes.js +90 -0
  112. package/dist/core/provider-processes.js.map +1 -0
  113. package/dist/index.d.ts +3 -2
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +3 -2
  116. package/dist/index.js.map +1 -1
  117. package/dist/state/json-file.d.ts +2 -1
  118. package/dist/state/json-file.d.ts.map +1 -1
  119. package/dist/state/json-file.js +59 -2
  120. package/dist/state/json-file.js.map +1 -1
  121. package/dist/state/layout.d.ts +1 -0
  122. package/dist/state/layout.d.ts.map +1 -1
  123. package/dist/state/layout.js +1 -0
  124. package/dist/state/layout.js.map +1 -1
  125. package/dist/state/run-journal.d.ts.map +1 -1
  126. package/dist/state/run-journal.js +8 -2
  127. package/dist/state/run-journal.js.map +1 -1
  128. package/dist/version.d.ts +1 -1
  129. package/dist/version.js +1 -1
  130. package/package.json +1 -1
  131. package/schemas/audit.schema.json +786 -1
  132. package/schemas/plan.schema.json +785 -1
  133. package/schemas/provider-file-quarantine.schema.json +741 -0
  134. package/schemas/run.schema.json +85 -0
@@ -0,0 +1,259 @@
1
+ import { lstat, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { providerFileQuarantineActionSchema, } from "../contracts/action.js";
4
+ import { providerFileQuarantineEntrySchema, } from "../contracts/provider-file-quarantine.js";
5
+ import { ensurePrivateDirectory, syncDirectory, writeJsonAtomic } from "../state/json-file.js";
6
+ import { renameAtNoReplace } from "./no-clobber-rename.js";
7
+ import { openPinnedDirectory, openPinnedProviderFile } from "./pinned-file.js";
8
+ import { inspectProviderFile, providerFileIdentityMatches, providerFileStatsMatch, } from "./provider-file-identity.js";
9
+ import { revalidateProviderFileQuarantine, } from "./provider-file-revalidation.js";
10
+ export class ProviderFileExecutionError extends Error {
11
+ outcome;
12
+ diagnosticCode;
13
+ entry;
14
+ name = "ProviderFileExecutionError";
15
+ constructor(message, outcome, diagnosticCode, entry, options) {
16
+ super(message, options);
17
+ this.outcome = outcome;
18
+ this.diagnosticCode = diagnosticCode;
19
+ this.entry = entry;
20
+ this.quarantinedBytes = options?.quarantinedBytes ?? 0;
21
+ }
22
+ quarantinedBytes;
23
+ }
24
+ export function providerFileQuarantinePath(quarantineDirectory, entryId) {
25
+ return join(quarantineDirectory, `${entryId}.payload`);
26
+ }
27
+ async function pathExists(path) {
28
+ try {
29
+ await lstat(path);
30
+ return true;
31
+ }
32
+ catch (error) {
33
+ if (error instanceof Error &&
34
+ "code" in error &&
35
+ error.code === "ENOENT") {
36
+ return false;
37
+ }
38
+ throw error;
39
+ }
40
+ }
41
+ async function persist(manifestPath, quarantineDirectory, entry) {
42
+ const parsed = providerFileQuarantineEntrySchema.parse(entry);
43
+ await writeJsonAtomic(manifestPath, parsed, {
44
+ privateDirectories: [quarantineDirectory],
45
+ });
46
+ return parsed;
47
+ }
48
+ async function finalizeUnmovedEntry(entry, manifestPath, quarantineDirectory, clock) {
49
+ try {
50
+ return await persist(manifestPath, quarantineDirectory, {
51
+ ...entry,
52
+ status: "restored",
53
+ restoredAt: clock().toISOString(),
54
+ });
55
+ }
56
+ catch (error) {
57
+ await rm(manifestPath, { force: true }).catch(() => undefined);
58
+ await syncDirectory(quarantineDirectory).catch(() => undefined);
59
+ throw error;
60
+ }
61
+ }
62
+ function assertAuthorized(dependencies, entry) {
63
+ if (dependencies.authorization !== undefined &&
64
+ dependencies.authorization.now().getTime() >= dependencies.authorization.expiresAtMs) {
65
+ throw new ProviderFileExecutionError("cleanup plan authorization expired before provider-file quarantine", "skipped-stale", "PLAN_EXPIRED_DURING_APPLY", entry);
66
+ }
67
+ }
68
+ export async function executeProviderFileQuarantine(action, options) {
69
+ const dependencies = options.dependencies ?? {};
70
+ const clock = dependencies.clock ?? (() => new Date());
71
+ const quarantinePath = providerFileQuarantinePath(options.quarantineDirectory, options.entryId);
72
+ const quarantineBasename = `${options.entryId}.payload`;
73
+ const manifestPath = join(options.quarantineDirectory, `${options.entryId}.json`);
74
+ if (!["darwin", "linux"].includes(dependencies.platform ?? process.platform)) {
75
+ throw new ProviderFileExecutionError(`provider-file quarantine is unsupported on ${dependencies.platform ?? process.platform}`, "skipped-stale", "PROVIDER_FILE_PLATFORM_UNSUPPORTED");
76
+ }
77
+ if (dependencies.authorizeTarget === undefined) {
78
+ throw new ProviderFileExecutionError("provider-file execution requires an approved provider policy", "skipped-stale", "PROVIDER_FILE_POLICY_REFUSED");
79
+ }
80
+ try {
81
+ await dependencies.authorizeTarget(action);
82
+ }
83
+ catch (error) {
84
+ throw new ProviderFileExecutionError(error instanceof Error ? error.message : String(error), "skipped-stale", "PROVIDER_FILE_POLICY_REFUSED", undefined, { cause: error });
85
+ }
86
+ await ensurePrivateDirectory(options.quarantineDirectory);
87
+ const quarantineDirectoryHandle = await openPinnedDirectory(options.quarantineDirectory);
88
+ let sourceHandle;
89
+ try {
90
+ sourceHandle = await openPinnedProviderFile(action.target.path, action.target.ownerRoot);
91
+ const [quarantineStats, sourceStats] = await Promise.all([
92
+ quarantineDirectoryHandle.stat(),
93
+ sourceHandle.stat(),
94
+ ]);
95
+ if (quarantineStats.dev !== sourceStats.dev) {
96
+ throw new ProviderFileExecutionError("provider-file recovery storage is on a different filesystem", "skipped-stale", "PROVIDER_FILE_QUARANTINE_CROSS_DEVICE");
97
+ }
98
+ if ((await pathExists(quarantinePath)) || (await pathExists(manifestPath))) {
99
+ throw new ProviderFileExecutionError("provider-file quarantine destination already exists", "failed", "PROVIDER_FILE_DESTINATION_OCCUPIED");
100
+ }
101
+ }
102
+ catch (error) {
103
+ await quarantineDirectoryHandle.close().catch(() => undefined);
104
+ if (error instanceof ProviderFileExecutionError) {
105
+ throw error;
106
+ }
107
+ throw new ProviderFileExecutionError(error instanceof Error ? error.message : String(error), "failed", "PROVIDER_FILE_QUARANTINE_FAILED", undefined, { cause: error });
108
+ }
109
+ let entry;
110
+ try {
111
+ entry = await persist(manifestPath, options.quarantineDirectory, {
112
+ schemaVersion: 1,
113
+ entryId: options.entryId,
114
+ runId: options.runId,
115
+ actionId: action.actionId,
116
+ resourceId: action.resourceId,
117
+ policyId: action.policyId,
118
+ status: "preparing",
119
+ originalPath: action.target.path,
120
+ quarantinePath,
121
+ createdAt: clock().toISOString(),
122
+ expiresAt: new Date(clock().getTime() + action.quarantineTtlMinutes * 60_000).toISOString(),
123
+ target: action.target,
124
+ });
125
+ }
126
+ catch (error) {
127
+ await Promise.all([
128
+ sourceHandle.close().catch(() => undefined),
129
+ quarantineDirectoryHandle.close().catch(() => undefined),
130
+ ]);
131
+ throw error;
132
+ }
133
+ let moved = false;
134
+ let modeSealed = false;
135
+ const originalMode = action.target.mode & 0o7777;
136
+ const chmodHandle = dependencies.chmodHandle ?? ((handle, mode) => handle.chmod(mode));
137
+ try {
138
+ if (!providerFileStatsMatch(await sourceHandle.stat(), action.target)) {
139
+ throw new ProviderFileExecutionError("provider file identity changed while acquiring exclusive access", "skipped-stale", "PROVIDER_FILE_IDENTITY_CHANGED", entry);
140
+ }
141
+ await chmodHandle(sourceHandle, originalMode & ~0o222);
142
+ modeSealed = true;
143
+ await sourceHandle.sync();
144
+ if (!providerFileStatsMatch(await sourceHandle.stat(), action.target, true)) {
145
+ throw new ProviderFileExecutionError("provider file identity changed while sealing exclusive access", "skipped-stale", "PROVIDER_FILE_IDENTITY_CHANGED", entry);
146
+ }
147
+ const sealed = await inspectProviderFile(action.target.path, action.target.ownerRoot, action.target.provider);
148
+ if (!providerFileIdentityMatches(sealed, action.target, true)) {
149
+ throw new ProviderFileExecutionError("provider file identity changed while acquiring exclusive access", "skipped-stale", "PROVIDER_FILE_IDENTITY_CHANGED", entry);
150
+ }
151
+ const readiness = await revalidateProviderFileQuarantine(providerFileQuarantineActionSchema.parse({
152
+ ...action,
153
+ target: sealed,
154
+ }), undefined, undefined, {
155
+ ...dependencies,
156
+ allowedHandlePids: new Set([...(dependencies.allowedHandlePids ?? []), process.pid]),
157
+ });
158
+ if (readiness.status === "stale") {
159
+ throw new ProviderFileExecutionError(readiness.diagnostic.message, "skipped-stale", readiness.diagnostic.code, entry);
160
+ }
161
+ assertAuthorized(dependencies, entry);
162
+ if (dependencies.move !== undefined) {
163
+ await dependencies.move(action.target.path, quarantinePath);
164
+ }
165
+ else {
166
+ await renameAtNoReplace(sourceHandle.parent.fd, sourceHandle.basename, quarantineDirectoryHandle.fd, quarantineBasename, dependencies.platform ?? process.platform);
167
+ }
168
+ moved = true;
169
+ const movedHandle = await openPinnedProviderFile(quarantinePath, options.quarantineDirectory).catch(() => undefined);
170
+ const movedStats = await movedHandle?.stat().catch(() => undefined);
171
+ await movedHandle?.close().catch(() => undefined);
172
+ if (movedStats === undefined || !providerFileStatsMatch(movedStats, action.target, true)) {
173
+ let rollbackError;
174
+ try {
175
+ if (dependencies.move !== undefined) {
176
+ await dependencies.move(quarantinePath, action.target.path);
177
+ }
178
+ else {
179
+ await renameAtNoReplace(quarantineDirectoryHandle.fd, quarantineBasename, sourceHandle.parent.fd, sourceHandle.basename, dependencies.platform ?? process.platform);
180
+ }
181
+ await Promise.all([sourceHandle.parent.sync(), quarantineDirectoryHandle.sync()]);
182
+ moved = false;
183
+ }
184
+ catch (error) {
185
+ rollbackError = error;
186
+ }
187
+ if (rollbackError !== undefined) {
188
+ throw new ProviderFileExecutionError("an unexpected inode was moved and rollback failed", "partially-applied", "PROVIDER_FILE_UNEXPECTED_INODE_PARTIAL", entry, { cause: rollbackError });
189
+ }
190
+ throw new ProviderFileExecutionError("source pathname changed before the atomic move; the unexpected inode was restored", "rolled-back", "PROVIDER_FILE_UNEXPECTED_INODE_ROLLED_BACK", entry);
191
+ }
192
+ await Promise.all([sourceHandle.parent.sync(), quarantineDirectoryHandle.sync()]);
193
+ await chmodHandle(sourceHandle, originalMode);
194
+ modeSealed = false;
195
+ await sourceHandle.sync();
196
+ const quarantineIdentity = await inspectProviderFile(quarantinePath, options.quarantineDirectory, action.target.provider);
197
+ if (quarantineIdentity.device !== action.target.device ||
198
+ quarantineIdentity.inode !== action.target.inode ||
199
+ quarantineIdentity.mode !== action.target.mode ||
200
+ quarantineIdentity.mtimeMs !== action.target.mtimeMs ||
201
+ quarantineIdentity.measuredBytes !== action.target.measuredBytes ||
202
+ quarantineIdentity.contentSha256 !== action.target.contentSha256) {
203
+ throw new ProviderFileExecutionError("quarantined provider file no longer matches the planned content identity", "partially-applied", "PROVIDER_FILE_QUARANTINE_IDENTITY_CHANGED", entry);
204
+ }
205
+ entry = await persist(manifestPath, options.quarantineDirectory, {
206
+ ...entry,
207
+ status: "quarantined",
208
+ quarantineIdentity,
209
+ });
210
+ return {
211
+ quarantineEntryId: entry.entryId,
212
+ quarantinePath: entry.quarantinePath,
213
+ quarantinedBytes: entry.target.measuredBytes,
214
+ manifestPath,
215
+ };
216
+ }
217
+ catch (error) {
218
+ if (!moved) {
219
+ if (modeSealed) {
220
+ try {
221
+ await chmodHandle(sourceHandle, originalMode);
222
+ await sourceHandle.sync();
223
+ modeSealed = false;
224
+ }
225
+ catch (restoreError) {
226
+ throw new ProviderFileExecutionError("provider file permissions could not be restored; recovery remains pending", "partially-applied", "PROVIDER_FILE_PERMISSION_RESTORE_FAILED", entry, { cause: new AggregateError([error, restoreError]) });
227
+ }
228
+ }
229
+ entry = await finalizeUnmovedEntry(entry, manifestPath, options.quarantineDirectory, clock);
230
+ if (error instanceof ProviderFileExecutionError) {
231
+ throw error;
232
+ }
233
+ throw new ProviderFileExecutionError(error instanceof Error ? error.message : String(error), "failed", "PROVIDER_FILE_QUARANTINE_FAILED", entry, { cause: error });
234
+ }
235
+ const quarantineIdentity = await inspectProviderFile(quarantinePath, options.quarantineDirectory, action.target.provider).catch(() => undefined);
236
+ if (quarantineIdentity !== undefined) {
237
+ entry = await persist(manifestPath, options.quarantineDirectory, {
238
+ ...entry,
239
+ status: "partial",
240
+ quarantineIdentity,
241
+ diagnostic: {
242
+ severity: "error",
243
+ code: "PROVIDER_FILE_QUARANTINE_PARTIAL",
244
+ message: error instanceof Error ? error.message : String(error),
245
+ adapter: action.adapter,
246
+ resourceId: action.resourceId,
247
+ },
248
+ }).catch(() => entry);
249
+ }
250
+ throw new ProviderFileExecutionError(error instanceof Error ? error.message : String(error), "partially-applied", "PROVIDER_FILE_QUARANTINE_PARTIAL", entry, { cause: error, quarantinedBytes: moved ? action.target.measuredBytes : 0 });
251
+ }
252
+ finally {
253
+ await Promise.all([
254
+ sourceHandle.close().catch(() => undefined),
255
+ quarantineDirectoryHandle.close().catch(() => undefined),
256
+ ]);
257
+ }
258
+ }
259
+ //# sourceMappingURL=provider-file-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-file-executor.js","sourceRoot":"","sources":["../../src/core/provider-file-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Stats } from "node:fs";
2
+ import type { ProviderFileIdentity, ProviderMutationId } from "../contracts/action.js";
3
+ export declare function inspectProviderFile<T extends ProviderMutationId>(path: string, ownerRoot: string, provider: T): Promise<ProviderFileIdentity & {
4
+ provider: T;
5
+ }>;
6
+ export declare function providerFileIdentityMatches(actual: ProviderFileIdentity, expected: ProviderFileIdentity, allowSealedMode?: boolean): boolean;
7
+ export declare function providerFileStatsMatch(stats: Stats, expected: ProviderFileIdentity, allowSealedMode?: boolean): boolean;
8
+ //# sourceMappingURL=provider-file-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-file-identity.d.ts","sourceRoot":"","sources":["../../src/core/provider-file-identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAqCvF,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,kBAAkB,EACpE,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,GACV,OAAO,CAAC,oBAAoB,GAAG;IAAE,QAAQ,EAAE,CAAC,CAAA;CAAE,CAAC,CAyCjD;AAMD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,oBAAoB,EAC9B,eAAe,UAAQ,GACtB,OAAO,CA8BT;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,eAAe,UAAQ,GACtB,OAAO,CAYT"}
@@ -0,0 +1,113 @@
1
+ import { createHash } from "node:crypto";
2
+ import { sha256Json } from "./digest.js";
3
+ import { openPinnedProviderFile } from "./pinned-file.js";
4
+ async function hashFileDescriptor(handle, measuredBytes) {
5
+ const hash = createHash("sha256");
6
+ const buffer = Buffer.allocUnsafe(64 * 1024);
7
+ let position = 0;
8
+ while (position < measuredBytes) {
9
+ const remaining = measuredBytes - position;
10
+ const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, remaining), position);
11
+ if (bytesRead === 0) {
12
+ throw new Error("provider file reached end-of-file before its measured size");
13
+ }
14
+ hash.update(buffer.subarray(0, bytesRead));
15
+ position += bytesRead;
16
+ }
17
+ return hash.digest("hex");
18
+ }
19
+ function stableFileStats(before, after) {
20
+ return (before.dev === after.dev &&
21
+ before.ino === after.ino &&
22
+ before.nlink === after.nlink &&
23
+ before.mode === after.mode &&
24
+ before.mtimeMs === after.mtimeMs &&
25
+ before.ctimeMs === after.ctimeMs &&
26
+ before.size === after.size);
27
+ }
28
+ export async function inspectProviderFile(path, ownerRoot, provider) {
29
+ const handle = await openPinnedProviderFile(path, ownerRoot);
30
+ let after;
31
+ let contentSha256;
32
+ try {
33
+ const before = await handle.stat();
34
+ if (!before.isFile()) {
35
+ throw new Error(`provider cleanup target is not a regular file: ${path}`);
36
+ }
37
+ if (before.nlink !== 1) {
38
+ throw new Error(`provider cleanup target has multiple hard links: ${path}`);
39
+ }
40
+ contentSha256 = await hashFileDescriptor(handle, before.size);
41
+ after = await handle.stat();
42
+ if (!stableFileStats(before, after)) {
43
+ throw new Error(`provider file changed while its content identity was measured: ${path}`);
44
+ }
45
+ if (after.nlink !== 1) {
46
+ throw new Error(`provider cleanup target has multiple hard links: ${path}`);
47
+ }
48
+ }
49
+ finally {
50
+ await handle.close();
51
+ }
52
+ const identity = {
53
+ path: handle.path,
54
+ ownerRoot: handle.ownerRoot,
55
+ relativePath: handle.relativePath,
56
+ provider,
57
+ device: after.dev,
58
+ inode: after.ino,
59
+ linkCount: 1,
60
+ mode: after.mode,
61
+ mtimeMs: after.mtimeMs,
62
+ measuredBytes: after.size,
63
+ contentSha256,
64
+ };
65
+ return {
66
+ ...identity,
67
+ fingerprint: sha256Json(identity),
68
+ };
69
+ }
70
+ function modeMatches(actual, expected, allowSealedMode) {
71
+ return actual === expected || (allowSealedMode && actual === (expected & ~0o222));
72
+ }
73
+ export function providerFileIdentityMatches(actual, expected, allowSealedMode = false) {
74
+ return (actual.path === expected.path &&
75
+ actual.ownerRoot === expected.ownerRoot &&
76
+ actual.relativePath === expected.relativePath &&
77
+ actual.provider === expected.provider &&
78
+ actual.device === expected.device &&
79
+ actual.inode === expected.inode &&
80
+ actual.linkCount === expected.linkCount &&
81
+ modeMatches(actual.mode, expected.mode, allowSealedMode) &&
82
+ actual.mtimeMs === expected.mtimeMs &&
83
+ actual.measuredBytes === expected.measuredBytes &&
84
+ actual.contentSha256 === expected.contentSha256 &&
85
+ (actual.fingerprint === expected.fingerprint ||
86
+ (allowSealedMode &&
87
+ actual.fingerprint ===
88
+ sha256Json({
89
+ path: expected.path,
90
+ ownerRoot: expected.ownerRoot,
91
+ relativePath: expected.relativePath,
92
+ provider: expected.provider,
93
+ device: expected.device,
94
+ inode: expected.inode,
95
+ linkCount: expected.linkCount,
96
+ mode: expected.mode & ~0o222,
97
+ mtimeMs: expected.mtimeMs,
98
+ measuredBytes: expected.measuredBytes,
99
+ contentSha256: expected.contentSha256,
100
+ }))));
101
+ }
102
+ export function providerFileStatsMatch(stats, expected, allowSealedMode = false) {
103
+ return (stats.isFile() &&
104
+ !stats.isSymbolicLink() &&
105
+ stats.dev === expected.device &&
106
+ stats.ino === expected.inode &&
107
+ stats.nlink === expected.linkCount &&
108
+ (stats.mode === expected.mode ||
109
+ (allowSealedMode && stats.mode === (expected.mode & ~0o222))) &&
110
+ stats.mtimeMs === expected.mtimeMs &&
111
+ stats.size === expected.measuredBytes);
112
+ }
113
+ //# sourceMappingURL=provider-file-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-file-identity.js","sourceRoot":"","sources":["../../src/core/provider-file-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AgentRinseConfig } from "../config/schema.js";
2
+ import type { ProviderFileQuarantineAction, ProviderMutationId } from "../contracts/action.js";
3
+ export type ProviderFilePolicy = {
4
+ id: string;
5
+ provider: ProviderMutationId;
6
+ matchesRelativePath(relativePath: string): boolean;
7
+ validateAction(action: ProviderFileQuarantineAction, now: Date): string | undefined;
8
+ };
9
+ export declare const CLAUDE_DEBUG_LOG_POLICY_ID = "claude.debug-log";
10
+ export declare const CLAUDE_DEBUG_LOG_MIN_AGE_MINUTES: number;
11
+ export declare const CLAUDE_DEBUG_LOG_QUARANTINE_TTL_MINUTES: number;
12
+ export declare const CLAUDE_CHANGELOG_CACHE_POLICY_ID = "claude.changelog-cache";
13
+ export declare const CLAUDE_CHANGELOG_CACHE_MIN_AGE_MINUTES: number;
14
+ export declare const CLAUDE_CHANGELOG_CACHE_QUARANTINE_TTL_MINUTES: number;
15
+ export declare function isClaudeDebugLogRelativePath(relativePath: string): boolean;
16
+ export declare function isClaudeChangelogCacheRelativePath(relativePath: string): boolean;
17
+ export declare const PROVIDER_FILE_POLICIES: readonly ProviderFilePolicy[];
18
+ export declare function authorizeProviderFileAction(action: ProviderFileQuarantineAction, home: string, config: AgentRinseConfig, platform?: NodeJS.Platform, environment?: NodeJS.ProcessEnv, now?: Date): Promise<void>;
19
+ //# sourceMappingURL=provider-file-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-file-policy.d.ts","sourceRoot":"","sources":["../../src/core/provider-file-policy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE/F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IACnD,cAAc,CAAC,MAAM,EAAE,4BAA4B,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;CACrF,CAAC;AAEF,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAC7D,eAAO,MAAM,gCAAgC,QAAe,CAAC;AAC7D,eAAO,MAAM,uCAAuC,QAAc,CAAC;AACnE,eAAO,MAAM,gCAAgC,2BAA2B,CAAC;AACzE,eAAO,MAAM,sCAAsC,QAAe,CAAC;AACnE,eAAO,MAAM,6CAA6C,QAAc,CAAC;AAEzE,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAQ1E;AAED,wBAAgB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAGhF;AAqBD,eAAO,MAAM,sBAAsB,EAAE,SAAS,kBAAkB,EA6B/D,CAAC;AAEF,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,4BAA4B,EACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,WAAW,GAAE,MAAM,CAAC,UAAwB,EAC5C,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -0,0 +1,72 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { resolve, sep } from "node:path";
3
+ import { resolveProviderRoot } from "../adapters/provider-root.js";
4
+ import { PROVIDER_SPECS } from "../adapters/provider-specs.js";
5
+ export const CLAUDE_DEBUG_LOG_POLICY_ID = "claude.debug-log";
6
+ export const CLAUDE_DEBUG_LOG_MIN_AGE_MINUTES = 30 * 24 * 60;
7
+ export const CLAUDE_DEBUG_LOG_QUARANTINE_TTL_MINUTES = 7 * 24 * 60;
8
+ export const CLAUDE_CHANGELOG_CACHE_POLICY_ID = "claude.changelog-cache";
9
+ export const CLAUDE_CHANGELOG_CACHE_MIN_AGE_MINUTES = 30 * 24 * 60;
10
+ export const CLAUDE_CHANGELOG_CACHE_QUARANTINE_TTL_MINUTES = 7 * 24 * 60;
11
+ export function isClaudeDebugLogRelativePath(relativePath) {
12
+ const components = relativePath.split(sep);
13
+ return (components.length === 2 &&
14
+ components[0] === "debug" &&
15
+ components[1] !== undefined &&
16
+ components[1].endsWith(".txt"));
17
+ }
18
+ export function isClaudeChangelogCacheRelativePath(relativePath) {
19
+ const components = relativePath.split(sep);
20
+ return components.length === 2 && components[0] === "cache" && components[1] === "changelog.md";
21
+ }
22
+ function validateAgeAndRecoveryWindow(action, now, label, minimumAgeMinutes, minimumTtlMinutes) {
23
+ if (action.pendingQuarantineBytes !== action.target.measuredBytes) {
24
+ return "pending quarantine bytes must match the exact file identity";
25
+ }
26
+ if (action.quarantineTtlMinutes < minimumTtlMinutes) {
27
+ return `${label} require at least seven days of recoverable quarantine`;
28
+ }
29
+ if (now.getTime() - action.target.mtimeMs < minimumAgeMinutes * 60_000) {
30
+ return `${label} must be at least 30 days old`;
31
+ }
32
+ return undefined;
33
+ }
34
+ export const PROVIDER_FILE_POLICIES = [
35
+ {
36
+ id: CLAUDE_DEBUG_LOG_POLICY_ID,
37
+ provider: "claude",
38
+ matchesRelativePath: isClaudeDebugLogRelativePath,
39
+ validateAction(action, now) {
40
+ return validateAgeAndRecoveryWindow(action, now, "Claude debug logs", CLAUDE_DEBUG_LOG_MIN_AGE_MINUTES, CLAUDE_DEBUG_LOG_QUARANTINE_TTL_MINUTES);
41
+ },
42
+ },
43
+ {
44
+ id: CLAUDE_CHANGELOG_CACHE_POLICY_ID,
45
+ provider: "claude",
46
+ matchesRelativePath: isClaudeChangelogCacheRelativePath,
47
+ validateAction(action, now) {
48
+ return validateAgeAndRecoveryWindow(action, now, "Claude changelog caches", CLAUDE_CHANGELOG_CACHE_MIN_AGE_MINUTES, CLAUDE_CHANGELOG_CACHE_QUARANTINE_TTL_MINUTES);
49
+ },
50
+ },
51
+ ];
52
+ export async function authorizeProviderFileAction(action, home, config, platform = process.platform, environment = process.env, now = new Date()) {
53
+ const explicitRoot = config.adapters[action.adapter]?.root;
54
+ const configuredRoot = resolveProviderRoot(PROVIDER_SPECS[action.adapter], resolve(home), {
55
+ ...(explicitRoot === undefined ? {} : { root: explicitRoot }),
56
+ platform,
57
+ environment,
58
+ });
59
+ const physicalRoot = await realpath(configuredRoot);
60
+ if (action.target.ownerRoot !== physicalRoot) {
61
+ throw new Error(`provider-file target is outside the configured ${action.adapter} root`);
62
+ }
63
+ const policy = PROVIDER_FILE_POLICIES.find((candidate) => candidate.id === action.policyId && candidate.provider === action.adapter);
64
+ if (policy === undefined || !policy.matchesRelativePath(action.target.relativePath)) {
65
+ throw new Error(`provider-file target is not approved by policy ${action.adapter}:${action.policyId}`);
66
+ }
67
+ const refusal = policy.validateAction(action, now);
68
+ if (refusal !== undefined) {
69
+ throw new Error(`provider-file action violates policy ${action.adapter}:${action.policyId}: ${refusal}`);
70
+ }
71
+ }
72
+ //# sourceMappingURL=provider-file-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-file-policy.js","sourceRoot":"","sources":["../../src/core/provider-file-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type ProviderFileQuarantineEntry } from "../contracts/provider-file-quarantine.js";
2
+ import { type PinnedFile } from "./pinned-file.js";
3
+ import { type ProviderProcessResult } from "./provider-processes.js";
4
+ import { type ProcessOwnershipResult } from "./process-ownership.js";
5
+ export type ProviderFileRecoveryDependencies = {
6
+ clock?: () => Date;
7
+ move?: (source: string, destination: string) => Promise<void>;
8
+ inspectProcesses?: (provider: ProviderFileQuarantineEntry["target"]["provider"]) => Promise<ProviderProcessResult>;
9
+ inspectOpenHandles?: (path: string) => Promise<ProcessOwnershipResult>;
10
+ truncateHandle?: (handle: PinnedFile) => Promise<void>;
11
+ platform?: NodeJS.Platform;
12
+ };
13
+ export type ProviderFileRecoveryOptions = {
14
+ manifestPath: string;
15
+ quarantineDirectory: string;
16
+ allowUnexpired?: boolean;
17
+ dependencies?: ProviderFileRecoveryDependencies;
18
+ };
19
+ export declare function providerFilePurgeIsolationPath(quarantineDirectory: string, entryId: string): string;
20
+ export declare function undoProviderFileQuarantine(input: ProviderFileQuarantineEntry, options: ProviderFileRecoveryOptions): Promise<ProviderFileQuarantineEntry>;
21
+ export declare function purgeProviderFileQuarantine(input: ProviderFileQuarantineEntry, options: ProviderFileRecoveryOptions): Promise<{
22
+ entry: ProviderFileQuarantineEntry;
23
+ reclaimedBytes: number;
24
+ }>;
25
+ //# sourceMappingURL=provider-file-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-file-recovery.d.ts","sourceRoot":"","sources":["../../src/core/provider-file-recovery.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,0CAA0C,CAAC;AAGlD,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE7F,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,gBAAgB,CAAC,EAAE,CACjB,QAAQ,EAAE,2BAA2B,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,KACxD,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,gCAAgC,CAAC;CACjD,CAAC;AAEF,wBAAgB,8BAA8B,CAC5C,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM,GACd,MAAM,CAER;AAsUD,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,2BAA2B,EAClC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,2BAA2B,CAAC,CAyGtC;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,2BAA2B,EAClC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC;IAAE,KAAK,EAAE,2BAA2B,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CA+HzE"}