@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,42 @@
1
+ import type Database from "better-sqlite3";
2
+ import { type SourceStat } from "./source-signature.js";
3
+ export interface ContentBoundary {
4
+ /** The stamp's mtime less its profile's margin, nanoseconds in decimal. */
5
+ readonly ns: string;
6
+ /** The device whose clock wrote the stamp. */
7
+ readonly dev: bigint;
8
+ }
9
+ /** One stamp: its boundary, and the retirement epoch it completed in, which
10
+ * every conclusion drawn from reads after it is drawn in. */
11
+ export interface ContentStamp {
12
+ readonly boundary: ContentBoundary | null;
13
+ readonly epoch: number;
14
+ }
15
+ /** The boundary one leaf may carry: none under another device's clock. */
16
+ export declare const leafBoundary: (clock: ContentBoundary | null, stat: Pick<SourceStat, "dev">) => string | null;
17
+ /** How a directory listing read under clock closes: `racy` until a fresh
18
+ * listing under a later stamp can, `unqualified` when no stamp can because
19
+ * the root has no clock or another device holds the directory, so only
20
+ * listing it again after its walk closes it (see detection/ground-proof.ts). */
21
+ export declare function listingQualification(clock: ContentBoundary | null, stat: Pick<SourceStat, "dev" | "mtimeNs" | "ctimeNs">): "qualified" | "racy" | "unqualified";
22
+ /** Milliseconds until a later stamp can qualify a fresh listing of a racy
23
+ * directory that stays untouched: stamps only advance, so a stamp taken that
24
+ * long after this one has a boundary past both of its times. */
25
+ export declare function listingWaitMs(clock: ContentBoundary, stat: Pick<SourceStat, "mtimeNs" | "ctimeNs">): number;
26
+ /** The retirement epoch a conclusion drawn now is drawn in. */
27
+ export declare const clockEpoch: () => number;
28
+ /** Throws when a retirement since epoch touched root's ground: at, above or
29
+ * beneath it. */
30
+ export declare function assertQualifiedSince(root: string, epoch: number): void;
31
+ /** Stamps root's content clock. The boundary is null when the root cannot
32
+ * hold a stamp, being absent or unwritable, or when its filesystem is
33
+ * untrusted, which is still stamped so that a later trusted stamp sees the
34
+ * change of profile: no leaf under it is then qualified, and every one is
35
+ * reread by whatever reads it next, and every listing under it closes only by
36
+ * being listed again. */
37
+ export declare function stampContentClock(file: string, root: string): Promise<ContentStamp>;
38
+ /** The save: every leaf at or under root, in both inventories, loses its
39
+ * proof. Returns how many proofs it retired. */
40
+ export declare function retireProofs(database: Database.Database, { root }: {
41
+ readonly root: string;
42
+ }): number;
@@ -0,0 +1,166 @@
1
+ import { lstat, mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { GroundBasisChangedError } from "./ground-basis.js";
4
+ import { groundProfile } from "./ground-profile.js";
5
+ import { save } from "./ground-saver.js";
6
+ import { groundStore } from "./ground-store.js";
7
+ import { precedenceWaitNs, timePrecedes } from "./source-signature.js";
8
+ import { cachedStatement } from "./sqlite.js";
9
+ /** The boundary one leaf may carry: none under another device's clock. */
10
+ export const leafBoundary = (clock, stat) => clock !== null && clock.dev === stat.dev ? clock.ns : null;
11
+ /** How a directory listing read under clock closes: `racy` until a fresh
12
+ * listing under a later stamp can, `unqualified` when no stamp can because
13
+ * the root has no clock or another device holds the directory, so only
14
+ * listing it again after its walk closes it (see detection/ground-proof.ts). */
15
+ export function listingQualification(clock, stat) {
16
+ if (clock === null || clock.dev !== stat.dev)
17
+ return "unqualified";
18
+ const boundary = BigInt(clock.ns);
19
+ return timePrecedes(stat.mtimeNs, boundary) && timePrecedes(stat.ctimeNs, boundary) ? "qualified" : "racy";
20
+ }
21
+ /** Milliseconds until a later stamp can qualify a fresh listing of a racy
22
+ * directory that stays untouched: stamps only advance, so a stamp taken that
23
+ * long after this one has a boundary past both of its times. */
24
+ export function listingWaitMs(clock, stat) {
25
+ const boundary = BigInt(clock.ns);
26
+ const mtime = precedenceWaitNs(stat.mtimeNs, boundary), ctime = precedenceWaitNs(stat.ctimeNs, boundary);
27
+ return Number(((mtime > ctime ? mtime : ctime) + 999999n) / 1000000n);
28
+ }
29
+ const UNSTAMPABLE = new Set(["EACCES", "EPERM", "EROFS", "ENOENT", "ENOTDIR"]);
30
+ const IGNORE_ALL = "*\n";
31
+ /** Control trees this process already told Git to ignore. */
32
+ const ignoredControls = new Set();
33
+ /** The profile each root was last stamped under by this process. */
34
+ const stampedUnder = new Map();
35
+ /** Retirements this process took, and the latest one of each root. */
36
+ let retirements = 0;
37
+ const retiredAt = new Map();
38
+ /** The retirement epoch a conclusion drawn now is drawn in. */
39
+ export const clockEpoch = () => retirements;
40
+ /** Throws when a retirement since epoch touched root's ground: at, above or
41
+ * beneath it. */
42
+ export function assertQualifiedSince(root, epoch) {
43
+ for (const [retired, at] of retiredAt) {
44
+ if (at > epoch && (retired === root || retired.startsWith(`${root}/`) || root.startsWith(`${retired}/`))) {
45
+ throw new GroundBasisChangedError(`${retired} was requalified after a conclusion under ${root}`);
46
+ }
47
+ }
48
+ }
49
+ const absent = (error) => error.code === "ENOENT";
50
+ /** The profile a standing stamp names; null when it names none. */
51
+ async function stampProfile(clock) {
52
+ try {
53
+ return (await readFile(clock, "utf8")).match(/^content clock (\S+)\n$/)?.[1] ?? null;
54
+ }
55
+ catch (error) {
56
+ if (absent(error))
57
+ return null;
58
+ throw error;
59
+ }
60
+ }
61
+ /** Writes the control tree's `.gitignore` when it is absent or different. */
62
+ async function ignoreControl(control) {
63
+ if (ignoredControls.has(control))
64
+ return;
65
+ const file = join(control, ".gitignore");
66
+ let current = null;
67
+ try {
68
+ current = await readFile(file, "utf8");
69
+ }
70
+ catch (error) {
71
+ if (!absent(error))
72
+ throw error;
73
+ }
74
+ if (current !== IGNORE_ALL)
75
+ await writeFile(file, IGNORE_ALL);
76
+ ignoredControls.add(control);
77
+ }
78
+ /** Each root's latest stamp, settled either way. */
79
+ const stamping = new Map();
80
+ /** Stamps root's content clock. The boundary is null when the root cannot
81
+ * hold a stamp, being absent or unwritable, or when its filesystem is
82
+ * untrusted, which is still stamped so that a later trusted stamp sees the
83
+ * change of profile: no leaf under it is then qualified, and every one is
84
+ * reread by whatever reads it next, and every listing under it closes only by
85
+ * being listed again. */
86
+ export function stampContentClock(file, root) {
87
+ const stamp = (stamping.get(root) ?? Promise.resolve()).then(() => stampNow(file, root));
88
+ const settled = stamp.then(() => { }, () => { });
89
+ stamping.set(root, settled);
90
+ void settled.then(() => { if (stamping.get(root) === settled)
91
+ stamping.delete(root); });
92
+ return stamp;
93
+ }
94
+ async function stampNow(file, root) {
95
+ const control = join(root, ".amalgm");
96
+ const clock = join(control, "content-clock"), next = `${clock}.next`;
97
+ let profile;
98
+ try {
99
+ profile = groundProfile(root);
100
+ const content = `content clock ${profile.id}\n`;
101
+ // Only written bytes move mtime everywhere; truncating an empty file
102
+ // does not on every filesystem.
103
+ try {
104
+ await writeFile(next, content);
105
+ }
106
+ catch (error) {
107
+ if (!absent(error))
108
+ throw error;
109
+ // Only the control tree is created; a vanished root stays vanished.
110
+ await mkdir(control, { mode: 0o700 });
111
+ await writeFile(next, content);
112
+ }
113
+ await ignoreControl(control);
114
+ }
115
+ catch (error) {
116
+ if (UNSTAMPABLE.has(error.code ?? ""))
117
+ return { boundary: null, epoch: retirements };
118
+ throw error;
119
+ }
120
+ const stamp = await lstat(next, { bigint: true });
121
+ let previous;
122
+ try {
123
+ previous = await lstat(clock, { bigint: true });
124
+ }
125
+ catch (error) {
126
+ if (!absent(error))
127
+ throw error;
128
+ }
129
+ const backwards = previous !== undefined && stamp.mtimeNs < previous.mtimeNs;
130
+ const requalified = previous === undefined
131
+ || stampedUnder.get(root) !== profile.id && await stampProfile(clock) !== profile.id;
132
+ // The previous stamp is replaced only after its retirement committed.
133
+ const retired = backwards || requalified ? await retire(file, root) : 0;
134
+ await rename(next, clock);
135
+ stampedUnder.set(root, profile.id);
136
+ if (backwards)
137
+ throw new GroundBasisChangedError(`the filesystem clock under ${root} went backwards; its content proofs were retired`);
138
+ if (retired)
139
+ throw new GroundBasisChangedError(`${root} is now stamped under ${profile.id}; its earlier content proofs were retired`);
140
+ return { boundary: profile.marginNs === null ? null : { ns: (stamp.mtimeNs - profile.marginNs).toString(), dev: stamp.dev },
141
+ epoch: retirements };
142
+ }
143
+ /** Every leaf at or under root loses its proof, as a save. A conclusion
144
+ * drawn under root from here on is drawn in the new epoch. */
145
+ async function retire(file, root) {
146
+ retiredAt.set(root, ++retirements);
147
+ return (await save(file, "ground.retireProofs", { root })).value;
148
+ }
149
+ /** The save: every leaf at or under root, in both inventories, loses its
150
+ * proof. Returns how many proofs it retired. */
151
+ export function retireProofs(database, { root }) {
152
+ const prefix = `${root}/`;
153
+ let retired = 0;
154
+ groundStore(database).write(writer => {
155
+ for (const inventory of ["entities", "detection_notebook"]) {
156
+ const proven = cachedStatement(database, `SELECT uuid FROM ${inventory} WHERE content_verified_ns IS NOT NULL
157
+ AND (absolute_path = ? OR substr(absolute_path, 1, ?) = ?)`).pluck().all(root, prefix.length, prefix);
158
+ for (const uuid of proven) {
159
+ writer.update(inventory, uuid, { contentVerifiedNs: null }, inventory === "detection_notebook" ? "retain-equivalent" : undefined);
160
+ }
161
+ retired += proven.length;
162
+ }
163
+ });
164
+ return retired;
165
+ }
166
+ //# sourceMappingURL=content-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-clock.js","sourceRoot":"","sources":["../src/content-clock.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,8 @@ export interface DirectContentMetrics {
30
30
  }
