@agi-fans/dsh-tui 0.20.0 → 0.22.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 (319) hide show
  1. package/lib/CHANGELOG.md +249 -3
  2. package/lib/chrome/box.d.ts +47 -16
  3. package/lib/chrome/box.js +172 -130
  4. package/lib/chrome/box.js.map +1 -1
  5. package/lib/chrome/code-highlight.d.ts +15 -0
  6. package/lib/chrome/code-highlight.js +60 -4
  7. package/lib/chrome/code-highlight.js.map +1 -1
  8. package/lib/chrome/command-output.d.ts +29 -2
  9. package/lib/chrome/command-output.js +100 -4
  10. package/lib/chrome/command-output.js.map +1 -1
  11. package/lib/chrome/main-screen-renderer.d.ts +18 -0
  12. package/lib/chrome/main-screen-renderer.js +58 -5
  13. package/lib/chrome/main-screen-renderer.js.map +1 -1
  14. package/lib/chrome/markdown.js +30 -10
  15. package/lib/chrome/markdown.js.map +1 -1
  16. package/lib/chrome/relative-time.d.ts +17 -0
  17. package/lib/chrome/relative-time.js +36 -0
  18. package/lib/chrome/relative-time.js.map +1 -1
  19. package/lib/chrome/renderer.d.ts +9 -0
  20. package/lib/chrome/renderer.js +1 -1
  21. package/lib/chrome/renderer.js.map +1 -1
  22. package/lib/chrome/secret-mask.d.ts +35 -0
  23. package/lib/chrome/secret-mask.js +180 -0
  24. package/lib/chrome/secret-mask.js.map +1 -0
  25. package/lib/chrome/status-config.d.ts +161 -51
  26. package/lib/chrome/status-config.js +237 -126
  27. package/lib/chrome/status-config.js.map +1 -1
  28. package/lib/chrome/status-line.d.ts +3 -2
  29. package/lib/chrome/status-line.js +105 -63
  30. package/lib/chrome/status-line.js.map +1 -1
  31. package/lib/chrome/terminal-colors.d.ts +85 -0
  32. package/lib/chrome/terminal-colors.js +230 -0
  33. package/lib/chrome/terminal-colors.js.map +1 -0
  34. package/lib/chrome/terminal-images.d.ts +9 -1
  35. package/lib/chrome/terminal-images.js +27 -4
  36. package/lib/chrome/terminal-images.js.map +1 -1
  37. package/lib/chrome/theme.d.ts +32 -9
  38. package/lib/chrome/theme.js +616 -520
  39. package/lib/chrome/theme.js.map +1 -1
  40. package/lib/chrome/tool-args.d.ts +1 -1
  41. package/lib/chrome/tool-args.js +3 -1
  42. package/lib/chrome/tool-args.js.map +1 -1
  43. package/lib/chrome/tool-renderers.d.ts +2 -0
  44. package/lib/chrome/tool-renderers.js +69 -3
  45. package/lib/chrome/tool-renderers.js.map +1 -1
  46. package/lib/chrome/tools-list.d.ts +1 -4
  47. package/lib/chrome/tools-list.js +1 -41
  48. package/lib/chrome/tools-list.js.map +1 -1
  49. package/lib/chrome/welcome-tips.d.ts +20 -7
  50. package/lib/chrome/welcome-tips.js +22 -41
  51. package/lib/chrome/welcome-tips.js.map +1 -1
  52. package/lib/commands/auth-ids.d.ts +25 -0
  53. package/lib/commands/auth-ids.js +27 -0
  54. package/lib/commands/auth-ids.js.map +1 -0
  55. package/lib/commands/auth-input.d.ts +34 -0
  56. package/lib/commands/auth-input.js +96 -0
  57. package/lib/commands/auth-input.js.map +1 -0
  58. package/lib/commands/auth-providers.d.ts +39 -0
  59. package/lib/commands/auth-providers.js +125 -0
  60. package/lib/commands/auth-providers.js.map +1 -0
  61. package/lib/commands/auth.d.ts +16 -22
  62. package/lib/commands/auth.js +346 -299
  63. package/lib/commands/auth.js.map +1 -1
  64. package/lib/commands/btw.d.ts +27 -0
  65. package/lib/commands/btw.js +59 -0
  66. package/lib/commands/btw.js.map +1 -0
  67. package/lib/commands/diff.js +30 -5
  68. package/lib/commands/diff.js.map +1 -1
  69. package/lib/commands/export.d.ts +1 -1
  70. package/lib/commands/export.js +5 -3
  71. package/lib/commands/export.js.map +1 -1
  72. package/lib/commands/files.d.ts +17 -1
  73. package/lib/commands/files.js +69 -61
  74. package/lib/commands/files.js.map +1 -1
  75. package/lib/commands/integrations.js +18 -6
  76. package/lib/commands/integrations.js.map +1 -1
  77. package/lib/commands/jobs.d.ts +19 -4
  78. package/lib/commands/jobs.js +50 -7
  79. package/lib/commands/jobs.js.map +1 -1
  80. package/lib/commands/model.js +109 -76
  81. package/lib/commands/model.js.map +1 -1
  82. package/lib/commands/permission.js +46 -13
  83. package/lib/commands/permission.js.map +1 -1
  84. package/lib/commands/plugins.js +196 -42
  85. package/lib/commands/plugins.js.map +1 -1
  86. package/lib/commands/schedule.d.ts +29 -0
  87. package/lib/commands/schedule.js +228 -0
  88. package/lib/commands/schedule.js.map +1 -0
  89. package/lib/commands/session-configuration.d.ts +1 -1
  90. package/lib/commands/session-configuration.js +29 -28
  91. package/lib/commands/session-configuration.js.map +1 -1
  92. package/lib/commands/session.js +75 -80
  93. package/lib/commands/session.js.map +1 -1
  94. package/lib/commands/terminal.d.ts +24 -4
  95. package/lib/commands/terminal.js +38 -94
  96. package/lib/commands/terminal.js.map +1 -1
  97. package/lib/commands/trajectory.js +4 -1
  98. package/lib/commands/trajectory.js.map +1 -1
  99. package/lib/definition.d.ts +150 -11
  100. package/lib/index.d.ts +1 -0
  101. package/lib/index.js +1 -0
  102. package/lib/index.js.map +1 -1
  103. package/lib/input/actions.d.ts +51 -0
  104. package/lib/input/actions.js +120 -0
  105. package/lib/input/actions.js.map +1 -0
  106. package/lib/input/editor-discovery.js +2 -2
  107. package/lib/input/editor-discovery.js.map +1 -1
  108. package/lib/input/editor.d.ts +0 -10
  109. package/lib/input/editor.js +11 -9
  110. package/lib/input/editor.js.map +1 -1
  111. package/lib/input/image-paste.d.ts +19 -1
  112. package/lib/input/image-paste.js +82 -1
  113. package/lib/input/image-paste.js.map +1 -1
  114. package/lib/input/keybindings-config.d.ts +15 -4
  115. package/lib/input/keybindings-config.js +57 -35
  116. package/lib/input/keybindings-config.js.map +1 -1
  117. package/lib/input/keys.d.ts +18 -0
  118. package/lib/input/keys.js +48 -3
  119. package/lib/input/keys.js.map +1 -1
  120. package/lib/input/wheel-scroll.d.ts +46 -0
  121. package/lib/input/wheel-scroll.js +69 -0
  122. package/lib/input/wheel-scroll.js.map +1 -0
  123. package/lib/prompt-intents.d.ts +182 -0
  124. package/lib/prompt-intents.js +127 -0
  125. package/lib/prompt-intents.js.map +1 -0
  126. package/lib/runtime/agent-profile.d.ts +5 -0
  127. package/lib/runtime/agent-profile.js +12 -0
  128. package/lib/runtime/agent-profile.js.map +1 -1
  129. package/lib/runtime/approval-rules.d.ts +59 -0
  130. package/lib/runtime/approval-rules.js +179 -0
  131. package/lib/runtime/approval-rules.js.map +1 -0
  132. package/lib/runtime/btw-policy.d.ts +7 -0
  133. package/lib/runtime/btw-policy.js +18 -0
  134. package/lib/runtime/btw-policy.js.map +1 -0
  135. package/lib/runtime/btw.d.ts +47 -0
  136. package/lib/runtime/btw.js +200 -0
  137. package/lib/runtime/btw.js.map +1 -0
  138. package/lib/runtime/cancellable.d.ts +75 -0
  139. package/lib/runtime/cancellable.js +76 -0
  140. package/lib/runtime/cancellable.js.map +1 -0
  141. package/lib/runtime/composer-images.js +5 -4
  142. package/lib/runtime/composer-images.js.map +1 -1
  143. package/lib/runtime/composer-shell.d.ts +30 -0
  144. package/lib/runtime/composer-shell.js +150 -0
  145. package/lib/runtime/composer-shell.js.map +1 -0
  146. package/lib/runtime/file-recovery-local.d.ts +73 -0
  147. package/lib/runtime/file-recovery-local.js +351 -0
  148. package/lib/runtime/file-recovery-local.js.map +1 -0
  149. package/lib/runtime/file-recovery-recording.d.ts +23 -0
  150. package/lib/runtime/file-recovery-recording.js +131 -0
  151. package/lib/runtime/file-recovery-recording.js.map +1 -0
  152. package/lib/runtime/file-recovery-review.d.ts +3 -0
  153. package/lib/runtime/file-recovery-review.js +130 -0
  154. package/lib/runtime/file-recovery-review.js.map +1 -0
  155. package/lib/runtime/file-recovery-store.d.ts +83 -0
  156. package/lib/runtime/file-recovery-store.js +329 -0
  157. package/lib/runtime/file-recovery-store.js.map +1 -0
  158. package/lib/runtime/file-recovery-worker.d.ts +22 -0
  159. package/lib/runtime/file-recovery-worker.js +153 -0
  160. package/lib/runtime/file-recovery-worker.js.map +1 -0
  161. package/lib/runtime/file-review.d.ts +6 -3
  162. package/lib/runtime/file-review.js +44 -7
  163. package/lib/runtime/file-review.js.map +1 -1
  164. package/lib/runtime/herdr-agent.d.ts +4 -13
  165. package/lib/runtime/herdr-agent.js +19 -63
  166. package/lib/runtime/herdr-agent.js.map +1 -1
  167. package/lib/runtime/plain-tui.d.ts +2 -0
  168. package/lib/runtime/plain-tui.js +7 -1
  169. package/lib/runtime/plain-tui.js.map +1 -1
  170. package/lib/runtime/plugin-settings.d.ts +25 -2
  171. package/lib/runtime/plugin-settings.js +329 -31
  172. package/lib/runtime/plugin-settings.js.map +1 -1
  173. package/lib/runtime/provider-local.d.ts +81 -24
  174. package/lib/runtime/provider-local.js +1807 -608
  175. package/lib/runtime/provider-local.js.map +1 -1
  176. package/lib/runtime/runner.js +52 -12
  177. package/lib/runtime/runner.js.map +1 -1
  178. package/lib/runtime/session-archive.d.ts +6 -0
  179. package/lib/runtime/session-archive.js +129 -3
  180. package/lib/runtime/session-archive.js.map +1 -1
  181. package/lib/runtime/session-runtime.js +1 -1
  182. package/lib/runtime/session-runtime.js.map +1 -1
  183. package/lib/runtime/settings-preferences.d.ts +5 -0
  184. package/lib/runtime/settings-preferences.js +34 -0
  185. package/lib/runtime/settings-preferences.js.map +1 -0
  186. package/lib/runtime/startup-notices.js +2 -0
  187. package/lib/runtime/startup-notices.js.map +1 -1
  188. package/lib/runtime/terminal-modes.d.ts +47 -0
  189. package/lib/runtime/terminal-modes.js +86 -0
  190. package/lib/runtime/terminal-modes.js.map +1 -0
  191. package/lib/runtime/terminal-notifications.d.ts +3 -5
  192. package/lib/runtime/terminal-notifications.js +4 -8
  193. package/lib/runtime/terminal-notifications.js.map +1 -1
  194. package/lib/runtime/terminal-probe.d.ts +36 -0
  195. package/lib/runtime/terminal-probe.js +37 -0
  196. package/lib/runtime/terminal-probe.js.map +1 -0
  197. package/lib/runtime/terminal-session.d.ts +57 -0
  198. package/lib/runtime/terminal-session.js +164 -0
  199. package/lib/runtime/terminal-session.js.map +1 -0
  200. package/lib/runtime/terminal-state.d.ts +29 -0
  201. package/lib/runtime/terminal-state.js +62 -0
  202. package/lib/runtime/terminal-state.js.map +1 -0
  203. package/lib/runtime/tool-presentation.js +50 -14
  204. package/lib/runtime/tool-presentation.js.map +1 -1
  205. package/lib/session/external-agents.d.ts +5 -0
  206. package/lib/session/external-agents.js +27 -0
  207. package/lib/session/external-agents.js.map +1 -0
  208. package/lib/session/feature-toggles.d.ts +1 -1
  209. package/lib/session/feature-toggles.js +1 -1
  210. package/lib/session/interaction-adapter.d.ts +1 -6
  211. package/lib/session/interaction-adapter.js +95 -18
  212. package/lib/session/interaction-adapter.js.map +1 -1
  213. package/lib/session/message-queue.js +1 -1
  214. package/lib/session/message-queue.js.map +1 -1
  215. package/lib/session/model-readiness.d.ts +16 -0
  216. package/lib/session/model-readiness.js +43 -0
  217. package/lib/session/model-readiness.js.map +1 -0
  218. package/lib/session/package-metadata.d.ts +8 -0
  219. package/lib/session/package-metadata.js +8 -0
  220. package/lib/session/package-metadata.js.map +1 -1
  221. package/lib/session/project-context.d.ts +5 -0
  222. package/lib/session/project-context.js +36 -0
  223. package/lib/session/project-context.js.map +1 -1
  224. package/lib/session/session-controller.d.ts +10 -13
  225. package/lib/session/session-controller.js +183 -98
  226. package/lib/session/session-controller.js.map +1 -1
  227. package/lib/session/session-library.js +2 -0
  228. package/lib/session/session-library.js.map +1 -1
  229. package/lib/session/session-tree.d.ts +3 -0
  230. package/lib/session/session-tree.js +3 -1
  231. package/lib/session/session-tree.js.map +1 -1
  232. package/lib/session/subagent-roster.d.ts +2 -1
  233. package/lib/session/subagent-roster.js +24 -3
  234. package/lib/session/subagent-roster.js.map +1 -1
  235. package/lib/session/subagent-tracker.d.ts +6 -2
  236. package/lib/session/subagent-tracker.js +49 -2
  237. package/lib/session/subagent-tracker.js.map +1 -1
  238. package/lib/session/tui-settings.d.ts +47 -13
  239. package/lib/session/tui-settings.js +76 -34
  240. package/lib/session/tui-settings.js.map +1 -1
  241. package/lib/session/working-directory.d.ts +4 -0
  242. package/lib/session/working-directory.js +4 -0
  243. package/lib/session/working-directory.js.map +1 -0
  244. package/lib/session/worktrees.d.ts +13 -0
  245. package/lib/session/worktrees.js +49 -0
  246. package/lib/session/worktrees.js.map +1 -0
  247. package/lib/views/approval-rule.d.ts +3 -0
  248. package/lib/views/approval-rule.js +4 -0
  249. package/lib/views/approval-rule.js.map +1 -0
  250. package/lib/views/at-complete.d.ts +8 -0
  251. package/lib/views/at-complete.js +64 -2
  252. package/lib/views/at-complete.js.map +1 -1
  253. package/lib/views/autocomplete.d.ts +22 -2
  254. package/lib/views/autocomplete.js +70 -40
  255. package/lib/views/autocomplete.js.map +1 -1
  256. package/lib/views/copy-targets.d.ts +13 -14
  257. package/lib/views/copy-targets.js +42 -54
  258. package/lib/views/copy-targets.js.map +1 -1
  259. package/lib/views/document-reader.js +18 -5
  260. package/lib/views/document-reader.js.map +1 -1
  261. package/lib/views/event-views.d.ts +1 -1
  262. package/lib/views/event-views.js +60 -6
  263. package/lib/views/event-views.js.map +1 -1
  264. package/lib/views/file-actions.d.ts +12 -0
  265. package/lib/views/file-actions.js +72 -0
  266. package/lib/views/file-actions.js.map +1 -0
  267. package/lib/views/history-search.js +15 -21
  268. package/lib/views/history-search.js.map +1 -1
  269. package/lib/views/hotkeys.d.ts +8 -1
  270. package/lib/views/hotkeys.js +53 -26
  271. package/lib/views/hotkeys.js.map +1 -1
  272. package/lib/views/list-navigation.d.ts +62 -0
  273. package/lib/views/list-navigation.js +73 -0
  274. package/lib/views/list-navigation.js.map +1 -0
  275. package/lib/views/list-view.d.ts +99 -0
  276. package/lib/views/list-view.js +165 -0
  277. package/lib/views/list-view.js.map +1 -0
  278. package/lib/views/prompt-selector.d.ts +34 -4
  279. package/lib/views/prompt-selector.js +270 -134
  280. package/lib/views/prompt-selector.js.map +1 -1
  281. package/lib/views/session-files.d.ts +1 -2
  282. package/lib/views/session-files.js +1 -11
  283. package/lib/views/session-files.js.map +1 -1
  284. package/lib/views/settings-list.d.ts +51 -10
  285. package/lib/views/settings-list.js +267 -315
  286. package/lib/views/settings-list.js.map +1 -1
  287. package/lib/views/trajectory-timeline.d.ts +72 -0
  288. package/lib/views/trajectory-timeline.js +133 -0
  289. package/lib/views/trajectory-timeline.js.map +1 -0
  290. package/lib/views/trajectory.d.ts +15 -4
  291. package/lib/views/trajectory.js +557 -123
  292. package/lib/views/trajectory.js.map +1 -1
  293. package/lib/views/transcript-export.js +9 -0
  294. package/lib/views/transcript-export.js.map +1 -1
  295. package/lib/views/transcript-render.d.ts +97 -25
  296. package/lib/views/transcript-render.js +542 -170
  297. package/lib/views/transcript-render.js.map +1 -1
  298. package/lib/views/transcript-search.d.ts +39 -6
  299. package/lib/views/transcript-search.js +46 -11
  300. package/lib/views/transcript-search.js.map +1 -1
  301. package/lib/views/transcript-types.d.ts +63 -5
  302. package/lib/views/transcript-types.js +23 -11
  303. package/lib/views/transcript-types.js.map +1 -1
  304. package/package.json +95 -65
  305. package/lib/commands/loop.d.ts +0 -52
  306. package/lib/commands/loop.js +0 -307
  307. package/lib/commands/loop.js.map +0 -1
  308. package/lib/commands/steer.d.ts +0 -5
  309. package/lib/commands/steer.js +0 -24
  310. package/lib/commands/steer.js.map +0 -1
  311. package/lib/runtime/terminal-reader.d.ts +0 -11
  312. package/lib/runtime/terminal-reader.js +0 -87
  313. package/lib/runtime/terminal-reader.js.map +0 -1
  314. package/lib/views/agent-hub.d.ts +0 -32
  315. package/lib/views/agent-hub.js +0 -206
  316. package/lib/views/agent-hub.js.map +0 -1
  317. package/lib/views/copy-selector.d.ts +0 -51
  318. package/lib/views/copy-selector.js +0 -139
  319. package/lib/views/copy-selector.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-recovery-recording.js","sourceRoot":"","sources":["../../src/runtime/file-recovery-recording.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { Agent } from '@deepseek-ai/dsh-agent';
