@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.
Files changed (244) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +39 -0
  4. package/dist/src/action/capture.d.ts +15 -0
  5. package/dist/src/action/capture.js +215 -0
  6. package/dist/src/action/capture.js.map +1 -0
  7. package/dist/src/action/mediate.d.ts +28 -0
  8. package/dist/src/action/mediate.js +109 -0
  9. package/dist/src/action/mediate.js.map +1 -0
  10. package/dist/src/action/mutate.d.ts +11 -0
  11. package/dist/src/action/mutate.js +189 -0
  12. package/dist/src/action/mutate.js.map +1 -0
  13. package/dist/src/action/objects.d.ts +5 -0
  14. package/dist/src/action/objects.js +50 -0
  15. package/dist/src/action/objects.js.map +1 -0
  16. package/dist/src/action/store.d.ts +24 -0
  17. package/dist/src/action/store.js +149 -0
  18. package/dist/src/action/store.js.map +1 -0
  19. package/dist/src/action/types.d.ts +84 -0
  20. package/dist/src/action/types.js +3 -0
  21. package/dist/src/action/types.js.map +1 -0
  22. package/dist/src/action/undo.d.ts +11 -0
  23. package/dist/src/action/undo.js +42 -0
  24. package/dist/src/action/undo.js.map +1 -0
  25. package/dist/src/adapters/filesystem.d.ts +35 -0
  26. package/dist/src/adapters/filesystem.js +499 -0
  27. package/dist/src/adapters/filesystem.js.map +1 -0
  28. package/dist/src/adapters/index.d.ts +7 -0
  29. package/dist/src/adapters/index.js +19 -0
  30. package/dist/src/adapters/index.js.map +1 -0
  31. package/dist/src/adapters/types.d.ts +54 -0
  32. package/dist/src/adapters/types.js +7 -0
  33. package/dist/src/adapters/types.js.map +1 -0
  34. package/dist/src/api/server.d.ts +25 -0
  35. package/dist/src/api/server.js +786 -0
  36. package/dist/src/api/server.js.map +1 -0
  37. package/dist/src/approval/store.d.ts +35 -0
  38. package/dist/src/approval/store.js +113 -0
  39. package/dist/src/approval/store.js.map +1 -0
  40. package/dist/src/checkpoint.d.ts +9 -0
  41. package/dist/src/checkpoint.js +140 -0
  42. package/dist/src/checkpoint.js.map +1 -0
  43. package/dist/src/cli/v5.d.ts +15 -0
  44. package/dist/src/cli/v5.js +110 -0
  45. package/dist/src/cli/v5.js.map +1 -0
  46. package/dist/src/cli.d.ts +2 -0
  47. package/dist/src/cli.js +823 -0
  48. package/dist/src/cli.js.map +1 -0
  49. package/dist/src/clients/types.d.ts +90 -0
  50. package/dist/src/clients/types.js +239 -0
  51. package/dist/src/clients/types.js.map +1 -0
  52. package/dist/src/commercial/auth/provider.d.ts +61 -0
  53. package/dist/src/commercial/auth/provider.js +227 -0
  54. package/dist/src/commercial/auth/provider.js.map +1 -0
  55. package/dist/src/commercial/entitlement/provider.d.ts +27 -0
  56. package/dist/src/commercial/entitlement/provider.js +192 -0
  57. package/dist/src/commercial/entitlement/provider.js.map +1 -0
  58. package/dist/src/commercial/entitlement/signing.d.ts +61 -0
  59. package/dist/src/commercial/entitlement/signing.js +124 -0
  60. package/dist/src/commercial/entitlement/signing.js.map +1 -0
  61. package/dist/src/commercial/env.d.ts +10 -0
  62. package/dist/src/commercial/env.js +40 -0
  63. package/dist/src/commercial/env.js.map +1 -0
  64. package/dist/src/commercial/product.d.ts +26 -0
  65. package/dist/src/commercial/product.js +39 -0
  66. package/dist/src/commercial/product.js.map +1 -0
  67. package/dist/src/commercial/store.d.ts +46 -0
  68. package/dist/src/commercial/store.js +104 -0
  69. package/dist/src/commercial/store.js.map +1 -0
  70. package/dist/src/commercial/stripe/checkout.d.ts +104 -0
  71. package/dist/src/commercial/stripe/checkout.js +469 -0
  72. package/dist/src/commercial/stripe/checkout.js.map +1 -0
  73. package/dist/src/core/compatibility.d.ts +15 -0
  74. package/dist/src/core/compatibility.js +226 -0
  75. package/dist/src/core/compatibility.js.map +1 -0
  76. package/dist/src/core/engine.d.ts +33 -0
  77. package/dist/src/core/engine.js +432 -0
  78. package/dist/src/core/engine.js.map +1 -0
  79. package/dist/src/core/lifecycle.d.ts +17 -0
  80. package/dist/src/core/lifecycle.js +56 -0
  81. package/dist/src/core/lifecycle.js.map +1 -0
  82. package/dist/src/core/types.d.ts +140 -0
  83. package/dist/src/core/types.js +37 -0
  84. package/dist/src/core/types.js.map +1 -0
  85. package/dist/src/destroy.d.ts +21 -0
  86. package/dist/src/destroy.js +219 -0
  87. package/dist/src/destroy.js.map +1 -0
  88. package/dist/src/diff.d.ts +13 -0
  89. package/dist/src/diff.js +251 -0
  90. package/dist/src/diff.js.map +1 -0
  91. package/dist/src/enforcement/detect.d.ts +13 -0
  92. package/dist/src/enforcement/detect.js +75 -0
  93. package/dist/src/enforcement/detect.js.map +1 -0
  94. package/dist/src/enforcement/hook-policy.d.ts +38 -0
  95. package/dist/src/enforcement/hook-policy.js +111 -0
  96. package/dist/src/enforcement/hook-policy.js.map +1 -0
  97. package/dist/src/enforcement/index.d.ts +8 -0
  98. package/dist/src/enforcement/index.js +8 -0
  99. package/dist/src/enforcement/index.js.map +1 -0
  100. package/dist/src/enforcement/perf.d.ts +6 -0
  101. package/dist/src/enforcement/perf.js +18 -0
  102. package/dist/src/enforcement/perf.js.map +1 -0
  103. package/dist/src/enforcement/policy.d.ts +12 -0
  104. package/dist/src/enforcement/policy.js +84 -0
  105. package/dist/src/enforcement/policy.js.map +1 -0
  106. package/dist/src/enforcement/readonly.d.ts +17 -0
  107. package/dist/src/enforcement/readonly.js +124 -0
  108. package/dist/src/enforcement/readonly.js.map +1 -0
  109. package/dist/src/enforcement/sandbox-clone.d.ts +6 -0
  110. package/dist/src/enforcement/sandbox-clone.js +11 -0
  111. package/dist/src/enforcement/sandbox-clone.js.map +1 -0
  112. package/dist/src/enforcement/setup.d.ts +33 -0
  113. package/dist/src/enforcement/setup.js +168 -0
  114. package/dist/src/enforcement/setup.js.map +1 -0
  115. package/dist/src/enforcement/trust.d.ts +10 -0
  116. package/dist/src/enforcement/trust.js +71 -0
  117. package/dist/src/enforcement/trust.js.map +1 -0
  118. package/dist/src/enforcement/types.d.ts +40 -0
  119. package/dist/src/enforcement/types.js +3 -0
  120. package/dist/src/enforcement/types.js.map +1 -0
  121. package/dist/src/entitlement/provider.d.ts +48 -0
  122. package/dist/src/entitlement/provider.js +95 -0
  123. package/dist/src/entitlement/provider.js.map +1 -0
  124. package/dist/src/hash.d.ts +9 -0
  125. package/dist/src/hash.js +23 -0
  126. package/dist/src/hash.js.map +1 -0
  127. package/dist/src/ledger/query.d.ts +19 -0
  128. package/dist/src/ledger/query.js +158 -0
  129. package/dist/src/ledger/query.js.map +1 -0
  130. package/dist/src/manifest.d.ts +32 -0
  131. package/dist/src/manifest.js +242 -0
  132. package/dist/src/manifest.js.map +1 -0
  133. package/dist/src/mcp/server.d.ts +7 -0
  134. package/dist/src/mcp/server.js +364 -0
  135. package/dist/src/mcp/server.js.map +1 -0
  136. package/dist/src/paths.d.ts +94 -0
  137. package/dist/src/paths.js +354 -0
  138. package/dist/src/paths.js.map +1 -0
  139. package/dist/src/permission/engine.d.ts +15 -0
  140. package/dist/src/permission/engine.js +147 -0
  141. package/dist/src/permission/engine.js.map +1 -0
  142. package/dist/src/permission/types.d.ts +42 -0
  143. package/dist/src/permission/types.js +3 -0
  144. package/dist/src/permission/types.js.map +1 -0
  145. package/dist/src/product/setup.d.ts +35 -0
  146. package/dist/src/product/setup.js +300 -0
  147. package/dist/src/product/setup.js.map +1 -0
  148. package/dist/src/protect/audit.d.ts +5 -0
  149. package/dist/src/protect/audit.js +26 -0
  150. package/dist/src/protect/audit.js.map +1 -0
  151. package/dist/src/protect/capture.d.ts +7 -0
  152. package/dist/src/protect/capture.js +250 -0
  153. package/dist/src/protect/capture.js.map +1 -0
  154. package/dist/src/protect/fingerprint.d.ts +4 -0
  155. package/dist/src/protect/fingerprint.js +49 -0
  156. package/dist/src/protect/fingerprint.js.map +1 -0
  157. package/dist/src/protect/hook-cli.d.ts +2 -0
  158. package/dist/src/protect/hook-cli.js +107 -0
  159. package/dist/src/protect/hook-cli.js.map +1 -0
  160. package/dist/src/protect/index.d.ts +12 -0
  161. package/dist/src/protect/index.js +12 -0
  162. package/dist/src/protect/index.js.map +1 -0
  163. package/dist/src/protect/install.d.ts +34 -0
  164. package/dist/src/protect/install.js +293 -0
  165. package/dist/src/protect/install.js.map +1 -0
  166. package/dist/src/protect/intercept.d.ts +11 -0
  167. package/dist/src/protect/intercept.js +390 -0
  168. package/dist/src/protect/intercept.js.map +1 -0
  169. package/dist/src/protect/protect.d.ts +17 -0
  170. package/dist/src/protect/protect.js +194 -0
  171. package/dist/src/protect/protect.js.map +1 -0
  172. package/dist/src/protect/root-paths.d.ts +13 -0
  173. package/dist/src/protect/root-paths.js +140 -0
  174. package/dist/src/protect/root-paths.js.map +1 -0
  175. package/dist/src/protect/shell-policy.d.ts +17 -0
  176. package/dist/src/protect/shell-policy.js +269 -0
  177. package/dist/src/protect/shell-policy.js.map +1 -0
  178. package/dist/src/protect/status.d.ts +11 -0
  179. package/dist/src/protect/status.js +165 -0
  180. package/dist/src/protect/status.js.map +1 -0
  181. package/dist/src/protect/store.d.ts +20 -0
  182. package/dist/src/protect/store.js +170 -0
  183. package/dist/src/protect/store.js.map +1 -0
  184. package/dist/src/protect/types.d.ts +116 -0
  185. package/dist/src/protect/types.js +3 -0
  186. package/dist/src/protect/types.js.map +1 -0
  187. package/dist/src/protect/undo-session.d.ts +14 -0
  188. package/dist/src/protect/undo-session.js +182 -0
  189. package/dist/src/protect/undo-session.js.map +1 -0
  190. package/dist/src/restore.d.ts +39 -0
  191. package/dist/src/restore.js +141 -0
  192. package/dist/src/restore.js.map +1 -0
  193. package/dist/src/sandbox.d.ts +23 -0
  194. package/dist/src/sandbox.js +198 -0
  195. package/dist/src/sandbox.js.map +1 -0
  196. package/dist/src/session/ambient.d.ts +10 -0
  197. package/dist/src/session/ambient.js +53 -0
  198. package/dist/src/session/ambient.js.map +1 -0
  199. package/dist/src/session/attribution.d.ts +27 -0
  200. package/dist/src/session/attribution.js +201 -0
  201. package/dist/src/session/attribution.js.map +1 -0
  202. package/dist/src/session/index.d.ts +25 -0
  203. package/dist/src/session/index.js +472 -0
  204. package/dist/src/session/index.js.map +1 -0
  205. package/dist/src/session/process.d.ts +34 -0
  206. package/dist/src/session/process.js +234 -0
  207. package/dist/src/session/process.js.map +1 -0
  208. package/dist/src/session/store.d.ts +14 -0
  209. package/dist/src/session/store.js +125 -0
  210. package/dist/src/session/store.js.map +1 -0
  211. package/dist/src/session/types.d.ts +111 -0
  212. package/dist/src/session/types.js +3 -0
  213. package/dist/src/session/types.js.map +1 -0
  214. package/dist/src/session/watcher.d.ts +32 -0
  215. package/dist/src/session/watcher.js +186 -0
  216. package/dist/src/session/watcher.js.map +1 -0
  217. package/dist/src/timing.d.ts +7 -0
  218. package/dist/src/timing.js +19 -0
  219. package/dist/src/timing.js.map +1 -0
  220. package/dist/src/types.d.ts +101 -0
  221. package/dist/src/types.js +3 -0
  222. package/dist/src/types.js.map +1 -0
  223. package/dist/src/verify.d.ts +8 -0
  224. package/dist/src/verify.js +126 -0
  225. package/dist/src/verify.js.map +1 -0
  226. package/docs/ADAPTERS.md +37 -0
  227. package/docs/APPROVALS.md +32 -0
  228. package/docs/ARCHITECTURE.md +57 -0
  229. package/docs/ATTRIBUTION.md +179 -0
  230. package/docs/COMMERCIAL.md +51 -0
  231. package/docs/CURSOR-ENFORCEMENT.md +73 -0
  232. package/docs/ENFORCEMENT.md +134 -0
  233. package/docs/FUTURE.md +91 -0
  234. package/docs/HUMAN-SETUP.md +98 -0
  235. package/docs/IDENTITY-AUTHORITY.md +35 -0
  236. package/docs/MCP.md +107 -0
  237. package/docs/PACKAGING.md +77 -0
  238. package/docs/PERMISSIONS.md +53 -0
  239. package/docs/PRODUCT-V5.md +63 -0
  240. package/docs/PRODUCT-V6.md +69 -0
  241. package/docs/PROTECTED-SESSIONS.md +155 -0
  242. package/docs/THREAT-MODEL.md +84 -0
  243. package/docs/TRANSACTIONS.md +57 -0
  244. package/package.json +85 -0