31
31
  export declare class DirectContentPlane {
32
32
  private readonly signal?;
33
+ /** This process's one-time fetch-client compile, measured at construction. */
34
+ readonly warmMs: number;
33
35
  /** Key material is stable for a resource's lifetime, so one handoff per
34
36
  * process is enough; it lives only in memory, never at rest. */
35
37
  private readonly keys;
@@ -36,8 +36,20 @@ function decodeRefs(frame) {
36
36
  return { url, offset: Number(ref.offset), length: Number(ref.length) };
37
37
  });
38
38
  }
39
+ /** Node compiles its bundled fetch client on first use: one synchronous
40
+ * step of tens of milliseconds. A plane pays it when built, as declared
41
+ * startup work before readiness, not as a stall inside the first download.
42
+ * Constructing `Headers` loads that same client. Answers the milliseconds
43
+ * spent; zero once the client is loaded. */
44
+ function warmFetchClient() {
45
+ const started = performance.now();
46
+ void new Headers();
47
+ return performance.now() - started;
48
+ }
39
49
  export class DirectContentPlane {
40
50
  signal;
51
+ /** This process's one-time fetch-client compile, measured at construction. */
52
+ warmMs = warmFetchClient();
41
53
  /** Key material is stable for a resource's lifetime, so one handoff per
42
54
  * process is enough; it lives only in memory, never at rest. */
43
55
  keys = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"content-direct.js","sourceRoot":"","sources":["../src/content-direct.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-direct.js","sourceRoot":"","sources":["../src/content-direct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * A content thread's failure as it crosses to the main thread. Only plain
3
+ * fields survive structured clone, so a thread describes its error by the
4
+ * fields callers classify by — above all `code` — and the main thread
5
+ * restores an Error of the same kind. A churned capture returns as
6
+ * CaptureSourceChangedError, so the walk's churn law sees it unchanged.
7
+ */
8
+ export interface CaptureFailure {
9
+ readonly name: string;
10
+ readonly message: string;
11
+ readonly stack?: string;
12
+ readonly code?: string;
13
+ readonly errno?: number;
14
+ readonly syscall?: string;
15
+ readonly path?: string;
16
+ }
17
+ export declare function describeFailure(error: unknown): CaptureFailure;
18
+ export declare function restoreFailure(failure: CaptureFailure): Error;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * A content thread's failure as it crosses to the main thread. Only plain
3
+ * fields survive structured clone, so a thread describes its error by the
4
+ * fields callers classify by — above all `code` — and the main thread
5
+ * restores an Error of the same kind. A churned capture returns as
6
+ * CaptureSourceChangedError, so the walk's churn law sees it unchanged.
7
+ */
8
+ import { CaptureSourceChangedError } from "./content-cache-host.js";
9
+ export function describeFailure(error) {
10
+ if (!(error instanceof Error))
11
+ return { name: "Error", message: String(error) };
12
+ const fields = error;
13
+ return {
14
+ name: error.name,
15
+ message: error.message,
16
+ ...(error.stack !== undefined ? { stack: error.stack } : {}),
17
+ ...(typeof fields.code === "string" ? { code: fields.code } : {}),
18
+ ...(typeof fields.errno === "number" ? { errno: fields.errno } : {}),
19
+ ...(typeof fields.syscall === "string" ? { syscall: fields.syscall } : {}),
20
+ ...(typeof fields.path === "string" ? { path: fields.path } : {}),
21
+ };
22
+ }
23
+ export function restoreFailure(failure) {
24
+ const error = failure.code === "CAPTURE_SOURCE_CHANGED"
25
+ ? new CaptureSourceChangedError(failure.message)
26
+ : Object.assign(new Error(failure.message), {
27
+ ...(failure.code !== undefined ? { code: failure.code } : {}),
28
+ ...(failure.errno !== undefined ? { errno: failure.errno } : {}),
29
+ ...(failure.syscall !== undefined ? { syscall: failure.syscall } : {}),
30
+ ...(failure.path !== undefined ? { path: failure.path } : {}),
31
+ });
32
+ if (failure.code !== "CAPTURE_SOURCE_CHANGED")
33
+ error.name = failure.name;
34
+ if (failure.stack)
35
+ error.stack = failure.stack;
36
+ return error;
37
+ }
38
+ //# sourceMappingURL=content-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-failure.js","sourceRoot":"","sources":["../src/content-failure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAYpE,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAChF,MAAM,MAAM,GAAG,KAA8B,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,KAAK,wBAAwB;QACrD,CAAC,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,OAAO,CAAC;QAChD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1C,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;IACL,IAAI,OAAO,CAAC,IAAI,KAAK,wBAAwB;QAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACzE,IAAI,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Large-file uploads stream on one thread of their own.
3
+ *
4
+ * A fused upload reads a large file once, hashes every block and the whole
5
+ * file, and ships each batch while reading the next. The read and both
6
+ * hashes run on the stream thread, never on the one thread that schedules
7
+ * Watch, Detect admission, Apply and Send. The main thread only relays each
8
+ * batch's blocks and the final seal to the wire; batch bytes cross by
9
+ * transfer, not copy.
10
+ *
11
+ * A stream spends most of its life waiting on the network between batches.
12
+ * It therefore holds no capture slot: the thread serves every concurrent
13
+ * stream at once, and none waits for another's upload. The capture laws —
14
+ * fingerprint before and after, manifest sealed last, two batches at most
15
+ * in memory — stay in content-cache-host and Live's uploadStream, run
16
+ * unchanged on that thread.
17
+ */
18
+ import { type MessagePort } from "node:worker_threads";
19
+ import type { ContentChunk, ContentManifest } from "@amalgm/live";
20
+ import type { CapturedFileContent, CaptureStreamTransport } from "./content-cache-host.js";
21
+ import { type CaptureFailure } from "./content-failure.js";
22
+ import type { SourceStat } from "./source-signature.js";
23
+ /** One stream as it crosses to the thread, with its own relay channel. */
24
+ export interface StreamJob {
25
+ readonly sourceFile: string;
26
+ readonly expected: SourceStat;
27
+ readonly relay: MessagePort;
28
+ }
29
+ /** One wire effect a stream asks the main thread for. */
30
+ export type StreamEffect = {
31
+ readonly op: "put";
32
+ readonly chunks: readonly ContentChunk[];
33
+ readonly bytes: Uint8Array;
34
+ } | {
35
+ readonly op: "seal";
36
+ readonly manifest: ContentManifest;
37
+ };
38
+ /** A numbered effect, or how the stream ended. The thread closes nothing;
39
+ * the main thread closes the relay once the stream has ended. */
40
+ export type StreamRequest = (StreamEffect & {
41
+ readonly seq: number;
42
+ }) | {
43
+ readonly op: "done";
44
+ readonly captured: CapturedFileContent;
45
+ } | {
46
+ readonly op: "failed";
47
+ readonly failure: CaptureFailure;
48
+ };
49
+ /** The wire's answer to one request. A failed effect keeps its error on the
50
+ * main thread, where the caller classifies it. */
51
+ export interface StreamAnswer {
52
+ readonly seq: number;
53
+ readonly failed: boolean;
54
+ }
55
+ /**
56
+ * Capture one large file by streaming its single read to the wire through
57
+ * `transport`. Ground churn rejects as CaptureSourceChangedError; a failed
58
+ * transport effect rejects with that effect's own error.
59
+ */
60
+ export declare function streamContentUpload(sourceFile: string, expected: SourceStat, transport: CaptureStreamTransport): Promise<CapturedFileContent>;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Large-file uploads stream on one thread of their own.
3
+ *
4
+ * A fused upload reads a large file once, hashes every block and the whole
5
+ * file, and ships each batch while reading the next. The read and both
6
+ * hashes run on the stream thread, never on the one thread that schedules
7
+ * Watch, Detect admission, Apply and Send. The main thread only relays each
8
+ * batch's blocks and the final seal to the wire; batch bytes cross by
9
+ * transfer, not copy.
10
+ *
11
+ * A stream spends most of its life waiting on the network between batches.
12
+ * It therefore holds no capture slot: the thread serves every concurrent
13
+ * stream at once, and none waits for another's upload. The capture laws —
14
+ * fingerprint before and after, manifest sealed last, two batches at most
15
+ * in memory — stay in content-cache-host and Live's uploadStream, run
16
+ * unchanged on that thread.
17
+ */
18
+ import { MessageChannel } from "node:worker_threads";
19
+ import { restoreFailure } from "./content-failure.js";
20
+ import { moduleThread } from "./module-thread.js";
21
+ import { queueTurn } from "./turns.js";
22
+ const WORKER = new URL("./content-stream-worker.js", import.meta.url);
23
+ let thread = null;
24
+ function spawn() {
25
+ const spawned = { worker: moduleThread(WORKER), streams: new Set() };
26
+ let failure = null;
27
+ spawned.worker.on("error", error => { failure ??= error; });
28
+ // A stream fails only once its thread has exited, so no caller released
29
+ // by the failure races the thread's still-open file.
30
+ spawned.worker.on("exit", code => {
31
+ if (thread === spawned)
32
+ thread = null;
33
+ const error = failure ?? new Error(`content stream worker exited with code ${code}`);
34
+ for (const fail of [...spawned.streams])
35
+ fail(error);
36
+ });
37
+ spawned.worker.unref();
38
+ return spawned;
39
+ }
40
+ /**
41
+ * Capture one large file by streaming its single read to the wire through
42
+ * `transport`. Ground churn rejects as CaptureSourceChangedError; a failed
43
+ * transport effect rejects with that effect's own error.
44
+ */
45
+ export function streamContentUpload(sourceFile, expected, transport) {
46
+ const current = thread ??= spawn();
47
+ return new Promise((resolve, reject) => {
48
+ const { port1: relay, port2 } = new MessageChannel();
49
+ let transportFailure = null;
50
+ let settled = false;
51
+ const settle = (outcome) => {
52
+ if (settled)
53
+ return;
54
+ settled = true;
55
+ current.streams.delete(fail);
56
+ if (current.streams.size === 0)
57
+ current.worker.unref();
58
+ relay.close();
59
+ queueTurn(outcome);
60
+ };
61
+ const fail = (error) => settle(() => reject(error));
62
+ current.streams.add(fail);
63
+ // A streaming thread keeps the process alive; an idle one never does.
64
+ current.worker.ref();
65
+ relay.on("message", (request) => {
66
+ if (request.op === "done")
67
+ settle(() => resolve(request.captured));
68
+ else if (request.op === "failed")
69
+ fail(transportFailure ? transportFailure.error : restoreFailure(request.failure));
70
+ else {
71
+ queueTurn(() => {
72
+ const effect = request.op === "put"
73
+ ? transport.putBlocks(request.chunks, request.bytes)
74
+ : transport.sealManifest(request.manifest);
75
+ effect.then(() => { if (!settled)
76
+ relay.postMessage({ seq: request.seq, failed: false }); }, (error) => {
77
+ transportFailure ??= { error };
78
+ if (!settled)
79
+ relay.postMessage({ seq: request.seq, failed: true });
80
+ });
81
+ });
82
+ }
83
+ });
84
+ current.worker.postMessage({
85
+ sourceFile,
86
+ // Only the signed fields travel; a Stats object loses its prototype.
87
+ expected: {
88
+ dev: expected.dev, ino: expected.ino, mode: expected.mode, nlink: expected.nlink,
89
+ size: expected.size, mtimeNs: expected.mtimeNs, ctimeNs: expected.ctimeNs,
90
+ },
91
+ relay: port2,
92
+ }, [port2]);
93
+ });
94
+ }
95
+ //# sourceMappingURL=content-stream-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-stream-thread.js","sourceRoot":"","sources":["../src/content-stream-thread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAiC,MAAM,qBAAqB,CAAC;AAKpF,OAAO,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkCvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtE,IAAI,MAAM,GAAwB,IAAI,CAAC;AAEvC,SAAS,KAAK;IACZ,MAAM,OAAO,GAAiB,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACnF,IAAI,OAAO,GAAY,IAAI,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,wEAAwE;IACxE,qDAAqD;IACrD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;QAC/B,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM,GAAG,IAAI,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,IAAI,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;QACrF,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAAE,QAAoB,EAAE,SAAiC;IAE3E,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;QACrD,IAAI,gBAAgB,GAAuC,IAAI,CAAC;QAChE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,OAAmB,EAAQ,EAAE;YAC3C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACvD,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,sEAAsE;QACtE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAsB,EAAE,EAAE;YAC7C,IAAI,OAAO,CAAC,EAAE,KAAK,MAAM;gBAAE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;iBAC9D,IAAI,OAAO,CAAC,EAAE,KAAK,QAAQ;gBAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC/G,CAAC;gBACJ,SAAS,CAAC,GAAG,EAAE;oBACb,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,KAAK,KAAK;wBACjC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;wBACpD,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC7C,MAAM,CAAC,IAAI,CACT,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO;wBAAE,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAyB,CAAC,CAAC,CAAC,CAAC,EACtG,CAAC,KAAc,EAAE,EAAE;wBACjB,gBAAgB,KAAK,EAAE,KAAK,EAAE,CAAC;wBAC/B,IAAI,CAAC,OAAO;4BAAE,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAyB,CAAC,CAAC;oBAC7F,CAAC,CACF,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;YACzB,UAAU;YACV,qEAAqE;YACrE,QAAQ,EAAE;gBACR,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK;gBAChF,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1E;YACD,KAAK,EAAE,KAAK;SACO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The stream thread. It runs every large-file upload's one read and both of
3
+ * its hashes, many streams at once, and asks the main thread for each wire
4
+ * effect over the stream's own relay (content-stream-thread.ts). Batches
5
+ * cross by transfer; the main thread closes each relay once it has ended.
6
+ */
7
+ export {};
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The stream thread. It runs every large-file upload's one read and both of
3
+ * its hashes, many streams at once, and asks the main thread for each wire
4
+ * effect over the stream's own relay (content-stream-thread.ts). Batches
5
+ * cross by transfer; the main thread closes each relay once it has ended.
6
+ */
7
+ import { parentPort } from "node:worker_threads";
8
+ import { captureContentFileStream } from "./content-cache-host.js";
9
+ import { describeFailure } from "./content-failure.js";
10
+ const port = parentPort;
11
+ if (!port)
12
+ throw new Error("content streams must run on a worker thread");
13
+ port.on("message", (job) => { void stream(job); });
14
+ /** The wire failed this effect; the main thread holds its error. */
15
+ class RelayedEffectFailed extends Error {
16
+ }
17
+ async function stream({ sourceFile, expected, relay }) {
18
+ const waiting = new Map();
19
+ let next = 0;
20
+ relay.on("message", (answer) => {
21
+ const pending = waiting.get(answer.seq);
22
+ waiting.delete(answer.seq);
23
+ if (answer.failed)
24
+ pending?.reject(new RelayedEffectFailed("content stream wire effect failed"));
25
+ else
26
+ pending?.resolve();
27
+ });
28
+ const ask = (effect, transfer) => new Promise((resolve, reject) => {
29
+ const seq = next++;
30
+ waiting.set(seq, { resolve, reject });
31
+ relay.postMessage({ ...effect, seq }, transfer);
32
+ });
33
+ let ended;
34
+ try {
35
+ const captured = await captureContentFileStream(sourceFile, expected, {
36
+ putBlocks: (chunks, bytes) => {
37
+ // A batch that shares its ArrayBuffer is copied, so the transfer
38
+ // never detaches bytes this thread still holds.
39
+ const owned = bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength
40
+ ? bytes : new Uint8Array(bytes);
41
+ return ask({ op: "put", chunks, bytes: owned }, [owned.buffer]);
42
+ },
43
+ sealManifest: manifest => ask({ op: "seal", manifest }, []),
44
+ });
45
+ ended = { op: "done", captured };
46
+ }
47
+ catch (error) {
48
+ ended = { op: "failed", failure: describeFailure(error) };
49
+ }
50
+ relay.postMessage(ended);
51
+ }
52
+ //# sourceMappingURL=content-stream-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-stream-worker.js","sourceRoot":"","sources":["../src/content-stream-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAE1E,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAc,EAAE,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,oEAAoE;AACpE,MAAM,mBAAoB,SAAQ,KAAK;CAAG;AAE1C,KAAK,UAAU,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAa;IAC9D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqE,CAAC;IAC7F,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAoB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,CAAC,IAAI,mBAAmB,CAAC,mCAAmC,CAAC,CAAC,CAAC;;YAC5F,OAAO,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,CAAC,MAAoB,EAAE,QAAuB,EAAiB,EAAE,CAC3E,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAA0B,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACL,IAAI,KAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,QAAQ,EAAE;YACpE,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3B,iEAAiE;gBACjE,gDAAgD;gBAChD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,CAAC,UAAU;oBAClF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH,KAAK,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Register's enclosing law. W's ground may enclose workspaces this machine
3
+ * already materializes. Each one the authority holds as its own root is
4
+ * absorbed: its accepted subtree joins W's head with every identity kept,
5
+ * and its root leaves the head in the same commit. Only its root record
6
+ * changes: it is re-placed where W's walk found it, under its parentUUID
7
+ * and name there, and a `workspace`, which only a root can be, becomes a
8
+ * `folder`.
9
+ *
10
+ * Absorbed ground rides as each inventory already holds it. The head
11
+ * carries its accepted records, and sharing (B) keeps its own rows
12
+ * (declaration-save.ts), so local work there, including an identity the walk
13
+ * found moved out of it, stays owed to ordinary Detect. Only identities an
14
+ * inventory lacks enter from the walk.
15
+ */
16
+ import { type CloudEntityRecord, type Sha256Hex } from "@amalgm/live";
17
+ import { type AcceptedView } from "./graph-publication.js";
18
+ /** A workspace this machine binds to ground. */
19
+ export interface BoundWorkspace {
20
+ readonly workspaceId: string;
21
+ readonly directory: string;
22
+ }
23
+ /** The bound workspaces W's ground encloses. */
24
+ export declare function enclosedWorkspaces(bindings: readonly BoundWorkspace[], workspaceId: string, directory: string): BoundWorkspace[];
25
+ /** The root AV holds this identity in, or null when AV never accepted it. */
26
+ export declare function acceptedHolder(view: AcceptedView, uuid: string): Promise<string | null>;
27
+ /** The enclosed workspaces W absorbs on this view. One held inside another
28
+ * enclosed workspace rides with it. Anything else refuses: ground whose own
29
+ * declaration the authority has not accepted, or that it holds inside a root
30
+ * this machine does not enclose, would move identities W never observed. */
31
+ export declare function absorbedRoots(view: AcceptedView, workspaceId: string, enclosed: readonly BoundWorkspace[], held: ReadonlySet<string>): Promise<string[]>;
32
+ /** An absorbed root's own record, re-placed where W's walk found it. */
33
+ export declare function placeAbsorbedRoot(record: CloudEntityRecord, placement: Pick<CloudEntityRecord, "parentUUID" | "name">, sha256Hex: Sha256Hex): CloudEntityRecord;
34
+ /** D's records for W: the walk outside absorbed ground, minus identities AV
35
+ * already holds there, plus each absorbed root exactly as AV holds it with
36
+ * its root re-placed. Container versions derive from D's own membership. */
37
+ export declare function absorbingDeclaration(view: AcceptedView, workspaceId: string, walked: readonly CloudEntityRecord[], absorbed: readonly string[], sha256Hex: Sha256Hex): Promise<readonly CloudEntityRecord[]>;