@amalgm/shell 0.1.164-preview.36072132286 → 0.1.164-preview.36809057014

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 (475) hide show
  1. package/PURPOSE.md +642 -128
  2. package/README.md +10 -8
  3. package/dist/accepted-tail.d.ts +26 -0
  4. package/dist/accepted-tail.js +37 -0
  5. package/dist/accepted-tail.js.map +1 -0
  6. package/dist/agent-execution.d.ts +16 -1
  7. package/dist/agent-execution.js +13 -5
  8. package/dist/agent-execution.js.map +1 -1
  9. package/dist/apply-cleanup.d.ts +28 -0
  10. package/dist/apply-cleanup.js +166 -0
  11. package/dist/apply-cleanup.js.map +1 -0
  12. package/dist/apply-recovery.d.ts +47 -0
  13. package/dist/apply-recovery.js +99 -0
  14. package/dist/apply-recovery.js.map +1 -0
  15. package/dist/apply-rows.d.ts +72 -0
  16. package/dist/apply-rows.js +150 -0
  17. package/dist/apply-rows.js.map +1 -0
  18. package/dist/apply-saves.d.ts +85 -0
  19. package/dist/apply-saves.js +238 -0
  20. package/dist/apply-saves.js.map +1 -0
  21. package/dist/boot.js +2 -1
  22. package/dist/boot.js.map +1 -1
  23. package/dist/capture-work.d.ts +8 -0
  24. package/dist/capture-work.js +67 -0
  25. package/dist/capture-work.js.map +1 -0
  26. package/dist/cargo-group.d.ts +45 -0
  27. package/dist/cargo-group.js +88 -0
  28. package/dist/cargo-group.js.map +1 -0
  29. package/dist/channel-session.d.ts +4 -2
  30. package/dist/channel-session.js +4 -3
  31. package/dist/channel-session.js.map +1 -1
  32. package/dist/chat-composition.d.ts +2 -0
  33. package/dist/chat-composition.js +1 -0
  34. package/dist/chat-composition.js.map +1 -1
  35. package/dist/cli.js +20 -1
  36. package/dist/cli.js.map +1 -1
  37. package/dist/construct-apply-host.d.ts +4 -2
  38. package/dist/construct-apply-host.js +8 -3
  39. package/dist/construct-apply-host.js.map +1 -1
  40. package/dist/construct-door.js +1 -1
  41. package/dist/construct-door.js.map +1 -1
  42. package/dist/construct-ledger.d.ts +6 -1
  43. package/dist/construct-ledger.js +21 -33
  44. package/dist/construct-ledger.js.map +1 -1
  45. package/dist/content-cache-collection.d.ts +18 -0
  46. package/dist/content-cache-collection.js +99 -0
  47. package/dist/content-cache-collection.js.map +1 -0
  48. package/dist/content-cache-host.d.ts +83 -17
  49. package/dist/content-cache-host.js +335 -95
  50. package/dist/content-cache-host.js.map +1 -1
  51. package/dist/content-cache-namespace.d.ts +59 -0
  52. package/dist/content-cache-namespace.js +210 -0
  53. package/dist/content-cache-namespace.js.map +1 -0
  54. package/dist/content-cache-ownership.d.ts +13 -0
  55. package/dist/content-cache-ownership.js +75 -0
  56. package/dist/content-cache-ownership.js.map +1 -0
  57. package/dist/content-cache-retention.d.ts +23 -0
  58. package/dist/content-cache-retention.js +195 -0
  59. package/dist/content-cache-retention.js.map +1 -0
  60. package/dist/content-capture-pool.d.ts +287 -0
  61. package/dist/content-capture-pool.js +461 -0
  62. package/dist/content-capture-pool.js.map +1 -0
  63. package/dist/content-capture-worker.d.ts +8 -0
  64. package/dist/content-capture-worker.js +109 -0
  65. package/dist/content-capture-worker.js.map +1 -0
  66. package/dist/content-clock.d.ts +42 -0
  67. package/dist/content-clock.js +166 -0
  68. package/dist/content-clock.js.map +1 -0
  69. package/dist/content-direct.d.ts +2 -0
  70. package/dist/content-direct.js +12 -0
  71. package/dist/content-direct.js.map +1 -1
  72. package/dist/content-failure.d.ts +18 -0
  73. package/dist/content-failure.js +38 -0
  74. package/dist/content-failure.js.map +1 -0
  75. package/dist/content-stream-thread.d.ts +60 -0
  76. package/dist/content-stream-thread.js +95 -0
  77. package/dist/content-stream-thread.js.map +1 -0
  78. package/dist/content-stream-worker.d.ts +7 -0
  79. package/dist/content-stream-worker.js +52 -0
  80. package/dist/content-stream-worker.js.map +1 -0
  81. package/dist/declaration-absorption.d.ts +37 -0
  82. package/dist/declaration-absorption.js +119 -0
  83. package/dist/declaration-absorption.js.map +1 -0
  84. package/dist/declaration-chain.d.ts +36 -0
  85. package/dist/declaration-chain.js +96 -0
  86. package/dist/declaration-chain.js.map +1 -0
  87. package/dist/declaration-commit.d.ts +31 -0
  88. package/dist/declaration-commit.js +49 -0
  89. package/dist/declaration-commit.js.map +1 -0
  90. package/dist/declaration-hold.d.ts +22 -0
  91. package/dist/declaration-hold.js +24 -0
  92. package/dist/declaration-hold.js.map +1 -0
  93. package/dist/declaration-journal.d.ts +62 -0
  94. package/dist/declaration-journal.js +99 -0
  95. package/dist/declaration-journal.js.map +1 -0
  96. package/dist/declaration-save.d.ts +31 -0
  97. package/dist/declaration-save.js +134 -0
  98. package/dist/declaration-save.js.map +1 -0
  99. package/dist/detection/accepted-result.d.ts +19 -1
  100. package/dist/detection/accepted-result.js +36 -5
  101. package/dist/detection/accepted-result.js.map +1 -1
  102. package/dist/detection/admission-save.d.ts +55 -0
  103. package/dist/detection/admission-save.js +48 -0
  104. package/dist/detection/admission-save.js.map +1 -0
  105. package/dist/detection/admission-units.d.ts +66 -0
  106. package/dist/detection/admission-units.js +322 -0
  107. package/dist/detection/admission-units.js.map +1 -0
  108. package/dist/detection/alias-discovery.d.ts +12 -0
  109. package/dist/detection/alias-discovery.js +80 -0
  110. package/dist/detection/alias-discovery.js.map +1 -0
  111. package/dist/detection/alias-examination.d.ts +30 -0
  112. package/dist/detection/alias-examination.js +49 -0
  113. package/dist/detection/alias-examination.js.map +1 -0
  114. package/dist/detection/apply-ownership.d.ts +81 -0
  115. package/dist/detection/apply-ownership.js +232 -0
  116. package/dist/detection/apply-ownership.js.map +1 -0
  117. package/dist/detection/basis-advanced.d.ts +11 -0
  118. package/dist/detection/basis-advanced.js +26 -0
  119. package/dist/detection/basis-advanced.js.map +1 -0
  120. package/dist/detection/capture-outcome.d.ts +16 -0
  121. package/dist/detection/capture-outcome.js +92 -0
  122. package/dist/detection/capture-outcome.js.map +1 -0
  123. package/dist/detection/container-membership.d.ts +32 -0
  124. package/dist/detection/container-membership.js +49 -0
  125. package/dist/detection/container-membership.js.map +1 -0
  126. package/dist/detection/detect-cancelled.d.ts +6 -0
  127. package/dist/detection/detect-cancelled.js +10 -0
  128. package/dist/detection/detect-cancelled.js.map +1 -0
  129. package/dist/detection/directory-proof.d.ts +47 -0
  130. package/dist/detection/directory-proof.js +77 -0
  131. package/dist/detection/directory-proof.js.map +1 -0
  132. package/dist/detection/disposition-rows.d.ts +18 -0
  133. package/dist/detection/disposition-rows.js +29 -0
  134. package/dist/detection/disposition-rows.js.map +1 -0
  135. package/dist/detection/dispositions.d.ts +130 -0
  136. package/dist/detection/dispositions.js +248 -0
  137. package/dist/detection/dispositions.js.map +1 -0
  138. package/dist/detection/git-notice.d.ts +88 -0
  139. package/dist/detection/git-notice.js +444 -0
  140. package/dist/detection/git-notice.js.map +1 -0
  141. package/dist/detection/ground-proof.d.ts +130 -0
  142. package/dist/detection/ground-proof.js +274 -0
  143. package/dist/detection/ground-proof.js.map +1 -0
  144. package/dist/detection/ground-reader.d.ts +29 -0
  145. package/dist/detection/ground-reader.js +102 -0
  146. package/dist/detection/ground-reader.js.map +1 -0
  147. package/dist/detection/held-territory.d.ts +51 -0
  148. package/dist/detection/held-territory.js +205 -0
  149. package/dist/detection/held-territory.js.map +1 -0
  150. package/dist/detection/identity-discovery.d.ts +45 -0
  151. package/dist/detection/identity-discovery.js +287 -0
  152. package/dist/detection/identity-discovery.js.map +1 -0
  153. package/dist/detection/maintenance-sweep.d.ts +108 -0
  154. package/dist/detection/maintenance-sweep.js +325 -0
  155. package/dist/detection/maintenance-sweep.js.map +1 -0
  156. package/dist/detection/name-reach.d.ts +12 -0
  157. package/dist/detection/name-reach.js +28 -0
  158. package/dist/detection/name-reach.js.map +1 -0
  159. package/dist/detection/notebook-basis.d.ts +5 -7
  160. package/dist/detection/notebook-basis.js +6 -7
  161. package/dist/detection/notebook-basis.js.map +1 -1
  162. package/dist/detection/owed-selection.d.ts +51 -0
  163. package/dist/detection/owed-selection.js +169 -0
  164. package/dist/detection/owed-selection.js.map +1 -0
  165. package/dist/detection/portable.d.ts +34 -34
  166. package/dist/detection/portable.js +67 -93
  167. package/dist/detection/portable.js.map +1 -1
  168. package/dist/detection/reconciliation-coverage.d.ts +7 -0
  169. package/dist/detection/reconciliation-coverage.js +16 -0
  170. package/dist/detection/reconciliation-coverage.js.map +1 -0
  171. package/dist/detection/repository-publication.d.ts +20 -0
  172. package/dist/detection/repository-publication.js +79 -0
  173. package/dist/detection/repository-publication.js.map +1 -0
  174. package/dist/detection/repository-routes.d.ts +43 -0
  175. package/dist/detection/repository-routes.js +97 -0
  176. package/dist/detection/repository-routes.js.map +1 -0
  177. package/dist/detection/root-examination.d.ts +94 -0
  178. package/dist/detection/root-examination.js +523 -0
  179. package/dist/detection/root-examination.js.map +1 -0
  180. package/dist/detection/runtime.d.ts +131 -64
  181. package/dist/detection/runtime.js +808 -1103
  182. package/dist/detection/runtime.js.map +1 -1
  183. package/dist/detection/scoped-identity-port.d.ts +34 -0
  184. package/dist/detection/scoped-identity-port.js +81 -0
  185. package/dist/detection/scoped-identity-port.js.map +1 -0
  186. package/dist/detection/seal-law.d.ts +66 -0
  187. package/dist/detection/seal-law.js +116 -0
  188. package/dist/detection/seal-law.js.map +1 -0
  189. package/dist/detection/sharing-policy.d.ts +11 -0
  190. package/dist/detection/sharing-policy.js +32 -0
  191. package/dist/detection/sharing-policy.js.map +1 -0
  192. package/dist/detection/thread-database.d.ts +4 -0
  193. package/dist/detection/thread-database.js +30 -0
  194. package/dist/detection/thread-database.js.map +1 -0
  195. package/dist/detection/unreadable.d.ts +11 -0
  196. package/dist/detection/unreadable.js +9 -0
  197. package/dist/detection/unreadable.js.map +1 -0
  198. package/dist/detection/verified-content.d.ts +6 -0
  199. package/dist/detection/verified-content.js +12 -0
  200. package/dist/detection/verified-content.js.map +1 -0
  201. package/dist/detection/walk-law.d.ts +34 -0
  202. package/dist/detection/walk-law.js +55 -0
  203. package/dist/detection/walk-law.js.map +1 -0
  204. package/dist/development/fly-guest.js +2 -1
  205. package/dist/development/fly-guest.js.map +1 -1
  206. package/dist/entity-apply-host.d.ts +29 -13
  207. package/dist/entity-apply-host.js +1426 -461
  208. package/dist/entity-apply-host.js.map +1 -1
  209. package/dist/entity-apply-store.d.ts +77 -30
  210. package/dist/entity-apply-store.js +221 -516
  211. package/dist/entity-apply-store.js.map +1 -1
  212. package/dist/entity-record-observability.js +2 -0
  213. package/dist/entity-record-observability.js.map +1 -1
  214. package/dist/entity-record-saves.d.ts +20 -0
  215. package/dist/entity-record-saves.js +91 -0
  216. package/dist/entity-record-saves.js.map +1 -0
  217. package/dist/entity-record-store.d.ts +15 -7
  218. package/dist/entity-record-store.js +57 -117
  219. package/dist/entity-record-store.js.map +1 -1
  220. package/dist/files-register-host.d.ts +22 -3
  221. package/dist/files-register-host.js +70 -31
  222. package/dist/files-register-host.js.map +1 -1
  223. package/dist/filesystem.js +3 -2
  224. package/dist/filesystem.js.map +1 -1
  225. package/dist/git-binding.d.ts +65 -0
  226. package/dist/git-binding.js +220 -0
  227. package/dist/git-binding.js.map +1 -0
  228. package/dist/git-capture.d.ts +39 -0
  229. package/dist/git-capture.js +86 -0
  230. package/dist/git-capture.js.map +1 -0
  231. package/dist/git-card.d.ts +12 -0
  232. package/dist/git-card.js +123 -0
  233. package/dist/git-card.js.map +1 -0
  234. package/dist/git-checkpoint-construction.d.ts +41 -0
  235. package/dist/git-checkpoint-construction.js +96 -0
  236. package/dist/git-checkpoint-construction.js.map +1 -0
  237. package/dist/git-checkpoint-preparation.d.ts +37 -0
  238. package/dist/git-checkpoint-preparation.js +145 -0
  239. package/dist/git-checkpoint-preparation.js.map +1 -0
  240. package/dist/git-command.d.ts +61 -8
  241. package/dist/git-command.js +217 -63
  242. package/dist/git-command.js.map +1 -1
  243. package/dist/git-configuration.d.ts +40 -0
  244. package/dist/git-configuration.js +217 -0
  245. package/dist/git-configuration.js.map +1 -0
  246. package/dist/git-evidence.d.ts +61 -0
  247. package/dist/git-evidence.js +181 -0
  248. package/dist/git-evidence.js.map +1 -0
  249. package/dist/git-index-entries.d.ts +15 -0
  250. package/dist/git-index-entries.js +44 -0
  251. package/dist/git-index-entries.js.map +1 -0
  252. package/dist/git-index-format.d.ts +35 -0
  253. package/dist/git-index-format.js +293 -0
  254. package/dist/git-index-format.js.map +1 -0
  255. package/dist/git-index-witness.d.ts +33 -0
  256. package/dist/git-index-witness.js +69 -0
  257. package/dist/git-index-witness.js.map +1 -0
  258. package/dist/git-literal-host.d.ts +82 -0
  259. package/dist/git-literal-host.js +172 -0
  260. package/dist/git-literal-host.js.map +1 -0
  261. package/dist/git-literal-read.d.ts +88 -0
  262. package/dist/git-literal-read.js +170 -0
  263. package/dist/git-literal-read.js.map +1 -0
  264. package/dist/git-literal-replay.d.ts +33 -0
  265. package/dist/git-literal-replay.js +268 -0
  266. package/dist/git-literal-replay.js.map +1 -0
  267. package/dist/git-native-file.d.ts +42 -0
  268. package/dist/git-native-file.js +145 -0
  269. package/dist/git-native-file.js.map +1 -0
  270. package/dist/git-native-index.d.ts +21 -0
  271. package/dist/git-native-index.js +44 -0
  272. package/dist/git-native-index.js.map +1 -0
  273. package/dist/git-operation-host.d.ts +48 -0
  274. package/dist/git-operation-host.js +127 -0
  275. package/dist/git-operation-host.js.map +1 -0
  276. package/dist/git-private-index.d.ts +11 -0
  277. package/dist/git-private-index.js +42 -0
  278. package/dist/git-private-index.js.map +1 -0
  279. package/dist/git-private-repository.d.ts +4 -0
  280. package/dist/git-private-repository.js +69 -0
  281. package/dist/git-private-repository.js.map +1 -0
  282. package/dist/git-private-view.d.ts +39 -0
  283. package/dist/git-private-view.js +162 -0
  284. package/dist/git-private-view.js.map +1 -0
  285. package/dist/git-ref-store.d.ts +12 -0
  286. package/dist/git-ref-store.js +68 -0
  287. package/dist/git-ref-store.js.map +1 -0
  288. package/dist/git-registration-host.d.ts +20 -30
  289. package/dist/git-registration-host.js +86 -249
  290. package/dist/git-registration-host.js.map +1 -1
  291. package/dist/git-repository-host.d.ts +148 -22
  292. package/dist/git-repository-host.js +633 -650
  293. package/dist/git-repository-host.js.map +1 -1
  294. package/dist/git-worktree-host.d.ts +2 -0
  295. package/dist/git-worktree-host.js +16 -0
  296. package/dist/git-worktree-host.js.map +1 -0
  297. package/dist/graph-publication.d.ts +75 -0
  298. package/dist/graph-publication.js +203 -0
  299. package/dist/graph-publication.js.map +1 -0
  300. package/dist/ground-basis.d.ts +242 -0
  301. package/dist/ground-basis.js +1023 -0
  302. package/dist/ground-basis.js.map +1 -0
  303. package/dist/ground-checkpoint-worker.d.ts +1 -0
  304. package/dist/ground-checkpoint-worker.js +84 -0
  305. package/dist/ground-checkpoint-worker.js.map +1 -0
  306. package/dist/ground-checkpoints.d.ts +16 -0
  307. package/dist/ground-checkpoints.js +45 -0
  308. package/dist/ground-checkpoints.js.map +1 -0
  309. package/dist/ground-coordination.d.ts +107 -3
  310. package/dist/ground-coordination.js +249 -24
  311. package/dist/ground-coordination.js.map +1 -1
  312. package/dist/ground-database.d.ts +42 -0
  313. package/dist/ground-database.js +290 -0
  314. package/dist/ground-database.js.map +1 -0
  315. package/dist/ground-differences.d.ts +23 -0
  316. package/dist/ground-differences.js +47 -0
  317. package/dist/ground-differences.js.map +1 -0
  318. package/dist/ground-holders.d.ts +4 -0
  319. package/dist/ground-holders.js +15 -0
  320. package/dist/ground-holders.js.map +1 -0
  321. package/dist/ground-initialization-worker.d.ts +1 -0
  322. package/dist/ground-initialization-worker.js +20 -0
  323. package/dist/ground-initialization-worker.js.map +1 -0
  324. package/dist/ground-initialization.d.ts +35 -0
  325. package/dist/ground-initialization.js +102 -0
  326. package/dist/ground-initialization.js.map +1 -0
  327. package/dist/ground-install-saves.d.ts +63 -0
  328. package/dist/ground-install-saves.js +139 -0
  329. package/dist/ground-install-saves.js.map +1 -0
  330. package/dist/ground-inventory-schema.d.ts +18 -0
  331. package/dist/ground-inventory-schema.js +168 -0
  332. package/dist/ground-inventory-schema.js.map +1 -0
  333. package/dist/ground-profile.d.ts +7 -0
  334. package/dist/ground-profile.js +52 -0
  335. package/dist/ground-profile.js.map +1 -0
  336. package/dist/ground-root-index.d.ts +2 -1
  337. package/dist/ground-root-index.js +16 -14
  338. package/dist/ground-root-index.js.map +1 -1
  339. package/dist/ground-row.d.ts +62 -0
  340. package/dist/ground-row.js +70 -0
  341. package/dist/ground-row.js.map +1 -0
  342. package/dist/ground-save-ops.d.ts +44 -0
  343. package/dist/ground-save-ops.js +41 -0
  344. package/dist/ground-save-ops.js.map +1 -0
  345. package/dist/ground-saver-worker.d.ts +1 -0
  346. package/dist/ground-saver-worker.js +156 -0
  347. package/dist/ground-saver-worker.js.map +1 -0
  348. package/dist/ground-saver.d.ts +75 -0
  349. package/dist/ground-saver.js +216 -0
  350. package/dist/ground-saver.js.map +1 -0
  351. package/dist/ground-store.d.ts +84 -0
  352. package/dist/ground-store.js +473 -0
  353. package/dist/ground-store.js.map +1 -0
  354. package/dist/ground-territory.d.ts +130 -0
  355. package/dist/ground-territory.js +511 -0
  356. package/dist/ground-territory.js.map +1 -0
  357. package/dist/index.d.ts +1 -1
  358. package/dist/index.js.map +1 -1
  359. package/dist/installation/ownership.d.ts +0 -2
  360. package/dist/installation/ownership.js +3 -15
  361. package/dist/installation/ownership.js.map +1 -1
  362. package/dist/machine-host.d.ts +3 -2
  363. package/dist/machine-host.js +28 -16
  364. package/dist/machine-host.js.map +1 -1
  365. package/dist/materialized-graph.d.ts +7 -7
  366. package/dist/materialized-graph.js +11 -23
  367. package/dist/materialized-graph.js.map +1 -1
  368. package/dist/module-thread.d.ts +9 -0
  369. package/dist/module-thread.js +10 -0
  370. package/dist/module-thread.js.map +1 -0
  371. package/dist/native/fsevents-stream.node +0 -0
  372. package/dist/physical-path-witness.d.ts +64 -0
  373. package/dist/physical-path-witness.js +168 -0
  374. package/dist/physical-path-witness.js.map +1 -0
  375. package/dist/register-upload-fusion.d.ts +5 -4
  376. package/dist/register-upload-fusion.js +9 -6
  377. package/dist/register-upload-fusion.js.map +1 -1
  378. package/dist/registry-graph.d.ts +3 -2
  379. package/dist/registry-graph.js +9 -6
  380. package/dist/registry-graph.js.map +1 -1
  381. package/dist/registry-page-cache.d.ts +5 -2
  382. package/dist/registry-page-cache.js.map +1 -1
  383. package/dist/repository-identity-steps.d.ts +5 -0
  384. package/dist/repository-identity-steps.js +33 -0
  385. package/dist/repository-identity-steps.js.map +1 -0
  386. package/dist/runtime-node-flags.d.ts +10 -0
  387. package/dist/runtime-node-flags.js +11 -0
  388. package/dist/runtime-node-flags.js.map +1 -0
  389. package/dist/service/adapter.d.ts +1 -1
  390. package/dist/service/adapter.js +1 -1
  391. package/dist/service/adapter.js.map +1 -1
  392. package/dist/service/cli.js +16 -20
  393. package/dist/service/cli.js.map +1 -1
  394. package/dist/service/control.d.ts +2 -2
  395. package/dist/service/keepalive.d.ts +4 -11
  396. package/dist/service/keepalive.js +65 -118
  397. package/dist/service/keepalive.js.map +1 -1
  398. package/dist/service/policy.d.ts +36 -0
  399. package/dist/service/policy.js +25 -0
  400. package/dist/service/policy.js.map +1 -0
  401. package/dist/service/portable.d.ts +1 -1
  402. package/dist/service/portable.js +1 -1
  403. package/dist/service/portable.js.map +1 -1
  404. package/dist/service/recovery.d.ts +10 -9
  405. package/dist/service/recovery.js +29 -19
  406. package/dist/service/recovery.js.map +1 -1
  407. package/dist/service/windows-action.d.ts +5 -3
  408. package/dist/service/windows-action.js +6 -9
  409. package/dist/service/windows-action.js.map +1 -1
  410. package/dist/service/windows-task.js +5 -5
  411. package/dist/service/windows-task.js.map +1 -1
  412. package/dist/sharing-admission.d.ts +17 -0
  413. package/dist/sharing-admission.js +128 -0
  414. package/dist/sharing-admission.js.map +1 -0
  415. package/dist/snapshot-delivery-baseline.d.ts +12 -3
  416. package/dist/snapshot-delivery-baseline.js +41 -42
  417. package/dist/snapshot-delivery-baseline.js.map +1 -1
  418. package/dist/source-proof.d.ts +36 -0
  419. package/dist/source-proof.js +70 -0
  420. package/dist/source-proof.js.map +1 -0
  421. package/dist/source-signature.d.ts +56 -0
  422. package/dist/source-signature.js +56 -0
  423. package/dist/source-signature.js.map +1 -0
  424. package/dist/source-witness.d.ts +15 -0
  425. package/dist/source-witness.js +29 -0
  426. package/dist/source-witness.js.map +1 -0
  427. package/dist/sqlite-durability.d.ts +31 -0
  428. package/dist/sqlite-durability.js +28 -0
  429. package/dist/sqlite-durability.js.map +1 -0
  430. package/dist/sqlite.d.ts +8 -2
  431. package/dist/sqlite.js +27 -4
  432. package/dist/sqlite.js.map +1 -1
  433. package/dist/sync-address.d.ts +19 -0
  434. package/dist/sync-address.js +52 -0
  435. package/dist/sync-address.js.map +1 -0
  436. package/dist/sync-setting.d.ts +15 -0
  437. package/dist/sync-setting.js +13 -0
  438. package/dist/sync-setting.js.map +1 -1
  439. package/dist/turns.d.ts +42 -0
  440. package/dist/turns.js +112 -0
  441. package/dist/turns.js.map +1 -0
  442. package/dist/updates/bootstrap.d.ts +53 -7
  443. package/dist/updates/bootstrap.js +224 -137
  444. package/dist/updates/bootstrap.js.map +1 -1
  445. package/dist/updates/controller.d.ts +8 -0
  446. package/dist/updates/controller.js +27 -3
  447. package/dist/updates/controller.js.map +1 -1
  448. package/dist/updates/store.d.ts +3 -0
  449. package/dist/updates/store.js +12 -0
  450. package/dist/updates/store.js.map +1 -1
  451. package/dist/user-ground-host.d.ts +364 -69
  452. package/dist/user-ground-host.js +5231 -3366
  453. package/dist/user-ground-host.js.map +1 -1
  454. package/dist/watching/fsevents.d.ts +52 -1
  455. package/dist/watching/fsevents.js +60 -25
  456. package/dist/watching/fsevents.js.map +1 -1
  457. package/dist/watching/host.d.ts +129 -5
  458. package/dist/watching/host.js +433 -80
  459. package/dist/watching/host.js.map +1 -1
  460. package/dist/watching/index.d.ts +1 -1
  461. package/dist/wire-binary.d.ts +3 -2
  462. package/dist/wire-binary.js +10 -8
  463. package/dist/wire-binary.js.map +1 -1
  464. package/dist/wire-client.d.ts +3 -4
  465. package/dist/wire-client.js +18 -44
  466. package/dist/wire-client.js.map +1 -1
  467. package/dist/wire-outbox.d.ts +34 -0
  468. package/dist/wire-outbox.js +127 -0
  469. package/dist/wire-outbox.js.map +1 -0
  470. package/dist/workspace-host.d.ts +4 -0
  471. package/dist/workspace-host.js +12 -1
  472. package/dist/workspace-host.js.map +1 -1
  473. package/examinations/fixtures/private-wire-authority.js +133 -10
  474. package/npm-shrinkwrap.json +43 -56
  475. package/package.json +26 -13