@@ -0,0 +1,364 @@
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
3
+ import * as z from "zod";
4
+ import { readFile } from "node:fs/promises";
5
+ import { getProjectRoot, getSandboxPath, assertApprovedSandbox, PathSafetyError, SANDBOX_DIR_NAME, ENFORCED_SANDBOX_DIR_NAME, } from "../paths.js";
6
+ import { resolveSandboxRelative, sandboxAbs, } from "../action/capture.js";
7
+ import { defaultMediateContext, formatActionResponse, mediateCreateDirectory, mediateDeleteDirectory, mediateDeleteFile, mediateMoveFile, mediateWriteFile, } from "../action/mediate.js";
8
+ import { listDirectoryMediated } from "../action/mutate.js";
9
+ import { endMcpSession, listActions, loadAction, loadOrCreateMcpSession, markIncompleteFailed, } from "../action/store.js";
10
+ import { formatUndoConflict, undoAction } from "../action/undo.js";
11
+ import { buildManifest } from "../manifest.js";
12
+ import { loadCheckpoint } from "../checkpoint.js";
13
+ import { listPolicyEvents, formatPolicyViolation } from "../enforcement/policy.js";
14
+ import { listTrustRecords } from "../enforcement/trust.js";
15
+ import { loadEnforcementState } from "../enforcement/setup.js";
16
+ function logErr(msg) {
17
+ process.stderr.write(`[rewind-mcp] ${msg}\n`);
18
+ }
19
+ function textResult(text, isError = false) {
20
+ return {
21
+ content: [{ type: "text", text }],
22
+ isError,
23
+ };
24
+ }
25
+ const sandboxSchema = z
26
+ .enum(["test", "enforced"])
27
+ .default("test")
28
+ .describe("Which sandbox: test=sandbox-test-project (default), enforced=sandbox-enforced-project (V3)");
29
+ function sandboxNameFromArg(s) {
30
+ return s === "enforced" ? ENFORCED_SANDBOX_DIR_NAME : SANDBOX_DIR_NAME;
31
+ }
32
+ function clientFromServer(server) {
33
+ const v = server.server.getClientVersion?.();
34
+ if (v?.name) {
35
+ return { name: v.name, version: v.version ?? "unknown" };
36
+ }
37
+ return { name: "UNKNOWN_MCP_CLIENT", version: "unknown" };
38
+ }
39
+ function ctxFor(server, projectRoot, sandbox = "test") {
40
+ return defaultMediateContext(projectRoot, clientFromServer(server), sandboxNameFromArg(sandbox));
41
+ }
42
+ export async function createRewindMcpServer(projectRoot = getProjectRoot()) {
43
+ await markIncompleteFailed(projectRoot);
44
+ await assertApprovedSandbox(getSandboxPath(projectRoot), projectRoot).catch(async () => {
45
+ logErr("Sandbox missing — create it with npm run sandbox:create");
46
+ });
47
+ const server = new McpServer({ name: "rewind", version: "0.5.0" }, { capabilities: { tools: {} } });
48
+ // Ensure MCP session exists once client connects — refreshed per tool via client info
49
+ server.registerTool("rewind_read_file", {
50
+ title: "Read sandbox file",
51
+ description: "Read a UTF-8 text file inside an approved sandbox. Non-mutating audit (not in reversible ledger).",
52
+ inputSchema: z.object({
53
+ path: z.string().describe("Relative path inside the sandbox"),
54
+ sandbox: sandboxSchema,
55
+ }),
56
+ }, async ({ path: relPath, sandbox }) => {
57
+ try {
58
+ const sn = sandboxNameFromArg(sandbox);
59
+ const rel = resolveSandboxRelative(relPath, projectRoot, sn);
60
+ if (!rel)
61
+ return textResult("Cannot read sandbox root as file", true);
62
+ const abs = sandboxAbs(rel, projectRoot, sn);
63
+ const data = await readFile(abs);
64
+ return textResult(data.toString("utf8"));
65
+ }
66
+ catch (err) {
67
+ return textResult(err instanceof Error ? err.message : String(err), true);
68
+ }
69
+ });
70
+ server.registerTool("rewind_list_directory", {
71
+ title: "List sandbox directory",
72
+ description: "List entries inside an approved sandbox only.",
73
+ inputSchema: z.object({
74
+ path: z
75
+ .string()
76
+ .default(".")
77
+ .describe("Relative directory path (default sandbox root)"),
78
+ sandbox: sandboxSchema,
79
+ }),
80
+ }, async ({ path: relPath, sandbox }) => {
81
+ try {
82
+ const sn = sandboxNameFromArg(sandbox);
83
+ const rel = !relPath || relPath === "."
84
+ ? ""
85
+ : resolveSandboxRelative(relPath, projectRoot, sn);
86
+ const names = await listDirectoryMediated(rel, projectRoot, sn);
87
+ return textResult(names.join("\n") || "(empty)");
88
+ }
89
+ catch (err) {
90
+ return textResult(err instanceof Error ? err.message : String(err), true);
91
+ }
92
+ });
93
+ server.registerTool("rewind_write_file", {
94
+ title: "Write sandbox file (mediated)",
95
+ description: "Create or overwrite a file via REWIND mediation. Use sandbox=enforced for V3 mandatory-mediation proofs.",
96
+ inputSchema: z.object({
97
+ path: z.string(),
98
+ content: z.string(),
99
+ sandbox: sandboxSchema,
100
+ }),
101
+ }, async ({ path: relPath, content, sandbox }) => {
102
+ try {
103
+ const action = await mediateWriteFile(ctxFor(server, projectRoot, sandbox), {
104
+ path: relPath,
105
+ content,
106
+ });
107
+ return textResult(formatActionResponse(action));
108
+ }
109
+ catch (err) {
110
+ return textResult(err instanceof Error ? err.message : String(err), true);
111
+ }
112
+ });
113
+ server.registerTool("rewind_create_file", {
114
+ title: "Create sandbox file (mediated)",
115
+ description: "Create a new file (fails if exists) via REWIND mediation.",
116
+ inputSchema: z.object({
117
+ path: z.string(),
118
+ content: z.string(),
119
+ sandbox: sandboxSchema,
120
+ }),
121
+ }, async ({ path: relPath, content, sandbox }) => {
122
+ try {
123
+ const action = await mediateWriteFile(ctxFor(server, projectRoot, sandbox), {
124
+ path: relPath,
125
+ content,
126
+ createOnly: true,
127
+ });
128
+ return textResult(formatActionResponse(action));
129
+ }
130
+ catch (err) {
131
+ return textResult(err instanceof Error ? err.message : String(err), true);
132
+ }
133
+ });
134
+ server.registerTool("rewind_delete_file", {
135
+ title: "Delete sandbox file (mediated)",
136
+ description: "Delete a file via REWIND mediation.",
137
+ inputSchema: z.object({ path: z.string(), sandbox: sandboxSchema }),
138
+ }, async ({ path: relPath, sandbox }) => {
139
+ try {
140
+ const action = await mediateDeleteFile(ctxFor(server, projectRoot, sandbox), {
141
+ path: relPath,
142
+ });
143
+ return textResult(formatActionResponse(action));
144
+ }
145
+ catch (err) {
146
+ return textResult(err instanceof Error ? err.message : String(err), true);
147
+ }
148
+ });
149
+ server.registerTool("rewind_move_file", {
150
+ title: "Move/rename sandbox file (mediated)",
151
+ description: "Move a file via REWIND mediation.",
152
+ inputSchema: z.object({
153
+ from: z.string(),
154
+ to: z.string(),
155
+ sandbox: sandboxSchema,
156
+ }),
157
+ }, async ({ from, to, sandbox }) => {
158
+ try {
159
+ const action = await mediateMoveFile(ctxFor(server, projectRoot, sandbox), {
160
+ from,
161
+ to,
162
+ });
163
+ return textResult(formatActionResponse(action));
164
+ }
165
+ catch (err) {
166
+ return textResult(err instanceof Error ? err.message : String(err), true);
167
+ }
168
+ });
169
+ server.registerTool("rewind_create_directory", {
170
+ title: "Create sandbox directory (mediated)",
171
+ description: "Create a directory via REWIND mediation.",
172
+ inputSchema: z.object({ path: z.string(), sandbox: sandboxSchema }),
173
+ }, async ({ path: relPath, sandbox }) => {
174
+ try {
175
+ const action = await mediateCreateDirectory(ctxFor(server, projectRoot, sandbox), {
176
+ path: relPath,
177
+ });
178
+ return textResult(formatActionResponse(action));
179
+ }
180
+ catch (err) {
181
+ return textResult(err instanceof Error ? err.message : String(err), true);
182
+ }
183
+ });
184
+ server.registerTool("rewind_delete_directory", {
185
+ title: "Delete sandbox directory (mediated)",
186
+ description: "Delete a directory tree via REWIND mediation (subtree captured for undo).",
187
+ inputSchema: z.object({ path: z.string(), sandbox: sandboxSchema }),
188
+ }, async ({ path: relPath, sandbox }) => {
189
+ try {
190
+ const action = await mediateDeleteDirectory(ctxFor(server, projectRoot, sandbox), {
191
+ path: relPath,
192
+ });
193
+ return textResult(formatActionResponse(action));
194
+ }
195
+ catch (err) {
196
+ return textResult(err instanceof Error ? err.message : String(err), true);
197
+ }
198
+ });
199
+ server.registerTool("rewind_get_status", {
200
+ title: "REWIND status",
201
+ description: "Show sandbox fingerprint, MCP session, enforcement, and recent action counts.",
202
+ inputSchema: z.object({}),
203
+ }, async () => {
204
+ try {
205
+ const client = clientFromServer(server);
206
+ const session = await loadOrCreateMcpSession(projectRoot, client);
207
+ const actions = await listActions(projectRoot);
208
+ const mediated = actions.filter((a) => a.source === "MCP");
209
+ const enf = await loadEnforcementState(projectRoot);
210
+ const policy = await listPolicyEvents(projectRoot);
211
+ const trust = await listTrustRecords(projectRoot);
212
+ let fingerprint = "(no checkpoint)";
213
+ try {
214
+ const cp = await loadCheckpoint("latest", projectRoot);
215
+ const live = await buildManifest(getSandboxPath(projectRoot), "sandbox-test-project");
216
+ fingerprint = `checkpoint=${cp.meta.fingerprint.slice(0, 12)}… live=${live.fingerprint.slice(0, 12)}… match=${cp.meta.fingerprint === live.fingerprint}`;
217
+ }
218
+ catch {
219
+ /* optional */
220
+ }
221
+ return textResult([
222
+ "REWIND STATUS",
223
+ `Client: ${client.name}@${client.version}`,
224
+ `MCP session: ${session.id}`,
225
+ `Actions (all): ${actions.length}`,
226
+ `Mediated MCP actions: ${mediated.length}`,
227
+ `Completed: ${mediated.filter((a) => a.status === "COMPLETED").length}`,
228
+ `Undone: ${mediated.filter((a) => a.status === "UNDONE").length}`,
229
+ `Conflicted: ${mediated.filter((a) => a.status === "CONFLICTED").length}`,
230
+ fingerprint,
231
+ "",
232
+ "ENFORCEMENT (V3)",
233
+ `Enabled: ${enf?.enabled ? "YES" : "NO"}`,
234
+ `Mechanism: ${enf?.mechanism ?? "none"}`,
235
+ `Locked (fs-readonly): ${enf?.locked ? "YES" : "NO"}`,
236
+ `Policy events: ${policy.length}`,
237
+ `Untrusted paths: ${trust.filter((t) => t.state === "UNTRUSTED").length}`,
238
+ "",
239
+ "NOTE: Native Cursor edits of sandbox-test-project bypass MCP.",
240
+ "NOTE: sandbox-enforced-project uses fs-readonly + Cursor hooks + optional seatbelt harness.",
241
+ ].join("\n"));
242
+ }
243
+ catch (err) {
244
+ return textResult(err instanceof Error ? err.message : String(err), true);
245
+ }
246
+ });
247
+ server.registerTool("rewind_policy_events", {
248
+ title: "List policy / enforcement events",
249
+ description: "List V3 policy events (bypass detection, blocked writes, enable/disable).",
250
+ inputSchema: z.object({
251
+ limit: z.number().int().positive().max(100).default(20),
252
+ }),
253
+ }, async ({ limit }) => {
254
+ const events = await listPolicyEvents(projectRoot);
255
+ const slice = events.slice(-limit);
256
+ const lines = slice.map((e) => `${e.time} ${e.id} ${e.status.padEnd(10)} ${e.type} ${e.path ?? "—"} [${e.mechanism}]`);
257
+ return textResult(lines.join("\n") || "(no policy events)");
258
+ });
259
+ server.registerTool("rewind_trust_status", {
260
+ title: "Path trust status",
261
+ description: "Show AUTHORITATIVE vs UNTRUSTED path records for mediated vs external state.",
262
+ inputSchema: z.object({}),
263
+ }, async () => {
264
+ const trust = await listTrustRecords(projectRoot);
265
+ if (trust.length === 0)
266
+ return textResult("(no trust records)");
267
+ const lines = trust.map((t) => `${t.state.padEnd(14)} ${t.path} action=${t.lastMediatedActionId ?? "—"} policy=${t.lastPolicyEventId ?? "—"}`);
268
+ const untrusted = trust.filter((t) => t.state === "UNTRUSTED");
269
+ if (untrusted.length > 0) {
270
+ lines.push("");
271
+ lines.push("POLICY VIOLATION — untrusted paths present:");
272
+ for (const u of untrusted) {
273
+ lines.push(formatPolicyViolation({
274
+ id: u.lastPolicyEventId ?? "unknown",
275
+ version: 3,
276
+ time: u.updatedAt,
277
+ type: "UNKNOWN_MUTATION",
278
+ path: u.path,
279
+ mechanism: "trust-store",
280
+ evidence: u.note ?? "untrusted",
281
+ status: "UNTRUSTED",
282
+ }));
283
+ }
284
+ }
285
+ return textResult(lines.join("\n"));
286
+ });
287
+ server.registerTool("rewind_action_history", {
288
+ title: "List mediated actions",
289
+ description: "List REWIND MCP action ledger entries (newest last).",
290
+ inputSchema: z.object({
291
+ limit: z.number().int().positive().max(100).default(20),
292
+ }),
293
+ }, async ({ limit }) => {
294
+ const actions = await listActions(projectRoot);
295
+ const slice = actions.slice(-limit);
296
+ const lines = slice.map((a) => `${a.sequence.toString().padStart(4)} ${a.id} ${a.status.padEnd(10)} ${a.tool} ${a.target}${a.targetSecondary ? "→" + a.targetSecondary : ""}`);
297
+ return textResult(lines.join("\n") || "(no actions)");
298
+ });
299
+ server.registerTool("rewind_undo_action", {
300
+ title: "Undo mediated action",
301
+ description: "Undo a single COMPLETED MCP action if current state still equals the recorded after-state. Refuses on conflict to protect newer work.",
302
+ inputSchema: z.object({
303
+ actionId: z.string().describe("Action id, e.g. act_…"),
304
+ }),
305
+ }, async ({ actionId }) => {
306
+ try {
307
+ const result = await undoAction(actionId, projectRoot);
308
+ if (result.conflict) {
309
+ return textResult(formatUndoConflict(result), true);
310
+ }
311
+ return textResult(result.ok
312
+ ? `${result.message}\nStatus: ${result.action.status}`
313
+ : result.message, !result.ok);
314
+ }
315
+ catch (err) {
316
+ return textResult(err instanceof Error ? err.message : String(err), true);
317
+ }
318
+ });
319
+ return server;
320
+ }
321
+ export async function runMcpServer(projectRoot = getProjectRoot()) {
322
+ const server = await createRewindMcpServer(projectRoot);
323
+ const transport = new StdioServerTransport();
324
+ logErr(`starting stdio MCP for project ${projectRoot}`);
325
+ await server.connect(transport);
326
+ logErr("connected — waiting for MCP client");
327
+ }
328
+ export async function printActionCli(id, projectRoot = getProjectRoot()) {
329
+ if (!id) {
330
+ const actions = await listActions(projectRoot);
331
+ console.log("REWIND ACTIONS");
332
+ console.log("");
333
+ for (const a of actions) {
334
+ console.log(`${a.sequence.toString().padStart(4)} ${a.id} ${a.status.padEnd(10)} ${a.tool} ${a.target}`);
335
+ }
336
+ console.log("");
337
+ console.log(`Total: ${actions.length}`);
338
+ return;
339
+ }
340
+ const a = await loadAction(id, projectRoot);
341
+ console.log(JSON.stringify(a, null, 2));
342
+ }
343
+ export async function printMcpSessionReport(projectRoot = getProjectRoot()) {
344
+ const actions = await listActions(projectRoot);
345
+ const sessionIds = [...new Set(actions.map((a) => a.sessionId))];
346
+ console.log("REWIND MCP SESSIONS");
347
+ console.log("");
348
+ for (const sid of sessionIds) {
349
+ const subset = actions.filter((a) => a.sessionId === sid);
350
+ const client = subset[0]?.client;
351
+ console.log(`Session ${sid}`);
352
+ console.log(`Source: MCP`);
353
+ console.log(`Client: ${client ? `${client.name}@${client.version}` : "unknown"}`);
354
+ console.log(`Actions: ${subset.length}`);
355
+ console.log(`Reversible completed: ${subset.filter((a) => a.status === "COMPLETED" && a.reversibility === "REVERSIBLE").length}`);
356
+ console.log(`Conflicted: ${subset.filter((a) => a.status === "CONFLICTED").length}`);
357
+ console.log(`Undone: ${subset.filter((a) => a.status === "UNDONE").length}`);
358
+ console.log(`Failed: ${subset.filter((a) => a.status === "FAILED").length}`);
359
+ console.log("");
360
+ }
361
+ await endMcpSession(projectRoot).catch(() => null);
362
+ }
363
+ export { PathSafetyError };
364
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Path safety for REWIND.
3
+ *
4
+ * Fail closed: only approved project-local sandboxes may be mutated
5
+ * (sandbox-test-project, sandbox-enforced-project). Checkpoint data lives
6
+ * under .rewind/ inside the *user project*, never inside the npm package.
7
+ */
8
+ export declare const SANDBOX_DIR_NAME = "sandbox-test-project";
9
+ export declare const ENFORCED_SANDBOX_DIR_NAME = "sandbox-enforced-project";
10
+ export declare const REWIND_DIR_NAME = ".rewind";
11
+ export type SandboxName = typeof SANDBOX_DIR_NAME | typeof ENFORCED_SANDBOX_DIR_NAME;
12
+ export declare const APPROVED_SANDBOX_NAMES: readonly SandboxName[];
13
+ /**
14
+ * Absolute path to the installed REWIND *package* (read-only runtime).
15
+ * Never write user/project state here.
16
+ */
17
+ export declare function getPackageRoot(): string;
18
+ /**
19
+ * Absolute path to the *user project* REWIND operates on.
20
+ * Defaults to process.cwd() — never the npm package / dist tree.
21
+ */
22
+ export declare function getProjectRoot(): string;
23
+ /** Global user state directory (~/.rewind) — credentials, commercial, keys. */
24
+ export declare function getUserRewindDir(override?: string | undefined): string;
25
+ /**
26
+ * How to invoke the installed REWIND CLI (portable — no tsx / src paths).
27
+ */
28
+ export declare function resolveRewindCliInvocation(extraArgs?: string[]): {
29
+ command: string;
30
+ args: string[];
31
+ };
32
+ export declare function assertSandboxName(name: string): SandboxName;
33
+ export declare function getSandboxPath(projectRoot?: string, sandboxName?: SandboxName): string;
34
+ export declare function getEnforcedSandboxPath(projectRoot?: string): string;
35
+ export declare function getPolicyDir(projectRoot?: string): string;
36
+ export declare function getTrustDir(projectRoot?: string): string;
37
+ export declare function getEnforcementDir(projectRoot?: string): string;
38
+ export declare function getRewindHome(projectRoot?: string): string;
39
+ export declare function getCheckpointsDir(projectRoot?: string): string;
40
+ export declare function getTransactionsDir(projectRoot?: string): string;
41
+ export declare function getSessionsDir(projectRoot?: string): string;
42
+ export declare function getActionsDir(projectRoot?: string): string;
43
+ export declare function getObjectsDir(projectRoot?: string): string;
44
+ export declare function getMcpSessionsDir(projectRoot?: string): string;
45
+ export declare class PathSafetyError extends Error {
46
+ readonly name = "PathSafetyError";
47
+ constructor(message: string);
48
+ }
49
+ /** Normalize to absolute, resolved path without requiring existence. */
50
+ export declare function normalizeAbsolute(input: string): string;
51
+ /**
52
+ * Returns true if `candidate` is exactly `root` or a path strictly inside it.
53
+ * Both arguments should be absolute. Does not follow symlinks.
54
+ * Also treats path strings as equal when they differ only by a shared
55
+ * realpath prefix mismatch that the caller already normalized.
56
+ */
57
+ export declare function isPathInside(root: string, candidate: string): boolean;
58
+ /**
59
+ * Like isPathInside, but resolves both sides with realpath when they exist.
60
+ * Handles macOS /var vs /private/var discrepancies.
61
+ */
62
+ export declare function isPathInsideAsync(root: string, candidate: string): Promise<boolean>;
63
+ /** Forbidden roots that must never be targeted. */
64
+ export declare function getForbiddenRoots(): string[];
65
+ /**
66
+ * Assert a relative path from sandbox has no traversal / absolute / null bytes.
67
+ * Returns a cleaned POSIX-style relative path.
68
+ */
69
+ export declare function assertSafeRelativePath(rel: string): string;
70
+ /**
71
+ * Resolve a relative sandbox path to an absolute path and ensure it stays
72
+ * inside the approved sandbox. Does not follow the final component if it is
73
+ * a dangling symlink (uses join + resolve of parent).
74
+ */
75
+ export declare function resolveInsideSandbox(relativePath: string, sandboxRoot?: string): string;
76
+ export interface SandboxValidation {
77
+ ok: true;
78
+ target: string;
79
+ approvedSandbox: string;
80
+ realTarget: string;
81
+ }
82
+ /**
83
+ * Validate that `target` is exactly an approved sandbox directory
84
+ * (sandbox-test-project or sandbox-enforced-project).
85
+ * Fail closed on missing paths, wrong identity, or symlink escape.
86
+ */
87
+ export declare function assertApprovedSandbox(target: string, projectRoot?: string, sandboxName?: SandboxName): Promise<SandboxValidation>;
88
+ /**
89
+ * After resolving a path that may be a symlink, ensure the real target
90
+ * remains inside the sandbox. Used when reading/writing individual files.
91
+ */
92
+ export declare function assertNoSymlinkEscape(absolutePath: string, sandboxRoot: string): Promise<void>;
93
+ /** Print chaos-test safety banner. Throws if not approved. */
94
+ export declare function printChaosSafetyBanner(target: string, projectRoot?: string): Promise<SandboxValidation>;