@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
+ /**
2
+ * One socket's outgoing messages, whole and in order. A message leaves as
3
+ * WebSocket fragments of at most WIRE_FRAGMENT_BYTES with a turn boundary
4
+ * (turns.ts) between them, so no send's framing, masking or encryption holds
5
+ * the main thread, and no other message lands between one message's
6
+ * fragments. The receiver joins the fragments back into the one message.
7
+ *
8
+ * One multiplexed socket carries every frame, so an unbounded queue would
9
+ * delay pongs and replies behind bulk cargo, and a slow uplink would be cut
10
+ * by the gateway's own heartbeat. Each fragment therefore waits until the
11
+ * socket holds at most MAX_QUEUED_WIRE_BYTES, so the socket never holds more
12
+ * than that allowance and one fragment, and a prompt frame (a pong, hello or
13
+ * reply) leaves before every waiting request, though never inside a message
14
+ * already begun.
15
+ */
16
+ import { turnBoundary } from "./turns.js";
17
+ /** One fragment's framing and masking stays far inside a turn's budget. */
18
+ export const WIRE_FRAGMENT_BYTES = 64 * 1024;
19
+ const MAX_QUEUED_WIRE_BYTES = 4 * 1024 * 1024;
20
+ const QUEUE_POLL_MS = 20;
21
+ const OPEN = 1;
22
+ /** A prompt frame's failure is its socket's own close. */
23
+ const unobserved = () => { };
24
+ /** A message's fragments, each part cut to the bound without joining parts. */
25
+ function* fragments(parts) {
26
+ let any = false;
27
+ for (const part of parts) {
28
+ // A string's UTF-8 form is at most three bytes per UTF-16 unit.
29
+ if (typeof part === "string" && part.length * 3 <= WIRE_FRAGMENT_BYTES) {
30
+ if (part.length) {
31
+ any = true;
32
+ yield part;
33
+ }
34
+ continue;
35
+ }
36
+ const bytes = typeof part === "string" ? Buffer.from(part, "utf8") : part;
37
+ for (let offset = 0; offset < bytes.byteLength; offset += WIRE_FRAGMENT_BYTES) {
38
+ any = true;
39
+ yield bytes.subarray(offset, offset + WIRE_FRAGMENT_BYTES);
40
+ }
41
+ }
42
+ if (!any)
43
+ yield Buffer.alloc(0);
44
+ }
45
+ export class WireOutbox {
46
+ #socket;
47
+ #prompt = [];
48
+ #requests = [];
49
+ #closed = null;
50
+ #sending = false;
51
+ constructor(socket) {
52
+ this.#socket = socket;
53
+ }
54
+ /** Queue one request behind every earlier one. A signal aborted before the
55
+ * message's first fragment drops it; once begun, a message always ends, or
56
+ * the stream would carry half of it. */
57
+ send(parts, binary, sent, signal) {
58
+ this.#queue(this.#requests, { parts, binary, sent, signal });
59
+ }
60
+ /** Queue one small text frame the gateway is waiting on ahead of every
61
+ * waiting request, behind only earlier prompt frames. */
62
+ prompt(frame) {
63
+ this.#queue(this.#prompt, { parts: [frame], binary: false, sent: unobserved, signal: undefined });
64
+ }
65
+ /** The socket is gone: every waiting message fails with its reason. */
66
+ close(error) {
67
+ this.#closed ??= error;
68
+ for (const message of [...this.#prompt.splice(0), ...this.#requests.splice(0)])
69
+ message.sent(error);
70
+ }
71
+ #queue(lane, message) {
72
+ if (this.#closed) {
73
+ message.sent(this.#closed);
74
+ return;
75
+ }
76
+ lane.push(message);
77
+ if (!this.#sending)
78
+ void this.#drain();
79
+ }
80
+ async #drain() {
81
+ this.#sending = true;
82
+ try {
83
+ for (;;) {
84
+ const message = this.#closed ? undefined : this.#prompt.shift() ?? this.#requests.shift();
85
+ if (!message)
86
+ return;
87
+ try {
88
+ await this.#transmit(message);
89
+ }
90
+ catch (error) {
91
+ message.sent(error instanceof Error ? error : new Error(String(error)));
92
+ }
93
+ }
94
+ }
95
+ finally {
96
+ this.#sending = false;
97
+ }
98
+ }
99
+ async #transmit({ parts, binary, sent, signal }) {
100
+ const cut = fragments(parts);
101
+ let fragment = cut.next();
102
+ await this.#room(signal);
103
+ for (;;) {
104
+ // The next fragment is known before this one leaves, so the last carries fin.
105
+ const next = cut.next();
106
+ this.#socket.send(fragment.value, { binary, fin: next.done === true }, next.done ? sent : undefined);
107
+ if (next.done)
108
+ return;
109
+ fragment = next;
110
+ await turnBoundary();
111
+ await this.#room(undefined);
112
+ }
113
+ }
114
+ async #room(signal) {
115
+ for (;;) {
116
+ signal?.throwIfAborted();
117
+ if (this.#closed)
118
+ throw this.#closed;
119
+ if (this.#socket.readyState !== OPEN)
120
+ throw new Error("wire is not open");
121
+ if (this.#socket.bufferedAmount <= MAX_QUEUED_WIRE_BYTES)
122
+ return;
123
+ await new Promise((resolve) => setTimeout(resolve, QUEUE_POLL_MS));
124
+ }
125
+ }
126
+ }
127
+ //# sourceMappingURL=wire-outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire-outbox.js","sourceRoot":"","sources":["../src/wire-outbox.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { WorkspaceRegistry } from "@amalgm/live/workspace";
2
2
  import type { WorkspacePathPort } from "@amalgm/live/workspace";
3
3
  import type { StateRail } from "@amalgm/core/state";
4
+ import type { WorkspaceScope } from "./agent-execution.js";
4
5
  import type { BrickMount } from "./gateway.js";
5
6
  /** Every runtime uses the same durable Live registry and Core UI projection. */
6
7
  export declare function createWorkspaceHost(options: {
@@ -11,6 +12,9 @@ export declare function createWorkspaceHost(options: {
11
12
  }): {
12
13
  registry: WorkspaceRegistry;
13
14
  mount: BrickMount;
15
+ scope: WorkspaceScope;
14
16
  };
17
+ /** Each linked folder outside the root, with a group's folders listed one by one. */
18
+ export declare function registeredFolders(registry: WorkspaceRegistry, workspaceRoot: string): string[];
15
19
  export declare const workspacePathHost: WorkspacePathPort;
16
20
  export declare function workspaceMount(registry: WorkspaceRegistry, workspaceRoot: string): BrickMount;
@@ -21,7 +21,18 @@ export function createWorkspaceHost(options) {
21
21
  for (const resource of ["projects", "workspaces"]) {
22
22
  options.state.registerResource(resource, { snapshotDefault: true, read: () => registry.list() });
23
23
  }
24
- return { registry, mount: workspaceMount(registry, options.workspaceRoot) };
24
+ return {
25
+ registry,
26
+ mount: workspaceMount(registry, options.workspaceRoot),
27
+ scope: { root: options.workspaceRoot, folders: () => registeredFolders(registry, options.workspaceRoot) },
28
+ };
29
+ }
30
+ /** Each linked folder outside the root, with a group's folders listed one by one. */
31
+ export function registeredFolders(registry, workspaceRoot) {
32
+ const paths = registry.list().flatMap(entry => entry.kind === "group"
33
+ ? entry.folders.map(folder => folder.path)
34
+ : [entry.path]);
35
+ return [...new Set(paths)].filter(path => !workspacePathHost.isWithin(workspaceRoot, path));
25
36
  }
26
37
  export const workspacePathHost = {
27
38
  isAbsolute,
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-host.js","sourceRoot":"","sources":["../src/workspace-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-host.js","sourceRoot":"","sources":["../src/workspace-host.ts"],"names":[],"mappings":"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"}
@@ -187,8 +187,44 @@ export function createPrivateWireAuthority({
187
187
  let contentFailureRetryable = contentPutFailureRetryable;
188
188
  let rejectMutationSubmits = false;
189
189
  let rejectEntityRecordSubmits = false;
190
+ let retryEntityRecordSubmits = false;
191
+ // Injected latency, off unless a test arms it: after durable acceptance and
192
+ // its doorbells, only the selected entity.record.ack waits; every other
193
+ // request and notification is still served. Times are epoch milliseconds.
194
+ let ackHoldPolicy = null;
195
+ const ackHolds = [];
196
+ const pendingAckReleases = new Set();
197
+ const epochNow = () => performance.timeOrigin + performance.now();
198
+ function holdAck(socket, ack, policy, evidence) {
199
+ const row = { ...evidence, policy, heldAt: epochNow(), releasedAt: null, releasedBy: null, heldMs: null, delivered: null };
200
+ ackHolds.push(row);
201
+ const release = (by) => {
202
+ if (row.releasedAt !== null) return;
203
+ clearTimeout(timer);
204
+ pendingAckReleases.delete(release);
205
+ row.releasedAt = epochNow();
206
+ row.releasedBy = by;
207
+ row.heldMs = row.releasedAt - row.heldAt;
208
+ row.delivered = socket.readyState === WebSocket.OPEN;
209
+ if (row.delivered) socket.send(ack);
210
+ };
211
+ const timer = setTimeout(() => release(policy.deadlineMs === undefined ? "delay" : "deadline"),
212
+ policy.deadlineMs ?? policy.delayMs);
213
+ timer.unref();
214
+ pendingAckReleases.add(release);
215
+ }
190
216
  let remainingMutationSubmitFailures = 0;
191
217
  let dropMutationAcks = 0;
218
+ // Examination holds on graph-head commits, off unless armed. A held submit
219
+ // parks before the authority reads it and replays, in arrival order, when
220
+ // released. A withheld acknowledgement is committed and never sent.
221
+ let holdGraphSubmits = false;
222
+ const heldGraphSubmits = [];
223
+ let withholdGraphAcks = false;
224
+ const withheldGraphAcks = [];
225
+ // Every answer to a mutation submit, in order: committed, duplicate, or
226
+ // the refusal code.
227
+ const graphAnswers = [];
192
228
  const committedMutationAcks = new Map();
193
229
  let deliverySequence = 0;
194
230
  const entityRecords = [];
@@ -304,13 +340,20 @@ export function createPrivateWireAuthority({
304
340
  entitySubscriptions.delete(socket);
305
341
  grantWatchers.delete(socket);
306
342
  });
307
- socket.on("message", (data, isBinary) => {
343
+ const receive = (data, isBinary) => {
308
344
  const frame = isBinary
309
345
  ? (() => {
310
346
  const decoded = decodeBinaryFrame(data);
311
347
  return { ...decoded.frame, data_bin: decoded.bytes };
312
348
  })()
313
349
  : JSON.parse(data.toString("utf8"));
350
+ if (holdGraphSubmits && frame.type === "shared.mutation.submit"
351
+ && frame.envelope?.operationKind === GRAPH_HEAD_OPERATION_KIND) {
352
+ const { mutationId, deviceId, baseVersion, deliveryWatermark } = frame.envelope;
353
+ heldGraphSubmits.push({ mutationId, deviceId, baseVersion, deliveryWatermark, heldAt: epochNow(),
354
+ replay: () => receive(data, isBinary) });
355
+ return;
356
+ }
314
357
  if (frame.type === "private.entity-content.put"
315
358
  || frame.type === "private.entity-content.put-blocks"
316
359
  || frame.type === "private.entity-content.put-cargo") {
@@ -650,7 +693,10 @@ export function createPrivateWireAuthority({
650
693
  expires_in_seconds: 300,
651
694
  }));
652
695
  } else if (frame.type === "shared.mutation.submit") {
696
+ const answer = (value) => graphAnswers.push({ mutationId: frame.envelope?.mutationId,
697
+ deviceId: frame.envelope?.deviceId, answer: value, version: current?.version ?? null, at: epochNow() });
653
698
  if (rejectMutationSubmits) {
699
+ answer("shared_realtime_internal_error");
654
700
  socket.send(JSON.stringify({
655
701
  type: "shared.error",
656
702
  request_id: frame.request_id,
@@ -663,6 +709,7 @@ export function createPrivateWireAuthority({
663
709
  }
664
710
  if (remainingMutationSubmitFailures > 0) {
665
711
  remainingMutationSubmitFailures -= 1;
712
+ answer("shared_database_serialization_failure");
666
713
  socket.send(JSON.stringify({
667
714
  type: "shared.error",
668
715
  request_id: frame.request_id,
@@ -685,6 +732,7 @@ export function createPrivateWireAuthority({
685
732
  // instead of committing twice.
686
733
  const committed = committedMutationAcks.get(envelope.mutationId);
687
734
  if (committed) {
735
+ answer("duplicate");
688
736
  socket.send(JSON.stringify({
689
737
  ...committed,
690
738
  request_id: frame.request_id,
@@ -692,10 +740,25 @@ export function createPrivateWireAuthority({
692
740
  }));
693
741
  return;
694
742
  }
695
- assert.equal(envelope.baseVersion, current.version);
696
743
  assert.equal(envelope.authorityEpoch, current.authorityEpoch);
697
- assert.equal(envelope.deliveryWatermark, deliverySequence,
698
- "a graph publication names the complete current delivery prefix");
744
+ // The production commit refuses a publication whose delivery prefix
745
+ // or graph head moved on, in that order; the gateway maps either
746
+ // refusal to its leading token, 400 and not retryable. The head
747
+ // comparison is the proposed strict CAS.
748
+ const moved = envelope.deliveryWatermark !== deliverySequence ? "entity_delivery_watermark_changed"
749
+ : envelope.baseVersion !== current.version ? "entity_graph_head_changed" : null;
750
+ if (moved) {
751
+ answer(moved);
752
+ socket.send(JSON.stringify({
753
+ type: "shared.error",
754
+ request_id: frame.request_id,
755
+ code: moved,
756
+ message: moved,
757
+ status: 400,
758
+ retryable: false,
759
+ }));
760
+ return;
761
+ }
699
762
  graphMutations.push(envelope);
700
763
  const base = Buffer.from(current.snapshotB64, "base64");
701
764
  const baseIsHead = base.toString("utf8", 0, 128).includes(`"kind":"${GRAPH_HEAD_KIND}"`);
@@ -759,6 +822,11 @@ export function createPrivateWireAuthority({
759
822
  duplicate: false,
760
823
  };
761
824
  committedMutationAcks.set(envelope.mutationId, ack);
825
+ answer("committed");
826
+ if (withholdGraphAcks && envelope.operationKind === GRAPH_HEAD_OPERATION_KIND) {
827
+ withheldGraphAcks.push(envelope.mutationId);
828
+ return;
829
+ }
762
830
  if (dropMutationAcks > 0) {
763
831
  // The commit landed; the acknowledgement is lost with the socket.
764
832
  dropMutationAcks -= 1;
@@ -767,10 +835,12 @@ export function createPrivateWireAuthority({
767
835
  }
768
836
  socket.send(JSON.stringify(ack));
769
837
  } else if (frame.type === "entity.record.submit") {
838
+ const receivedAt = epochNow();
770
839
  if (rejectEntityRecordSubmits) {
771
840
  socket.send(JSON.stringify({ type: 'shared.error', request_id: frame.request_id,
772
- code: 'entity_record_authority_not_found', message: 'no entity authority exists at that id',
773
- status: 404, retryable: false }));
841
+ code: retryEntityRecordSubmits ? 'examination_acceptance_held' : 'entity_record_authority_not_found',
842
+ message: retryEntityRecordSubmits ? 'local examination holds acceptance before append' : 'no entity authority exists at that id',
843
+ status: retryEntityRecordSubmits ? 503 : 404, retryable: retryEntityRecordSubmits }));
774
844
  return;
775
845
  }
776
846
  const submitted = decodeLocalEntityRecord(frame.record_json);
@@ -855,12 +925,26 @@ export function createPrivateWireAuthority({
855
925
  }));
856
926
  }
857
927
  }
858
- socket.send(JSON.stringify({
928
+ const ack = JSON.stringify({
859
929
  type: "entity.record.ack",
860
930
  request_id: frame.request_id,
861
931
  record_json: encodeEntityRecord(decision.record),
862
932
  duplicate: decision.kind === "duplicate",
863
- }));
933
+ });
934
+ const hold = decision.kind === "append" ? ackHoldPolicy : null;
935
+ if (hold === null) {
936
+ socket.send(ack);
937
+ return;
938
+ }
939
+ // A test-released hold selects exactly the next accepted record.
940
+ if (hold.deadlineMs !== undefined) ackHoldPolicy = null;
941
+ holdAck(socket, ack, hold, {
942
+ entityId: decision.record.entityId,
943
+ mutationId: decision.record.mutationId,
944
+ globalSequence: decision.record.globalSequence,
945
+ receivedAt,
946
+ acceptedAt: epochNow(),
947
+ });
864
948
  } else if (frame.type === "entity.record.subscribe") {
865
949
  entitySubscribeRequests += 1;
866
950
  entitySubscriptions.get(socket).set(frame.authority_id, null);
@@ -931,7 +1015,8 @@ export function createPrivateWireAuthority({
931
1015
  request_id: frame.request_id,
932
1016
  }));
933
1017
  }
934
- });
1018
+ };
1019
+ socket.on("message", receive);
935
1020
  });
936
1021
  return {
937
1022
  server,
@@ -988,7 +1073,26 @@ export function createPrivateWireAuthority({
988
1073
  rejectMutationSubmits(reject) {
989
1074
  rejectMutationSubmits = reject;
990
1075
  },
991
- rejectEntityRecordSubmits(reject) { rejectEntityRecordSubmits = reject; },
1076
+ rejectEntityRecordSubmits(reject, retryable = false) {
1077
+ rejectEntityRecordSubmits = reject;
1078
+ retryEntityRecordSubmits = retryable;
1079
+ },
1080
+ /** Injected latency for accepted records' acknowledgements: `{ delayMs }`
1081
+ * holds every one for that interval; `{ deadlineMs }` holds only the
1082
+ * next one until releaseEntityRecordAcks() or the deadline; null stops. */
1083
+ holdEntityRecordAcks(policy) {
1084
+ const positive = (value) => Number.isFinite(value) && value > 0;
1085
+ assert.ok(policy === null || (positive(policy.delayMs) !== positive(policy.deadlineMs)
1086
+ && Object.keys(policy).length === 1), "hold policy is null, { delayMs } or { deadlineMs }");
1087
+ ackHoldPolicy = policy;
1088
+ },
1089
+ /** Release every held acknowledgement now; returns how many. */
1090
+ releaseEntityRecordAcks() {
1091
+ const releases = [...pendingAckReleases];
1092
+ for (const release of releases) release("controller");
1093
+ return releases.length;
1094
+ },
1095
+ get entityRecordAckHolds() { return ackHolds.map((row) => ({ ...row })); },
992
1096
  interceptContentSealQueries(handler) {
993
1097
  onContentSealQuery = handler;
994
1098
  },
@@ -1124,6 +1228,25 @@ export function createPrivateWireAuthority({
1124
1228
  },
1125
1229
  get entitySubscribeRequests() { return entitySubscribeRequests; },
1126
1230
  get graphMutations() { return [...graphMutations]; },
1231
+ /** Every mutation submit's answer, in order. */
1232
+ get graphCommitAnswers() { return graphAnswers.map((row) => ({ ...row })); },
1233
+ /** Park every graph-head submit until released. */
1234
+ holdGraphCommits() {
1235
+ holdGraphSubmits = true;
1236
+ },
1237
+ /** Stop holding and replay each parked submit in arrival order. */
1238
+ releaseGraphCommits() {
1239
+ holdGraphSubmits = false;
1240
+ const held = heldGraphSubmits.splice(0);
1241
+ for (const submit of held) submit.replay();
1242
+ return held.map(({ replay, ...submit }) => submit);
1243
+ },
1244
+ get heldGraphCommits() { return heldGraphSubmits.map(({ replay, ...submit }) => submit); },
1245
+ /** Commit graph heads but never send their acknowledgements while on. */
1246
+ withholdGraphAcks(withhold) {
1247
+ withholdGraphAcks = withhold;
1248
+ },
1249
+ get withheldGraphAcks() { return [...withheldGraphAcks]; },
1127
1250
  /** Every record of the committed registry graph. A head commit names its
1128
1251
  * roots as immutable pages, so this is what the authority actually holds
1129
1252
  * after assembling them — the honest replacement for reading records out
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@amalgm/shell",
3
- "version": "0.1.164-preview.36072132286",
3
+ "version": "0.1.164-preview.36809057014",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@amalgm/shell",
9
- "version": "0.1.164-preview.36072132286",
9
+ "version": "0.1.164-preview.36809057014",
10
10
  "license": "UNLICENSED",
11
11
  "dependencies": {
12
12
  "@amalgm/agents": "0.2.3-preview.35795493380",
13
13
  "@amalgm/apps": "0.1.3-preview.35541603008",
14
14
  "@amalgm/automations": "0.4.4-preview.35542563246",
15
15
  "@amalgm/browser": "0.1.2-preview.35541635545",
16
- "@amalgm/channels": "0.1.5-preview.36059389034",
17
- "@amalgm/chat": "0.2.9-preview.36070682526",
16
+ "@amalgm/channels": "0.1.5-preview.36777776173",
17
+ "@amalgm/chat": "0.2.9-preview.36777100786",
18
18
  "@amalgm/core": "0.5.1-preview.35541371724",
19
- "@amalgm/live": "0.2.81-preview.35320889761",
19
+ "@amalgm/live": "0.2.81-preview.36771680084",
20
20
  "@amalgm/tools": "0.1.7-preview.35541586993",
21
21
  "@anthropic-ai/claude-agent-sdk": "^0.3.224",
22
22
  "@homebridge/node-pty-prebuilt-multiarch": "0.13.1",
@@ -40,15 +40,12 @@
40
40
  "engines": {
41
41
  "node": ">=24",
42
42
  "npm": ">=11.19.1 <12"
43
- },
44
- "optionalDependencies": {
45
- "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
46
43
  }
47
44
  },
48
45
  "node_modules/@agentclientprotocol/sdk": {
49
- "version": "1.5.0",
50
- "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.5.0.tgz",
51
- "integrity": "sha512-524jwbB2iYWA+kWWyv9fhKbhU89dH/lu9u5EXwVNmfYzopV8BujCDxByBDZhxRUkB7RWIJzISCnwivdDk+bdVg==",
46
+ "version": "1.5.1",
47
+ "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.5.1.tgz",
48
+ "integrity": "sha512-nSUIrC1fOR9+ppKfx9KdwjBBND2sAPzFHo4yVQrGbXZHnayUYpwL8CDVR5LSxbapY/oKMOzNP0wvwfyx3PS2KA==",
52
49
  "license": "Apache-2.0",
53
50
  "peerDependencies": {
54
51
  "zod": "^3.25.0 || ^4.0.0"
@@ -177,9 +174,9 @@
177
174
  }
178
175
  },
179
176
  "node_modules/@amalgm/channels": {
180
- "version": "0.1.5-preview.36059389034",
181
- "resolved": "https://registry.npmjs.org/@amalgm/channels/-/channels-0.1.5-preview.36059389034.tgz",
182
- "integrity": "sha512-fMAON0XvLsOb1ZrRw2q/fLQuMW3E5wu4t2VpJ4Xp1X04ES/Jh3CD1f/EMwI3sHzL9Lv+Z7ujQAzG9SfqivmClA==",
177
+ "version": "0.1.5-preview.36777776173",
178
+ "resolved": "https://registry.npmjs.org/@amalgm/channels/-/channels-0.1.5-preview.36777776173.tgz",
179
+ "integrity": "sha512-lsJ3LBrw9x3G5N39tPwC1dUc+2UXBXrCsuDc/kFJs1vllc0TZ6DzBIzeB143lkdURPAsrIzzU0PxKcBTRQ3RdQ==",
183
180
  "license": "UNLICENSED",
184
181
  "dependencies": {
185
182
  "@amalgm/core": "0.5.1-preview.35541371724",
@@ -197,9 +194,9 @@
197
194
  }
198
195
  },
199
196
  "node_modules/@amalgm/chat": {
200
- "version": "0.2.9-preview.36070682526",
201
- "resolved": "https://registry.npmjs.org/@amalgm/chat/-/chat-0.2.9-preview.36070682526.tgz",
202
- "integrity": "sha512-tnzeY06l1/VGX1nwp3EUpwtChx4dURrkCV1wkFCs4Y9o2n8fe7fZud7D08+0vjAqWp/pCkxvacLzc0QwM1iKNQ==",
197
+ "version": "0.2.9-preview.36777100786",
198
+ "resolved": "https://registry.npmjs.org/@amalgm/chat/-/chat-0.2.9-preview.36777100786.tgz",
199
+ "integrity": "sha512-1O1XLuMmMCj56QkSlg0Eyu6VT4Til7ma68CjmAzONemzX9ZnyrZgz4IC+3MewtWu9i09hPC74HJ0vt/t3mxmUQ==",
203
200
  "license": "UNLICENSED",
204
201
  "dependencies": {
205
202
  "@agentclientprotocol/sdk": "^1.4.0",
@@ -224,9 +221,9 @@
224
221
  }
225
222
  },
226
223
  "node_modules/@amalgm/live": {
227
- "version": "0.2.81-preview.35320889761",
228
- "resolved": "https://registry.npmjs.org/@amalgm/live/-/live-0.2.81-preview.35320889761.tgz",
229
- "integrity": "sha512-sGLYdh1xx1FuzUTf7wtPcSzYJ/Db6bx8KNljZ1ZF1gdbDahDKze//whaYq7mlRKYQznYTJLFrJnw+l0M2RIMpg==",
224
+ "version": "0.2.81-preview.36771680084",
225
+ "resolved": "https://registry.npmjs.org/@amalgm/live/-/live-0.2.81-preview.36771680084.tgz",
226
+ "integrity": "sha512-ETfSFsY3Ae2+84IfXesP/IBmREHxl4RbFJ+8kpdQv3LkI9kLCbExpCXsSe/fboaNooNhUpXTZ/9C/ESAkLfQGw==",
230
227
  "license": "UNLICENSED",
231
228
  "engines": {
232
229
  "node": ">=18"
@@ -866,9 +863,9 @@
866
863
  }
867
864
  },
868
865
  "node_modules/@opencode-ai/sdk": {
869
- "version": "1.18.32",
870
- "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.32.tgz",
871
- "integrity": "sha512-Wi3WtH/cLA3C0ga05lyDb7zac+SzbST9MPwCve1Ffod0xwzHdy9G2gnxvMAR4RBRhKJS32Rgk2cR+fxBhAVSQw==",
866
+ "version": "1.18.34",
867
+ "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.34.tgz",
868
+ "integrity": "sha512-R9QWUpcngtdQ6FCixz7NC6n1WsSho6CEuRUzYHz/CzZcp3miSklDzXkm0oDwXVCnuEu+ANoeM0f6RDp51kOMzQ==",
872
869
  "license": "MIT",
873
870
  "dependencies": {
874
871
  "cross-spawn": "7.0.6"
@@ -1043,9 +1040,9 @@
1043
1040
  "license": "MIT"
1044
1041
  },
1045
1042
  "node_modules/@types/ws": {
1046
- "version": "8.18.1",
1047
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
1048
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
1043
+ "version": "8.18.2",
1044
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz",
1045
+ "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==",
1049
1046
  "license": "MIT",
1050
1047
  "dependencies": {
1051
1048
  "@types/node": "*"
@@ -1210,9 +1207,10 @@
1210
1207
  }
1211
1208
  },
1212
1209
  "node_modules/brace-expansion": {
1213
- "version": "5.0.9",
1214
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
1215
- "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
1210
+ "version": "5.0.12",
1211
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
1212
+ "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
1213
+ "license": "MIT",
1216
1214
  "dependencies": {
1217
1215
  "balanced-match": "^4.0.2"
1218
1216
  },
@@ -1623,9 +1621,9 @@
1623
1621
  "peer": true
1624
1622
  },
1625
1623
  "node_modules/fast-uri": {
1626
- "version": "3.1.7",
1627
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz",
1628
- "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==",
1624
+ "version": "3.1.8",
1625
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
1626
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
1629
1627
  "funding": [
1630
1628
  {
1631
1629
  "type": "github",
@@ -1635,7 +1633,8 @@
1635
1633
  "type": "opencollective",
1636
1634
  "url": "https://opencollective.com/fastify"
1637
1635
  }
1638
- ]
1636
+ ],
1637
+ "license": "BSD-3-Clause"
1639
1638
  },
1640
1639
  "node_modules/ffmpeg-static": {
1641
1640
  "version": "5.3.0",
@@ -1699,19 +1698,6 @@
1699
1698
  "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
1700
1699
  "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
1701
1700
  },
1702
- "node_modules/fsevents": {
1703
- "version": "2.3.3",
1704
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1705
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1706
- "hasInstallScript": true,
1707
- "optional": true,
1708
- "os": [
1709
- "darwin"
1710
- ],
1711
- "engines": {
1712
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1713
- }
1714
- },
1715
1701
  "node_modules/function-bind": {
1716
1702
  "version": "1.1.2",
1717
1703
  "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -1894,9 +1880,10 @@
1894
1880
  "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
1895
1881
  },
1896
1882
  "node_modules/ip-address": {
1897
- "version": "10.4.0",
1898
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz",
1899
- "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==",
1883
+ "version": "10.7.2",
1884
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.2.tgz",
1885
+ "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==",
1886
+ "license": "MIT",
1900
1887
  "engines": {
1901
1888
  "node": ">= 12"
1902
1889
  }
@@ -4403,18 +4390,18 @@
4403
4390
  }
4404
4391
  },
4405
4392
  "node_modules/tldts-core": {
4406
- "version": "7.4.15",
4407
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.15.tgz",
4408
- "integrity": "sha512-ERuv0p98XgSzmlSLJr8vDNxX+uATGInlN97V3R+JpYWaSqn5IG3ewWgCwczk4bkOpgth/o8Nt5FOi4B4w0n/1A==",
4393
+ "version": "7.4.16",
4394
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.16.tgz",
4395
+ "integrity": "sha512-MDolfaSJtlSK5Y0A1xl3277ekubZwobpBjugknDizI9O5Rm60a1m8k4ICK+MRsCDzPygT81mp3BBf5RKDlFRfA==",
4409
4396
  "license": "MIT"
4410
4397
  },
4411
4398
  "node_modules/tldts-experimental": {
4412
- "version": "7.4.15",
4413
- "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-7.4.15.tgz",
4414
- "integrity": "sha512-IHFsr0juxP1k2JemWCefrfnHaVX1NHgpRApdnGvgItJSEZvhcEv2yOt2DVJ3j7aPbEEoxjN7dci7+mtZmfGIJw==",
4399
+ "version": "7.4.16",
4400
+ "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-7.4.16.tgz",
4401
+ "integrity": "sha512-H1gI3Toi/7PoMRmBIX9K2cyWIEdxjW0F4ygsVRtsCM1thOZwa3zFc8SowUttgd0UhVUR2ahRbgUHEKrxj7WZ3w==",
4415
4402
  "license": "MIT",
4416
4403
  "dependencies": {
4417
- "tldts-core": "^7.4.15"
4404
+ "tldts-core": "^7.4.16"
4418
4405
  }
4419
4406
  },
4420
4407
  "node_modules/toidentifier": {