@@ -0,0 +1,127 @@
1
+ /** Git continuation state in a repository's own Git directory, read natively.
2
+ * Capture, Apply and seal eligibility share this one classification: what
3
+ * the portable Checkpoint carries (an unfinished merge), what it cannot
4
+ * reproduce, and an Amalgm reveal in progress. */
5
+ import { existsSync, lstatSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { CaptureSourceChangedError } from './content-cache-host.js';
8
+ import { gitCommonDirectory, gitStorageDirectory } from './git-binding.js';
9
+ export const UNSUPPORTED_GIT_OPERATIONS = [
10
+ ['rebase-merge', 'rebase'], ['rebase-apply', 'rebase'],
11
+ ['CHERRY_PICK_HEAD', 'cherry-pick'], ['REVERT_HEAD', 'revert'],
12
+ ['sequencer', 'cherry-pick or revert sequence'], ['MERGE_AUTOSTASH', 'merge with an autostash'],
13
+ ];
14
+ /** An Amalgm reveal rewrites a repository in place over several Git
15
+ * invocations. Like MERGE_HEAD, this file in the Git directory says the
16
+ * repository is mid-operation: capture refuses it (so Detect never records a
17
+ * torn moment as truth, and retries once it settles), while the reveal that
18
+ * owns it resumes from whatever state an interruption left behind. */
19
+ export const REVEAL_MARKER = 'amalgm-reveal';
20
+ export function unsupportedGitOperation(gitDirectory) {
21
+ return UNSUPPORTED_GIT_OPERATIONS.find(([marker]) => existsSync(join(gitDirectory, marker)))?.[1] ?? null;
22
+ }
23
+ export class UnsupportedGitOperationError extends Error {
24
+ operation;
25
+ code = 'UNSUPPORTED_GIT_OPERATION';
26
+ constructor(operation) {
27
+ super(`Live cannot reproduce an unfinished ${operation}. Continue or abort that Git operation before syncing this checkout.`);
28
+ this.operation = operation;
29
+ }
30
+ }
31
+ function optionalGitFile(directory, name) {
32
+ try {
33
+ return readFileSync(join(directory, name));
34
+ }
35
+ catch (error) {
36
+ if (error.code === 'ENOENT')
37
+ return Buffer.alloc(0);
38
+ throw error;
39
+ }
40
+ }
41
+ /** The unfinished merge the Checkpoint carries, or null. */
42
+ export function mergeOperation(directory) {
43
+ const heads = optionalGitFile(directory, 'MERGE_HEAD').toString('utf8')
44
+ .split(/\r?\n/).filter(Boolean);
45
+ if (heads.length === 0)
46
+ return null;
47
+ if (heads.some((head) => !/^[0-9a-f]{40}([0-9a-f]{24})?$/.test(head))) {
48
+ throw new Error('repository has an invalid MERGE_HEAD');
49
+ }
50
+ return {
51
+ kind: 'merge',
52
+ heads,
53
+ message: optionalGitFile(directory, 'MERGE_MSG'),
54
+ mode: optionalGitFile(directory, 'MERGE_MODE'),
55
+ };
56
+ }
57
+ /** The marker that makes this moment unrecordable: an operation the
58
+ * Checkpoint cannot carry throws; another owner's reveal is named. Git's
59
+ * locks are not such markers. They exclude Git's writers, never its readers:
60
+ * the committed index stays whole while a lock exists, a rename that lands
61
+ * during a capture fails its witnesses, and a lock a dead Git left behind
62
+ * says nothing at all. A live lock says only when to read: see
63
+ * `gitWriterLock`. */
64
+ export function busyMarker(directory, ownReveal) {
65
+ const unsupported = unsupportedGitOperation(directory);
66
+ if (unsupported)
67
+ throw new UnsupportedGitOperationError(unsupported);
68
+ return !ownReveal && existsSync(join(directory, REVEAL_MARKER)) ? REVEAL_MARKER : null;
69
+ }
70
+ /** Git replaces a control file by writing `<name>.lock` beside it and then
71
+ * renaming it into place, or unlinking it if the write fails; either end
72
+ * rings Watch. The storage directory holds each checkout's own files, and
73
+ * the common directory the files its worktrees share. */
74
+ const GIT_WRITER_LOCKS = [
75
+ ['storage', 'index.lock'], ['storage', 'HEAD.lock'],
76
+ ['common', 'config.lock'], ['common', 'packed-refs.lock'], ['common', 'shallow.lock'],
77
+ ];
78
+ /** How long a lock may still be a writer rewriting the repository: what the
79
+ * one-second Git budget leaves once the held repository's own read, an
80
+ * ordinary read with its 250 ms budget, is paid. A lock that has held Detect
81
+ * back that long holds nothing more. Its writer is waiting on a person, as a
82
+ * commit editor does, or has died, and neither moves ground. */
83
+ const GIT_WRITER_SETTLE_MS = 750;
84
+ /** The lock a live Git writer holds in this checkout's storage, or null. A
85
+ * rung reader waits for that lock's release ring, since a read taken while
86
+ * the writer works would only be invalidated by its commit. A stale lock
87
+ * never rings, so the wait also ends when the last live lock stops holding;
88
+ * an older lock holds nothing, and the witnesses judge whatever is read
89
+ * through it. A lock that cannot be read is no evidence of a writer: the
90
+ * capture meets whatever made it unreadable. */
91
+ export function gitWriterLock(repository) {
92
+ const now = Date.now();
93
+ let held = null;
94
+ try {
95
+ const storage = gitStorageDirectory(repository).directory;
96
+ const directories = { storage, common: gitCommonDirectory(storage) };
97
+ for (const [place, name] of GIT_WRITER_LOCKS) {
98
+ const lock = lstatSync(join(directories[place], name), { throwIfNoEntry: false });
99
+ // Either side of now: a file time and the clock round differently.
100
+ if (!lock || Math.abs(now - lock.mtimeMs) >= GIT_WRITER_SETTLE_MS)
101
+ continue;
102
+ const settlesInMs = Math.ceil(GIT_WRITER_SETTLE_MS - (now - lock.mtimeMs));
103
+ if (held === null || settlesInMs > held.settlesInMs)
104
+ held = { name, settlesInMs };
105
+ }
106
+ }
107
+ catch { /* no readable storage: no evidence of a writer */ }
108
+ return held;
109
+ }
110
+ export const gitOperationWitness = (directory, ownReveal, operation) => Object.freeze({ kind: 'git-operation', directory, ownReveal, operation: JSON.stringify(operation) });
111
+ /** A marker that appeared since capture changed the moment the capture
112
+ * describes; the next capture classifies it. */
113
+ export function judgeGitOperation(witness) {
114
+ let busy;
115
+ try {
116
+ busy = busyMarker(witness.directory, witness.ownReveal) !== null;
117
+ }
118
+ catch (error) {
119
+ if (!(error instanceof UnsupportedGitOperationError))
120
+ throw error;
121
+ busy = true;
122
+ }
123
+ if (busy || JSON.stringify(mergeOperation(witness.directory)) !== witness.operation) {
124
+ throw new CaptureSourceChangedError('repository Git basis changed after capture');
125
+ }
126
+ }
127
+ //# sourceMappingURL=git-operation-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-operation-host.js","sourceRoot":"","sources":["../src/git-operation-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class PrivateNativeIndex {
2
+ #private;
3
+ private constructor();
4
+ /** `files` are the index and its shared base, by the names Git reads them under. */
5
+ static create(format: "sha1" | "sha256", files: ReadonlyMap<string, Buffer>, closing: boolean): Promise<PrivateNativeIndex>;
6
+ /** A worktree command runs in its worktree, so one that emptied fails as
7
+ * that address's absence (git-command.ts). */
8
+ untracked(repository: string, paths: readonly string[] | null): Promise<Buffer>;
9
+ /** Callers retire the view only once its Git children have exited. */
10
+ close(): Promise<void>;
11
+ }
@@ -0,0 +1,42 @@
1
+ /** Git lists untracked names over copied native index bytes, without source
2
+ * objects or settings. Every file effect is asynchronous: an index can be
3
+ * many megabytes, and its directory is retired only after every Git child
4
+ * over it has exited. */
5
+ import { rm, writeFile } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { runGit } from "./git-command.js";
8
+ import { createPrivateRepository } from "./git-private-repository.js";
9
+ const PROFILE = Object.freeze({ LC_ALL: "C" });
10
+ export class PrivateNativeIndex {
11
+ #directory;
12
+ #closing;
13
+ constructor(directory, closing) {
14
+ this.#directory = directory;
15
+ this.#closing = closing;
16
+ }
17
+ /** `files` are the index and its shared base, by the names Git reads them under. */
18
+ static async create(format, files, closing) {
19
+ const view = new PrivateNativeIndex(await createPrivateRepository("amalgm-git-index-", format), closing);
20
+ try {
21
+ // Every write settles before a failure retires the directory under it.
22
+ const written = await Promise.allSettled([...files].map(([name, bytes]) => writeFile(join(view.#directory, name), bytes)));
23
+ const failed = written.find((outcome) => outcome.status === "rejected");
24
+ if (failed)
25
+ throw failed.reason;
26
+ return view;
27
+ }
28
+ catch (error) {
29
+ await view.close();
30
+ throw error;
31
+ }
32
+ }
33
+ /** A worktree command runs in its worktree, so one that emptied fails as
34
+ * that address's absence (git-command.ts). */
35
+ untracked(repository, paths) {
36
+ return runGit(repository, [`--git-dir=${this.#directory}`, `--work-tree=${repository}`, "ls-files", "--others", "-z",
37
+ ...paths ? ["--", ...paths.map(path => `:(literal)${path}`)] : []], { profile: PROFILE, purpose: "checkpoint", closing: this.#closing });
38
+ }
39
+ /** Callers retire the view only once its Git children have exited. */
40
+ close() { return rm(this.#directory, { recursive: true, force: true }); }
41
+ }
42
+ //# sourceMappingURL=git-private-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-private-index.js","sourceRoot":"","sources":["../src/git-private-index.ts"],"names":[],"mappings":"AAAA;;;yBAGyB;AACzB,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAmB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,OAAO,GAAe,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAE3D,MAAM,OAAO,kBAAkB;IACpB,UAAU,CAAS;IACnB,QAAQ,CAAU;IAE3B,YAAoB,SAAiB,EAAE,OAAgB;QACrD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,oFAAoF;IACpF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAyB,EAAE,KAAkC,EAC/E,OAAgB;QAChB,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,MAAM,uBAAuB,CAAC,mBAAmB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QACzG,IAAI,CAAC;YACH,uEAAuE;YACvE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3H,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAoC,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YAC1G,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACtD,CAAC;IAED;kDAC8C;IAC9C,SAAS,CAAC,UAAkB,EAAE,KAA+B;QAC3D,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,aAAa,IAAI,CAAC,UAAU,EAAE,EAAE,eAAe,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI;YAClH,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACpE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,sEAAsE;IACtE,KAAK,KAAoB,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;CACzF"}
@@ -0,0 +1,4 @@
1
+ type Format = "sha1" | "sha256";
2
+ /** A new private bare repository; its owner removes the returned directory. */
3
+ export declare function createPrivateRepository(prefix: string, format: Format): Promise<string>;
4
+ export {};
@@ -0,0 +1,69 @@
1
+ /** A private bare repository is Git's own empty layout. Git creates it once
2
+ * per host and object format, probing the temporary filesystem it will live
3
+ * on; every later private repository is that layout written into a fresh
4
+ * directory, with no Git process. */
5
+ import { lstat, mkdir, mkdtemp, readFile, readdir, rm, writeFile } from "node:fs/promises";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+ import { gitHost, runGit } from "./git-command.js";
9
+ const layouts = new Map();
10
+ async function initializedLayout(format) {
11
+ const scratch = await mkdtemp(join(tmpdir(), "amalgm-git-layout-"));
12
+ try {
13
+ await runGit(scratch, ["init", "--bare", "--quiet", `--object-format=${format}`, "--template="], { profile: { LC_ALL: "C" }, purpose: "checkpoint" });
14
+ const directories = [], files = new Map();
15
+ // Parents precede children, so a replay creates each directory in order.
16
+ const visit = async (relative) => {
17
+ for (const name of (await readdir(join(scratch, relative))).sort()) {
18
+ const child = relative ? `${relative}/${name}` : name;
19
+ const stat = await lstat(join(scratch, child));
20
+ if (stat.isDirectory()) {
21
+ directories.push(child);
22
+ await visit(child);
23
+ }
24
+ else if (stat.isFile())
25
+ files.set(child, await readFile(join(scratch, child)));
26
+ else
27
+ throw new Error(`Git's empty repository holds an unsupported entry: ${child}`);
28
+ }
29
+ };
30
+ await visit("");
31
+ return Object.freeze({ directories: Object.freeze(directories), files });
32
+ }
33
+ finally {
34
+ await rm(scratch, { recursive: true, force: true });
35
+ }
36
+ }
37
+ /** A failed initialization leaves no layout, so the next caller asks Git again. */
38
+ function layoutOf(format) {
39
+ const key = JSON.stringify([gitHost().key, format]);
40
+ let layout = layouts.get(key);
41
+ if (!layout) {
42
+ layout = initializedLayout(format);
43
+ layouts.set(key, layout);
44
+ layout.catch(() => { if (layouts.get(key) === layout)
45
+ layouts.delete(key); });
46
+ }
47
+ return layout;
48
+ }
49
+ /** A new private bare repository; its owner removes the returned directory. */
50
+ export async function createPrivateRepository(prefix, format) {
51
+ const layout = await layoutOf(format);
52
+ const directory = await mkdtemp(join(tmpdir(), prefix));
53
+ try {
54
+ for (const relative of layout.directories)
55
+ await mkdir(join(directory, relative));
56
+ // Every write settles before a failure retires the directory under it.
57
+ const written = await Promise.allSettled([...layout.files]
58
+ .map(([relative, bytes]) => writeFile(join(directory, relative), bytes)));
59
+ const failed = written.find((outcome) => outcome.status === "rejected");
60
+ if (failed)
61
+ throw failed.reason;
62
+ return directory;
63
+ }
64
+ catch (error) {
65
+ await rm(directory, { recursive: true, force: true });
66
+ throw error;
67
+ }
68
+ }
69
+ //# sourceMappingURL=git-private-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-private-repository.js","sourceRoot":"","sources":["../src/git-private-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { NativeIndexBinding } from "./git-binding.js";
2
+ import { type GitIndexEntry } from "./git-index-entries.js";
3
+ /** Source alternates are used only by readers. Git object writers can refresh
4
+ * an existing alternate object's timestamp, so they run without alternates.
5
+ * Required patch bases are copied into private storage before a writer runs. */
6
+ export declare class PrivateGitView {
7
+ #private;
8
+ readonly directory: string;
9
+ readonly format: string;
10
+ private constructor();
11
+ /** The binding names the source's object format and store, so opening a
12
+ * view asks Git nothing. */
13
+ static open(binding: Pick<NativeIndexBinding, "format" | "objects">, shallow?: readonly string[]): Promise<PrivateGitView>;
14
+ private read;
15
+ private write;
16
+ tree(entries: readonly GitIndexEntry[]): Promise<string>;
17
+ rawBlob(leaf: {
18
+ readonly content: Uint8Array;
19
+ readonly objectId: string;
20
+ }): Promise<void>;
21
+ writeBlob(bytes: Uint8Array): Promise<string>;
22
+ blobSizes(objects: readonly string[]): Promise<Buffer>;
23
+ blobs(objects: readonly string[]): Promise<Buffer>;
24
+ pack(objects: readonly string[]): Promise<Buffer>;
25
+ /** The objects this view holds, asked once. */
26
+ present(objects: readonly string[]): Promise<string[]>;
27
+ /** Those of these commits the tips reach under this view's horizon, each
28
+ * with the parents that horizon gives it. */
29
+ reached(tips: readonly string[], commits: readonly string[]): Promise<Map<string, string[]>>;
30
+ /** A shallow receiver's haves may reach no wanted commit through their
31
+ * parents, so, as upload-pack does, each have's own tree is its edge. */
32
+ exportPack(revisions: Uint8Array, file: string, shallowReceiver: boolean): Promise<void>;
33
+ diff(before: string, after: string): Promise<Buffer>;
34
+ apply(base: string, patch: Uint8Array): Promise<GitIndexEntry[]>;
35
+ ownsObject(oid: string): boolean;
36
+ private replaceIndex;
37
+ indexBytes(entries: readonly GitIndexEntry[]): Promise<Buffer>;
38
+ close(): Promise<void>;
39
+ }
@@ -0,0 +1,162 @@
1
+ /** Private Git object/index effects, with borrowed source objects only for readers. */
2
+ import { existsSync } from "node:fs";
3
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { runGit, runGitToFile } from "./git-command.js";
6
+ import { assertGitPath, parseGitIndex } from "./git-index-entries.js";
7
+ import { createPrivateRepository } from "./git-private-repository.js";
8
+ /** Source alternates are used only by readers. Git object writers can refresh
9
+ * an existing alternate object's timestamp, so they run without alternates.
10
+ * Required patch bases are copied into private storage before a writer runs. */
11
+ export class PrivateGitView {
12
+ directory;
13
+ format;
14
+ #profile;
15
+ constructor(directory, format, profile) {
16
+ this.directory = directory;
17
+ this.format = format;
18
+ this.#profile = profile;
19
+ }
20
+ /** The binding names the source's object format and store, so opening a
21
+ * view asks Git nothing. */
22
+ static async open(binding, shallow = []) {
23
+ const view = new PrivateGitView(await createPrivateRepository("amalgm-git-view-", binding.format), binding.format, Object.freeze({ GIT_ALTERNATE_OBJECT_DIRECTORIES: JSON.stringify(binding.objects), GIT_NO_REPLACE_OBJECTS: "1",
24
+ LC_ALL: "C" }));
25
+ try {
26
+ // Only history traversal needs a horizon, supplied by its captured Card.
27
+ // Index/tree/blob readers never reread an unrelated live shallow file.
28
+ if (shallow.length)
29
+ await writeFile(join(view.directory, "shallow"), `${shallow.join("\n")}\n`);
30
+ await mkdir(join(view.directory, "info"), { recursive: true });
31
+ await writeFile(join(view.directory, "info", "attributes"), "* -diff\n");
32
+ return view;
33
+ }
34
+ catch (error) {
35
+ await view.close();
36
+ throw error;
37
+ }
38
+ }
39
+ read(args, input, purpose = "checkpoint") {
40
+ return runGit(this.directory, ["-c", "core.quotePath=true", "-c", "core.autocrlf=false", ...args], { input, profile: this.#profile, purpose });
41
+ }
42
+ write(args, input) {
43
+ const { GIT_ALTERNATE_OBJECT_DIRECTORIES: _alternates, ...profile } = this.#profile;
44
+ return runGit(this.directory, ["-c", "core.quotePath=true", "-c", "core.autocrlf=false", ...args], { input, profile, purpose: "checkpoint" });
45
+ }
46
+ async tree(entries) {
47
+ await this.replaceIndex(entries);
48
+ return (await this.write(["write-tree", "--missing-ok"])).toString("utf8").trim();
49
+ }
50
+ async rawBlob(leaf) {
51
+ const oid = await this.writeBlob(leaf.content);
52
+ if (oid !== leaf.objectId)
53
+ throw new Error("Git disagrees with literal blob identity");
54
+ }
55
+ async writeBlob(bytes) {
56
+ return (await this.write(["hash-object", "-w", "--no-filters", "--stdin"], bytes)).toString("ascii").trim();
57
+ }
58
+ blobSizes(objects) {
59
+ return this.read(["cat-file", "--batch-check=%(objectsize)"], Buffer.from(objects.join("\n") + "\n"));
60
+ }
61
+ blobs(objects) {
62
+ return this.read(["cat-file", "--batch"], Buffer.from(objects.join("\n") + "\n"));
63
+ }
64
+ pack(objects) {
65
+ return this.read(["pack-objects", "--stdout"], Buffer.from(objects.join("\n") + "\n"), "transport");
66
+ }
67
+ /** The objects this view holds, asked once. */
68
+ async present(objects) {
69
+ if (!objects.length)
70
+ return [];
71
+ const held = new Set((await this.read(["cat-file", "--batch-check=%(objectname)"], Buffer.from(`${objects.join("\n")}\n`), "transport")).toString("ascii").split("\n"));
72
+ return objects.filter(object => held.has(object));
73
+ }
74
+ /** Those of these commits the tips reach under this view's horizon, each
75
+ * with the parents that horizon gives it. */
76
+ async reached(tips, commits) {
77
+ const found = new Map();
78
+ if (!tips.length || !commits.length)
79
+ return found;
80
+ const wanted = new Set(commits);
81
+ const ancestry = await this.read(["rev-list", "--parents", "--stdin"], Buffer.from(`${tips.join("\n")}\n`), "transport");
82
+ for (const line of ancestry.toString("ascii").split("\n")) {
83
+ const [commit, ...parents] = line.split(" ");
84
+ if (wanted.has(commit))
85
+ found.set(commit, parents);
86
+ }
87
+ return found;
88
+ }
89
+ /** A shallow receiver's haves may reach no wanted commit through their
90
+ * parents, so, as upload-pack does, each have's own tree is its edge. */
91
+ exportPack(revisions, file, shallowReceiver) {
92
+ // With no remotes in this private repository, a missing borrowed object
93
+ // cannot trigger a lazy fetch into the source repository.
94
+ return runGitToFile(this.directory, ["pack-objects", "--stdout", "--revs", "--thin", "--delta-base-offset",
95
+ ...shallowReceiver ? ["--shallow"] : []], file, { input: revisions, profile: this.#profile, purpose: "transport" });
96
+ }
97
+ diff(before, after) {
98
+ return this.read(["diff-tree", "-r", "--no-commit-id", "--binary", "--full-index",
99
+ "--no-renames", "--no-ext-diff", "--no-textconv", "--no-color", "--submodule=short",
100
+ "--src-prefix=a/", "--dst-prefix=b/", "--diff-algorithm=myers", "--no-indent-heuristic",
101
+ "--unified=3", "--inter-hunk-context=0", before, after, "--"]);
102
+ }
103
+ async apply(base, patch) {
104
+ // Enumerate the source tree without letting an index writer see source
105
+ // storage. Even index-only commands may generate cached tree objects.
106
+ const entries = (await this.read(["ls-tree", "-r", "-z", "--full-tree", base]))
107
+ .toString("utf8").split("\0").filter(Boolean).map(record => {
108
+ const separator = record.indexOf("\t");
109
+ const [mode, , objectId] = record.slice(0, separator).split(" ");
110
+ if (separator < 0)
111
+ throw new Error("invalid Git tree entry");
112
+ return `${mode} ${objectId} 0\t${record.slice(separator + 1)}\0`;
113
+ });
114
+ await this.replaceIndex(await parseGitIndex(Buffer.from(entries.join(""))));
115
+ if (patch.length) {
116
+ // Extended headers are unprefixed; text hunks prefix each content line
117
+ // and binary hunks use space-free base85. Human-readable --summary
118
+ // cannot enforce this rule because it prints embedded filename newlines.
119
+ const bytes = Buffer.from(patch.buffer, patch.byteOffset, patch.byteLength);
120
+ for (const header of ["rename from ", "rename to ", "rename old ", "rename new ", "copy from ", "copy to "]) {
121
+ if (bytes.subarray(0, header.length).equals(Buffer.from(header)) || bytes.includes(Buffer.from(`\n${header}`))) {
122
+ throw new Error("repository patch must not contain rename/copy instructions");
123
+ }
124
+ }
125
+ // Let Git parse its patch path grammar, including tabs and newlines.
126
+ // The canonical profile emits no rename records. Only changed base
127
+ // blobs need copying; unrelated history stays in the read-only view.
128
+ const changed = new Set((await this.write(["apply", "--numstat", "-z"], patch))
129
+ .toString("utf8").split("\0").filter(Boolean).map(record => {
130
+ const first = record.indexOf("\t"), second = record.indexOf("\t", first + 1);
131
+ if (first < 0 || second < 0)
132
+ throw new Error("invalid Git patch path inventory");
133
+ const path = record.slice(second + 1);
134
+ assertGitPath(path);
135
+ return path;
136
+ }));
137
+ const current = await parseGitIndex(await this.write(["ls-files", "--stage", "-z"]));
138
+ for (const entry of current) {
139
+ if (!changed.has(entry.path) || entry.mode === "160000" || this.ownsObject(entry.objectId))
140
+ continue;
141
+ const bytes = await this.read(["cat-file", "blob", entry.objectId]);
142
+ const oid = await this.writeBlob(bytes);
143
+ if (oid !== entry.objectId)
144
+ throw new Error("private Git patch base failed verification");
145
+ }
146
+ await this.write(["apply", "--cached", "--binary", "--whitespace=nowarn"], patch);
147
+ }
148
+ return parseGitIndex(await this.write(["ls-files", "--stage", "-z"]));
149
+ }
150
+ ownsObject(oid) { return existsSync(join(this.directory, "objects", oid.slice(0, 2), oid.slice(2))); }
151
+ async replaceIndex(entries) {
152
+ await this.write(["read-tree", "--empty"]);
153
+ if (entries.length)
154
+ await this.write(["update-index", "-z", "--index-info"], Buffer.from(entries.map(entry => `${entry.mode} ${entry.objectId} ${entry.stage}\t${entry.path}\0`).join("")));
155
+ }
156
+ async indexBytes(entries) {
157
+ await this.replaceIndex(entries);
158
+ return readFile(join(this.directory, "index"));
159
+ }
160
+ close() { return rm(this.directory, { recursive: true, force: true }); }
161
+ }
162
+ //# sourceMappingURL=git-private-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-private-view.js","sourceRoot":"","sources":["../src/git-private-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type LooseRef = {
2
+ readonly kind: "direct";
3
+ readonly commit: string;
4
+ } | {
5
+ readonly kind: "symbolic";
6
+ readonly target: string;
7
+ } | {
8
+ readonly kind: "unreadable";
9
+ };
10
+ /** Every loose ref this checkout sees, by full name, read on demand. Git
11
+ * ignores its own `.lock` files, and so does this reader. */
12
+ export declare function looseRefs(repository: string): Map<string, () => LooseRef>;
@@ -0,0 +1,68 @@
1
+ /** Git's loose ref store, read natively for the two facts for-each-ref
2
+ * cannot give. The files backend keeps every symbolic ref as one loose file
3
+ * (pack-refs never packs one), and `%(symref)` follows a chain to its end, so
4
+ * only the loose file names a symbolic ref's immediate target. for-each-ref
5
+ * also silently omits every stored ref it cannot read — a dangling or cyclic
6
+ * symbolic ref, unreadable content, a malformed name — so its output alone
7
+ * never proves the ref set complete. */
8
+ import { readdirSync, readFileSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { refusal } from "@amalgm/live";
11
+ import { CaptureSourceChangedError } from "./content-cache-host.js";
12
+ import { gitCommonDirectory, gitStorageDirectory } from "./git-binding.js";
13
+ /** Git's per-worktree namespaces; every other ref lives in the common directory. */
14
+ const PER_WORKTREE = ["refs/bisect/", "refs/worktree/", "refs/rewritten/"];
15
+ /** Every loose ref this checkout sees, by full name, read on demand. Git
16
+ * ignores its own `.lock` files, and so does this reader. */
17
+ export function looseRefs(repository) {
18
+ const gitDir = gitStorageDirectory(repository).directory;
19
+ const common = gitCommonDirectory(gitDir);
20
+ const found = new Map();
21
+ const walk = (store, relative, admit) => {
22
+ let entries;
23
+ try {
24
+ entries = readdirSync(join(store, relative), { withFileTypes: true });
25
+ }
26
+ catch (error) {
27
+ if (missing(error))
28
+ return;
29
+ throw error;
30
+ }
31
+ for (const entry of entries) {
32
+ const name = `${relative}/${entry.name}`;
33
+ if (entry.isDirectory())
34
+ walk(store, name, admit);
35
+ else if (entry.isSymbolicLink())
36
+ throw refusal(`repository stores a symbolic-link ref: ${name}`);
37
+ else if (!entry.name.endsWith(".lock") && admit(name))
38
+ found.set(name, () => readLoose(join(store, name)));
39
+ }
40
+ };
41
+ const perWorktree = (name) => PER_WORKTREE.some(prefix => name.startsWith(prefix));
42
+ if (common === gitDir)
43
+ walk(gitDir, "refs", () => true);
44
+ else {
45
+ walk(common, "refs", name => !perWorktree(name));
46
+ walk(gitDir, "refs", perWorktree);
47
+ }
48
+ return found;
49
+ }
50
+ /** Git's loose-ref grammar: `ref:` and a target, or one object ID. */
51
+ function readLoose(path) {
52
+ let content;
53
+ try {
54
+ content = readFileSync(path, "utf8");
55
+ }
56
+ catch (error) {
57
+ if (missing(error))
58
+ throw new CaptureSourceChangedError("repository ref store changed", { cause: error });
59
+ throw error;
60
+ }
61
+ const symbolic = /^ref:[ \t]*(\S+)\s*$/.exec(content);
62
+ if (symbolic)
63
+ return { kind: "symbolic", target: symbolic[1] };
64
+ const direct = /^([0-9a-f]{40}|[0-9a-f]{64})\s*$/.exec(content);
65
+ return direct ? { kind: "direct", commit: direct[1] } : { kind: "unreadable" };
66
+ }
67
+ const missing = (error) => ["ENOENT", "ENOTDIR"].includes(error.code ?? "");
68
+ //# sourceMappingURL=git-ref-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-ref-store.js","sourceRoot":"","sources":["../src/git-ref-store.ts"],"names":[],"mappings":"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"}