@ricsam/r5d-worker 0.0.137 → 0.0.138

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 (236) hide show
  1. package/README.md +4 -94
  2. package/dist/cjs/package.json +1 -1
  3. package/dist/mjs/main.mjs +46 -7543
  4. package/dist/mjs/package.json +1 -1
  5. package/dist/mjs/personal/action-scheduler.mjs +31 -0
  6. package/dist/mjs/personal/client.mjs +215 -0
  7. package/dist/mjs/personal/runtime.mjs +328 -0
  8. package/dist/mjs/personal/tcp.mjs +217 -0
  9. package/dist/mjs/runtime/adapter.mjs +42 -0
  10. package/dist/mjs/runtime/client.mjs +95 -0
  11. package/dist/mjs/runtime/daemon.mjs +131 -0
  12. package/dist/mjs/runtime/executor.mjs +436 -0
  13. package/dist/mjs/runtime/index.mjs +15 -0
  14. package/dist/mjs/runtime/protocol.mjs +139 -0
  15. package/dist/mjs/runtime/pty-host.mjs +156 -0
  16. package/dist/mjs/runtime/pty.mjs +127 -0
  17. package/dist/mjs/runtime/releases/artifacts.mjs +201 -0
  18. package/dist/mjs/runtime/releases/grants.mjs +93 -0
  19. package/dist/mjs/runtime/releases/main.mjs +101 -0
  20. package/dist/mjs/runtime/releases/manager.mjs +541 -0
  21. package/dist/mjs/runtime/releases/process.mjs +88 -0
  22. package/dist/mjs/runtime/releases/retirement.mjs +18 -0
  23. package/dist/mjs/runtime/releases/rpc-client.mjs +184 -0
  24. package/dist/mjs/runtime/releases/rpc-main.mjs +213 -0
  25. package/dist/mjs/runtime/releases/rpc-protocol.mjs +103 -0
  26. package/dist/mjs/runtime/storage.mjs +156 -0
  27. package/dist/mjs/runtime/workspace/artifacts.mjs +121 -0
  28. package/dist/mjs/runtime/workspace/authority.mjs +1355 -0
  29. package/dist/mjs/runtime/workspace/contracts.mjs +60 -0
  30. package/dist/mjs/runtime/workspace/file-write.mjs +23 -0
  31. package/dist/mjs/runtime/workspace/files.mjs +308 -0
  32. package/dist/mjs/runtime/workspace/http-body.mjs +45 -0
  33. package/dist/mjs/runtime/workspace/storage-client.mjs +59 -0
  34. package/dist/mjs/runtime/workspace/storage-wire.mjs +53 -0
  35. package/dist/types/main.d.ts +0 -1167
  36. package/dist/types/personal/action-scheduler.d.ts +23 -0
  37. package/dist/types/personal/client.d.ts +14 -0
  38. package/dist/types/personal/runtime.d.ts +121 -0
  39. package/dist/types/personal/tcp.d.ts +14 -0
  40. package/dist/types/runtime/client.d.ts +3 -1
  41. package/dist/types/runtime/executor.d.ts +6 -1
  42. package/dist/types/runtime/protocol.d.ts +176 -4
  43. package/dist/types/runtime/pty.d.ts +1 -0
  44. package/dist/types/runtime/releases/artifacts.d.ts +51 -0
  45. package/dist/types/runtime/releases/grants.d.ts +16 -0
  46. package/dist/types/runtime/releases/manager.d.ts +145 -0
  47. package/dist/types/runtime/releases/process.d.ts +14 -0
  48. package/dist/types/runtime/releases/retirement.d.ts +15 -0
  49. package/dist/types/runtime/releases/rpc-client.d.ts +52 -0
  50. package/dist/types/runtime/releases/rpc-main.d.ts +10 -0
  51. package/dist/types/runtime/releases/rpc-protocol.d.ts +1139 -0
  52. package/dist/types/runtime/workspace/artifacts.d.ts +30 -0
  53. package/dist/types/runtime/workspace/authority.d.ts +338 -0
  54. package/dist/types/runtime/workspace/contracts.d.ts +86 -0
  55. package/dist/types/runtime/workspace/file-write.d.ts +14 -0
  56. package/dist/types/runtime/workspace/files.d.ts +21 -0
  57. package/dist/types/runtime/workspace/http-body.d.ts +9 -0
  58. package/dist/types/runtime/workspace/storage-client.d.ts +23 -0
  59. package/dist/types/runtime/workspace/storage-wire.d.ts +138 -0
  60. package/package.json +8 -6
  61. package/dist/cjs/atomic-rename.cjs +0 -303
  62. package/dist/cjs/browser-upload.cjs +0 -73
  63. package/dist/cjs/cli-update.cjs +0 -108
  64. package/dist/cjs/command-launcher.cjs +0 -423
  65. package/dist/cjs/control-command-policy.cjs +0 -177
  66. package/dist/cjs/git-blob-hash.cjs +0 -41
  67. package/dist/cjs/git-identity.cjs +0 -39
  68. package/dist/cjs/git-process-environment.cjs +0 -133
  69. package/dist/cjs/inline-output.cjs +0 -62
  70. package/dist/cjs/main.cjs +0 -7517
  71. package/dist/cjs/managed-paths.cjs +0 -215
  72. package/dist/cjs/plan-lint.cjs +0 -165
  73. package/dist/cjs/plan-parser.cjs +0 -127
  74. package/dist/cjs/plan-paths.cjs +0 -53
  75. package/dist/cjs/port-forward-client.cjs +0 -206
  76. package/dist/cjs/process-tree.cjs +0 -117
  77. package/dist/cjs/project-checkout-garbage.cjs +0 -219
  78. package/dist/cjs/project-mirror-fetch-policy.cjs +0 -82
  79. package/dist/cjs/project-mirror-refs-token.cjs +0 -85
  80. package/dist/cjs/project-workspace-state.cjs +0 -972
  81. package/dist/cjs/project-worktrees.cjs +0 -1713
  82. package/dist/cjs/pty-output-coalescer.cjs +0 -87
  83. package/dist/cjs/recovery-journal-protocol.cjs +0 -56
  84. package/dist/cjs/recovery-journal-runtime.cjs +0 -133
  85. package/dist/cjs/recovery-journal-thread.cjs +0 -9
  86. package/dist/cjs/recovery-journal.cjs +0 -742
  87. package/dist/cjs/recovery-output-window.cjs +0 -77
  88. package/dist/cjs/recovery-protocol.cjs +0 -31
  89. package/dist/cjs/recovery-store.cjs +0 -252
  90. package/dist/cjs/registry-auth.cjs +0 -310
  91. package/dist/cjs/repository-transition-policy.cjs +0 -49
  92. package/dist/cjs/runtime-version.cjs +0 -88
  93. package/dist/cjs/session-file-mutations.cjs +0 -61
  94. package/dist/cjs/supervisor.cjs +0 -147
  95. package/dist/cjs/three-way-merge.cjs +0 -346
  96. package/dist/cjs/working-tree-mirror.cjs +0 -1872
  97. package/dist/cjs/workspace-automatic-sync-policy.cjs +0 -79
  98. package/dist/cjs/workspace-branch-incarnation-policy.cjs +0 -37
  99. package/dist/cjs/workspace-command-sync-policy.cjs +0 -112
  100. package/dist/cjs/workspace-command-targets.cjs +0 -63
  101. package/dist/cjs/workspace-filesystem-executor-thread.cjs +0 -36
  102. package/dist/cjs/workspace-filesystem-executor.cjs +0 -327
  103. package/dist/cjs/workspace-filesystem-job-types.cjs +0 -144
  104. package/dist/cjs/workspace-filesystem-jobs.cjs +0 -59
  105. package/dist/cjs/workspace-git-sync.cjs +0 -3595
  106. package/dist/cjs/workspace-hydration-ledger.cjs +0 -83
  107. package/dist/cjs/workspace-hydration-merge.cjs +0 -448
  108. package/dist/cjs/workspace-hydration-recovery-state.cjs +0 -53
  109. package/dist/cjs/workspace-incident-state.cjs +0 -37
  110. package/dist/cjs/workspace-merge-projection.cjs +0 -628
  111. package/dist/cjs/workspace-mount-boundary.cjs +0 -71
  112. package/dist/cjs/workspace-mount-hold-fence.cjs +0 -120
  113. package/dist/cjs/workspace-mutation-gate.cjs +0 -127
  114. package/dist/cjs/workspace-path-move.cjs +0 -195
  115. package/dist/cjs/workspace-preserve-only-policy.cjs +0 -36
  116. package/dist/cjs/workspace-project-config-policy.cjs +0 -53
  117. package/dist/cjs/workspace-projection-ledger.cjs +0 -81
  118. package/dist/cjs/workspace-publication-evidence.cjs +0 -46
  119. package/dist/cjs/workspace-sync-coalescer.cjs +0 -58
  120. package/dist/mjs/atomic-rename.mjs +0 -261
  121. package/dist/mjs/browser-upload.mjs +0 -42
  122. package/dist/mjs/command-launcher.mjs +0 -393
  123. package/dist/mjs/control-command-policy.mjs +0 -146
  124. package/dist/mjs/git-blob-hash.mjs +0 -16
  125. package/dist/mjs/git-identity.mjs +0 -15
  126. package/dist/mjs/git-process-environment.mjs +0 -105
  127. package/dist/mjs/inline-output.mjs +0 -37
  128. package/dist/mjs/managed-paths.mjs +0 -174
  129. package/dist/mjs/plan-lint.mjs +0 -129
  130. package/dist/mjs/plan-parser.mjs +0 -94
  131. package/dist/mjs/plan-paths.mjs +0 -25
  132. package/dist/mjs/port-forward-client.mjs +0 -172
  133. package/dist/mjs/project-checkout-garbage.mjs +0 -178
  134. package/dist/mjs/project-mirror-fetch-policy.mjs +0 -56
  135. package/dist/mjs/project-mirror-refs-token.mjs +0 -53
  136. package/dist/mjs/project-workspace-state.mjs +0 -937
  137. package/dist/mjs/project-worktrees.mjs +0 -1657
  138. package/dist/mjs/pty-output-coalescer.mjs +0 -61
  139. package/dist/mjs/recovery-journal-protocol.mjs +0 -30
  140. package/dist/mjs/recovery-journal-runtime.mjs +0 -112
  141. package/dist/mjs/recovery-journal-thread.mjs +0 -8
  142. package/dist/mjs/recovery-journal.mjs +0 -694
  143. package/dist/mjs/recovery-output-window.mjs +0 -53
  144. package/dist/mjs/recovery-protocol.mjs +0 -6
  145. package/dist/mjs/recovery-store.mjs +0 -217
  146. package/dist/mjs/registry-auth.mjs +0 -269
  147. package/dist/mjs/repository-transition-policy.mjs +0 -22
  148. package/dist/mjs/runtime-version.mjs +0 -54
  149. package/dist/mjs/session-file-mutations.mjs +0 -37
  150. package/dist/mjs/supervisor.mjs +0 -114
  151. package/dist/mjs/three-way-merge.mjs +0 -318
  152. package/dist/mjs/working-tree-mirror.mjs +0 -1817
  153. package/dist/mjs/workspace-automatic-sync-policy.mjs +0 -48
  154. package/dist/mjs/workspace-branch-incarnation-policy.mjs +0 -13
  155. package/dist/mjs/workspace-command-sync-policy.mjs +0 -84
  156. package/dist/mjs/workspace-command-targets.mjs +0 -37
  157. package/dist/mjs/workspace-filesystem-executor-thread.mjs +0 -38
  158. package/dist/mjs/workspace-filesystem-executor.mjs +0 -287
  159. package/dist/mjs/workspace-filesystem-job-types.mjs +0 -116
  160. package/dist/mjs/workspace-filesystem-jobs.mjs +0 -55
  161. package/dist/mjs/workspace-git-sync.mjs +0 -3553
  162. package/dist/mjs/workspace-hydration-ledger.mjs +0 -58
  163. package/dist/mjs/workspace-hydration-merge.mjs +0 -414
  164. package/dist/mjs/workspace-hydration-recovery-state.mjs +0 -29
  165. package/dist/mjs/workspace-incident-state.mjs +0 -12
  166. package/dist/mjs/workspace-merge-projection.mjs +0 -594
  167. package/dist/mjs/workspace-mount-boundary.mjs +0 -37
  168. package/dist/mjs/workspace-mount-hold-fence.mjs +0 -95
  169. package/dist/mjs/workspace-mutation-gate.mjs +0 -103
  170. package/dist/mjs/workspace-path-move.mjs +0 -160
  171. package/dist/mjs/workspace-preserve-only-policy.mjs +0 -11
  172. package/dist/mjs/workspace-project-config-policy.mjs +0 -27
  173. package/dist/mjs/workspace-projection-ledger.mjs +0 -57
  174. package/dist/mjs/workspace-publication-evidence.mjs +0 -21
  175. package/dist/mjs/workspace-sync-coalescer.mjs +0 -34
  176. package/dist/types/atomic-rename.d.ts +0 -78
  177. package/dist/types/browser-upload.d.ts +0 -7
  178. package/dist/types/command-launcher.d.ts +0 -104
  179. package/dist/types/control-command-policy.d.ts +0 -53
  180. package/dist/types/git-blob-hash.d.ts +0 -10
  181. package/dist/types/git-identity.d.ts +0 -9
  182. package/dist/types/git-process-environment.d.ts +0 -9
  183. package/dist/types/inline-output.d.ts +0 -3
  184. package/dist/types/managed-paths.d.ts +0 -19
  185. package/dist/types/plan-lint.d.ts +0 -16
  186. package/dist/types/plan-parser.d.ts +0 -38
  187. package/dist/types/plan-paths.d.ts +0 -36
  188. package/dist/types/port-forward-client.d.ts +0 -8
  189. package/dist/types/project-checkout-garbage.d.ts +0 -86
  190. package/dist/types/project-mirror-fetch-policy.d.ts +0 -84
  191. package/dist/types/project-mirror-refs-token.d.ts +0 -53
  192. package/dist/types/project-workspace-state.d.ts +0 -188
  193. package/dist/types/project-worktrees.d.ts +0 -397
  194. package/dist/types/pty-output-coalescer.d.ts +0 -20
  195. package/dist/types/recovery-journal-protocol.d.ts +0 -35
  196. package/dist/types/recovery-journal-runtime.d.ts +0 -12
  197. package/dist/types/recovery-journal-stall-fixture.d.ts +0 -1
  198. package/dist/types/recovery-journal-thread.d.ts +0 -1
  199. package/dist/types/recovery-journal.d.ts +0 -248
  200. package/dist/types/recovery-output-window.d.ts +0 -19
  201. package/dist/types/recovery-protocol.d.ts +0 -59
  202. package/dist/types/recovery-store.d.ts +0 -52
  203. package/dist/types/registry-auth.d.ts +0 -47
  204. package/dist/types/repository-transition-policy.d.ts +0 -26
  205. package/dist/types/runtime-version.d.ts +0 -1
  206. package/dist/types/session-file-mutations.d.ts +0 -22
  207. package/dist/types/supervisor-daemonized-fixture.d.ts +0 -1
  208. package/dist/types/supervisor-launcher-cleanup-fixture.d.ts +0 -1
  209. package/dist/types/supervisor-signal-fixture.d.ts +0 -1
  210. package/dist/types/supervisor.d.ts +0 -23
  211. package/dist/types/three-way-merge.d.ts +0 -77
  212. package/dist/types/working-tree-mirror.d.ts +0 -424
  213. package/dist/types/workspace-automatic-sync-policy.d.ts +0 -57
  214. package/dist/types/workspace-branch-incarnation-policy.d.ts +0 -14
  215. package/dist/types/workspace-command-sync-policy.d.ts +0 -57
  216. package/dist/types/workspace-command-targets.d.ts +0 -37
  217. package/dist/types/workspace-filesystem-executor-thread.d.ts +0 -1
  218. package/dist/types/workspace-filesystem-executor.d.ts +0 -123
  219. package/dist/types/workspace-filesystem-job-types.d.ts +0 -302
  220. package/dist/types/workspace-filesystem-jobs.d.ts +0 -7
  221. package/dist/types/workspace-git-sync.d.ts +0 -514
  222. package/dist/types/workspace-hydration-ledger.d.ts +0 -76
  223. package/dist/types/workspace-hydration-merge.d.ts +0 -103
  224. package/dist/types/workspace-hydration-recovery-state.d.ts +0 -10
  225. package/dist/types/workspace-incident-state.d.ts +0 -19
  226. package/dist/types/workspace-merge-projection.d.ts +0 -69
  227. package/dist/types/workspace-mount-boundary.d.ts +0 -10
  228. package/dist/types/workspace-mount-hold-fence.d.ts +0 -42
  229. package/dist/types/workspace-mutation-gate.d.ts +0 -42
  230. package/dist/types/workspace-path-move.d.ts +0 -21
  231. package/dist/types/workspace-preserve-only-policy.d.ts +0 -15
  232. package/dist/types/workspace-project-config-policy.d.ts +0 -48
  233. package/dist/types/workspace-projection-ledger.d.ts +0 -59
  234. package/dist/types/workspace-publication-evidence.d.ts +0 -17
  235. package/dist/types/workspace-sync-coalescer.d.ts +0 -28
  236. /package/dist/types/{credential-authority-lock-fixture.d.ts → runtime/releases/main.d.ts} +0 -0