3
+ export declare function reviewFileRecovery(ctx: Context, agent: Agent, sessionId: string, turn: number, upstream: AbortSignal, assertActive: () => void): Promise<void>;
@@ -0,0 +1,130 @@
1
+ /** Human-only recovery review; uses existing list and document surfaces. */
2
+ import { cancellable } from "./cancellable.js";
3
+ import { fileDocument, codeDocument } from "./file-review.js";
4
+ function pathLabel(path) { return /[\u0000-\u001f\u007f]/u.test(path) ? JSON.stringify(path) : path; }
5
+ function reportText(report) {
6
+ return `### ${report.id}${report.completedAt === undefined ? ' · Completion unconfirmed' : ''}\n\n`
7
+ + report.entries.map(entry => `${pathLabel(entry.path)} · ${entry.status}${entry.reason === undefined ? '' : '\n' + entry.reason}`
8
+ + (entry.backup === '' ? '' : `\nReserved backup path: ${pathLabel(entry.backup)} (present only if a file was displaced; inspect if completion is unconfirmed)`)).join('\n\n')
9
+ + `\n\nDirectory: ${JSON.stringify(report.root)}`;
10
+ }
11
+ async function preview(ctx, operation, signal) {
12
+ const provider = ctx.get('omdshFileRecovery');
13
+ const side = async (state) => {
14
+ if (state.kind === 'missing')
15
+ return 'Absent';
16
+ if (state.kind === 'link')
17
+ return 'Symbolic link → ' + JSON.stringify(Buffer.from(state.target, 'base64').toString('utf8'));
18
+ const source = await fileDocument(provider.store.blobPath(state.hash), signal, 128 * 1024, operation.path);
19
+ return source.binary ? `Binary · ${state.size} bytes · ${state.hash}` : codeDocument(source.text, source.language ?? '')
20
+ + (source.truncated ? '\n\nPreview truncated; complete bytes are retained.' : '');
21
+ };
22
+ return `## ${pathLabel(operation.path)}\n\n### Before Turn\n\n${await side(operation.before)}\n\n### After Turn\n\n${await side(operation.after)}`;
23
+ }
24
+ export async function reviewFileRecovery(ctx, agent, sessionId, turn, upstream, assertActive) {
25
+ const provider = ctx.get('omdshFileRecovery');
26
+ if (provider === undefined) {
27
+ ctx.tui.notice('File recovery is not available in this profile.');
28
+ return;
29
+ }
30
+ const record = await provider.checkpoint(sessionId, turn);
31
+ if (record?.status !== 'ready' || record.before === undefined || record.after === undefined) {
32
+ ctx.tui.notice(record?.error ?? (record?.status === 'capturing' ? 'Checkpoint completion is unconfirmed. No files will be restored.'
33
+ : 'No complete snapshot for this Turn. Enable File recovery snapshots in Settings → Tools before starting new Turns.'));
34
+ return;
35
+ }
36
+ const before = record.before, after = record.after;
37
+ const plan = await provider.store.plan(before, after, upstream);
38
+ const ready = plan.operations.filter(operation => operation.status === 'ready');
39
+ const protectedPaths = plan.operations.filter(operation => operation.status === 'conflict');
40
+ let history = '';
41
+ try {
42
+ history = (await provider.savedReports(before, after, upstream)).map(reportText).join('\n\n');
43
+ }
44
+ catch (error) {
45
+ ctx.tui.notice('Saved recovery reports could not be read: ' + (error instanceof Error ? error.message : String(error)), { level: 'error' });
46
+ }
47
+ if (ready.length === 0) {
48
+ // A result, not a surface: nothing here needs an answer.
49
+ ctx.tui.commandOutput('File recovery', 'No files can be restored\n\n'
50
+ + (protectedPaths.length === 0 ? 'Files are unchanged or already match the original snapshot.'
51
+ : protectedPaths.map(operation => `${pathLabel(operation.path)} · ${operation.reason}`).join('\n'))
52
+ + (history === '' ? '' : '\n\n## Saved reports\n\n' + history));
53
+ return;
54
+ }
55
+ const options = ready.map((operation, index) => ({ label: pathLabel(operation.path), value: 'file-' + index,
56
+ description: operation.before.kind === 'missing' ? 'Remove created file' : operation.after.kind === 'missing' ? 'Recreate deleted file' : 'Restore original contents and mode' }));
57
+ assertActive();
58
+ let answer;
59
+ for (;;) {
60
+ answer = await ctx.tui.prompt({ title: `Restore Turn ${turn} files`, question: plan.root, presentation: 'card',
61
+ options, multiSelect: true, initialValues: options.map(option => option.value), allowCustom: false, filterable: true, notify: false,
62
+ detail: `${protectedPaths.length} conflicts will be preserved. Select files; Enter reviews the restoration.`,
63
+ actions: history === '' ? [] : [{ key: 'Alt+H', label: 'saved reports', valuePrefix: 'reports:', scope: 'list' }], signal: upstream, onSuperseded: () => { } });
64
+ if (answer !== 'reports:')
65
+ break;
66
+ ctx.tui.commandOutput('Saved recovery reports', history);
67
+ assertActive();
68
+ upstream.throwIfAborted();
69
+ }
70
+ if (answer === null || answer === '')
71
+ return;
72
+ const values = answer.split(', ').map(value => options.findIndex(option => option.value === value));
73
+ if (values.some(index => index < 0))
74
+ throw new Error('The file recovery selection is no longer valid.');
75
+ const paths = [...new Set(values.map(index => ready[index].path))];
76
+ let index = 0;
77
+ for (;;) {
78
+ assertActive();
79
+ upstream.throwIfAborted();
80
+ const selected = ready.find(operation => operation.path === paths[index]);
81
+ // The preview is the detail of a choice, so it belongs on the card that offers
82
+ // the choice rather than on a page of its own.
83
+ const action = await ctx.tui.prompt({ title: 'File snapshots', question: `${index + 1}/${paths.length} · ${pathLabel(selected.path)}`,
84
+ detail: await preview(ctx, selected, upstream),
85
+ options: [...(index > 0 ? [{ label: 'Previous', value: 'previous' }] : []), ...(index + 1 < paths.length ? [{ label: 'Next', value: 'next' }] : []),
86
+ { label: 'Review restoration', value: 'review' }, { label: 'Cancel', value: 'cancel' }],
87
+ allowCustom: false, notify: false, signal: upstream, onSuperseded: () => { } });
88
+ if (action === null || action === 'cancel')
89
+ return;
90
+ if (action === 'previous') {
91
+ index = Math.max(0, index - 1);
92
+ continue;
93
+ }
94
+ if (action === 'next') {
95
+ index = Math.min(paths.length - 1, index + 1);
96
+ continue;
97
+ }
98
+ if (action === 'review')
99
+ break;
100
+ }
101
+ assertActive();
102
+ upstream.throwIfAborted();
103
+ const confirmed = await ctx.tui.prompt({ title: 'Confirm file recovery', question: `Restore ${paths.length} files from before Turn ${turn}?`,
104
+ detail: `Directory: ${JSON.stringify(plan.root)}\n\n${paths.map(pathLabel).join('\n')}\n\nFiles changed after the retained snapshot are skipped. The snapshot may include changes from other processes during the Turn. Messages and the Git index stay unchanged. Displaced files are retained as backups in this directory.`,
105
+ options: [{ label: 'Cancel', value: 'cancel' }, { label: 'Restore selected files', value: 'restore' }], initialValue: 'cancel',
106
+ allowCustom: false, notify: false, signal: upstream, onSuperseded: () => { } });
107
+ if (confirmed !== 'restore')
108
+ return;
109
+ assertActive();
110
+ upstream.throwIfAborted();
111
+ const outcome = await cancellable(ctx.tui, {
112
+ title: 'Restoring files',
113
+ question: `${paths.length} selected files`,
114
+ detail: 'Cancellation may leave a partial restoration. Completed operations and backups are retained in the report.',
115
+ // Bound before the closure: the `ready` check narrowed these above, and that
116
+ // narrowing does not survive into a callback.
117
+ surface: true,
118
+ }, upstream, work => provider.restore(agent, before, after, paths, work));
119
+ assertActive();
120
+ // A superseded restore had its surface taken away, so its partial receipt is
121
+ // not shown: nobody is looking. A reader who cancelled directly still gets the
122
+ // report, because they chose to stop mid-way and need to know what was written.
123
+ if (outcome === undefined || outcome.reason === 'superseded' || upstream.aborted)
124
+ return;
125
+ const report = outcome.value;
126
+ const restored = report.entries.filter(entry => entry.status === 'restored').length;
127
+ ctx.tui.notice(`File recovery: ${restored} restored · ${report.entries.length - restored} skipped or incomplete. Report: ${report.id}`);
128
+ ctx.tui.commandOutput('File recovery report', reportText(report));
129
+ }
130
+ //# sourceMappingURL=file-recovery-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-recovery-review.js","sourceRoot":"","sources":["../../src/runtime/file-recovery-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ export interface RecoveryLimits {
2
+ maxFiles: number;
3
+ maxFileBytes: number;
4
+ maxSnapshotBytes: number;
5
+ }
6
+ export declare const RECOVERY_LIMITS: Readonly<RecoveryLimits>;
7
+ export type RecoveryState = {
8
+ kind: 'missing';
9
+ } | {
10
+ kind: 'file';
11
+ hash: string;
12
+ size: number;
13
+ mode: number;
14
+ revision: string;
15
+ identity: string;
16
+ } | {
17
+ kind: 'link';
18
+ target: string;
19
+ revision: string;
20
+ identity: string;
21
+ };
22
+ export interface RecoveryEntry {
23
+ path: string;
24
+ state: RecoveryState;
25
+ }
26
+ export interface RecoveryInventory {
27
+ paths: readonly string[];
28
+ excluded: readonly string[];
29
+ protected?: readonly string[];
30
+ }
31
+ export interface RecoverySnapshot {
32
+ version: 1;
33
+ id: string;
34
+ root: string;
35
+ rootIdentity: string;
36
+ platform: NodeJS.Platform;
37
+ createdAt: number;
38
+ entries: RecoveryEntry[];
39
+ excluded: string[];
40
+ protected: string[];
41
+ }
42
+ export interface RecoveryOperation {
43
+ path: string;
44
+ before: RecoveryState;
45
+ after: RecoveryState;
46
+ status: 'ready' | 'conflict' | 'already-restored';
47
+ reason?: string;
48
+ }
49
+ export interface RecoveryPlan {
50
+ root: string;
51
+ rootIdentity: string;
52
+ before: string;
53
+ after: string;
54
+ operations: RecoveryOperation[];
55
+ }
56
+ export declare function recoveryRootIdentity(root: string): Promise<string>;
57
+ export declare const sameRecoveryContent: (left: RecoveryState, right: RecoveryState) => boolean;
58
+ export declare const sameRecoveryVersion: (left: RecoveryState, right: RecoveryState) => boolean;
59
+ export declare function recoveryRelativePath(path: string): string;
60
+ /** Refuse directory links so a path cannot silently leave the captured workspace. */
61
+ export declare function recoveryHostPath(root: string, path: string): Promise<string>;
62
+ /** Read a stable entry without following its final symbolic link. */
63
+ export declare function recoveryState(root: string, path: string, maxBytes: number, signal: AbortSignal): Promise<{
64
+ state: RecoveryState;
65
+ bytes?: Buffer;
66
+ }>;
67
+ /** Local-provider probe for an already bounded host path, including retained backups. */
68
+ export declare function recoveryHostState(host: string, maxBytes: number, signal: AbortSignal): Promise<{
69
+ state: RecoveryState;
70
+ bytes?: Buffer;
71
+ }>;
72
+ /** All-or-nothing snapshots; incomplete captures never publish a manifest. */
73
+ export declare class FileRecoveryStore {
74
+ readonly directory: string;
75
+ readonly limits: Readonly<RecoveryLimits>;
76
+ constructor(directory: string, limits?: RecoveryLimits);
77
+ private checkLocation;
78
+ capture(workspace: string, inventory: () => Promise<RecoveryInventory>, signal: AbortSignal): Promise<RecoverySnapshot>;
79
+ blobPath(hash: string): string;
80
+ private snapshotPath;
81
+ read(id: string): Promise<RecoverySnapshot>;
82
+ plan(beforeId: string, afterId: string, signal: AbortSignal): Promise<RecoveryPlan>;
83
+ }
@@ -0,0 +1,329 @@
1
+ /** Durable byte snapshots and conservative recovery plans; no host mutations. */
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { constants } from 'node:fs';
4
+ import { link, lstat, mkdir, open, readFile, readlink, realpath, rm } from 'node:fs/promises';
5
+ import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
6
+ export const RECOVERY_LIMITS = { maxFiles: 10_000, maxFileBytes: 128 * 1024 * 1024, maxSnapshotBytes: 1024 * 1024 * 1024 };
7
+ const missing = { kind: 'missing' };
8
+ const digest = (bytes) => createHash('sha256').update(bytes).digest('hex');
9
+ async function canonicalFuturePath(path) {
10
+ const parts = [];
11
+ let current = resolve(path);
12
+ for (;;) {
13
+ try {
14
+ return join(await realpath(current), ...parts.reverse());
15
+ }
16
+ catch (error) {
17
+ if (error.code !== 'ENOENT')
18
+ throw error;
19
+ const parent = dirname(current);
20
+ if (parent === current)
21
+ throw error;
22
+ parts.push(current.slice(parent.length + (parent.endsWith(sep) ? 0 : 1)));
23
+ current = parent;
24
+ }
25
+ }
26
+ }
27
+ export async function recoveryRootIdentity(root) {
28
+ const stat = await lstat(root, { bigint: true });
29
+ if (!stat.isDirectory() || stat.isSymbolicLink())
30
+ throw new Error('The recovery workspace is not an ordinary directory.');
31
+ return digest([stat.dev, stat.ino, stat.birthtimeNs].join(':'));
32
+ }
33
+ const stateContent = (state) => state.kind === 'file' ? `file:${state.hash}:${state.mode}`
34
+ : state.kind === 'link' ? `link:${state.target}` : 'missing';
35
+ export const sameRecoveryContent = (left, right) => stateContent(left) === stateContent(right);
36
+ export const sameRecoveryVersion = (left, right) => sameRecoveryContent(left, right)
37
+ // Windows reports creation time in `ctime`; use the revision without it so a
38
+ // byte-identical rewrite still conflicts while capture noise does not.
39
+ && (process.platform === 'win32'
40
+ ? left.kind === 'missing' || right.kind === 'missing' || left.identity === right.identity
41
+ : left.kind === 'missing' || right.kind === 'missing' || left.revision === right.revision);
42
+ export function recoveryRelativePath(path) {
43
+ if (path === '' || isAbsolute(path) || path.includes('\0') || path.includes('\uFFFD')
44
+ || (process.platform !== 'win32' && path.includes('\\')))
45
+ throw new Error('Recovery requires an unambiguous workspace-relative path.');
46
+ const parts = path.replaceAll('\\', '/').split('/');
47
+ if (parts.some(part => part === '' || part === '.' || part === '..' || part.toLowerCase() === '.git' || part.startsWith('.omdsh-recovery-')))
48
+ throw new Error('Recovery cannot include metadata, backup paths or parent traversal.');
49
+ return parts.join('/');
50
+ }
51
+ function exclusionPath(path) {
52
+ return recoveryRelativePath(path.endsWith('/') ? path.slice(0, -1) : path) + (path.endsWith('/') ? '/' : '');
53
+ }
54
+ /** Refuse directory links so a path cannot silently leave the captured workspace. */
55
+ export async function recoveryHostPath(root, path) {
56
+ const parts = recoveryRelativePath(path).split('/');
57
+ let current = root;
58
+ for (const part of parts.slice(0, -1)) {
59
+ current = join(current, part);
60
+ try {
61
+ const stat = await lstat(current);
62
+ if (!stat.isDirectory() || stat.isSymbolicLink())
63
+ throw new Error('A recovery parent is not an ordinary directory.');
64
+ }
65
+ catch (error) {
66
+ if (error.code === 'ENOENT')
67
+ break;
68
+ throw error;
69
+ }
70
+ }
71
+ return join(root, ...parts);
72
+ }
73
+ /** Read a stable entry without following its final symbolic link. */
74
+ export async function recoveryState(root, path, maxBytes, signal) {
75
+ return recoveryHostState(await recoveryHostPath(root, path), maxBytes, signal);
76
+ }
77
+ /** Local-provider probe for an already bounded host path, including retained backups. */
78
+ export async function recoveryHostState(host, maxBytes, signal) {
79
+ signal.throwIfAborted();
80
+ const first = await lstat(host, { bigint: true }).catch(error => {
81
+ if (error.code === 'ENOENT')
82
+ return undefined;
83
+ throw error;
84
+ });
85
+ if (first === undefined)
86
+ return { state: missing };
87
+ const revision = (stat) => digest([stat.dev, stat.ino, stat.size, stat.mode, stat.mtimeNs, stat.ctimeNs].join(':'));
88
+ const token = revision(first);
89
+ // Rename changes ctime. This second token still detects writes, replacement,
90
+ // size/mode changes and timestamp changes after an entry has been claimed.
91
+ const identity = digest([first.dev, first.ino, first.size, first.mode, first.mtimeNs].join(':'));
92
+ if (first.isSymbolicLink()) {
93
+ if (process.platform === 'win32')
94
+ throw new Error('Windows reparse points require dedicated recovery support; this snapshot was not captured.');
95
+ const target = await readlink(host, { encoding: 'buffer' });
96
+ if (revision(await lstat(host, { bigint: true })) !== token)
97
+ throw new Error('A link changed while its snapshot was being read.');
98
+ return { state: { kind: 'link', target: target.toString('base64'), revision: token, identity } };
99
+ }
100
+ if (!first.isFile() || first.nlink > 1n)
101
+ throw new Error('Recovery snapshots require regular files or symbolic links; hard links and special files are unsupported.');
102
+ if ((first.mode & 3584n) !== 0n)
103
+ throw new Error('Files with special permission bits require metadata recovery support; this snapshot was not captured.');
104
+ if (first.size > BigInt(maxBytes))
105
+ throw new Error('A file exceeds the recovery snapshot limit.');
106
+ const handle = await open(host, constants.O_RDONLY | (process.platform === 'win32' ? 0 : constants.O_NOFOLLOW));
107
+ try {
108
+ if (revision(await handle.stat({ bigint: true })) !== token)
109
+ throw new Error('A file changed before its snapshot could be opened.');
110
+ const bytes = Buffer.alloc(Number(first.size));
111
+ let at = 0;
112
+ while (at < bytes.length) {
113
+ signal.throwIfAborted();
114
+ const read = await handle.read(bytes, at, Math.min(64 * 1024, bytes.length - at), at);
115
+ if (read.bytesRead === 0)
116
+ throw new Error('A file was shortened during snapshot capture.');
117
+ at += read.bytesRead;
118
+ }
119
+ if (revision(await handle.stat({ bigint: true })) !== token || revision(await lstat(host, { bigint: true })) !== token)
120
+ throw new Error('A file changed while its snapshot was being read.');
121
+ return { state: { kind: 'file', hash: digest(bytes), size: bytes.length, mode: Number(first.mode & 511n), revision: token, identity }, bytes };
122
+ }
123
+ finally {
124
+ await handle.close();
125
+ }
126
+ }
127
+ /** Publish a complete private record without replacing any existing identity. */
128
+ async function publish(path, bytes) {
129
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
130
+ const temp = path + '.' + randomUUID() + '.tmp';
131
+ const handle = await open(temp, 'wx', 0o600);
132
+ try {
133
+ await handle.writeFile(bytes);
134
+ await handle.sync();
135
+ await handle.close();
136
+ await link(temp, path);
137
+ }
138
+ finally {
139
+ try {
140
+ await handle.close();
141
+ }
142
+ finally {
143
+ await rm(temp, { force: true });
144
+ }
145
+ }
146
+ }
147
+ /** All-or-nothing snapshots; incomplete captures never publish a manifest. */
148
+ export class FileRecoveryStore {
149
+ directory;
150
+ limits;
151
+ constructor(directory, limits = RECOVERY_LIMITS) {
152
+ this.directory = resolve(directory);
153
+ for (const value of Object.values(limits))
154
+ if (!Number.isSafeInteger(value) || value <= 0)
155
+ throw new Error('Recovery limits must be positive safe integers.');
156
+ if (limits.maxFiles > 10_000)
157
+ throw new Error('Recovery manifests support at most 10,000 files.');
158
+ this.limits = { ...limits };
159
+ }
160
+ async checkLocation(root) {
161
+ const inside = relative(root, await canonicalFuturePath(this.directory));
162
+ if (inside === '' || (!isAbsolute(inside) && inside !== '..' && !inside.startsWith('..' + sep)))
163
+ throw new Error('Recovery storage must be outside the workspace.');
164
+ }
165
+ async capture(workspace, inventory, signal) {
166
+ const root = await realpath(workspace);
167
+ const rootIdentity = await recoveryRootIdentity(root);
168
+ await this.checkLocation(root);
169
+ const initial = await inventory();
170
+ const paths = [...new Set(initial.paths.map(recoveryRelativePath))].sort();
171
+ const excluded = [...new Set(initial.excluded.map(exclusionPath))].sort();
172
+ const protectedPaths = [...new Set((initial.protected ?? []).map(exclusionPath))].sort();
173
+ if (excluded.length > this.limits.maxFiles)
174
+ throw new Error('The workspace exceeds the recovery exclusion limit.');
175
+ if (protectedPaths.length > this.limits.maxFiles)
176
+ throw new Error('The workspace exceeds the recovery boundary limit.');
177
+ if (paths.length > this.limits.maxFiles)
178
+ throw new Error('The workspace exceeds the recovery file limit.');
179
+ const entries = [];
180
+ let total = 0;
181
+ for (const path of paths) {
182
+ const { state, bytes } = await recoveryState(root, path, this.limits.maxFileBytes, signal);
183
+ if (bytes !== undefined) {
184
+ total += bytes.length;
185
+ if (total > this.limits.maxSnapshotBytes)
186
+ throw new Error('The workspace exceeds the recovery byte limit.');
187
+ const blob = this.blobPath(state.hash);
188
+ try {
189
+ await publish(blob, bytes);
190
+ }
191
+ catch (error) {
192
+ if (error.code !== 'EEXIST')
193
+ throw error;
194
+ if (digest(await readFile(blob)) !== digest(bytes))
195
+ throw new Error('Stored recovery content failed its checksum.');
196
+ }
197
+ }
198
+ entries.push({ path, state });
199
+ }
200
+ // Recheck the inventory and freshness after the scan. Concurrent changes
201
+ // invalidate the whole capture instead of publishing a mixed file set.
202
+ const final = await inventory(), endPaths = [...new Set(final.paths.map(recoveryRelativePath))].sort();
203
+ const endExcluded = [...new Set(final.excluded.map(exclusionPath))].sort();
204
+ const endProtected = [...new Set((final.protected ?? []).map(exclusionPath))].sort();
205
+ if (JSON.stringify(paths) !== JSON.stringify(endPaths) || JSON.stringify(excluded) !== JSON.stringify(endExcluded)
206
+ || JSON.stringify(protectedPaths) !== JSON.stringify(endProtected))
207
+ throw new Error('The workspace file set changed during snapshot capture.');
208
+ for (const entry of entries) {
209
+ const now = await recoveryState(root, entry.path, this.limits.maxFileBytes, signal);
210
+ if (!sameRecoveryVersion(entry.state, now.state))
211
+ throw new Error('A file changed during snapshot capture.');
212
+ }
213
+ signal.throwIfAborted();
214
+ if (await recoveryRootIdentity(root) !== rootIdentity)
215
+ throw new Error('The recovery workspace was replaced during snapshot capture.');
216
+ const snapshot = { version: 1, id: 'snapshot-' + randomUUID(), root, rootIdentity, platform: process.platform, createdAt: Date.now(), entries, excluded, protected: protectedPaths };
217
+ const text = JSON.stringify(snapshot);
218
+ if (Buffer.byteLength(text) > 8 * 1024 * 1024 - 256)
219
+ throw new Error('The recovery manifest exceeds its storage limit.');
220
+ await publish(this.snapshotPath(snapshot.id), Buffer.from(JSON.stringify({ checksum: digest(text), snapshot }) + '\n'));
221
+ return snapshot;
222
+ }
223
+ blobPath(hash) {
224
+ if (!/^[a-f0-9]{64}$/u.test(hash))
225
+ throw new Error('Invalid recovery content identity.');
226
+ return join(this.directory, 'blobs', hash);
227
+ }
228
+ snapshotPath(id) {
229
+ if (!/^snapshot-[a-f0-9-]{36}$/u.test(id))
230
+ throw new Error('Invalid recovery snapshot identity.');
231
+ return join(this.directory, 'snapshots', id + '.json');
232
+ }
233
+ async read(id) {
234
+ const path = this.snapshotPath(id), stat = await lstat(path);
235
+ if (!stat.isFile() || stat.size > 8 * 1024 * 1024)
236
+ throw new Error('Recovery manifest must be a bounded regular file.');
237
+ const value = JSON.parse(await readFile(path, 'utf8'));
238
+ if (value === null || typeof value !== 'object')
239
+ throw new Error('Invalid recovery manifest.');
240
+ const { checksum, snapshot } = value;
241
+ if (typeof checksum !== 'string' || checksum !== digest(JSON.stringify(snapshot)) || !validSnapshot(snapshot) || snapshot.id !== id)
242
+ throw new Error('Recovery manifest failed validation.');
243
+ return snapshot;
244
+ }
245
+ async plan(beforeId, afterId, signal) {
246
+ const before = await this.read(beforeId), after = await this.read(afterId);
247
+ await this.checkLocation(before.root);
248
+ if (before.root !== after.root || before.rootIdentity !== after.rootIdentity || before.platform !== process.platform || after.platform !== process.platform)
249
+ throw new Error('Recovery snapshots belong to another workspace or platform.');
250
+ if (await realpath(before.root) !== before.root)
251
+ throw new Error('The original recovery workspace no longer resolves to its captured directory.');
252
+ if (await recoveryRootIdentity(before.root) !== before.rootIdentity)
253
+ throw new Error('The original recovery workspace was replaced.');
254
+ const old = new Map(before.entries.map(entry => [entry.path, entry.state])), last = new Map(after.entries.map(entry => [entry.path, entry.state]));
255
+ const operations = [];
256
+ for (const path of [...new Set([...old.keys(), ...last.keys()])].sort()) {
257
+ const start = old.get(path) ?? missing, end = last.get(path) ?? missing;
258
+ if (sameRecoveryContent(start, end))
259
+ continue;
260
+ if ([...before.protected, ...after.protected].some(item => item.endsWith('/') ? path.startsWith(item) : path === item)) {
261
+ operations.push({ path, before: start, after: end, status: 'conflict', reason: 'This path belongs to a protected snapshot boundary.' });
262
+ continue;
263
+ }
264
+ if (!old.has(path) && before.excluded.some(item => item.endsWith('/') ? path.startsWith(item) : path === item)) {
265
+ operations.push({ path, before: start, after: end, status: 'conflict', reason: 'This path was outside the captured scope at Turn start; its original content is unknown.' });
266
+ continue;
267
+ }
268
+ try {
269
+ const now = (await recoveryState(before.root, path, this.limits.maxFileBytes, signal)).state;
270
+ const status = sameRecoveryContent(now, start) ? 'already-restored' : sameRecoveryVersion(now, end) ? 'ready' : 'conflict';
271
+ operations.push({ path, before: start, after: end, status, ...(status === 'conflict' ? { reason: 'Changed since the retained post-Turn snapshot.' } : {}) });
272
+ }
273
+ catch (error) {
274
+ signal.throwIfAborted();
275
+ operations.push({ path, before: start, after: end, status: 'conflict', reason: error instanceof Error ? error.message : String(error) });
276
+ }
277
+ }
278
+ return { root: before.root, rootIdentity: before.rootIdentity, before: before.id, after: after.id, operations };
279
+ }
280
+ }
281
+ function validSnapshot(value) {
282
+ if (value === null || typeof value !== 'object')
283
+ return false;
284
+ const record = value;
285
+ if (record.version !== 1 || typeof record.id !== 'string' || typeof record.root !== 'string' || !isAbsolute(record.root)
286
+ || typeof record.rootIdentity !== 'string' || !/^[a-f0-9]{64}$/u.test(record.rootIdentity)
287
+ || typeof record.platform !== 'string' || !Number.isSafeInteger(record.createdAt) || !Array.isArray(record.entries) || record.entries.length > 10_000
288
+ || !Array.isArray(record.excluded) || record.excluded.length > 10_000 || !Array.isArray(record.protected) || record.protected.length > 10_000)
289
+ return false;
290
+ for (const path of [...record.excluded, ...record.protected]) {
291
+ try {
292
+ if (typeof path !== 'string' || exclusionPath(path) !== path)
293
+ return false;
294
+ }
295
+ catch {
296
+ return false;
297
+ }
298
+ }
299
+ const seen = new Set();
300
+ for (const entry of record.entries) {
301
+ if (entry === null || typeof entry !== 'object' || typeof entry.path !== 'string' || entry.state === null || typeof entry.state !== 'object')
302
+ return false;
303
+ try {
304
+ if (recoveryRelativePath(entry.path) !== entry.path || seen.has(entry.path))
305
+ return false;
306
+ }
307
+ catch {
308
+ return false;
309
+ }
310
+ seen.add(entry.path);
311
+ const state = entry.state;
312
+ if (state.kind === 'missing')
313
+ continue;
314
+ if (typeof state.revision !== 'string' || !/^[a-f0-9]{64}$/u.test(state.revision))
315
+ return false;
316
+ if (typeof state.identity !== 'string' || !/^[a-f0-9]{64}$/u.test(state.identity))
317
+ return false;
318
+ if (state.kind === 'link') {
319
+ if (typeof state.target !== 'string' || Buffer.from(state.target, 'base64').toString('base64') !== state.target)
320
+ return false;
321
+ continue;
322
+ }
323
+ if (state.kind !== 'file' || !/^[a-f0-9]{64}$/u.test(state.hash) || !Number.isSafeInteger(state.size) || state.size < 0
324
+ || !Number.isSafeInteger(state.mode) || state.mode < 0 || state.mode > 0o777)
325
+ return false;
326
+ }
327
+ return true;
328
+ }
329
+ //# sourceMappingURL=file-recovery-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-recovery-store.js","sourceRoot":"","sources":["../../src/runtime/file-recovery-store.ts"],"names":[],"mappings":"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"}