@rewind-ai/cli 0.6.2
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.
- package/.env.example +8 -0
- package/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/src/action/capture.d.ts +15 -0
- package/dist/src/action/capture.js +215 -0
- package/dist/src/action/capture.js.map +1 -0
- package/dist/src/action/mediate.d.ts +28 -0
- package/dist/src/action/mediate.js +109 -0
- package/dist/src/action/mediate.js.map +1 -0
- package/dist/src/action/mutate.d.ts +11 -0
- package/dist/src/action/mutate.js +189 -0
- package/dist/src/action/mutate.js.map +1 -0
- package/dist/src/action/objects.d.ts +5 -0
- package/dist/src/action/objects.js +50 -0
- package/dist/src/action/objects.js.map +1 -0
- package/dist/src/action/store.d.ts +24 -0
- package/dist/src/action/store.js +149 -0
- package/dist/src/action/store.js.map +1 -0
- package/dist/src/action/types.d.ts +84 -0
- package/dist/src/action/types.js +3 -0
- package/dist/src/action/types.js.map +1 -0
- package/dist/src/action/undo.d.ts +11 -0
- package/dist/src/action/undo.js +42 -0
- package/dist/src/action/undo.js.map +1 -0
- package/dist/src/adapters/filesystem.d.ts +35 -0
- package/dist/src/adapters/filesystem.js +499 -0
- package/dist/src/adapters/filesystem.js.map +1 -0
- package/dist/src/adapters/index.d.ts +7 -0
- package/dist/src/adapters/index.js +19 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/adapters/types.d.ts +54 -0
- package/dist/src/adapters/types.js +7 -0
- package/dist/src/adapters/types.js.map +1 -0
- package/dist/src/api/server.d.ts +25 -0
- package/dist/src/api/server.js +786 -0
- package/dist/src/api/server.js.map +1 -0
- package/dist/src/approval/store.d.ts +35 -0
- package/dist/src/approval/store.js +113 -0
- package/dist/src/approval/store.js.map +1 -0
- package/dist/src/checkpoint.d.ts +9 -0
- package/dist/src/checkpoint.js +140 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/cli/v5.d.ts +15 -0
- package/dist/src/cli/v5.js +110 -0
- package/dist/src/cli/v5.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +823 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/clients/types.d.ts +90 -0
- package/dist/src/clients/types.js +239 -0
- package/dist/src/clients/types.js.map +1 -0
- package/dist/src/commercial/auth/provider.d.ts +61 -0
- package/dist/src/commercial/auth/provider.js +227 -0
- package/dist/src/commercial/auth/provider.js.map +1 -0
- package/dist/src/commercial/entitlement/provider.d.ts +27 -0
- package/dist/src/commercial/entitlement/provider.js +192 -0
- package/dist/src/commercial/entitlement/provider.js.map +1 -0
- package/dist/src/commercial/entitlement/signing.d.ts +61 -0
- package/dist/src/commercial/entitlement/signing.js +124 -0
- package/dist/src/commercial/entitlement/signing.js.map +1 -0
- package/dist/src/commercial/env.d.ts +10 -0
- package/dist/src/commercial/env.js +40 -0
- package/dist/src/commercial/env.js.map +1 -0
- package/dist/src/commercial/product.d.ts +26 -0
- package/dist/src/commercial/product.js +39 -0
- package/dist/src/commercial/product.js.map +1 -0
- package/dist/src/commercial/store.d.ts +46 -0
- package/dist/src/commercial/store.js +104 -0
- package/dist/src/commercial/store.js.map +1 -0
- package/dist/src/commercial/stripe/checkout.d.ts +104 -0
- package/dist/src/commercial/stripe/checkout.js +469 -0
- package/dist/src/commercial/stripe/checkout.js.map +1 -0
- package/dist/src/core/compatibility.d.ts +15 -0
- package/dist/src/core/compatibility.js +226 -0
- package/dist/src/core/compatibility.js.map +1 -0
- package/dist/src/core/engine.d.ts +33 -0
- package/dist/src/core/engine.js +432 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/lifecycle.d.ts +17 -0
- package/dist/src/core/lifecycle.js +56 -0
- package/dist/src/core/lifecycle.js.map +1 -0
- package/dist/src/core/types.d.ts +140 -0
- package/dist/src/core/types.js +37 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/destroy.d.ts +21 -0
- package/dist/src/destroy.js +219 -0
- package/dist/src/destroy.js.map +1 -0
- package/dist/src/diff.d.ts +13 -0
- package/dist/src/diff.js +251 -0
- package/dist/src/diff.js.map +1 -0
- package/dist/src/enforcement/detect.d.ts +13 -0
- package/dist/src/enforcement/detect.js +75 -0
- package/dist/src/enforcement/detect.js.map +1 -0
- package/dist/src/enforcement/hook-policy.d.ts +38 -0
- package/dist/src/enforcement/hook-policy.js +111 -0
- package/dist/src/enforcement/hook-policy.js.map +1 -0
- package/dist/src/enforcement/index.d.ts +8 -0
- package/dist/src/enforcement/index.js +8 -0
- package/dist/src/enforcement/index.js.map +1 -0
- package/dist/src/enforcement/perf.d.ts +6 -0
- package/dist/src/enforcement/perf.js +18 -0
- package/dist/src/enforcement/perf.js.map +1 -0
- package/dist/src/enforcement/policy.d.ts +12 -0
- package/dist/src/enforcement/policy.js +84 -0
- package/dist/src/enforcement/policy.js.map +1 -0
- package/dist/src/enforcement/readonly.d.ts +17 -0
- package/dist/src/enforcement/readonly.js +124 -0
- package/dist/src/enforcement/readonly.js.map +1 -0
- package/dist/src/enforcement/sandbox-clone.d.ts +6 -0
- package/dist/src/enforcement/sandbox-clone.js +11 -0
- package/dist/src/enforcement/sandbox-clone.js.map +1 -0
- package/dist/src/enforcement/setup.d.ts +33 -0
- package/dist/src/enforcement/setup.js +168 -0
- package/dist/src/enforcement/setup.js.map +1 -0
- package/dist/src/enforcement/trust.d.ts +10 -0
- package/dist/src/enforcement/trust.js +71 -0
- package/dist/src/enforcement/trust.js.map +1 -0
- package/dist/src/enforcement/types.d.ts +40 -0
- package/dist/src/enforcement/types.js +3 -0
- package/dist/src/enforcement/types.js.map +1 -0
- package/dist/src/entitlement/provider.d.ts +48 -0
- package/dist/src/entitlement/provider.js +95 -0
- package/dist/src/entitlement/provider.js.map +1 -0
- package/dist/src/hash.d.ts +9 -0
- package/dist/src/hash.js +23 -0
- package/dist/src/hash.js.map +1 -0
- package/dist/src/ledger/query.d.ts +19 -0
- package/dist/src/ledger/query.js +158 -0
- package/dist/src/ledger/query.js.map +1 -0
- package/dist/src/manifest.d.ts +32 -0
- package/dist/src/manifest.js +242 -0
- package/dist/src/manifest.js.map +1 -0
- package/dist/src/mcp/server.d.ts +7 -0
- package/dist/src/mcp/server.js +364 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/paths.d.ts +94 -0
- package/dist/src/paths.js +354 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/permission/engine.d.ts +15 -0
- package/dist/src/permission/engine.js +147 -0
- package/dist/src/permission/engine.js.map +1 -0
- package/dist/src/permission/types.d.ts +42 -0
- package/dist/src/permission/types.js +3 -0
- package/dist/src/permission/types.js.map +1 -0
- package/dist/src/product/setup.d.ts +35 -0
- package/dist/src/product/setup.js +300 -0
- package/dist/src/product/setup.js.map +1 -0
- package/dist/src/protect/audit.d.ts +5 -0
- package/dist/src/protect/audit.js +26 -0
- package/dist/src/protect/audit.js.map +1 -0
- package/dist/src/protect/capture.d.ts +7 -0
- package/dist/src/protect/capture.js +250 -0
- package/dist/src/protect/capture.js.map +1 -0
- package/dist/src/protect/fingerprint.d.ts +4 -0
- package/dist/src/protect/fingerprint.js +49 -0
- package/dist/src/protect/fingerprint.js.map +1 -0
- package/dist/src/protect/hook-cli.d.ts +2 -0
- package/dist/src/protect/hook-cli.js +107 -0
- package/dist/src/protect/hook-cli.js.map +1 -0
- package/dist/src/protect/index.d.ts +12 -0
- package/dist/src/protect/index.js +12 -0
- package/dist/src/protect/index.js.map +1 -0
- package/dist/src/protect/install.d.ts +34 -0
- package/dist/src/protect/install.js +293 -0
- package/dist/src/protect/install.js.map +1 -0
- package/dist/src/protect/intercept.d.ts +11 -0
- package/dist/src/protect/intercept.js +390 -0
- package/dist/src/protect/intercept.js.map +1 -0
- package/dist/src/protect/protect.d.ts +17 -0
- package/dist/src/protect/protect.js +194 -0
- package/dist/src/protect/protect.js.map +1 -0
- package/dist/src/protect/root-paths.d.ts +13 -0
- package/dist/src/protect/root-paths.js +140 -0
- package/dist/src/protect/root-paths.js.map +1 -0
- package/dist/src/protect/shell-policy.d.ts +17 -0
- package/dist/src/protect/shell-policy.js +269 -0
- package/dist/src/protect/shell-policy.js.map +1 -0
- package/dist/src/protect/status.d.ts +11 -0
- package/dist/src/protect/status.js +165 -0
- package/dist/src/protect/status.js.map +1 -0
- package/dist/src/protect/store.d.ts +20 -0
- package/dist/src/protect/store.js +170 -0
- package/dist/src/protect/store.js.map +1 -0
- package/dist/src/protect/types.d.ts +116 -0
- package/dist/src/protect/types.js +3 -0
- package/dist/src/protect/types.js.map +1 -0
- package/dist/src/protect/undo-session.d.ts +14 -0
- package/dist/src/protect/undo-session.js +182 -0
- package/dist/src/protect/undo-session.js.map +1 -0
- package/dist/src/restore.d.ts +39 -0
- package/dist/src/restore.js +141 -0
- package/dist/src/restore.js.map +1 -0
- package/dist/src/sandbox.d.ts +23 -0
- package/dist/src/sandbox.js +198 -0
- package/dist/src/sandbox.js.map +1 -0
- package/dist/src/session/ambient.d.ts +10 -0
- package/dist/src/session/ambient.js +53 -0
- package/dist/src/session/ambient.js.map +1 -0
- package/dist/src/session/attribution.d.ts +27 -0
- package/dist/src/session/attribution.js +201 -0
- package/dist/src/session/attribution.js.map +1 -0
- package/dist/src/session/index.d.ts +25 -0
- package/dist/src/session/index.js +472 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/session/process.d.ts +34 -0
- package/dist/src/session/process.js +234 -0
- package/dist/src/session/process.js.map +1 -0
- package/dist/src/session/store.d.ts +14 -0
- package/dist/src/session/store.js +125 -0
- package/dist/src/session/store.js.map +1 -0
- package/dist/src/session/types.d.ts +111 -0
- package/dist/src/session/types.js +3 -0
- package/dist/src/session/types.js.map +1 -0
- package/dist/src/session/watcher.d.ts +32 -0
- package/dist/src/session/watcher.js +186 -0
- package/dist/src/session/watcher.js.map +1 -0
- package/dist/src/timing.d.ts +7 -0
- package/dist/src/timing.js +19 -0
- package/dist/src/timing.js.map +1 -0
- package/dist/src/types.d.ts +101 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/verify.d.ts +8 -0
- package/dist/src/verify.js +126 -0
- package/dist/src/verify.js.map +1 -0
- package/docs/ADAPTERS.md +37 -0
- package/docs/APPROVALS.md +32 -0
- package/docs/ARCHITECTURE.md +57 -0
- package/docs/ATTRIBUTION.md +179 -0
- package/docs/COMMERCIAL.md +51 -0
- package/docs/CURSOR-ENFORCEMENT.md +73 -0
- package/docs/ENFORCEMENT.md +134 -0
- package/docs/FUTURE.md +91 -0
- package/docs/HUMAN-SETUP.md +98 -0
- package/docs/IDENTITY-AUTHORITY.md +35 -0
- package/docs/MCP.md +107 -0
- package/docs/PACKAGING.md +77 -0
- package/docs/PERMISSIONS.md +53 -0
- package/docs/PRODUCT-V5.md +63 -0
- package/docs/PRODUCT-V6.md +69 -0
- package/docs/PROTECTED-SESSIONS.md +155 -0
- package/docs/THREAT-MODEL.md +84 -0
- package/docs/TRANSACTIONS.md +57 -0
- package/package.json +85 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query layer over transaction history.
|
|
3
|
+
* Prefers V5 overlays; falls back to v2 ActionRecords.
|
|
4
|
+
* Append-only: never silently rewrite historical facts.
|
|
5
|
+
*/
|
|
6
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { getActionsDir, getProjectRoot, getRewindHome } from "../paths.js";
|
|
9
|
+
import { listActions, loadAction } from "../action/store.js";
|
|
10
|
+
import { actionRecordToTransaction } from "../core/compatibility.js";
|
|
11
|
+
import { TRANSACTION_MODEL_VERSION, } from "../core/types.js";
|
|
12
|
+
import { loadTransaction } from "../core/engine.js";
|
|
13
|
+
import { listPendingApprovals } from "../approval/store.js";
|
|
14
|
+
import { snapshotIdentityHash } from "../action/capture.js";
|
|
15
|
+
export async function listTransactions(projectRoot = getProjectRoot(), query = {}) {
|
|
16
|
+
const actions = await listActions(projectRoot);
|
|
17
|
+
const txns = [];
|
|
18
|
+
for (const a of actions) {
|
|
19
|
+
try {
|
|
20
|
+
txns.push(await loadTransaction(a.id, projectRoot));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
txns.push(actionRecordToTransaction(a));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Include overlay-only transactions (e.g. non-fs future) if any
|
|
27
|
+
const overlayDir = path.join(getRewindHome(projectRoot), "transactions");
|
|
28
|
+
try {
|
|
29
|
+
const names = await readdir(overlayDir);
|
|
30
|
+
const have = new Set(txns.map((t) => t.id));
|
|
31
|
+
for (const n of names) {
|
|
32
|
+
if (!n.endsWith(".json") || n.includes(".tmp-"))
|
|
33
|
+
continue;
|
|
34
|
+
const id = n.replace(/\.json$/, "");
|
|
35
|
+
if (have.has(id))
|
|
36
|
+
continue;
|
|
37
|
+
try {
|
|
38
|
+
const raw = await readFile(path.join(overlayDir, n), "utf8");
|
|
39
|
+
const txn = JSON.parse(raw);
|
|
40
|
+
if (txn.version === TRANSACTION_MODEL_VERSION)
|
|
41
|
+
txns.push(txn);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* skip */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
/* no overlay dir */
|
|
50
|
+
}
|
|
51
|
+
txns.sort((a, b) => a.sequence - b.sequence || a.createdAt.localeCompare(b.createdAt));
|
|
52
|
+
let filtered = txns;
|
|
53
|
+
if (query.status) {
|
|
54
|
+
filtered = filtered.filter((t) => t.status === query.status);
|
|
55
|
+
}
|
|
56
|
+
if (query.adapter) {
|
|
57
|
+
filtered = filtered.filter((t) => t.adapter === query.adapter);
|
|
58
|
+
}
|
|
59
|
+
if (query.actorClient) {
|
|
60
|
+
filtered = filtered.filter((t) => t.actor.client === query.actorClient);
|
|
61
|
+
}
|
|
62
|
+
if (query.limit && query.limit > 0) {
|
|
63
|
+
filtered = filtered.slice(-query.limit);
|
|
64
|
+
}
|
|
65
|
+
return filtered;
|
|
66
|
+
}
|
|
67
|
+
export async function getTransaction(id, projectRoot = getProjectRoot()) {
|
|
68
|
+
return loadTransaction(id, projectRoot);
|
|
69
|
+
}
|
|
70
|
+
export function formatTransaction(txn) {
|
|
71
|
+
const actor = `${txn.actor.client}${txn.actor.clientVersion ? "@" + txn.actor.clientVersion : ""}`;
|
|
72
|
+
const before = txn.before?.kind === "filesystem"
|
|
73
|
+
? snapshotIdentityHash(txn.before.primary)
|
|
74
|
+
: "—";
|
|
75
|
+
const after = txn.after?.kind === "filesystem"
|
|
76
|
+
? snapshotIdentityHash(txn.after.primary)
|
|
77
|
+
: "—";
|
|
78
|
+
const undo = txn.undo.status === "READY"
|
|
79
|
+
? "READY"
|
|
80
|
+
: txn.undo.status === "NONE"
|
|
81
|
+
? "—"
|
|
82
|
+
: txn.undo.status;
|
|
83
|
+
return [
|
|
84
|
+
"REWIND",
|
|
85
|
+
"",
|
|
86
|
+
`TRANSACTION ${txn.id}`,
|
|
87
|
+
"",
|
|
88
|
+
`Actor ${actor}`,
|
|
89
|
+
`Source ${txn.source}`,
|
|
90
|
+
`Adapter ${txn.adapter}`,
|
|
91
|
+
`Operation ${txn.operation}`,
|
|
92
|
+
`Target ${txn.target.displayName ?? txn.target.resource}`,
|
|
93
|
+
"",
|
|
94
|
+
`Permission ${txn.permission?.decision ?? "—"}`,
|
|
95
|
+
`Status ${txn.status}`,
|
|
96
|
+
`Reversibility ${txn.reversibility.class}`,
|
|
97
|
+
`Undo ${undo}`,
|
|
98
|
+
"",
|
|
99
|
+
`Before ${before}`,
|
|
100
|
+
`After ${after}`,
|
|
101
|
+
txn.error ? `\nError ${txn.error}` : "",
|
|
102
|
+
]
|
|
103
|
+
.filter((line) => line !== "")
|
|
104
|
+
.join("\n");
|
|
105
|
+
}
|
|
106
|
+
export function formatTransactionList(txns) {
|
|
107
|
+
const lines = ["REWIND TRANSACTIONS", ""];
|
|
108
|
+
for (const t of txns) {
|
|
109
|
+
const actor = t.actor.client;
|
|
110
|
+
lines.push(`${t.sequence.toString().padStart(4)} ${t.id} ${t.status.padEnd(18)} ${t.adapter}/${t.operation} ${t.target.resource} [${actor}]`);
|
|
111
|
+
}
|
|
112
|
+
lines.push("");
|
|
113
|
+
lines.push(`Total: ${txns.length}`);
|
|
114
|
+
return lines.join("\n");
|
|
115
|
+
}
|
|
116
|
+
export async function ledgerStatusSummary(projectRoot = getProjectRoot()) {
|
|
117
|
+
const txns = await listTransactions(projectRoot);
|
|
118
|
+
const pending = await listPendingApprovals(projectRoot);
|
|
119
|
+
const actors = new Map();
|
|
120
|
+
for (const t of txns) {
|
|
121
|
+
const key = `${t.actor.client}@${t.actor.clientVersion ?? "?"}`;
|
|
122
|
+
actors.set(key, (actors.get(key) ?? 0) + 1);
|
|
123
|
+
}
|
|
124
|
+
const lines = [
|
|
125
|
+
"REWIND STATUS",
|
|
126
|
+
"",
|
|
127
|
+
`Transactions ${txns.length}`,
|
|
128
|
+
`Completed ${txns.filter((t) => t.status === "COMPLETED").length}`,
|
|
129
|
+
`Undone ${txns.filter((t) => t.status === "UNDONE").length}`,
|
|
130
|
+
`Conflicted ${txns.filter((t) => t.status === "CONFLICTED").length}`,
|
|
131
|
+
`Denied ${txns.filter((t) => t.status === "DENIED").length}`,
|
|
132
|
+
`Awaiting ${txns.filter((t) => t.status === "AWAITING_APPROVAL").length}`,
|
|
133
|
+
`Pending appr. ${pending.length}`,
|
|
134
|
+
"",
|
|
135
|
+
"Actors:",
|
|
136
|
+
];
|
|
137
|
+
if (actors.size === 0)
|
|
138
|
+
lines.push(" (none)");
|
|
139
|
+
for (const [k, n] of actors) {
|
|
140
|
+
lines.push(` ${k} (${n})`);
|
|
141
|
+
}
|
|
142
|
+
// Prove action dir still exists (v2 ledger)
|
|
143
|
+
try {
|
|
144
|
+
await readdir(getActionsDir(projectRoot));
|
|
145
|
+
lines.push("");
|
|
146
|
+
lines.push("Ledger: .rewind/actions + .rewind/transactions (compatible)");
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
lines.push("");
|
|
150
|
+
lines.push("Ledger: empty");
|
|
151
|
+
}
|
|
152
|
+
return lines.join("\n");
|
|
153
|
+
}
|
|
154
|
+
/** Load raw v2 action without upgrade — for compat tests. */
|
|
155
|
+
export async function loadLegacyAction(id, projectRoot = getProjectRoot()) {
|
|
156
|
+
return loadAction(id, projectRoot);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/ledger/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Manifest, ManifestEntry } from "./types.js";
|
|
2
|
+
/** Convert absolute path under root to POSIX relative path. */
|
|
3
|
+
export declare function toRelativePosix(root: string, absolute: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Walk a directory tree without following directory symlinks.
|
|
6
|
+
* Yields absolute paths for files, dirs, and symlinks.
|
|
7
|
+
*/
|
|
8
|
+
export declare function walkTree(root: string, options?: {
|
|
9
|
+
followSymlinks?: boolean;
|
|
10
|
+
}): Promise<string[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Build a deterministic manifest for a directory tree.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildManifest(root: string, rootLabel?: string): Promise<Manifest>;
|
|
15
|
+
/**
|
|
16
|
+
* Canonical serialization for fingerprinting.
|
|
17
|
+
* Only content-defining fields — not createdAt.
|
|
18
|
+
*/
|
|
19
|
+
export declare function canonicalizeEntries(entries: ManifestEntry[]): string;
|
|
20
|
+
export declare function fingerprintManifestEntries(entries: ManifestEntry[]): string;
|
|
21
|
+
export declare function fingerprintManifest(manifest: Manifest): string;
|
|
22
|
+
/** Content-addressable store helpers under checkpointDir/objects/<hash> */
|
|
23
|
+
export declare function objectPath(checkpointDir: string, hash: string): string;
|
|
24
|
+
export declare function storeFileContent(checkpointDir: string, hash: string, data: Buffer): Promise<void>;
|
|
25
|
+
export declare function readStoredContent(checkpointDir: string, hash: string): Promise<Buffer>;
|
|
26
|
+
/**
|
|
27
|
+
* Materialize a full file tree from a manifest + object store into `targetRoot`.
|
|
28
|
+
* Assumes targetRoot already exists and has been validated as the sandbox.
|
|
29
|
+
*/
|
|
30
|
+
export declare function materializeFromCheckpoint(checkpointDir: string, manifest: Manifest, targetRoot: string): Promise<void>;
|
|
31
|
+
/** Touch helper kept for potential mtime tests — not used in fingerprint. */
|
|
32
|
+
export declare function touch(absolute: string): Promise<void>;
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { lstat, readdir, readlink, readFile, mkdir, writeFile, chmod, rm, symlink, utimes, } from "node:fs/promises";
|
|
3
|
+
import { sha256, sha256File } from "./hash.js";
|
|
4
|
+
import { assertNoSymlinkEscape, assertSafeRelativePath, isPathInside, isPathInsideAsync, } from "./paths.js";
|
|
5
|
+
const MANIFEST_VERSION = 1;
|
|
6
|
+
/** Convert absolute path under root to POSIX relative path. */
|
|
7
|
+
export function toRelativePosix(root, absolute) {
|
|
8
|
+
const rel = path.relative(root, absolute);
|
|
9
|
+
return rel.split(path.sep).join("/");
|
|
10
|
+
}
|
|
11
|
+
function modeOf(statsMode) {
|
|
12
|
+
return statsMode & 0o7777;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Walk a directory tree without following directory symlinks.
|
|
16
|
+
* Yields absolute paths for files, dirs, and symlinks.
|
|
17
|
+
*/
|
|
18
|
+
export async function walkTree(root, options = {}) {
|
|
19
|
+
const follow = options.followSymlinks === true;
|
|
20
|
+
const results = [];
|
|
21
|
+
async function walk(current) {
|
|
22
|
+
if (!isPathInside(root, current) && current !== root) {
|
|
23
|
+
throw new Error(`Walk escaped root: ${current}`);
|
|
24
|
+
}
|
|
25
|
+
let entries;
|
|
26
|
+
try {
|
|
27
|
+
entries = await readdir(current, { withFileTypes: true });
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const code = err && typeof err === "object" && "code" in err
|
|
31
|
+
? String(err.code)
|
|
32
|
+
: "";
|
|
33
|
+
if (code === "ENOENT")
|
|
34
|
+
return;
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
// Deterministic order
|
|
38
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
39
|
+
for (const ent of entries) {
|
|
40
|
+
const abs = path.join(current, ent.name);
|
|
41
|
+
if (!isPathInside(root, abs)) {
|
|
42
|
+
throw new Error(`Entry escapes root: ${abs}`);
|
|
43
|
+
}
|
|
44
|
+
// Use lstat semantics via Dirent; also lstat for symlink checks.
|
|
45
|
+
if (ent.isSymbolicLink()) {
|
|
46
|
+
results.push(abs);
|
|
47
|
+
if (follow) {
|
|
48
|
+
await assertNoSymlinkEscape(abs, root);
|
|
49
|
+
// Do not recurse into symlink directories for manifests.
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (ent.isDirectory()) {
|
|
54
|
+
results.push(abs);
|
|
55
|
+
await walk(abs);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (ent.isFile()) {
|
|
59
|
+
results.push(abs);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Ignore sockets, devices, etc. for V0 — but record nothing.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Include root itself only as container; we start from children.
|
|
66
|
+
// Actually include all descendants; root dir is implicit.
|
|
67
|
+
await walk(root);
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
async function entryForPath(root, absolute) {
|
|
71
|
+
await assertNoSymlinkEscape(absolute, root);
|
|
72
|
+
const st = await lstat(absolute);
|
|
73
|
+
const rel = assertSafeRelativePath(toRelativePosix(root, absolute));
|
|
74
|
+
let kind;
|
|
75
|
+
let hash = null;
|
|
76
|
+
let size = 0;
|
|
77
|
+
let linkTarget = null;
|
|
78
|
+
if (st.isSymbolicLink()) {
|
|
79
|
+
kind = "symlink";
|
|
80
|
+
linkTarget = await readlink(absolute);
|
|
81
|
+
hash = sha256(linkTarget);
|
|
82
|
+
size = Buffer.byteLength(linkTarget);
|
|
83
|
+
}
|
|
84
|
+
else if (st.isDirectory()) {
|
|
85
|
+
kind = "directory";
|
|
86
|
+
hash = null;
|
|
87
|
+
size = 0;
|
|
88
|
+
}
|
|
89
|
+
else if (st.isFile()) {
|
|
90
|
+
kind = "file";
|
|
91
|
+
size = st.size;
|
|
92
|
+
hash = await sha256File(absolute);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new Error(`Unsupported filesystem entry: ${absolute}`);
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
path: rel,
|
|
99
|
+
kind,
|
|
100
|
+
hash,
|
|
101
|
+
size,
|
|
102
|
+
mode: modeOf(st.mode),
|
|
103
|
+
linkTarget,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build a deterministic manifest for a directory tree.
|
|
108
|
+
*/
|
|
109
|
+
export async function buildManifest(root, rootLabel = "sandbox") {
|
|
110
|
+
const absPaths = await walkTree(root);
|
|
111
|
+
const entries = [];
|
|
112
|
+
for (const abs of absPaths) {
|
|
113
|
+
entries.push(await entryForPath(root, abs));
|
|
114
|
+
}
|
|
115
|
+
entries.sort((a, b) => a.path.localeCompare(b.path));
|
|
116
|
+
const fingerprint = fingerprintManifestEntries(entries);
|
|
117
|
+
return {
|
|
118
|
+
version: MANIFEST_VERSION,
|
|
119
|
+
createdAt: new Date().toISOString(),
|
|
120
|
+
rootLabel,
|
|
121
|
+
entries,
|
|
122
|
+
fingerprint,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Canonical serialization for fingerprinting.
|
|
127
|
+
* Only content-defining fields — not createdAt.
|
|
128
|
+
*/
|
|
129
|
+
export function canonicalizeEntries(entries) {
|
|
130
|
+
const sorted = [...entries].sort((a, b) => a.path.localeCompare(b.path));
|
|
131
|
+
const canonical = sorted.map((e) => ({
|
|
132
|
+
path: e.path,
|
|
133
|
+
kind: e.kind,
|
|
134
|
+
hash: e.hash,
|
|
135
|
+
size: e.size,
|
|
136
|
+
mode: e.mode,
|
|
137
|
+
linkTarget: e.linkTarget,
|
|
138
|
+
}));
|
|
139
|
+
return JSON.stringify(canonical);
|
|
140
|
+
}
|
|
141
|
+
export function fingerprintManifestEntries(entries) {
|
|
142
|
+
return sha256(canonicalizeEntries(entries));
|
|
143
|
+
}
|
|
144
|
+
export function fingerprintManifest(manifest) {
|
|
145
|
+
return fingerprintManifestEntries(manifest.entries);
|
|
146
|
+
}
|
|
147
|
+
/** Content-addressable store helpers under checkpointDir/objects/<hash> */
|
|
148
|
+
export function objectPath(checkpointDir, hash) {
|
|
149
|
+
return path.join(checkpointDir, "objects", hash.slice(0, 2), hash);
|
|
150
|
+
}
|
|
151
|
+
export async function storeFileContent(checkpointDir, hash, data) {
|
|
152
|
+
const dest = objectPath(checkpointDir, hash);
|
|
153
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
154
|
+
try {
|
|
155
|
+
await lstat(dest);
|
|
156
|
+
return; // already stored
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// continue
|
|
160
|
+
}
|
|
161
|
+
const tmp = `${dest}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
162
|
+
await writeFile(tmp, data);
|
|
163
|
+
const { rename } = await import("node:fs/promises");
|
|
164
|
+
try {
|
|
165
|
+
await rename(tmp, dest);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
await rm(tmp, { force: true }).catch(() => undefined);
|
|
169
|
+
try {
|
|
170
|
+
await lstat(dest);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export async function readStoredContent(checkpointDir, hash) {
|
|
179
|
+
return readFile(objectPath(checkpointDir, hash));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Materialize a full file tree from a manifest + object store into `targetRoot`.
|
|
183
|
+
* Assumes targetRoot already exists and has been validated as the sandbox.
|
|
184
|
+
*/
|
|
185
|
+
export async function materializeFromCheckpoint(checkpointDir, manifest, targetRoot) {
|
|
186
|
+
// Ensure directories first (sorted so parents before children via path length)
|
|
187
|
+
const dirs = manifest.entries
|
|
188
|
+
.filter((e) => e.kind === "directory")
|
|
189
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
190
|
+
for (const d of dirs) {
|
|
191
|
+
const abs = path.join(targetRoot, d.path);
|
|
192
|
+
if (!isPathInside(targetRoot, abs)) {
|
|
193
|
+
throw new Error(`Restore path escapes: ${d.path}`);
|
|
194
|
+
}
|
|
195
|
+
await mkdir(abs, { recursive: true });
|
|
196
|
+
await chmod(abs, d.mode);
|
|
197
|
+
}
|
|
198
|
+
const files = manifest.entries.filter((e) => e.kind === "file");
|
|
199
|
+
for (const f of files) {
|
|
200
|
+
if (!f.hash)
|
|
201
|
+
throw new Error(`File entry missing hash: ${f.path}`);
|
|
202
|
+
const abs = path.join(targetRoot, f.path);
|
|
203
|
+
if (!isPathInside(targetRoot, abs)) {
|
|
204
|
+
throw new Error(`Restore path escapes: ${f.path}`);
|
|
205
|
+
}
|
|
206
|
+
await mkdir(path.dirname(abs), { recursive: true });
|
|
207
|
+
const data = await readStoredContent(checkpointDir, f.hash);
|
|
208
|
+
const tmp = `${abs}.rewind-tmp-${process.pid}`;
|
|
209
|
+
await writeFile(tmp, data, { mode: f.mode });
|
|
210
|
+
const { rename } = await import("node:fs/promises");
|
|
211
|
+
await rename(tmp, abs);
|
|
212
|
+
await chmod(abs, f.mode);
|
|
213
|
+
}
|
|
214
|
+
const links = manifest.entries.filter((e) => e.kind === "symlink");
|
|
215
|
+
for (const l of links) {
|
|
216
|
+
if (!l.linkTarget)
|
|
217
|
+
throw new Error(`Symlink missing target: ${l.path}`);
|
|
218
|
+
const abs = path.join(targetRoot, l.path);
|
|
219
|
+
if (!isPathInside(targetRoot, abs)) {
|
|
220
|
+
throw new Error(`Restore path escapes: ${l.path}`);
|
|
221
|
+
}
|
|
222
|
+
// Validate link target does not escape when resolved
|
|
223
|
+
const resolved = path.resolve(path.dirname(abs), l.linkTarget);
|
|
224
|
+
if (!(await isPathInsideAsync(targetRoot, resolved))) {
|
|
225
|
+
throw new Error(`Symlink target escapes sandbox: ${l.path} -> ${l.linkTarget}`);
|
|
226
|
+
}
|
|
227
|
+
await mkdir(path.dirname(abs), { recursive: true });
|
|
228
|
+
try {
|
|
229
|
+
await rm(abs, { force: true });
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
/* ignore */
|
|
233
|
+
}
|
|
234
|
+
await symlink(l.linkTarget, abs);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** Touch helper kept for potential mtime tests — not used in fingerprint. */
|
|
238
|
+
export async function touch(absolute) {
|
|
239
|
+
const now = new Date();
|
|
240
|
+
await utimes(absolute, now, now);
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,KAAK,EACL,EAAE,EACF,OAAO,EACP,MAAM,GACP,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAEpC,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,MAAM,CAAC,SAAiB;IAC/B,OAAO,SAAS,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,UAAwC,EAAE;IAE1C,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,KAAK,IAAI,CAAC;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,UAAU,IAAI,CAAC,OAAe;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GACR,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;gBAC7C,CAAC,CAAC,MAAM,CAAE,GAAyB,CAAC,IAAI,CAAC;gBACzC,CAAC,CAAC,EAAE,CAAC;YACT,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAC9B,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,sBAAsB;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAErD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,iEAAiE;YACjE,IAAI,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACvC,yDAAyD;gBAC3D,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YAED,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,0DAA0D;IAC1D,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,QAAgB;IAEhB,MAAM,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,sBAAsB,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpE,IAAI,IAAe,CAAC;IACpB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;QACxB,IAAI,GAAG,SAAS,CAAC;QACjB,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,IAAI,GAAG,WAAW,CAAC;QACnB,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;QACvB,IAAI,GAAG,MAAM,CAAC;QACd,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACf,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG;QACT,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;QACrB,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,SAAS,GAAG,SAAS;IAErB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAExD,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS;QACT,OAAO;QACP,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU;KACzB,CAAC,CAAC,CAAC;IACJ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAwB;IACjE,OAAO,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkB;IACpD,OAAO,0BAA0B,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,UAAU,CAAC,aAAqB,EAAE,IAAY;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,IAAY,EACZ,IAAY;IAEZ,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,iBAAiB;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,WAAW;IACb,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAAqB,EACrB,IAAY;IAEZ,OAAO,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAAqB,EACrB,QAAkB,EAClB,UAAkB;IAElB,+EAA+E;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,GAAG,eAAe,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/C,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACnE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,qDAAqD;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,MAAM,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,QAAgB;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
2
|
+
import { PathSafetyError } from "../paths.js";
|
|
3
|
+
export declare function createRewindMcpServer(projectRoot?: string): Promise<McpServer>;
|
|
4
|
+
export declare function runMcpServer(projectRoot?: string): Promise<void>;
|
|
5
|
+
export declare function printActionCli(id: string | undefined, projectRoot?: string): Promise<void>;
|
|
6
|
+
export declare function printMcpSessionReport(projectRoot?: string): Promise<void>;
|
|
7
|
+
export { PathSafetyError };
|