@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":"composer-shell.js","sourceRoot":"","sources":["../../src/runtime/composer-shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /** Local host recovery provider over public filesystem, process and sandbox seams. */
2
+ import { Context, Service, type Volatile } from '@deepseek-ai/cordis';
3
+ import z from '@deepseek-ai/schemastery';
4
+ import type { Agent } from '@deepseek-ai/dsh-agent';
5
+ import { type ContextFormed } from '@deepseek-ai/dsh-llm';
6
+ import { FileRecoveryStore, type RecoverySnapshot } from './file-recovery-store.ts';
7
+ import type { RecoveryWorkerResult } from './file-recovery-worker.ts';
8
+ import { type TurnRecoveryRecord } from './file-recovery-recording.ts';
9
+ export interface Config {
10
+ stateDir?: string;
11
+ enabled: Volatile<boolean>;
12
+ }
13
+ export interface RecoveryReceiptEntry {
14
+ path: string;
15
+ operationId: string;
16
+ backup: string;
17
+ status: RecoveryWorkerResult['status'] | 'planned' | 'uncertain' | 'cancelled';
18
+ reason?: string;
19
+ }
20
+ export interface RecoveryReceipt {
21
+ version: 1;
22
+ id: string;
23
+ sessionId: string;
24
+ root: string;
25
+ before: string;
26
+ after: string;
27
+ startedAt: number;
28
+ completedAt?: number;
29
+ entries: RecoveryReceiptEntry[];
30
+ }
31
+ declare module '@deepseek-ai/cordis' {
32
+ interface Context {
33
+ omdshFileRecovery: LocalFileRecovery;
34
+ }
35
+ }
36
+ declare module '@deepseek-ai/dsh-llm' {
37
+ interface MessageSourceMap {
38
+ 'omdsh-file-recovery': {
39
+ kind: 'omdsh-file-recovery';
40
+ } & ContextFormed;
41
+ }
42
+ }
43
+ export declare class LocalFileRecovery extends Service {
44
+ static inject: string[];
45
+ static Config: z<Schemastery.ObjectS<NoInfer<{
46
+ stateDir: z<string, string, "plain">;
47
+ enabled: z<boolean, boolean, "volatile-defined">;
48
+ }>>, Schemastery.ObjectT<NoInfer<{
49
+ stateDir: z<string, string, "plain">;
50
+ enabled: z<boolean, boolean, "volatile-defined">;
51
+ }>>, "plain">;
52
+ readonly store: FileRecoveryStore;
53
+ get enabled(): boolean;
54
+ private readonly recoveryConfig;
55
+ private readonly recording;
56
+ private readonly ownerContext;
57
+ private readonly closing;
58
+ private readonly tasks;
59
+ private readonly ownerLifetimes;
60
+ constructor(ctx: Context, config: Config);
61
+ checkpoint(sessionId: string, turn: number): Promise<TurnRecoveryRecord | undefined>;
62
+ private track;
63
+ private ownerSignal;
64
+ private rootOf;
65
+ private git;
66
+ private inventory;
67
+ capture(agent: Agent, retainedPaths: readonly string[], upstream: AbortSignal): Promise<RecoverySnapshot>;
68
+ restore(agent: Agent, before: string, after: string, paths: readonly string[], upstream: AbortSignal): Promise<RecoveryReceipt>;
69
+ private saveReceipt;
70
+ readReceipt(id: string): Promise<RecoveryReceipt>;
71
+ savedReports(before: string, after: string, signal: AbortSignal): Promise<RecoveryReceipt[]>;
72
+ }
73
+ export default LocalFileRecovery;
@@ -0,0 +1,351 @@
1
+ /** Local host recovery provider over public filesystem, process and sandbox seams. */
2
+ import { Service } from '@deepseek-ai/cordis';
3
+ import z from '@deepseek-ai/schemastery';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { lstat, mkdir, open, readFile, readdir, realpath, rename, rm } from 'node:fs/promises';
6
+ import { dirname, isAbsolute, join } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { homedir } from 'node:os';
9
+ import { createUserMessage } from '@deepseek-ai/dsh-llm';
10
+ import { SubprocessExecutableNotFoundError } from '@deepseek-ai/dsh-subprocess';
11
+ import { FileRecoveryStore, recoveryRelativePath } from "./file-recovery-store.js";
12
+ import { currentWorkingDirectory } from "../session/working-directory.js";
13
+ import { TurnRecoveryRecording } from "./file-recovery-recording.js";
14
+ const isReserved = (path) => path.split('/').some(part => part.toLowerCase() === '.git' || part.startsWith('.omdsh-recovery-'));
15
+ export class LocalFileRecovery extends Service {
16
+ static inject = ['agents', 'fs', 'subprocess', 'sandbox', 'sandboxPolicy'];
17
+ static Config = z.object({ stateDir: z.string().hidden(), enabled: z.boolean().default(false).description('Keep private file snapshots for new Turns; uses disk space and adds capture work.').volatile() });
18
+ store;
19
+ get enabled() { return this.recoveryConfig.enabled.get(); }
20
+ recoveryConfig;
21
+ recording;
22
+ ownerContext;
23
+ closing = new AbortController();
24
+ tasks = new Set();
25
+ ownerLifetimes = new WeakMap();
26
+ constructor(ctx, config) {
27
+ super(ctx, 'omdshFileRecovery');
28
+ if (config.stateDir !== undefined && (typeof config.stateDir !== 'string' || config.stateDir.trim() === ''))
29
+ throw new Error('File recovery requires a private state directory.');
30
+ this.ownerContext = ctx;
31
+ this.store = new FileRecoveryStore(config.stateDir ?? join(process.env.OMDSH_HOME || process.env.DSH_HOME || join(homedir(), '.dsh'), 'omdsh/file-recovery'));
32
+ this.recoveryConfig = config;
33
+ ctx.on('agent/disposed', ({ agent }) => { this.ownerLifetimes.get(agent)?.abort(new Error('The file recovery owner was closed.')); });
34
+ ctx.effect(() => async () => { this.closing.abort(new Error('File recovery unloaded.')); await Promise.allSettled(this.tasks); });
35
+ this.recording = new TurnRecoveryRecording(ctx, this);
36
+ }
37
+ checkpoint(sessionId, turn) { return this.recording.get(sessionId, turn); }
38
+ track(signal, operation) {
39
+ const fused = AbortSignal.any([signal, this.closing.signal]);
40
+ const task = Promise.resolve().then(() => { fused.throwIfAborted(); return operation(fused); }).finally(() => { this.tasks.delete(task); });
41
+ this.tasks.add(task);
42
+ return task;
43
+ }
44
+ ownerSignal(agent, upstream) {
45
+ let lifetime = this.ownerLifetimes.get(agent);
46
+ if (lifetime === undefined) {
47
+ lifetime = new AbortController();
48
+ this.ownerLifetimes.set(agent, lifetime);
49
+ }
50
+ return AbortSignal.any([upstream, lifetime.signal]);
51
+ }
52
+ async rootOf(agent, signal, capturedRoot) {
53
+ const ctx = this.ownerContext;
54
+ if (ctx.get('agents').get(agent.id) !== agent)
55
+ throw new Error('File recovery requires the exact live session owner.');
56
+ const cwd = capturedRoot ?? currentWorkingDirectory(ctx, agent.session);
57
+ const target = await ctx.get('fs').resolve(cwd, { signal });
58
+ const path = ctx.get('fs').processPath(target), host = ctx.get('fs').processPathFromHostPath(cwd);
59
+ const platform = (await ctx.get('subprocess').terminalEnvironment(signal)).platform;
60
+ if (host === undefined || platform !== (process.platform === 'win32' ? 'windows' : 'posix'))
61
+ throw new Error('This file recovery provider requires a local execution world.');
62
+ const root = await realpath(cwd);
63
+ if (await realpath(path) !== root || await realpath(host) !== root)
64
+ throw new Error('The filesystem and recovery workspace do not share one local execution world.');
65
+ return root;
66
+ }
67
+ async git(root, args, signal) {
68
+ const provider = this.ownerContext.get('subprocess'), executable = await provider.resolveExecutable('git', undefined, signal);
69
+ const handle = provider.spawn({ argv: [executable, '-C', root, ...args], cwd: root, graceMs: 500, signal,
70
+ stdio: { stdin: 'ignore', stdout: { maxBytes: 2 * 1024 * 1024 }, stderr: { maxBytes: 16 * 1024 } } });
71
+ const outcome = await handle.done;
72
+ const output = handle.collected.stdout.readFrom(0);
73
+ if (output.lossy)
74
+ throw new Error('The Git recovery inventory exceeds its output limit.');
75
+ signal.throwIfAborted();
76
+ return { code: outcome.exitCode, text: output.text };
77
+ }
78
+ async inventory(root, signal) {
79
+ let git = false;
80
+ try {
81
+ git = (await this.git(root, ['rev-parse', '--is-inside-work-tree'], signal)).code === 0;
82
+ }
83
+ catch (error) {
84
+ if (!(error instanceof SubprocessExecutableNotFoundError))
85
+ throw error;
86
+ }
87
+ if (git) {
88
+ const index = await this.git(root, ['ls-files', '--stage', '-z'], signal);
89
+ const others = await this.git(root, ['ls-files', '--others', '--exclude-standard', '-z'], signal);
90
+ const ignored = await this.git(root, ['ls-files', '--others', '--ignored', '--exclude-standard', '--directory', '-z'], signal);
91
+ if (index.code !== 0 || others.code !== 0 || ignored.code !== 0)
92
+ throw new Error('Git could not provide a complete recovery inventory.');
93
+ const paths = [], protectedPaths = [], excluded = ignored.text.split('\0').filter(Boolean).filter(path => !isReserved(path));
94
+ for (const record of index.text.split('\0').filter(Boolean)) {
95
+ const at = record.indexOf('\t');
96
+ if (at < 0)
97
+ throw new Error('Invalid Git recovery inventory.');
98
+ const path = record.slice(at + 1);
99
+ if (isReserved(path))
100
+ continue;
101
+ if (record.startsWith('160000 ')) {
102
+ excluded.push(path + '/');
103
+ protectedPaths.push(path + '/');
104
+ }
105
+ else
106
+ paths.push(path);
107
+ }
108
+ for (const path of others.text.split('\0').filter(Boolean).filter(path => !isReserved(path))) {
109
+ if (path.endsWith('/')) {
110
+ excluded.push(path);
111
+ protectedPaths.push(path);
112
+ }
113
+ else
114
+ paths.push(path);
115
+ }
116
+ return { paths, excluded, protected: protectedPaths };
117
+ }
118
+ const paths = [];
119
+ const walk = async (directory, prefix) => {
120
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
121
+ signal.throwIfAborted();
122
+ const path = prefix + entry.name;
123
+ if (isReserved(path))
124
+ continue;
125
+ recoveryRelativePath(path);
126
+ if (entry.isDirectory())
127
+ await walk(join(directory, entry.name), path + '/');
128
+ else
129
+ paths.push(path);
130
+ if (paths.length > this.store.limits.maxFiles)
131
+ throw new Error('The workspace exceeds the recovery file limit.');
132
+ }
133
+ };
134
+ await walk(root, '');
135
+ return { paths, excluded: [] };
136
+ }
137
+ capture(agent, retainedPaths, upstream) {
138
+ return this.track(this.ownerSignal(agent, upstream), async (signal) => {
139
+ const root = await this.rootOf(agent, signal);
140
+ return this.store.capture(root, async () => {
141
+ const current = await this.inventory(root, signal);
142
+ return { ...current, paths: [...current.paths, ...retainedPaths.filter(path => !(current.protected ?? []).some(prefix => path.startsWith(prefix)))] };
143
+ }, signal);
144
+ });
145
+ }
146
+ restore(agent, before, after, paths, upstream) {
147
+ return this.track(this.ownerSignal(agent, upstream), signal => agent.runMaintenance(async (maintenance) => {
148
+ const fused = AbortSignal.any([signal, maintenance]), plan = await this.store.plan(before, after, fused);
149
+ const root = await this.rootOf(agent, fused, plan.root);
150
+ const liveProtected = (await this.inventory(root, fused)).protected ?? [];
151
+ if (plan.root !== root)
152
+ throw new Error('The checkpoint belongs to another workspace.');
153
+ const unique = new Set(paths.map(recoveryRelativePath));
154
+ if (unique.size === 0 || [...unique].some(path => !plan.operations.some(operation => operation.path === path)))
155
+ throw new Error('Select captured file changes to restore.');
156
+ const receipt = { version: 1, id: 'restore-' + randomUUID(), sessionId: agent.id, root, before, after, startedAt: Date.now(),
157
+ entries: plan.operations.filter(operation => unique.has(operation.path)).map(operation => {
158
+ const operationId = randomUUID(), parent = operation.path.includes('/') ? operation.path.slice(0, operation.path.lastIndexOf('/') + 1) : '';
159
+ return { path: operation.path, operationId, backup: parent + '.omdsh-recovery-' + operationId + '.backup', status: 'planned' };
160
+ }) };
161
+ // Each intent is durable before the worker can mutate a file. A process
162
+ // crash leaves a planned entry whose completion is explicitly unconfirmed.
163
+ await this.saveReceipt(receipt);
164
+ for (const entry of receipt.entries) {
165
+ if (fused.aborted) {
166
+ entry.status = 'cancelled';
167
+ entry.backup = '';
168
+ continue;
169
+ }
170
+ const operation = plan.operations.find(operation => operation.path === entry.path);
171
+ if (liveProtected.some(prefix => entry.path.startsWith(prefix))) {
172
+ entry.status = 'conflict';
173
+ entry.backup = '';
174
+ entry.reason = 'This path is now inside a protected Git submodule.';
175
+ await this.saveReceipt(receipt);
176
+ continue;
177
+ }
178
+ if (operation.status !== 'ready') {
179
+ entry.status = operation.status;
180
+ entry.backup = '';
181
+ if (operation.reason !== undefined)
182
+ entry.reason = operation.reason;
183
+ await this.saveReceipt(receipt);
184
+ continue;
185
+ }
186
+ const policy = this.ownerContext.get('sandboxPolicy').resolve({ session: agent.session });
187
+ if (policy.mode === 'read-only') {
188
+ entry.status = 'failed';
189
+ entry.backup = '';
190
+ entry.reason = 'Access is Read only. Change Access before restoring files.';
191
+ await this.saveReceipt(receipt);
192
+ continue;
193
+ }
194
+ if (policy.mode !== 'danger-full-access') {
195
+ const fs = this.ownerContext.get('fs'), boundary = await fs.resolve(policy.workspaceRoot, { signal: fused }), target = await fs.resolve(root, { signal: fused });
196
+ if (!fs.contains(boundary, target)) {
197
+ entry.status = 'failed';
198
+ entry.backup = '';
199
+ entry.reason = 'The captured directory is outside the current Access boundary.';
200
+ await this.saveReceipt(receipt);
201
+ continue;
202
+ }
203
+ }
204
+ const argv = [process.execPath, fileURLToPath(new URL(import.meta.url.endsWith('.ts') ? './file-recovery-worker.ts' : './file-recovery-worker.js', import.meta.url)), '--omdsh-recovery-worker'];
205
+ let confined;
206
+ try {
207
+ confined = await this.ownerContext.get('sandbox').confine(argv, { mode: 'workspace-write', workspaceRoot: root, sessionId: agent.id }, fused);
208
+ }
209
+ catch (error) {
210
+ entry.status = fused.aborted ? 'cancelled' : 'failed';
211
+ entry.backup = '';
212
+ entry.reason = error instanceof Error ? error.message : String(error);
213
+ await this.saveReceipt(receipt);
214
+ continue;
215
+ }
216
+ const request = { root, rootIdentity: plan.rootIdentity, directory: this.store.directory, operation,
217
+ operationId: entry.operationId, maxFileBytes: this.store.limits.maxFileBytes };
218
+ let handle;
219
+ try {
220
+ handle = this.ownerContext.get('subprocess').spawn({ argv: confined.argv, cwd: root, graceMs: 500, signal: fused,
221
+ stdio: { stdin: 'pipe', stdout: { maxBytes: 64 * 1024 }, stderr: { maxBytes: 16 * 1024 } } });
222
+ }
223
+ catch (error) {
224
+ entry.status = fused.aborted ? 'cancelled' : 'failed';
225
+ entry.backup = '';
226
+ entry.reason = error instanceof Error ? error.message : String(error);
227
+ await this.saveReceipt(receipt);
228
+ continue;
229
+ }
230
+ handle.stdin.on('error', () => { });
231
+ handle.stdin.end(JSON.stringify(request));
232
+ try {
233
+ const outcome = await handle.done;
234
+ const output = handle.collected.stdout.readFrom(0);
235
+ if (outcome.exitCode !== 0 || output.lossy)
236
+ throw new Error('Recovery worker did not confirm completion. Inspect the receipt and retained backup.');
237
+ const result = JSON.parse(output.text);
238
+ if (!validWorkerResult(result, entry.path))
239
+ throw new Error('Invalid recovery worker result; completion is unconfirmed.');
240
+ entry.status = result.status;
241
+ if (result.reason !== undefined)
242
+ entry.reason = result.reason;
243
+ if (result.backup === undefined)
244
+ entry.backup = '';
245
+ else if (result.backup !== entry.backup)
246
+ throw new Error('Recovery worker returned an unexpected backup path.');
247
+ }
248
+ catch (error) {
249
+ entry.status = 'uncertain';
250
+ entry.reason = error instanceof Error ? error.message : String(error);
251
+ }
252
+ finally {
253
+ await handle.waitForExit();
254
+ await this.saveReceipt(receipt);
255
+ }
256
+ }
257
+ receipt.completedAt = Date.now();
258
+ await this.saveReceipt(receipt);
259
+ if (receipt.entries.some(entry => entry.status === 'restored' || entry.status === 'uncertain')) {
260
+ try {
261
+ agent.inject(createUserMessage({ source: { kind: 'omdsh-file-recovery', form: 'notice', summary: 'File recovery changed or may have changed workspace files.' },
262
+ content: [{ type: 'text', text: `The user attempted file recovery in ${JSON.stringify(root)}. Results: ${JSON.stringify(receipt.entries.map(entry => ({ path: entry.path, status: entry.status })))}. Re-read affected files before relying on earlier observations. Uncertain results do not establish completion.` }] }));
263
+ }
264
+ catch {
265
+ this.ownerContext.logger.warn('File recovery completed, but its model notice could not be queued. The saved receipt retains the actual results.');
266
+ }
267
+ }
268
+ return receipt;
269
+ }));
270
+ }
271
+ async saveReceipt(receipt) {
272
+ const path = join(this.store.directory, 'receipts', receipt.id + '.json'), temp = path + '.' + randomUUID() + '.tmp';
273
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
274
+ const handle = await open(temp, 'wx', 0o600);
275
+ try {
276
+ await handle.writeFile(JSON.stringify(receipt) + '\n');
277
+ await handle.sync();
278
+ await handle.close();
279
+ await rename(temp, path);
280
+ }
281
+ finally {
282
+ try {
283
+ await handle.close();
284
+ }
285
+ finally {
286
+ await rm(temp, { force: true });
287
+ }
288
+ }
289
+ }
290
+ async readReceipt(id) {
291
+ if (!/^restore-[a-f0-9-]{36}$/u.test(id))
292
+ throw new Error('Invalid recovery receipt identity.');
293
+ const path = join(this.store.directory, 'receipts', id + '.json'), stat = await lstat(path);
294
+ if (!stat.isFile() || stat.size > 8 * 1024 * 1024)
295
+ throw new Error('Recovery receipt must be a bounded regular file.');
296
+ const value = JSON.parse(await readFile(path, 'utf8'));
297
+ if (!validReceipt(value) || value.id !== id)
298
+ throw new Error('Invalid recovery receipt.');
299
+ return value;
300
+ }
301
+ async savedReports(before, after, signal) {
302
+ signal.throwIfAborted();
303
+ const names = await readdir(join(this.store.directory, 'receipts')).catch(error => {
304
+ if (error.code === 'ENOENT')
305
+ return [];
306
+ throw error;
307
+ });
308
+ if (names.length > 10_000)
309
+ throw new Error('The recovery report directory exceeds its inspection limit.');
310
+ const reports = [];
311
+ for (const name of names.filter(name => /^restore-[a-f0-9-]{36}\.json$/u.test(name))) {
312
+ signal.throwIfAborted();
313
+ const report = await this.readReceipt(name.slice(0, -5));
314
+ if (report.before === before && report.after === after)
315
+ reports.push(report);
316
+ }
317
+ return reports.sort((a, b) => b.startedAt - a.startedAt);
318
+ }
319
+ }
320
+ function validWorkerResult(value, path) {
321
+ if (value === null || typeof value !== 'object')
322
+ return false;
323
+ const result = value;
324
+ return result.path === path && ['restored', 'conflict', 'already-restored', 'failed'].includes(String(result.status))
325
+ && (result.reason === undefined || typeof result.reason === 'string') && (result.backup === undefined || typeof result.backup === 'string');
326
+ }
327
+ function validReceipt(value) {
328
+ if (value === null || typeof value !== 'object')
329
+ return false;
330
+ const receipt = value;
331
+ const validEntry = (entry) => {
332
+ try {
333
+ if (typeof entry?.path !== 'string' || recoveryRelativePath(entry.path) !== entry.path || typeof entry.operationId !== 'string'
334
+ || !/^[a-f0-9-]{36}$/u.test(entry.operationId) || typeof entry.backup !== 'string')
335
+ return false;
336
+ const parent = entry.path.includes('/') ? entry.path.slice(0, entry.path.lastIndexOf('/') + 1) : '';
337
+ return (entry.backup === '' || entry.backup === parent + '.omdsh-recovery-' + entry.operationId + '.backup')
338
+ && ['planned', 'restored', 'conflict', 'already-restored', 'failed', 'uncertain', 'cancelled'].includes(entry.status)
339
+ && (entry.reason === undefined || typeof entry.reason === 'string');
340
+ }
341
+ catch {
342
+ return false;
343
+ }
344
+ };
345
+ return receipt.version === 1 && typeof receipt.id === 'string' && typeof receipt.sessionId === 'string' && typeof receipt.root === 'string' && isAbsolute(receipt.root)
346
+ && typeof receipt.before === 'string' && typeof receipt.after === 'string' && Number.isSafeInteger(receipt.startedAt)
347
+ && (receipt.completedAt === undefined || Number.isSafeInteger(receipt.completedAt)) && Array.isArray(receipt.entries) && receipt.entries.length <= 10_000
348
+ && receipt.entries.every(validEntry);
349
+ }
350
+ export default LocalFileRecovery;
351
+ //# sourceMappingURL=file-recovery-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-recovery-local.js","sourceRoot":"","sources":["../../src/runtime/file-recovery-local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { LocalFileRecovery } from './file-recovery-local.ts';
3
+ export interface TurnRecoveryRecord {
4
+ version: 1;
5
+ sessionId: string;
6
+ turn: number;
7
+ status: 'capturing' | 'ready' | 'unavailable';
8
+ before?: string;
9
+ after?: string;
10
+ error?: string;
11
+ }
12
+ export declare class TurnRecoveryRecording {
13
+ private readonly provider;
14
+ private readonly active;
15
+ private readonly tasks;
16
+ private readonly closing;
17
+ constructor(ctx: Context, provider: LocalFileRecovery);
18
+ private path;
19
+ private save;
20
+ private begin;
21
+ private finish;
22
+ get(sessionId: string, turn: number): Promise<TurnRecoveryRecord | undefined>;
23
+ }
@@ -0,0 +1,131 @@
1
+ /** Optional Turn snapshots over the public Agent lifecycle. */
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { lstat, mkdir, open, readFile, rename, rm } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { BTW_PRESET } from "./btw-policy.js";
6
+ export class TurnRecoveryRecording {
7
+ provider;
8
+ active = new Map();
9
+ tasks = new Set();
10
+ closing = new AbortController();
11
+ constructor(ctx, provider) {
12
+ this.provider = provider;
13
+ ctx.on('agent/pre-step', async (payload, next) => {
14
+ const decision = await next();
15
+ if (decision.kind === 'reject' || !ctx.get('agents').roots().includes(payload.agent) || payload.agent.session.header.agentPreset === BTW_PRESET)
16
+ return decision;
17
+ const current = this.active.get(payload.agent);
18
+ if (payload.step === 1 && current?.record.turn !== payload.turn) {
19
+ if (current !== undefined)
20
+ await this.finish(current);
21
+ if (provider.enabled)
22
+ await this.begin(payload.agent, payload.turn, payload.signal);
23
+ }
24
+ else if (current?.record.turn === payload.turn && !current.dirty) {
25
+ current.dirty = true;
26
+ current.record.status = 'capturing';
27
+ delete current.record.after;
28
+ await this.save(current.record).catch(() => { });
29
+ }
30
+ return decision;
31
+ }, true);
32
+ ctx.on('agent/turn-stopping', async ({ agent }) => { const state = this.active.get(agent); if (state !== undefined)
33
+ await this.finish(state); });
34
+ ctx.on('agent/status', ({ agent, status }) => { const state = this.active.get(agent); if (status === 'idle' && state !== undefined)
35
+ void this.finish(state); });
36
+ ctx.on('agent/disposed', ({ agent }) => { this.active.delete(agent); });
37
+ ctx.effect(() => async () => { this.closing.abort(); await Promise.allSettled(this.tasks); this.active.clear(); });
38
+ }
39
+ path(sessionId, turn) {
40
+ if (!Number.isSafeInteger(turn) || turn <= 0)
41
+ throw new Error('Invalid recovery Turn.');
42
+ return join(this.provider.store.directory, 'turns', createHash('sha256').update(JSON.stringify([sessionId, turn])).digest('hex') + '.json');
43
+ }
44
+ async save(record) {
45
+ const path = this.path(record.sessionId, record.turn), temp = path + '.' + randomUUID() + '.tmp';
46
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
47
+ const handle = await open(temp, 'wx', 0o600);
48
+ try {
49
+ await handle.writeFile(JSON.stringify(record) + '\n');
50
+ await handle.sync();
51
+ await handle.close();
52
+ await rename(temp, path);
53
+ }
54
+ finally {
55
+ try {
56
+ await handle.close();
57
+ }
58
+ finally {
59
+ await rm(temp, { force: true });
60
+ }
61
+ }
62
+ }
63
+ async begin(agent, turn, signal) {
64
+ const state = { agent, dirty: true, record: { version: 1, sessionId: agent.id, turn, status: 'capturing' } };
65
+ this.active.set(agent, state);
66
+ try {
67
+ await this.save(state.record);
68
+ state.before = await this.provider.capture(agent, [], AbortSignal.any([signal, this.closing.signal]));
69
+ state.record.before = state.before.id;
70
+ await this.save(state.record);
71
+ }
72
+ catch (error) {
73
+ state.record.status = 'unavailable';
74
+ state.record.error = error instanceof Error ? error.message : String(error);
75
+ await this.save(state.record).catch(() => { });
76
+ }
77
+ }
78
+ finish(state) {
79
+ if (state.finishing !== undefined)
80
+ return state.finishing;
81
+ if (!state.dirty || state.before === undefined)
82
+ return Promise.resolve();
83
+ const task = (async () => {
84
+ try {
85
+ const after = await this.provider.capture(state.agent, state.before.entries.map(entry => entry.path), this.closing.signal);
86
+ if (after.root !== state.before.root || after.rootIdentity !== state.before.rootIdentity)
87
+ throw new Error('The working directory changed during this Turn; no complete file checkpoint is available.');
88
+ state.record.after = after.id;
89
+ state.record.status = 'ready';
90
+ delete state.record.error;
91
+ }
92
+ catch (error) {
93
+ state.record.status = 'unavailable';
94
+ state.record.error = error instanceof Error ? error.message : String(error);
95
+ }
96
+ state.dirty = false;
97
+ await this.save(state.record).catch(() => { state.record.status = 'unavailable'; state.record.error = 'The file checkpoint could not be saved.'; });
98
+ })().finally(() => { delete state.finishing; this.tasks.delete(task); });
99
+ state.finishing = task;
100
+ this.tasks.add(task);
101
+ return task;
102
+ }
103
+ async get(sessionId, turn) {
104
+ const state = [...this.active.values()].find(value => value.record.sessionId === sessionId && value.record.turn === turn);
105
+ if (state !== undefined) {
106
+ await state.finishing;
107
+ return { ...state.record };
108
+ }
109
+ const path = this.path(sessionId, turn);
110
+ const stat = await lstat(path).catch(error => { if (error.code === 'ENOENT')
111
+ return undefined; throw error; });
112
+ if (stat === undefined)
113
+ return undefined;
114
+ if (!stat.isFile() || stat.size > 32 * 1024)
115
+ throw new Error('Invalid Turn recovery record.');
116
+ const value = JSON.parse(await readFile(path, 'utf8'));
117
+ if (!validRecord(value) || value.sessionId !== sessionId || value.turn !== turn)
118
+ throw new Error('Invalid Turn recovery record.');
119
+ return value;
120
+ }
121
+ }
122
+ function validRecord(value) {
123
+ if (value === null || typeof value !== 'object')
124
+ return false;
125
+ const record = value;
126
+ const snapshot = (id) => id === undefined || typeof id === 'string' && /^snapshot-[a-f0-9-]{36}$/u.test(id);
127
+ return record.version === 1 && typeof record.sessionId === 'string' && Number.isSafeInteger(record.turn)
128
+ && ['capturing', 'ready', 'unavailable'].includes(String(record.status)) && snapshot(record.before) && snapshot(record.after)
129
+ && (record.error === undefined || typeof record.error === 'string') && (record.status !== 'ready' || record.before !== undefined && record.after !== undefined);
130
+ }
131
+ //# sourceMappingURL=file-recovery-recording.js.map