@@ -1,83 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var workspace_hydration_ledger_exports = {};
20
- __export(workspace_hydration_ledger_exports, {
21
- WorkspaceHydrationLedger: () => WorkspaceHydrationLedger,
22
- WorkspaceHydrationPreBlobLedger: () => WorkspaceHydrationPreBlobLedger
23
- });
24
- module.exports = __toCommonJS(workspace_hydration_ledger_exports);
25
- class WorkspaceHydrationLedger {
26
- mounts = /* @__PURE__ */ new Map();
27
- static key(mount) {
28
- return `${mount.hydrationIncarnationKey}\0${mount.id}`;
29
- }
30
- /** Entries by mount-relative path for the mount, or an empty map. */
31
- entries(mount) {
32
- return this.mounts.get(WorkspaceHydrationLedger.key(mount)) ?? /* @__PURE__ */ new Map();
33
- }
34
- /** Blob ids by mount-relative path for the mount (the §3.3 detector's input), or an empty map. */
35
- preBlobs(mount) {
36
- return new Map([...this.entries(mount)].map(([relativePath, entry]) => [relativePath, entry.preBlob]));
37
- }
38
- /**
39
- * Record what a merge hydration replaced; earlier entries for other paths
40
- * are kept. A path that already carries a live entry keeps its `preBlob`
41
- * while the new hydration also ran across a live process: the process's
42
- * read predates both hydrations, so what it read is still the first blob.
43
- */
44
- record(mount, entries, options = {}) {
45
- const incoming = entries instanceof Map ? [...entries] : Object.entries(entries);
46
- if (incoming.length === 0) return;
47
- const replace = new Set(options.replacePreBlobFor ?? []);
48
- const key = WorkspaceHydrationLedger.key(mount);
49
- const current = this.mounts.get(key) ?? /* @__PURE__ */ new Map();
50
- for (const [relativePath, entry] of incoming) {
51
- const previous = current.get(relativePath);
52
- const preBlob = previous && previous.processLiveAcrossHydration && entry.processLiveAcrossHydration && !replace.has(relativePath) ? previous.preBlob : entry.preBlob;
53
- current.set(relativePath, { ...entry, preBlob });
54
- }
55
- this.mounts.set(key, current);
56
- }
57
- /** Forget the mount: its checkout was rewritten by something this ledger did not observe. */
58
- clearMount(mount) {
59
- this.mounts.delete(WorkspaceHydrationLedger.key(mount));
60
- }
61
- /** Forget paths whose checkout content moved on from the hydrated bytes: a later return to the old bytes is a deliberate edit. */
62
- forget(mount, paths) {
63
- const key = WorkspaceHydrationLedger.key(mount);
64
- const current = this.mounts.get(key);
65
- if (!current) return;
66
- for (const relativePath of paths) current.delete(relativePath);
67
- if (current.size === 0) this.mounts.delete(key);
68
- }
69
- clear() {
70
- this.mounts.clear();
71
- }
72
- get size() {
73
- let total = 0;
74
- for (const entries of this.mounts.values()) total += entries.size;
75
- return total;
76
- }
77
- }
78
- const WorkspaceHydrationPreBlobLedger = WorkspaceHydrationLedger;
79
- // Annotate the CommonJS export names for ESM import in node:
80
- 0 && (module.exports = {
81
- WorkspaceHydrationLedger,
82
- WorkspaceHydrationPreBlobLedger
83
- });
@@ -1,448 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var workspace_hydration_merge_exports = {};
30
- __export(workspace_hydration_merge_exports, {
31
- RACY_PROJECTION_WINDOW_MS: () => RACY_PROJECTION_WINDOW_MS,
32
- decideWorkspaceHydrationMerge: () => decideWorkspaceHydrationMerge,
33
- describeHydrationSkipPaths: () => describeHydrationSkipPaths,
34
- parseWorkspaceSubtreeChanges: () => parseWorkspaceSubtreeChanges,
35
- readHydrationBinaryPaths: () => readHydrationBinaryPaths
36
- });
37
- module.exports = __toCommonJS(workspace_hydration_merge_exports);
38
- var import_node_fs = __toESM(require("node:fs"), 1);
39
- var import_node_path = __toESM(require("node:path"), 1);
40
- var import_git_process_environment = require("./git-process-environment.cjs");
41
- var import_git_blob_hash = require("./git-blob-hash.cjs");
42
- var import_three_way_merge = require("./three-way-merge.cjs");
43
- var import_working_tree_mirror = require("./working-tree-mirror.cjs");
44
- const RACY_PROJECTION_WINDOW_MS = 2e3;
45
- class TargetChanged extends Error {
46
- constructor(relativePath) {
47
- super(`Working-tree target changed while merge hydration inspected it: ${relativePath}`);
48
- this.relativePath = relativePath;
49
- }
50
- relativePath;
51
- }
52
- function isBlobMode(mode) {
53
- return mode === "100644" || mode === "100755";
54
- }
55
- function executableBit(mode) {
56
- return (mode & 73) !== 0;
57
- }
58
- function resolveExecutable(base, ours, theirs) {
59
- if (ours === base) return theirs;
60
- if (theirs === base) return ours;
61
- return ours === theirs ? ours : null;
62
- }
63
- function withExecutable(mode, executable) {
64
- const bits = mode & 511;
65
- return executable ? bits | 73 : bits & ~73;
66
- }
67
- function readOwnedFile(root, relativePath, expected) {
68
- const inspected = (0, import_working_tree_mirror.inspectWorkingTreePath)(root, relativePath);
69
- if (inspected.kind !== "entry" || !(0, import_working_tree_mirror.workingTreeStatsMatch)(expected, inspected.stat)) throw new TargetChanged(relativePath);
70
- const descriptor = import_node_fs.default.openSync(inspected.absolutePath, import_node_fs.default.constants.O_RDONLY | import_node_fs.default.constants.O_NOFOLLOW);
71
- try {
72
- const before = import_node_fs.default.fstatSync(descriptor);
73
- if (!(0, import_working_tree_mirror.workingTreeStatsMatch)(expected, before)) throw new TargetChanged(relativePath);
74
- const content = Buffer.allocUnsafe(before.size);
75
- let offset = 0;
76
- while (offset < before.size) {
77
- const bytesRead = import_node_fs.default.readSync(descriptor, content, offset, before.size - offset, offset);
78
- if (bytesRead <= 0) throw new TargetChanged(relativePath);
79
- offset += bytesRead;
80
- }
81
- if (!(0, import_working_tree_mirror.workingTreeStatsMatch)(expected, import_node_fs.default.fstatSync(descriptor))) throw new TargetChanged(relativePath);
82
- return content;
83
- } finally {
84
- import_node_fs.default.closeSync(descriptor);
85
- }
86
- }
87
- function readOuterFile(root, relativePath) {
88
- const inspected = (0, import_working_tree_mirror.inspectWorkingTreePath)(root, relativePath);
89
- if (inspected.kind !== "entry" || !inspected.stat.isFile())
90
- throw new Error(`Outer worktree does not hold a regular file at ${relativePath}`);
91
- return import_node_fs.default.readFileSync(inspected.absolutePath);
92
- }
93
- function currentTargetStat(root, relativePath) {
94
- const inspected = (0, import_working_tree_mirror.inspectWorkingTreePath)(root, relativePath);
95
- return inspected.kind === "entry" ? inspected.stat : null;
96
- }
97
- function directoryHoldsOnlyVisibleEntries(root, relativePath, existing) {
98
- const inspected = (0, import_working_tree_mirror.inspectWorkingTreePath)(root, relativePath);
99
- if (inspected.kind !== "entry" || !inspected.stat.isDirectory()) return true;
100
- const pending = [{ absolutePath: inspected.absolutePath, relativePath }];
101
- while (pending.length > 0) {
102
- const directory = pending.pop();
103
- for (const name of import_node_fs.default.readdirSync(directory.absolutePath)) {
104
- const childRelative = `${directory.relativePath}/${name}`;
105
- if (!existing.has(childRelative)) return false;
106
- const child = import_node_fs.default.lstatSync(import_node_path.default.join(directory.absolutePath, name));
107
- if (child.isDirectory() && !child.isSymbolicLink())
108
- pending.push({ absolutePath: import_node_path.default.join(directory.absolutePath, name), relativePath: childRelative });
109
- }
110
- }
111
- return true;
112
- }
113
- function decideWorkspaceHydrationMerge(input) {
114
- const { prepared, changes, projectedFiles } = input;
115
- const trustedProjection = (projected, stat) => (0, import_working_tree_mirror.projectedFileEntryMatches)(projected, stat) && (input.readAtMs === void 0 || projected.mtimeMs < input.readAtMs - RACY_PROJECTION_WINDOW_MS && projected.ctimeMs < input.readAtMs - RACY_PROJECTION_WINDOW_MS);
116
- const { desired, existing, existingStats, shielded, sourceRoot, targetRoot } = prepared;
117
- const conflicts = /* @__PURE__ */ new Set();
118
- const write = /* @__PURE__ */ new Set();
119
- const remove = /* @__PURE__ */ new Set();
120
- const overrides = /* @__PURE__ */ new Map();
121
- const expectations = /* @__PURE__ */ new Map();
122
- const preBlobs = /* @__PURE__ */ new Map();
123
- const postBlobs = /* @__PURE__ */ new Map();
124
- const blobsToStore = /* @__PURE__ */ new Map();
125
- const mergedPaths = [];
126
- const keptPaths = /* @__PURE__ */ new Set();
127
- const desiredForIndex = new Map(desired);
128
- let algorithm = "sha1";
129
- for (const change of changes.values()) {
130
- const detected = (0, import_git_blob_hash.gitObjectHashAlgorithmFor)(change.base?.objectId ?? change.theirs?.objectId ?? "");
131
- if (detected) {
132
- algorithm = detected;
133
- break;
134
- }
135
- }
136
- const hashOf = (content) => (0, import_git_blob_hash.gitBlobHash)(content, algorithm);
137
- const mergeCandidates = [];
138
- const directoryReplacements = [];
139
- const oursState = (relativePath, change) => {
140
- const ours = existing.get(relativePath);
141
- const oursStat = existingStats.get(relativePath);
142
- if (!ours || !oursStat) return change.base ? "deleted" : "absent";
143
- if (!change.base) return "added";
144
- const base = change.base;
145
- if (ours.kind === "file" && isBlobMode(base.mode)) {
146
- if (executableBit(ours.mode) !== (base.mode === "100755")) return "changed";
147
- const projected = projectedFiles?.[relativePath];
148
- if (projected?.kind === "file" && trustedProjection(projected, oursStat)) return "base";
149
- if (projectedFiles !== null && projected === void 0) return "changed";
150
- return hashOf(readOwnedFile(targetRoot, relativePath, oursStat)) === base.objectId ? "base" : "changed";
151
- }
152
- if (ours.kind === "symlink" && base.mode === "120000") return hashOf(Buffer.from(ours.target)) === base.objectId ? "base" : "changed";
153
- if (ours.kind === "gitlink" && base.mode === "160000") return ours.objectId === base.objectId ? "base" : "changed";
154
- return "changed";
155
- };
156
- try {
157
- for (const [relativePath, change] of [...changes].sort(([left], [right]) => left.localeCompare(right))) {
158
- if (shielded.has(relativePath)) continue;
159
- const ours = existing.get(relativePath);
160
- const oursStat = existingStats.get(relativePath);
161
- const theirsEntry = desired.get(relativePath);
162
- if (change.theirs && (!theirsEntry || theirsEntry.kind === "directory")) {
163
- conflicts.add(relativePath);
164
- continue;
165
- }
166
- if (ours?.kind === "directory" && !change.base && change.theirs) {
167
- directoryReplacements.push(relativePath);
168
- continue;
169
- }
170
- const state = oursState(relativePath, change);
171
- if (state === "base" || state === "absent") {
172
- if (!change.theirs) {
173
- if (ours && oursStat) {
174
- remove.add(relativePath);
175
- expectations.set(relativePath, oursStat);
176
- }
177
- if (change.base && isBlobMode(change.base.mode)) {
178
- preBlobs.set(relativePath, change.base.objectId);
179
- postBlobs.set(relativePath, null);
180
- }
181
- continue;
182
- }
183
- write.add(relativePath);
184
- expectations.set(relativePath, oursStat ?? currentTargetStat(targetRoot, relativePath));
185
- if (change.base && isBlobMode(change.base.mode) && change.base.objectId !== change.theirs.objectId) {
186
- preBlobs.set(relativePath, change.base.objectId);
187
- postBlobs.set(relativePath, isBlobMode(change.theirs.mode) ? change.theirs.objectId : null);
188
- }
189
- continue;
190
- }
191
- if (state === "deleted") {
192
- if (change.theirs) conflicts.add(relativePath);
193
- continue;
194
- }
195
- if (!change.theirs) {
196
- conflicts.add(relativePath);
197
- continue;
198
- }
199
- const theirs = change.theirs;
200
- if (ours.kind === "file" && isBlobMode(theirs.mode)) {
201
- const oursBytes = readOwnedFile(targetRoot, relativePath, oursStat);
202
- const theirsBytes = readOuterFile(sourceRoot, relativePath);
203
- const oursExecutable = executableBit(ours.mode);
204
- const theirsExecutable = theirs.mode === "100755";
205
- if (oursBytes.equals(theirsBytes)) {
206
- if (oursExecutable === theirsExecutable) {
207
- keptPaths.add(relativePath);
208
- continue;
209
- }
210
- const baseExecutable = change.base ? change.base.mode === "100755" : null;
211
- const resolved = baseExecutable === null ? null : resolveExecutable(baseExecutable, oursExecutable, theirsExecutable);
212
- if (resolved === null) {
213
- conflicts.add(relativePath);
214
- continue;
215
- }
216
- overrides.set(relativePath, { content: theirsBytes, mode: withExecutable(oursStat.mode, resolved) });
217
- write.add(relativePath);
218
- expectations.set(relativePath, oursStat);
219
- mergedPaths.push(relativePath);
220
- continue;
221
- }
222
- if (!change.base || !isBlobMode(change.base.mode)) {
223
- conflicts.add(relativePath);
224
- continue;
225
- }
226
- mergeCandidates.push({
227
- relativePath,
228
- ours,
229
- oursStat,
230
- base: change.base.objectId,
231
- baseExecutable: change.base.mode === "100755",
232
- theirs
233
- });
234
- continue;
235
- }
236
- if (ours.kind === "symlink" && theirs.mode === "120000" && theirsEntry?.kind === "symlink") {
237
- if (ours.target === theirsEntry.target) keptPaths.add(relativePath);
238
- else conflicts.add(relativePath);
239
- continue;
240
- }
241
- if (ours.kind === "gitlink" && theirs.mode === "160000") {
242
- if (ours.objectId === theirs.objectId) keptPaths.add(relativePath);
243
- else conflicts.add(relativePath);
244
- continue;
245
- }
246
- conflicts.add(relativePath);
247
- }
248
- for (const relativePath of directoryReplacements) {
249
- const prefix = `${relativePath}/`;
250
- let container = true;
251
- for (const candidate of existing.keys()) {
252
- if (candidate.startsWith(prefix) && !remove.has(candidate)) {
253
- container = false;
254
- break;
255
- }
256
- }
257
- if (container && !directoryHoldsOnlyVisibleEntries(targetRoot, relativePath, existing)) container = false;
258
- if (!container) {
259
- conflicts.add(relativePath);
260
- continue;
261
- }
262
- write.add(relativePath);
263
- expectations.set(relativePath, existingStats.get(relativePath) ?? null);
264
- }
265
- if (mergeCandidates.length > 0) {
266
- const binaryPaths = input.readBinaryPaths?.(mergeCandidates.map(({ relativePath }) => relativePath));
267
- const baseBlobs = input.readBaseBlobs([...new Set(mergeCandidates.map(({ base }) => base))]);
268
- for (const candidate of mergeCandidates) {
269
- const { relativePath } = candidate;
270
- const baseBytes = baseBlobs.get(candidate.base);
271
- if (!baseBytes) throw new Error(`Projected blob ${candidate.base} for ${relativePath} is missing from the workspace clone`);
272
- const oursBytes = readOwnedFile(targetRoot, relativePath, candidate.oursStat);
273
- const theirsBytes = readOuterFile(sourceRoot, relativePath);
274
- if (binaryPaths?.has(relativePath) || (0, import_three_way_merge.isBinaryContent)(baseBytes) || (0, import_three_way_merge.isBinaryContent)(oursBytes) || (0, import_three_way_merge.isBinaryContent)(theirsBytes)) {
275
- conflicts.add(relativePath);
276
- continue;
277
- }
278
- const merged = (0, import_three_way_merge.mergeThreeWay)(baseBytes, oursBytes, theirsBytes);
279
- if (merged.kind === "conflict") {
280
- conflicts.add(relativePath);
281
- continue;
282
- }
283
- const resolved = resolveExecutable(
284
- candidate.baseExecutable,
285
- executableBit(candidate.ours.mode),
286
- candidate.theirs.mode === "100755"
287
- );
288
- if (resolved === null) {
289
- conflicts.add(relativePath);
290
- continue;
291
- }
292
- const mode = withExecutable(candidate.oursStat.mode, resolved);
293
- const contentUnchanged = merged.content.equals(oursBytes);
294
- if (contentUnchanged && mode === (candidate.oursStat.mode & 511)) {
295
- keptPaths.add(relativePath);
296
- continue;
297
- }
298
- overrides.set(relativePath, { content: merged.content, mode });
299
- write.add(relativePath);
300
- expectations.set(relativePath, candidate.oursStat);
301
- if (!contentUnchanged) {
302
- const preBlob = hashOf(oursBytes);
303
- const postBlob = hashOf(merged.content);
304
- preBlobs.set(relativePath, preBlob);
305
- postBlobs.set(relativePath, postBlob);
306
- blobsToStore.set(preBlob, oursBytes);
307
- blobsToStore.set(postBlob, merged.content);
308
- }
309
- mergedPaths.push(relativePath);
310
- }
311
- }
312
- const neededDirectories = /* @__PURE__ */ new Set();
313
- for (const relativePath of write) {
314
- let parent = import_node_path.default.posix.dirname(relativePath);
315
- while (parent !== ".") {
316
- neededDirectories.add(parent);
317
- parent = import_node_path.default.posix.dirname(parent);
318
- }
319
- }
320
- for (const [relativePath, entry] of desired) {
321
- if (shielded.has(relativePath) || changes.has(relativePath)) continue;
322
- const current = existing.get(relativePath);
323
- if (entry.kind === "directory") {
324
- if (!neededDirectories.has(relativePath)) continue;
325
- if (current && current.kind !== "directory") {
326
- if (!remove.has(relativePath)) conflicts.add(relativePath);
327
- continue;
328
- }
329
- expectations.set(relativePath, currentTargetStat(targetRoot, relativePath));
330
- continue;
331
- }
332
- if (entry.kind === "gitlink") {
333
- if (current?.kind === "gitlink") desiredForIndex.set(relativePath, current);
334
- else {
335
- const record = prepared.git?.indexRecords.find((candidate) => candidate.relativePath === relativePath && candidate.stage === 0);
336
- if (record?.mode === "160000") desiredForIndex.set(relativePath, { kind: "gitlink", objectId: record.objectId });
337
- else desiredForIndex.delete(relativePath);
338
- }
339
- }
340
- if (!current || current.kind !== entry.kind) {
341
- keptPaths.add(relativePath);
342
- continue;
343
- }
344
- if (current.kind === "file") {
345
- const stat = existingStats.get(relativePath);
346
- const projected = projectedFiles?.[relativePath];
347
- const unchanged = projected?.kind === "file" && stat ? trustedProjection(projected, stat) : projectedFiles === null || projected !== void 0;
348
- if (!unchanged) keptPaths.add(relativePath);
349
- }
350
- }
351
- for (const [relativePath, entry] of existing) {
352
- if (desired.has(relativePath) || changes.has(relativePath) || entry.kind === "directory" || shielded.has(relativePath)) continue;
353
- keptPaths.add(relativePath);
354
- }
355
- const blockedDirectories = /* @__PURE__ */ new Set();
356
- for (const [relativePath, entry] of existing) {
357
- if (entry.kind === "directory" || remove.has(relativePath)) continue;
358
- let parent = import_node_path.default.posix.dirname(relativePath);
359
- while (parent !== ".") {
360
- blockedDirectories.add(parent);
361
- parent = import_node_path.default.posix.dirname(parent);
362
- }
363
- }
364
- for (const [relativePath, entry] of existing) {
365
- if (entry.kind !== "directory" || desired.has(relativePath) || blockedDirectories.has(relativePath)) continue;
366
- remove.add(relativePath);
367
- }
368
- } catch (error) {
369
- if (error instanceof TargetChanged) return { kind: "target_changed", paths: [error.relativePath] };
370
- throw error;
371
- }
372
- if (conflicts.size > 0) return { kind: "conflict", paths: [...conflicts].sort() };
373
- for (const relativePath of [...write, ...overrides.keys()]) {
374
- if (!expectations.has(relativePath)) expectations.set(relativePath, currentTargetStat(targetRoot, relativePath));
375
- }
376
- return {
377
- kind: "apply",
378
- selection: { write, remove, desiredForIndex },
379
- overrides,
380
- expectations,
381
- preBlobs,
382
- postBlobs,
383
- blobsToStore,
384
- mergedPaths: mergedPaths.sort(),
385
- keptPaths: [...keptPaths].sort()
386
- };
387
- }
388
- function readHydrationBinaryPaths(input) {
389
- const binary = /* @__PURE__ */ new Set();
390
- if (!input.relativePaths.length) return binary;
391
- const requested = new Set(input.relativePaths);
392
- for (const cwd of [input.checkoutRoot, input.outerRoot]) {
393
- const result = Bun.spawnSync(["git", "check-attr", "-z", "--stdin", "diff"], {
394
- cwd,
395
- env: (0, import_git_process_environment.workerGitProcessEnvironment)(),
396
- stdin: Buffer.from(`${input.relativePaths.join("\0")}\0`),
397
- stdout: "pipe",
398
- stderr: "pipe"
399
- });
400
- if (result.exitCode !== 0) throw new Error(`Cannot inspect hydration binary attributes: ${result.stderr.toString().trim()}`);
401
- const records = result.stdout.toString().split("\0");
402
- if (records.pop() !== "" || records.length !== requested.size * 3) throw new Error("Invalid hydration attribute response");
403
- const seen = /* @__PURE__ */ new Set();
404
- for (let index = 0; index < records.length; index += 3) {
405
- const relativePath = records[index];
406
- if (!requested.has(relativePath) || seen.has(relativePath) || records[index + 1] !== "diff")
407
- throw new Error("Invalid hydration attribute path");
408
- seen.add(relativePath);
409
- if (records[index + 2] === "unset") binary.add(relativePath);
410
- }
411
- }
412
- return binary;
413
- }
414
- function parseWorkspaceSubtreeChanges(raw) {
415
- const changes = /* @__PURE__ */ new Map();
416
- const records = [];
417
- let start = 0;
418
- for (let index = 0; index < raw.length; index += 1) {
419
- if (raw[index] !== 0) continue;
420
- if (index > start) records.push(raw.subarray(start, index));
421
- start = index + 1;
422
- }
423
- if (start < raw.length) records.push(raw.subarray(start));
424
- for (let index = 0; index + 1 < records.length; index += 2) {
425
- const match = /^:([0-7]{6}) ([0-7]{6}) ([0-9a-f]{40,64}) ([0-9a-f]{40,64}) ([A-Z])/u.exec(records[index].toString());
426
- if (!match) throw new Error(`Unexpected diff-tree record: ${records[index].toString()}`);
427
- const relativePath = records[index + 1].toString();
428
- if (relativePath.split("/").some((segment) => segment === ".." || segment === "" || segment === ".git")) {
429
- throw new Error(`Unsafe path in workspace subtree diff: ${relativePath}`);
430
- }
431
- const base = match[1] === "000000" ? null : { mode: match[1], objectId: match[3] };
432
- const theirs = match[2] === "000000" ? null : { mode: match[2], objectId: match[4] };
433
- changes.set(relativePath, { base, theirs });
434
- }
435
- return changes;
436
- }
437
- function describeHydrationSkipPaths(mountSourcePath, paths) {
438
- const shown = paths.slice(0, 5).map((relativePath) => import_node_path.default.join(mountSourcePath, ...relativePath.split("/")));
439
- return paths.length > 5 ? `${shown.join(", ")} and ${paths.length - 5} more` : shown.join(", ");
440
- }
441
- // Annotate the CommonJS export names for ESM import in node:
442
- 0 && (module.exports = {
443
- RACY_PROJECTION_WINDOW_MS,
444
- decideWorkspaceHydrationMerge,
445
- describeHydrationSkipPaths,
446
- parseWorkspaceSubtreeChanges,
447
- readHydrationBinaryPaths
448
- });
@@ -1,53 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var workspace_hydration_recovery_state_exports = {};
20
- __export(workspace_hydration_recovery_state_exports, {
21
- findHydrationRecovery: () => findHydrationRecovery
22
- });
23
- module.exports = __toCommonJS(workspace_hydration_recovery_state_exports);
24
- function findHydrationRecovery(error) {
25
- const pending = [error];
26
- const seen = /* @__PURE__ */ new Set();
27
- while (pending.length) {
28
- const candidate = pending.pop();
29
- if (!candidate || typeof candidate !== "object" || seen.has(candidate)) continue;
30
- seen.add(candidate);
31
- const record = candidate;
32
- if (record.code === "hydration_recovery_required" && record.hydrationRecovery && typeof record.hydrationRecovery === "object") {
33
- const evidence = record.hydrationRecovery;
34
- if (typeof evidence.transactionId === "string" && typeof evidence.transactionPath === "string" && Array.isArray(evidence.mounts)) {
35
- const retainedPaths = [...new Set(evidence.mounts.flatMap((mount) => mount.retainedPaths ?? []))];
36
- return {
37
- transactionId: evidence.transactionId,
38
- transactionPath: evidence.transactionPath,
39
- mountIds: evidence.mounts.map(({ id }) => id),
40
- previousHeads: Object.fromEntries((evidence.receiptBefore?.mounts ?? []).map(({ id, head }) => [id, head])),
41
- ...retainedPaths.length > 0 ? { retainedPaths } : {}
42
- };
43
- }
44
- }
45
- pending.push(record.cause);
46
- if (Array.isArray(record.errors)) pending.push(...record.errors);
47
- }
48
- return void 0;
49
- }
50
- // Annotate the CommonJS export names for ESM import in node:
51
- 0 && (module.exports = {
52
- findHydrationRecovery
53
- });
@@ -1,37 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var workspace_incident_state_exports = {};
20
- __export(workspace_incident_state_exports, {
21
- applyWorkspaceIncidentUpdate: () => applyWorkspaceIncidentUpdate,
22
- workspaceConfigurationRefreshesDeferredConfiguration: () => workspaceConfigurationRefreshesDeferredConfiguration
23
- });
24
- module.exports = __toCommonJS(workspace_incident_state_exports);
25
- function applyWorkspaceIncidentUpdate(currentIncidentId, update) {
26
- if (update.status === "remediating" || update.status === "waiting_for_worker") return update.incidentId;
27
- if (currentIncidentId && update.incidentId && update.incidentId !== currentIncidentId) return currentIncidentId;
28
- return null;
29
- }
30
- function workspaceConfigurationRefreshesDeferredConfiguration(input) {
31
- return input.deferredIncidentId !== null && input.activeIncidentId === null && input.requestedDeferredIncidentId === void 0;
32
- }
33
- // Annotate the CommonJS export names for ESM import in node:
34
- 0 && (module.exports = {
35
- applyWorkspaceIncidentUpdate,
36
- workspaceConfigurationRefreshesDeferredConfiguration
37
- });