@earendil-works/chord 1.4.0 → 1.5.1

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 (1299) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +115 -90
  3. package/dist/context/index.d.ts +1 -1
  4. package/dist/context/index.d.ts.map +1 -1
  5. package/dist/context/index.js +1 -1
  6. package/dist/context/index.js.map +1 -1
  7. package/dist/contracts/accepts.d.ts +81 -0
  8. package/dist/contracts/accepts.d.ts.map +1 -0
  9. package/dist/contracts/accepts.js +123 -0
  10. package/dist/contracts/accepts.js.map +1 -0
  11. package/dist/contracts/contract.d.ts +121 -0
  12. package/dist/contracts/contract.d.ts.map +1 -0
  13. package/dist/contracts/contract.js +50 -0
  14. package/dist/contracts/contract.js.map +1 -0
  15. package/dist/contracts/declare.d.ts +107 -0
  16. package/dist/contracts/declare.d.ts.map +1 -0
  17. package/dist/contracts/declare.js +136 -0
  18. package/dist/contracts/declare.js.map +1 -0
  19. package/dist/contracts/evolve.d.ts +92 -0
  20. package/dist/contracts/evolve.d.ts.map +1 -0
  21. package/dist/contracts/evolve.js +179 -0
  22. package/dist/contracts/evolve.js.map +1 -0
  23. package/dist/contracts/fingerprint.d.ts +16 -0
  24. package/dist/contracts/fingerprint.d.ts.map +1 -0
  25. package/dist/contracts/fingerprint.js +50 -0
  26. package/dist/contracts/fingerprint.js.map +1 -0
  27. package/dist/contracts/history.d.ts +71 -0
  28. package/dist/contracts/history.d.ts.map +1 -0
  29. package/dist/contracts/history.js +3 -0
  30. package/dist/contracts/history.js.map +1 -0
  31. package/dist/contracts/host-kind.d.ts +40 -0
  32. package/dist/contracts/host-kind.d.ts.map +1 -0
  33. package/dist/contracts/host-kind.js +37 -0
  34. package/dist/contracts/host-kind.js.map +1 -0
  35. package/dist/contracts/index.d.ts +7 -0
  36. package/dist/contracts/index.d.ts.map +1 -0
  37. package/dist/contracts/index.js +6 -0
  38. package/dist/contracts/index.js.map +1 -0
  39. package/dist/contracts/internal.d.ts +10 -0
  40. package/dist/contracts/internal.d.ts.map +1 -0
  41. package/dist/contracts/internal.js +9 -0
  42. package/dist/contracts/internal.js.map +1 -0
  43. package/dist/contracts/names.d.ts +3 -0
  44. package/dist/contracts/names.d.ts.map +1 -0
  45. package/dist/contracts/names.js +13 -0
  46. package/dist/contracts/names.js.map +1 -0
  47. package/dist/contracts/params.d.ts +28 -0
  48. package/dist/contracts/params.d.ts.map +1 -0
  49. package/dist/contracts/params.js +50 -0
  50. package/dist/contracts/params.js.map +1 -0
  51. package/dist/contracts/schema.d.ts +102 -0
  52. package/dist/contracts/schema.d.ts.map +1 -0
  53. package/dist/contracts/schema.js +103 -0
  54. package/dist/contracts/schema.js.map +1 -0
  55. package/dist/contracts/snapshot.d.ts +16 -0
  56. package/dist/contracts/snapshot.d.ts.map +1 -0
  57. package/dist/contracts/snapshot.js +167 -0
  58. package/dist/contracts/snapshot.js.map +1 -0
  59. package/dist/data/args.d.ts +50 -0
  60. package/dist/data/args.d.ts.map +1 -0
  61. package/dist/data/args.js +83 -0
  62. package/dist/data/args.js.map +1 -0
  63. package/dist/data/errors.d.ts +80 -0
  64. package/dist/data/errors.d.ts.map +1 -0
  65. package/dist/data/errors.js +116 -0
  66. package/dist/data/errors.js.map +1 -0
  67. package/dist/data/failure.d.ts +26 -0
  68. package/dist/data/failure.d.ts.map +1 -0
  69. package/dist/data/failure.js +77 -0
  70. package/dist/data/failure.js.map +1 -0
  71. package/dist/data/index.d.ts +4 -0
  72. package/dist/data/index.d.ts.map +1 -0
  73. package/dist/data/index.js +5 -0
  74. package/dist/data/index.js.map +1 -0
  75. package/dist/data/internal.d.ts +7 -0
  76. package/dist/data/internal.d.ts.map +1 -0
  77. package/dist/data/internal.js +8 -0
  78. package/dist/data/internal.js.map +1 -0
  79. package/dist/data/params.d.ts +20 -0
  80. package/dist/data/params.d.ts.map +1 -0
  81. package/dist/data/params.js +31 -0
  82. package/dist/data/params.js.map +1 -0
  83. package/dist/data/principal.d.ts +22 -0
  84. package/dist/data/principal.d.ts.map +1 -0
  85. package/dist/data/principal.js +49 -0
  86. package/dist/data/principal.js.map +1 -0
  87. package/dist/data/validator.d.ts +12 -0
  88. package/dist/data/validator.d.ts.map +1 -0
  89. package/dist/data/validator.js +35 -0
  90. package/dist/data/validator.js.map +1 -0
  91. package/dist/delta/apply-immutable-trusted.js +3 -4
  92. package/dist/delta/apply-immutable-trusted.js.map +1 -1
  93. package/dist/delta/diff.d.ts.map +1 -1
  94. package/dist/delta/diff.js +5 -3
  95. package/dist/delta/diff.js.map +1 -1
  96. package/dist/delta/index.d.ts +9 -1
  97. package/dist/delta/index.d.ts.map +1 -1
  98. package/dist/delta/index.js +15 -11
  99. package/dist/delta/index.js.map +1 -1
  100. package/dist/delta/pending.d.ts +36 -0
  101. package/dist/delta/pending.d.ts.map +1 -0
  102. package/dist/delta/pending.js +143 -0
  103. package/dist/delta/pending.js.map +1 -0
  104. package/dist/delta/tracker.d.ts +12 -0
  105. package/dist/delta/tracker.d.ts.map +1 -1
  106. package/dist/delta/tracker.js +109 -39
  107. package/dist/delta/tracker.js.map +1 -1
  108. package/dist/documents/address-source.d.ts +20 -0
  109. package/dist/documents/address-source.d.ts.map +1 -0
  110. package/dist/documents/address-source.js +44 -0
  111. package/dist/documents/address-source.js.map +1 -0
  112. package/dist/documents/definition.d.ts +84 -0
  113. package/dist/documents/definition.d.ts.map +1 -0
  114. package/dist/documents/definition.js +74 -0
  115. package/dist/documents/definition.js.map +1 -0
  116. package/dist/documents/documents.d.ts +126 -0
  117. package/dist/documents/documents.d.ts.map +1 -0
  118. package/dist/documents/documents.js +248 -0
  119. package/dist/documents/documents.js.map +1 -0
  120. package/dist/documents/fence.d.ts +9 -0
  121. package/dist/documents/fence.d.ts.map +1 -0
  122. package/dist/documents/fence.js +15 -0
  123. package/dist/documents/fence.js.map +1 -0
  124. package/dist/documents/handles.d.ts +76 -0
  125. package/dist/documents/handles.d.ts.map +1 -0
  126. package/dist/documents/handles.js +66 -0
  127. package/dist/documents/handles.js.map +1 -0
  128. package/dist/documents/index.d.ts +4 -0
  129. package/dist/documents/index.d.ts.map +1 -0
  130. package/dist/documents/index.js +3 -0
  131. package/dist/documents/index.js.map +1 -0
  132. package/dist/documents/internal.d.ts +9 -0
  133. package/dist/documents/internal.d.ts.map +1 -0
  134. package/dist/documents/internal.js +9 -0
  135. package/dist/documents/internal.js.map +1 -0
  136. package/dist/documents/keyed-slot.d.ts +103 -0
  137. package/dist/documents/keyed-slot.d.ts.map +1 -0
  138. package/dist/documents/keyed-slot.js +395 -0
  139. package/dist/documents/keyed-slot.js.map +1 -0
  140. package/dist/documents/line.d.ts +7 -0
  141. package/dist/documents/line.d.ts.map +1 -0
  142. package/dist/documents/line.js +14 -0
  143. package/dist/documents/line.js.map +1 -0
  144. package/dist/documents/persistence.d.ts +104 -0
  145. package/dist/documents/persistence.d.ts.map +1 -0
  146. package/dist/documents/persistence.js +129 -0
  147. package/dist/documents/persistence.js.map +1 -0
  148. package/dist/documents/residency.d.ts +31 -0
  149. package/dist/documents/residency.d.ts.map +1 -0
  150. package/dist/documents/residency.js +93 -0
  151. package/dist/documents/residency.js.map +1 -0
  152. package/dist/documents/slot.d.ts +109 -0
  153. package/dist/documents/slot.d.ts.map +1 -0
  154. package/dist/documents/slot.js +181 -0
  155. package/dist/documents/slot.js.map +1 -0
  156. package/dist/documents/transaction.d.ts +143 -0
  157. package/dist/documents/transaction.d.ts.map +1 -0
  158. package/dist/documents/transaction.js +442 -0
  159. package/dist/documents/transaction.js.map +1 -0
  160. package/dist/host/activity.d.ts +31 -0
  161. package/dist/host/activity.d.ts.map +1 -0
  162. package/dist/host/activity.js +40 -0
  163. package/dist/host/activity.js.map +1 -0
  164. package/dist/host/adapted.d.ts +49 -0
  165. package/dist/host/adapted.d.ts.map +1 -0
  166. package/dist/host/adapted.js +214 -0
  167. package/dist/host/adapted.js.map +1 -0
  168. package/dist/host/attempt.d.ts +308 -0
  169. package/dist/host/attempt.d.ts.map +1 -0
  170. package/dist/host/attempt.js +1199 -0
  171. package/dist/host/attempt.js.map +1 -0
  172. package/dist/host/backoff.d.ts +29 -0
  173. package/dist/host/backoff.d.ts.map +1 -0
  174. package/dist/host/backoff.js +69 -0
  175. package/dist/host/backoff.js.map +1 -0
  176. package/dist/host/ctx.d.ts +94 -0
  177. package/dist/host/ctx.d.ts.map +1 -0
  178. package/dist/host/ctx.js +200 -0
  179. package/dist/host/ctx.js.map +1 -0
  180. package/dist/host/deadline.d.ts +12 -0
  181. package/dist/host/deadline.d.ts.map +1 -0
  182. package/dist/host/deadline.js +40 -0
  183. package/dist/host/deadline.js.map +1 -0
  184. package/dist/host/dependencies.d.ts +65 -0
  185. package/dist/host/dependencies.d.ts.map +1 -0
  186. package/dist/host/dependencies.js +115 -0
  187. package/dist/host/dependencies.js.map +1 -0
  188. package/dist/host/destination.d.ts +48 -0
  189. package/dist/host/destination.d.ts.map +1 -0
  190. package/dist/host/destination.js +101 -0
  191. package/dist/host/destination.js.map +1 -0
  192. package/dist/host/facet.d.ts +84 -0
  193. package/dist/host/facet.d.ts.map +1 -0
  194. package/dist/host/facet.js +55 -0
  195. package/dist/host/facet.js.map +1 -0
  196. package/dist/host/follow.d.ts +52 -0
  197. package/dist/host/follow.d.ts.map +1 -0
  198. package/dist/host/follow.js +207 -0
  199. package/dist/host/follow.js.map +1 -0
  200. package/dist/host/host.d.ts +571 -0
  201. package/dist/host/host.d.ts.map +1 -0
  202. package/dist/host/host.js +1318 -0
  203. package/dist/host/host.js.map +1 -0
  204. package/dist/host/index.d.ts +17 -0
  205. package/dist/host/index.d.ts.map +1 -0
  206. package/dist/host/index.js +6 -0
  207. package/dist/host/index.js.map +1 -0
  208. package/dist/host/internal.d.ts +11 -0
  209. package/dist/host/internal.d.ts.map +1 -0
  210. package/dist/host/internal.js +9 -0
  211. package/dist/host/internal.js.map +1 -0
  212. package/dist/host/members.d.ts +50 -0
  213. package/dist/host/members.d.ts.map +1 -0
  214. package/dist/host/members.js +107 -0
  215. package/dist/host/members.js.map +1 -0
  216. package/dist/host/native.d.ts +64 -0
  217. package/dist/host/native.d.ts.map +1 -0
  218. package/dist/host/native.js +126 -0
  219. package/dist/host/native.js.map +1 -0
  220. package/dist/host/object.d.ts +331 -0
  221. package/dist/host/object.d.ts.map +1 -0
  222. package/dist/host/object.js +1296 -0
  223. package/dist/host/object.js.map +1 -0
  224. package/dist/host/old-work.d.ts +34 -0
  225. package/dist/host/old-work.d.ts.map +1 -0
  226. package/dist/host/old-work.js +52 -0
  227. package/dist/host/old-work.js.map +1 -0
  228. package/dist/host/parked.d.ts +23 -0
  229. package/dist/host/parked.d.ts.map +1 -0
  230. package/dist/host/parked.js +79 -0
  231. package/dist/host/parked.js.map +1 -0
  232. package/dist/host/presence.d.ts +34 -0
  233. package/dist/host/presence.d.ts.map +1 -0
  234. package/dist/host/presence.js +117 -0
  235. package/dist/host/presence.js.map +1 -0
  236. package/dist/host/readiness.d.ts +27 -0
  237. package/dist/host/readiness.d.ts.map +1 -0
  238. package/dist/host/readiness.js +134 -0
  239. package/dist/host/readiness.js.map +1 -0
  240. package/dist/host/ref-state.d.ts +53 -0
  241. package/dist/host/ref-state.d.ts.map +1 -0
  242. package/dist/host/ref-state.js +83 -0
  243. package/dist/host/ref-state.js.map +1 -0
  244. package/dist/host/reference-keys.d.ts +36 -0
  245. package/dist/host/reference-keys.d.ts.map +1 -0
  246. package/dist/host/reference-keys.js +168 -0
  247. package/dist/host/reference-keys.js.map +1 -0
  248. package/dist/host/reference-source.d.ts +65 -0
  249. package/dist/host/reference-source.d.ts.map +1 -0
  250. package/dist/host/reference-source.js +285 -0
  251. package/dist/host/reference-source.js.map +1 -0
  252. package/dist/host/reference.d.ts +321 -0
  253. package/dist/host/reference.d.ts.map +1 -0
  254. package/dist/host/reference.js +797 -0
  255. package/dist/host/reference.js.map +1 -0
  256. package/dist/host/reload-cycle.d.ts +16 -0
  257. package/dist/host/reload-cycle.d.ts.map +1 -0
  258. package/dist/host/reload-cycle.js +81 -0
  259. package/dist/host/reload-cycle.js.map +1 -0
  260. package/dist/host/retry-on.d.ts +28 -0
  261. package/dist/host/retry-on.d.ts.map +1 -0
  262. package/dist/host/retry-on.js +52 -0
  263. package/dist/host/retry-on.js.map +1 -0
  264. package/dist/host/revocation.d.ts +16 -0
  265. package/dist/host/revocation.d.ts.map +1 -0
  266. package/dist/host/revocation.js +27 -0
  267. package/dist/host/revocation.js.map +1 -0
  268. package/dist/host/root.d.ts +37 -0
  269. package/dist/host/root.d.ts.map +1 -0
  270. package/dist/host/root.js +68 -0
  271. package/dist/host/root.js.map +1 -0
  272. package/dist/host/route.d.ts +64 -0
  273. package/dist/host/route.d.ts.map +1 -0
  274. package/dist/host/route.js +227 -0
  275. package/dist/host/route.js.map +1 -0
  276. package/dist/host/routines.d.ts +78 -0
  277. package/dist/host/routines.d.ts.map +1 -0
  278. package/dist/host/routines.js +398 -0
  279. package/dist/host/routines.js.map +1 -0
  280. package/dist/host/sleep.d.ts +9 -0
  281. package/dist/host/sleep.d.ts.map +1 -0
  282. package/dist/host/sleep.js +40 -0
  283. package/dist/host/sleep.js.map +1 -0
  284. package/dist/host/staging.d.ts +94 -0
  285. package/dist/host/staging.d.ts.map +1 -0
  286. package/dist/host/staging.js +304 -0
  287. package/dist/host/staging.js.map +1 -0
  288. package/dist/host/unbound-clock.d.ts +23 -0
  289. package/dist/host/unbound-clock.d.ts.map +1 -0
  290. package/dist/host/unbound-clock.js +58 -0
  291. package/dist/host/unbound-clock.js.map +1 -0
  292. package/dist/host/unbound.d.ts +37 -0
  293. package/dist/host/unbound.d.ts.map +1 -0
  294. package/dist/host/unbound.js +88 -0
  295. package/dist/host/unbound.js.map +1 -0
  296. package/dist/host/uuid.d.ts +3 -0
  297. package/dist/host/uuid.d.ts.map +1 -0
  298. package/dist/host/uuid.js +38 -0
  299. package/dist/host/uuid.js.map +1 -0
  300. package/dist/index.d.ts +29 -18
  301. package/dist/index.d.ts.map +1 -1
  302. package/dist/index.js +20 -9
  303. package/dist/index.js.map +1 -1
  304. package/dist/jobs/definition.d.ts +96 -0
  305. package/dist/jobs/definition.d.ts.map +1 -0
  306. package/dist/jobs/definition.js +83 -0
  307. package/dist/jobs/definition.js.map +1 -0
  308. package/dist/jobs/index.d.ts +5 -0
  309. package/dist/jobs/index.d.ts.map +1 -0
  310. package/dist/jobs/index.js +3 -0
  311. package/dist/jobs/index.js.map +1 -0
  312. package/dist/jobs/internal.d.ts +3 -0
  313. package/dist/jobs/internal.d.ts.map +1 -0
  314. package/dist/jobs/internal.js +4 -0
  315. package/dist/jobs/internal.js.map +1 -0
  316. package/dist/jobs/job.d.ts +149 -0
  317. package/dist/jobs/job.d.ts.map +1 -0
  318. package/dist/jobs/job.js +387 -0
  319. package/dist/jobs/job.js.map +1 -0
  320. package/dist/jobs/persisted.d.ts +38 -0
  321. package/dist/jobs/persisted.d.ts.map +1 -0
  322. package/dist/jobs/persisted.js +95 -0
  323. package/dist/jobs/persisted.js.map +1 -0
  324. package/dist/jobs/records.d.ts +231 -0
  325. package/dist/jobs/records.d.ts.map +1 -0
  326. package/dist/jobs/records.js +871 -0
  327. package/dist/jobs/records.js.map +1 -0
  328. package/dist/jobs/run-states.d.ts +69 -0
  329. package/dist/jobs/run-states.d.ts.map +1 -0
  330. package/dist/jobs/run-states.js +228 -0
  331. package/dist/jobs/run-states.js.map +1 -0
  332. package/dist/jobs/run.d.ts +117 -0
  333. package/dist/jobs/run.d.ts.map +1 -0
  334. package/dist/jobs/run.js +204 -0
  335. package/dist/jobs/run.js.map +1 -0
  336. package/dist/jobs/running.d.ts +44 -0
  337. package/dist/jobs/running.d.ts.map +1 -0
  338. package/dist/jobs/running.js +117 -0
  339. package/dist/jobs/running.js.map +1 -0
  340. package/dist/jobs/stored.d.ts +63 -0
  341. package/dist/jobs/stored.d.ts.map +1 -0
  342. package/dist/jobs/stored.js +55 -0
  343. package/dist/jobs/stored.js.map +1 -0
  344. package/dist/link/binary.d.ts +4 -0
  345. package/dist/link/binary.d.ts.map +1 -0
  346. package/dist/link/binary.js +544 -0
  347. package/dist/link/binary.js.map +1 -0
  348. package/dist/link/channel.d.ts +68 -0
  349. package/dist/link/channel.d.ts.map +1 -0
  350. package/dist/link/channel.js +215 -0
  351. package/dist/link/channel.js.map +1 -0
  352. package/dist/link/errors.d.ts +7 -0
  353. package/dist/link/errors.d.ts.map +1 -0
  354. package/dist/link/errors.js +21 -0
  355. package/dist/link/errors.js.map +1 -0
  356. package/dist/link/index.d.ts +8 -0
  357. package/dist/link/index.d.ts.map +1 -0
  358. package/dist/link/index.js +8 -0
  359. package/dist/link/index.js.map +1 -0
  360. package/dist/link/internal.d.ts +9 -0
  361. package/dist/link/internal.d.ts.map +1 -0
  362. package/dist/link/internal.js +10 -0
  363. package/dist/link/internal.js.map +1 -0
  364. package/dist/link/ipc.d.ts +22 -0
  365. package/dist/link/ipc.d.ts.map +1 -0
  366. package/dist/link/ipc.js +64 -0
  367. package/dist/link/ipc.js.map +1 -0
  368. package/dist/link/link.d.ts +34 -0
  369. package/dist/link/link.d.ts.map +1 -0
  370. package/dist/link/link.js +87 -0
  371. package/dist/link/link.js.map +1 -0
  372. package/dist/link/message.d.ts +262 -0
  373. package/dist/link/message.d.ts.map +1 -0
  374. package/dist/link/message.js +156 -0
  375. package/dist/link/message.js.map +1 -0
  376. package/dist/link/part.d.ts +80 -0
  377. package/dist/link/part.d.ts.map +1 -0
  378. package/dist/link/part.js +165 -0
  379. package/dist/link/part.js.map +1 -0
  380. package/dist/link/text.d.ts +6 -0
  381. package/dist/link/text.d.ts.map +1 -0
  382. package/dist/link/text.js +355 -0
  383. package/dist/link/text.js.map +1 -0
  384. package/dist/link/values.d.ts +40 -0
  385. package/dist/link/values.d.ts.map +1 -0
  386. package/dist/link/values.js +121 -0
  387. package/dist/link/values.js.map +1 -0
  388. package/dist/link/websocket.d.ts +26 -0
  389. package/dist/link/websocket.d.ts.map +1 -0
  390. package/dist/link/websocket.js +91 -0
  391. package/dist/link/websocket.js.map +1 -0
  392. package/dist/node/app/app.d.ts +269 -0
  393. package/dist/node/app/app.d.ts.map +1 -0
  394. package/dist/node/app/app.js +513 -0
  395. package/dist/node/app/app.js.map +1 -0
  396. package/dist/node/app/archive.d.ts +37 -0
  397. package/dist/node/app/archive.d.ts.map +1 -0
  398. package/dist/node/app/archive.js +204 -0
  399. package/dist/node/app/archive.js.map +1 -0
  400. package/dist/node/app/blobs.d.ts +23 -0
  401. package/dist/node/app/blobs.d.ts.map +1 -0
  402. package/dist/node/app/blobs.js +64 -0
  403. package/dist/node/app/blobs.js.map +1 -0
  404. package/dist/node/app/data.d.ts +35 -0
  405. package/dist/node/app/data.d.ts.map +1 -0
  406. package/dist/node/app/data.js +44 -0
  407. package/dist/node/app/data.js.map +1 -0
  408. package/dist/node/app/ephemeral-sessions.d.ts +20 -0
  409. package/dist/node/app/ephemeral-sessions.d.ts.map +1 -0
  410. package/dist/node/app/ephemeral-sessions.js +69 -0
  411. package/dist/node/app/ephemeral-sessions.js.map +1 -0
  412. package/dist/node/app/ephemeral.d.ts +11 -0
  413. package/dist/node/app/ephemeral.d.ts.map +1 -0
  414. package/dist/node/app/ephemeral.js +34 -0
  415. package/dist/node/app/ephemeral.js.map +1 -0
  416. package/dist/node/app/files-copy.d.ts +13 -0
  417. package/dist/node/app/files-copy.d.ts.map +1 -0
  418. package/dist/node/app/files-copy.js +86 -0
  419. package/dist/node/app/files-copy.js.map +1 -0
  420. package/dist/node/app/files-entry.d.ts +4 -0
  421. package/dist/node/app/files-entry.d.ts.map +1 -0
  422. package/dist/node/app/files-entry.js +7 -0
  423. package/dist/node/app/files-entry.js.map +1 -0
  424. package/dist/node/app/files-index.d.ts +180 -0
  425. package/dist/node/app/files-index.d.ts.map +1 -0
  426. package/dist/node/app/files-index.js +535 -0
  427. package/dist/node/app/files-index.js.map +1 -0
  428. package/dist/node/app/files.d.ts +363 -0
  429. package/dist/node/app/files.d.ts.map +1 -0
  430. package/dist/node/app/files.js +368 -0
  431. package/dist/node/app/files.js.map +1 -0
  432. package/dist/node/app/folder-views.d.ts +21 -0
  433. package/dist/node/app/folder-views.d.ts.map +1 -0
  434. package/dist/node/app/folder-views.js +55 -0
  435. package/dist/node/app/folder-views.js.map +1 -0
  436. package/dist/node/app/index.d.ts +12 -0
  437. package/dist/node/app/index.d.ts.map +1 -0
  438. package/dist/node/app/index.js +15 -0
  439. package/dist/node/app/index.js.map +1 -0
  440. package/dist/node/app/info.d.ts +66 -0
  441. package/dist/node/app/info.d.ts.map +1 -0
  442. package/dist/node/app/info.js +37 -0
  443. package/dist/node/app/info.js.map +1 -0
  444. package/dist/node/app/invite.d.ts +5 -0
  445. package/dist/node/app/invite.d.ts.map +1 -0
  446. package/dist/node/app/invite.js +64 -0
  447. package/dist/node/app/invite.js.map +1 -0
  448. package/dist/node/app/layout.d.ts +36 -0
  449. package/dist/node/app/layout.d.ts.map +1 -0
  450. package/dist/node/app/layout.js +87 -0
  451. package/dist/node/app/layout.js.map +1 -0
  452. package/dist/node/app/owner.d.ts +31 -0
  453. package/dist/node/app/owner.d.ts.map +1 -0
  454. package/dist/node/app/owner.js +104 -0
  455. package/dist/node/app/owner.js.map +1 -0
  456. package/dist/node/app/pairing.d.ts +55 -0
  457. package/dist/node/app/pairing.d.ts.map +1 -0
  458. package/dist/node/app/pairing.js +183 -0
  459. package/dist/node/app/pairing.js.map +1 -0
  460. package/dist/node/app/secrets.d.ts +16 -0
  461. package/dist/node/app/secrets.d.ts.map +1 -0
  462. package/dist/node/app/secrets.js +72 -0
  463. package/dist/node/app/secrets.js.map +1 -0
  464. package/dist/node/app/sessions.d.ts +72 -0
  465. package/dist/node/app/sessions.d.ts.map +1 -0
  466. package/dist/node/app/sessions.js +222 -0
  467. package/dist/node/app/sessions.js.map +1 -0
  468. package/dist/node/app/tar.d.ts +24 -0
  469. package/dist/node/app/tar.d.ts.map +1 -0
  470. package/dist/node/app/tar.js +167 -0
  471. package/dist/node/app/tar.js.map +1 -0
  472. package/dist/node/app/uploads.d.ts +37 -0
  473. package/dist/node/app/uploads.d.ts.map +1 -0
  474. package/dist/node/app/uploads.js +157 -0
  475. package/dist/node/app/uploads.js.map +1 -0
  476. package/dist/node/app/users.d.ts +37 -0
  477. package/dist/node/app/users.d.ts.map +1 -0
  478. package/dist/node/app/users.js +62 -0
  479. package/dist/node/app/users.js.map +1 -0
  480. package/dist/node/app/worker.d.ts +18 -0
  481. package/dist/node/app/worker.d.ts.map +1 -0
  482. package/dist/node/app/worker.js +84 -0
  483. package/dist/node/app/worker.js.map +1 -0
  484. package/dist/node/compression.d.ts +7 -0
  485. package/dist/node/compression.d.ts.map +1 -0
  486. package/dist/node/compression.js +25 -0
  487. package/dist/node/compression.js.map +1 -0
  488. package/dist/node/http/admission.d.ts +63 -0
  489. package/dist/node/http/admission.d.ts.map +1 -0
  490. package/dist/node/http/admission.js +134 -0
  491. package/dist/node/http/admission.js.map +1 -0
  492. package/dist/node/http/authenticate.d.ts +21 -0
  493. package/dist/node/http/authenticate.d.ts.map +1 -0
  494. package/dist/node/http/authenticate.js +34 -0
  495. package/dist/node/http/authenticate.js.map +1 -0
  496. package/dist/node/http/cookies.d.ts +32 -0
  497. package/dist/node/http/cookies.d.ts.map +1 -0
  498. package/dist/node/http/cookies.js +70 -0
  499. package/dist/node/http/cookies.js.map +1 -0
  500. package/dist/node/http/file.d.ts +23 -0
  501. package/dist/node/http/file.d.ts.map +1 -0
  502. package/dist/node/http/file.js +94 -0
  503. package/dist/node/http/file.js.map +1 -0
  504. package/dist/node/http/headers.d.ts +37 -0
  505. package/dist/node/http/headers.d.ts.map +1 -0
  506. package/dist/node/http/headers.js +136 -0
  507. package/dist/node/http/headers.js.map +1 -0
  508. package/dist/node/http/http.d.ts +111 -0
  509. package/dist/node/http/http.d.ts.map +1 -0
  510. package/dist/node/http/http.js +524 -0
  511. package/dist/node/http/http.js.map +1 -0
  512. package/dist/node/http/incoming.d.ts +19 -0
  513. package/dist/node/http/incoming.d.ts.map +1 -0
  514. package/dist/node/http/incoming.js +31 -0
  515. package/dist/node/http/incoming.js.map +1 -0
  516. package/dist/node/http/index.d.ts +11 -0
  517. package/dist/node/http/index.d.ts.map +1 -0
  518. package/dist/node/http/index.js +12 -0
  519. package/dist/node/http/index.js.map +1 -0
  520. package/dist/node/http/node.d.ts +78 -0
  521. package/dist/node/http/node.d.ts.map +1 -0
  522. package/dist/node/http/node.js +291 -0
  523. package/dist/node/http/node.js.map +1 -0
  524. package/dist/node/http/request.d.ts +60 -0
  525. package/dist/node/http/request.d.ts.map +1 -0
  526. package/dist/node/http/request.js +118 -0
  527. package/dist/node/http/request.js.map +1 -0
  528. package/dist/node/http/response.d.ts +63 -0
  529. package/dist/node/http/response.d.ts.map +1 -0
  530. package/dist/node/http/response.js +202 -0
  531. package/dist/node/http/response.js.map +1 -0
  532. package/dist/node/http/router.d.ts +132 -0
  533. package/dist/node/http/router.d.ts.map +1 -0
  534. package/dist/node/http/router.js +267 -0
  535. package/dist/node/http/router.js.map +1 -0
  536. package/dist/node/http/upgrades.d.ts +61 -0
  537. package/dist/node/http/upgrades.d.ts.map +1 -0
  538. package/dist/node/http/upgrades.js +192 -0
  539. package/dist/node/http/upgrades.js.map +1 -0
  540. package/dist/node/plugins/base-inputs.d.ts +14 -0
  541. package/dist/node/plugins/base-inputs.d.ts.map +1 -0
  542. package/dist/node/plugins/base-inputs.js +33 -0
  543. package/dist/node/plugins/base-inputs.js.map +1 -0
  544. package/dist/node/plugins/build.d.ts +77 -0
  545. package/dist/node/plugins/build.d.ts.map +1 -0
  546. package/dist/node/plugins/build.js +576 -0
  547. package/dist/node/plugins/build.js.map +1 -0
  548. package/dist/node/plugins/css-modules.d.ts +13 -0
  549. package/dist/node/plugins/css-modules.d.ts.map +1 -0
  550. package/dist/node/plugins/css-modules.js +58 -0
  551. package/dist/node/plugins/css-modules.js.map +1 -0
  552. package/dist/node/plugins/discover.d.ts +67 -0
  553. package/dist/node/plugins/discover.d.ts.map +1 -0
  554. package/dist/node/plugins/discover.js +369 -0
  555. package/dist/node/plugins/discover.js.map +1 -0
  556. package/dist/node/plugins/evaluate.d.ts +33 -0
  557. package/dist/node/plugins/evaluate.d.ts.map +1 -0
  558. package/dist/node/plugins/evaluate.js +121 -0
  559. package/dist/node/plugins/evaluate.js.map +1 -0
  560. package/dist/node/plugins/index.d.ts +11 -0
  561. package/dist/node/plugins/index.d.ts.map +1 -0
  562. package/dist/node/plugins/index.js +13 -0
  563. package/dist/node/plugins/index.js.map +1 -0
  564. package/dist/node/plugins/install.d.ts +38 -0
  565. package/dist/node/plugins/install.d.ts.map +1 -0
  566. package/dist/node/plugins/install.js +213 -0
  567. package/dist/node/plugins/install.js.map +1 -0
  568. package/dist/node/plugins/plugins.d.ts +162 -0
  569. package/dist/node/plugins/plugins.d.ts.map +1 -0
  570. package/dist/node/plugins/plugins.js +244 -0
  571. package/dist/node/plugins/plugins.js.map +1 -0
  572. package/dist/node/plugins/runtime.d.ts +57 -0
  573. package/dist/node/plugins/runtime.d.ts.map +1 -0
  574. package/dist/node/plugins/runtime.js +92 -0
  575. package/dist/node/plugins/runtime.js.map +1 -0
  576. package/dist/node/plugins/stack.d.ts +16 -0
  577. package/dist/node/plugins/stack.d.ts.map +1 -0
  578. package/dist/node/plugins/stack.js +61 -0
  579. package/dist/node/plugins/stack.js.map +1 -0
  580. package/dist/node/plugins/testing.d.ts +58 -0
  581. package/dist/node/plugins/testing.d.ts.map +1 -0
  582. package/dist/node/plugins/testing.js +210 -0
  583. package/dist/node/plugins/testing.js.map +1 -0
  584. package/dist/node/plugins/watcher.d.ts +69 -0
  585. package/dist/node/plugins/watcher.d.ts.map +1 -0
  586. package/dist/node/plugins/watcher.js +622 -0
  587. package/dist/node/plugins/watcher.js.map +1 -0
  588. package/dist/node/surfaces/bundle.d.ts +31 -0
  589. package/dist/node/surfaces/bundle.d.ts.map +1 -0
  590. package/dist/node/surfaces/bundle.js +118 -0
  591. package/dist/node/surfaces/bundle.js.map +1 -0
  592. package/dist/node/surfaces/current.d.ts +17 -0
  593. package/dist/node/surfaces/current.d.ts.map +1 -0
  594. package/dist/node/surfaces/current.js +54 -0
  595. package/dist/node/surfaces/current.js.map +1 -0
  596. package/dist/node/surfaces/index.d.ts +6 -0
  597. package/dist/node/surfaces/index.d.ts.map +1 -0
  598. package/dist/node/surfaces/index.js +6 -0
  599. package/dist/node/surfaces/index.js.map +1 -0
  600. package/dist/node/surfaces/published.d.ts +27 -0
  601. package/dist/node/surfaces/published.d.ts.map +1 -0
  602. package/dist/node/surfaces/published.js +142 -0
  603. package/dist/node/surfaces/published.js.map +1 -0
  604. package/dist/node/surfaces/served.d.ts +15 -0
  605. package/dist/node/surfaces/served.d.ts.map +1 -0
  606. package/dist/node/surfaces/served.js +42 -0
  607. package/dist/node/surfaces/served.js.map +1 -0
  608. package/dist/node/surfaces/surface-build.d.ts +53 -0
  609. package/dist/node/surfaces/surface-build.d.ts.map +1 -0
  610. package/dist/node/surfaces/surface-build.js +105 -0
  611. package/dist/node/surfaces/surface-build.js.map +1 -0
  612. package/dist/node/surfaces/tui.d.ts +40 -0
  613. package/dist/node/surfaces/tui.d.ts.map +1 -0
  614. package/dist/node/surfaces/tui.js +55 -0
  615. package/dist/node/surfaces/tui.js.map +1 -0
  616. package/dist/node/surfaces/web.d.ts +56 -0
  617. package/dist/node/surfaces/web.d.ts.map +1 -0
  618. package/dist/node/surfaces/web.js +108 -0
  619. package/dist/node/surfaces/web.js.map +1 -0
  620. package/dist/node/tui/actions.d.ts +49 -0
  621. package/dist/node/tui/actions.d.ts.map +1 -0
  622. package/dist/node/tui/actions.js +195 -0
  623. package/dist/node/tui/actions.js.map +1 -0
  624. package/dist/node/tui/credentials.d.ts +17 -0
  625. package/dist/node/tui/credentials.d.ts.map +1 -0
  626. package/dist/node/tui/credentials.js +54 -0
  627. package/dist/node/tui/credentials.js.map +1 -0
  628. package/dist/node/tui/filter.d.ts +5 -0
  629. package/dist/node/tui/filter.d.ts.map +1 -0
  630. package/dist/node/tui/filter.js +79 -0
  631. package/dist/node/tui/filter.js.map +1 -0
  632. package/dist/node/tui/index.d.ts +6 -0
  633. package/dist/node/tui/index.d.ts.map +1 -0
  634. package/dist/node/tui/index.js +6 -0
  635. package/dist/node/tui/index.js.map +1 -0
  636. package/dist/node/tui/launcher.d.ts +40 -0
  637. package/dist/node/tui/launcher.d.ts.map +1 -0
  638. package/dist/node/tui/launcher.js +439 -0
  639. package/dist/node/tui/launcher.js.map +1 -0
  640. package/dist/node/tui/pipe.d.ts +18 -0
  641. package/dist/node/tui/pipe.d.ts.map +1 -0
  642. package/dist/node/tui/pipe.js +134 -0
  643. package/dist/node/tui/pipe.js.map +1 -0
  644. package/dist/node/tui/sandbox.d.ts +54 -0
  645. package/dist/node/tui/sandbox.d.ts.map +1 -0
  646. package/dist/node/tui/sandbox.js +431 -0
  647. package/dist/node/tui/sandbox.js.map +1 -0
  648. package/dist/node/workers/base.d.ts +30 -0
  649. package/dist/node/workers/base.d.ts.map +1 -0
  650. package/dist/node/workers/base.js +255 -0
  651. package/dist/node/workers/base.js.map +1 -0
  652. package/dist/node/workers/child.d.ts +4 -0
  653. package/dist/node/workers/child.d.ts.map +1 -0
  654. package/dist/node/workers/child.js +6 -0
  655. package/dist/node/workers/child.js.map +1 -0
  656. package/dist/node/workers/control.d.ts +83 -0
  657. package/dist/node/workers/control.d.ts.map +1 -0
  658. package/dist/node/workers/control.js +77 -0
  659. package/dist/node/workers/control.js.map +1 -0
  660. package/dist/node/workers/index.d.ts +4 -0
  661. package/dist/node/workers/index.d.ts.map +1 -0
  662. package/dist/node/workers/index.js +7 -0
  663. package/dist/node/workers/index.js.map +1 -0
  664. package/dist/node/workers/lock.d.ts +30 -0
  665. package/dist/node/workers/lock.d.ts.map +1 -0
  666. package/dist/node/workers/lock.js +180 -0
  667. package/dist/node/workers/lock.js.map +1 -0
  668. package/dist/node/workers/main.d.ts +46 -0
  669. package/dist/node/workers/main.d.ts.map +1 -0
  670. package/dist/node/workers/main.js +230 -0
  671. package/dist/node/workers/main.js.map +1 -0
  672. package/dist/node/workers/process.d.ts +42 -0
  673. package/dist/node/workers/process.d.ts.map +1 -0
  674. package/dist/node/workers/process.js +125 -0
  675. package/dist/node/workers/process.js.map +1 -0
  676. package/dist/node/workers/workers.d.ts +122 -0
  677. package/dist/node/workers/workers.d.ts.map +1 -0
  678. package/dist/node/workers/workers.js +677 -0
  679. package/dist/node/workers/workers.js.map +1 -0
  680. package/dist/output.d.ts +1 -1
  681. package/dist/output.d.ts.map +1 -1
  682. package/dist/output.js +4 -2
  683. package/dist/output.js.map +1 -1
  684. package/dist/react/hooks.d.ts +43 -0
  685. package/dist/react/hooks.d.ts.map +1 -0
  686. package/dist/react/hooks.js +82 -0
  687. package/dist/react/hooks.js.map +1 -0
  688. package/dist/react/index.d.ts +3 -0
  689. package/dist/react/index.d.ts.map +1 -0
  690. package/dist/react/index.js +4 -0
  691. package/dist/react/index.js.map +1 -0
  692. package/dist/react/stores.d.ts +9 -0
  693. package/dist/react/stores.d.ts.map +1 -0
  694. package/dist/react/stores.js +37 -0
  695. package/dist/react/stores.js.map +1 -0
  696. package/dist/registries/contribution.d.ts +50 -0
  697. package/dist/registries/contribution.d.ts.map +1 -0
  698. package/dist/registries/contribution.js +129 -0
  699. package/dist/registries/contribution.js.map +1 -0
  700. package/dist/registries/entries.d.ts +18 -0
  701. package/dist/registries/entries.d.ts.map +1 -0
  702. package/dist/registries/entries.js +42 -0
  703. package/dist/registries/entries.js.map +1 -0
  704. package/dist/registries/index.d.ts +3 -0
  705. package/dist/registries/index.d.ts.map +1 -0
  706. package/dist/registries/index.js +5 -0
  707. package/dist/registries/index.js.map +1 -0
  708. package/dist/registries/internal.d.ts +4 -0
  709. package/dist/registries/internal.d.ts.map +1 -0
  710. package/dist/registries/internal.js +5 -0
  711. package/dist/registries/internal.js.map +1 -0
  712. package/dist/registries/record.d.ts +115 -0
  713. package/dist/registries/record.d.ts.map +1 -0
  714. package/dist/registries/record.js +283 -0
  715. package/dist/registries/record.js.map +1 -0
  716. package/dist/registries/registry.d.ts +74 -0
  717. package/dist/registries/registry.d.ts.map +1 -0
  718. package/dist/registries/registry.js +14 -0
  719. package/dist/registries/registry.js.map +1 -0
  720. package/dist/registries/value.d.ts +48 -0
  721. package/dist/registries/value.d.ts.map +1 -0
  722. package/dist/registries/value.js +224 -0
  723. package/dist/registries/value.js.map +1 -0
  724. package/dist/remote/calls.d.ts +25 -0
  725. package/dist/remote/calls.d.ts.map +1 -0
  726. package/dist/remote/calls.js +62 -0
  727. package/dist/remote/calls.js.map +1 -0
  728. package/dist/remote/consumer.d.ts +43 -0
  729. package/dist/remote/consumer.d.ts.map +1 -0
  730. package/dist/remote/consumer.js +350 -0
  731. package/dist/remote/consumer.js.map +1 -0
  732. package/dist/remote/hold.d.ts +141 -0
  733. package/dist/remote/hold.d.ts.map +1 -0
  734. package/dist/remote/hold.js +579 -0
  735. package/dist/remote/hold.js.map +1 -0
  736. package/dist/remote/host-link.d.ts +77 -0
  737. package/dist/remote/host-link.d.ts.map +1 -0
  738. package/dist/remote/host-link.js +184 -0
  739. package/dist/remote/host-link.js.map +1 -0
  740. package/dist/remote/internal.d.ts +6 -0
  741. package/dist/remote/internal.d.ts.map +1 -0
  742. package/dist/remote/internal.js +6 -0
  743. package/dist/remote/internal.js.map +1 -0
  744. package/dist/remote/path.d.ts +46 -0
  745. package/dist/remote/path.d.ts.map +1 -0
  746. package/dist/remote/path.js +73 -0
  747. package/dist/remote/path.js.map +1 -0
  748. package/dist/remote/provider.d.ts +89 -0
  749. package/dist/remote/provider.d.ts.map +1 -0
  750. package/dist/remote/provider.js +597 -0
  751. package/dist/remote/provider.js.map +1 -0
  752. package/dist/remote/relay.d.ts +69 -0
  753. package/dist/remote/relay.d.ts.map +1 -0
  754. package/dist/remote/relay.js +219 -0
  755. package/dist/remote/relay.js.map +1 -0
  756. package/dist/remote/remote-object.d.ts +138 -0
  757. package/dist/remote/remote-object.d.ts.map +1 -0
  758. package/dist/remote/remote-object.js +492 -0
  759. package/dist/remote/remote-object.js.map +1 -0
  760. package/dist/remote/replica.d.ts +59 -0
  761. package/dist/remote/replica.d.ts.map +1 -0
  762. package/dist/remote/replica.js +125 -0
  763. package/dist/remote/replica.js.map +1 -0
  764. package/dist/sqlite/cloudflare.d.ts +2 -0
  765. package/dist/sqlite/cloudflare.d.ts.map +1 -1
  766. package/dist/sqlite/cloudflare.js +10 -0
  767. package/dist/sqlite/cloudflare.js.map +1 -1
  768. package/dist/sqlite/database.d.ts +5 -2
  769. package/dist/sqlite/database.d.ts.map +1 -1
  770. package/dist/sqlite/database.js.map +1 -1
  771. package/dist/sqlite/node.d.ts +13 -2
  772. package/dist/sqlite/node.d.ts.map +1 -1
  773. package/dist/sqlite/node.js +31 -8
  774. package/dist/sqlite/node.js.map +1 -1
  775. package/dist/state/batch.d.ts +64 -0
  776. package/dist/state/batch.d.ts.map +1 -0
  777. package/dist/state/batch.js +164 -0
  778. package/dist/state/batch.js.map +1 -0
  779. package/dist/state/derive.d.ts +52 -0
  780. package/dist/state/derive.d.ts.map +1 -0
  781. package/dist/state/derive.js +182 -0
  782. package/dist/state/derive.js.map +1 -0
  783. package/dist/state/index.d.ts +6 -0
  784. package/dist/state/index.d.ts.map +1 -0
  785. package/dist/state/index.js +4 -0
  786. package/dist/state/index.js.map +1 -0
  787. package/dist/state/internal.d.ts +6 -0
  788. package/dist/state/internal.d.ts.map +1 -0
  789. package/dist/state/internal.js +8 -0
  790. package/dist/state/internal.js.map +1 -0
  791. package/dist/state/native-source.d.ts +106 -0
  792. package/dist/state/native-source.d.ts.map +1 -0
  793. package/dist/state/native-source.js +240 -0
  794. package/dist/state/native-source.js.map +1 -0
  795. package/dist/state/watchable.d.ts +114 -0
  796. package/dist/state/watchable.d.ts.map +1 -0
  797. package/dist/state/watchable.js +156 -0
  798. package/dist/state/watchable.js.map +1 -0
  799. package/dist/state/writable.d.ts +32 -0
  800. package/dist/state/writable.d.ts.map +1 -0
  801. package/dist/state/writable.js +49 -0
  802. package/dist/state/writable.js.map +1 -0
  803. package/dist/store/adapter.d.ts +67 -0
  804. package/dist/store/adapter.d.ts.map +1 -0
  805. package/dist/store/adapter.js +118 -0
  806. package/dist/store/adapter.js.map +1 -0
  807. package/dist/store/allocator.d.ts +17 -0
  808. package/dist/store/allocator.d.ts.map +1 -0
  809. package/dist/store/allocator.js +30 -0
  810. package/dist/store/allocator.js.map +1 -0
  811. package/dist/store/applier.d.ts +8 -0
  812. package/dist/store/applier.d.ts.map +1 -0
  813. package/dist/store/applier.js +375 -0
  814. package/dist/store/applier.js.map +1 -0
  815. package/dist/store/apply-batch.d.ts +12 -0
  816. package/dist/store/apply-batch.d.ts.map +1 -0
  817. package/dist/store/apply-batch.js +83 -0
  818. package/dist/store/apply-batch.js.map +1 -0
  819. package/dist/store/archive.d.ts +32 -0
  820. package/dist/store/archive.d.ts.map +1 -0
  821. package/dist/store/archive.js +130 -0
  822. package/dist/store/archive.js.map +1 -0
  823. package/dist/store/backend.d.ts +10 -0
  824. package/dist/store/backend.d.ts.map +1 -0
  825. package/dist/store/backend.js +15 -0
  826. package/dist/store/backend.js.map +1 -0
  827. package/dist/store/catalog.d.ts +24 -0
  828. package/dist/store/catalog.d.ts.map +1 -0
  829. package/dist/store/catalog.js +17 -0
  830. package/dist/store/catalog.js.map +1 -0
  831. package/dist/store/claims.d.ts +23 -0
  832. package/dist/store/claims.d.ts.map +1 -0
  833. package/dist/store/claims.js +65 -0
  834. package/dist/store/claims.js.map +1 -0
  835. package/dist/store/columns.d.ts +77 -0
  836. package/dist/store/columns.d.ts.map +1 -0
  837. package/dist/store/columns.js +77 -0
  838. package/dist/store/columns.js.map +1 -0
  839. package/dist/store/engine.d.ts +176 -0
  840. package/dist/store/engine.d.ts.map +1 -0
  841. package/dist/store/engine.js +283 -0
  842. package/dist/store/engine.js.map +1 -0
  843. package/dist/store/evaluate.d.ts +17 -0
  844. package/dist/store/evaluate.d.ts.map +1 -0
  845. package/dist/store/evaluate.js +128 -0
  846. package/dist/store/evaluate.js.map +1 -0
  847. package/dist/store/export.d.ts +17 -0
  848. package/dist/store/export.d.ts.map +1 -0
  849. package/dist/store/export.js +200 -0
  850. package/dist/store/export.js.map +1 -0
  851. package/dist/store/expression.d.ts +150 -0
  852. package/dist/store/expression.d.ts.map +1 -0
  853. package/dist/store/expression.js +268 -0
  854. package/dist/store/expression.js.map +1 -0
  855. package/dist/store/import.d.ts +10 -0
  856. package/dist/store/import.d.ts.map +1 -0
  857. package/dist/store/import.js +276 -0
  858. package/dist/store/import.js.map +1 -0
  859. package/dist/store/index.d.ts +16 -0
  860. package/dist/store/index.d.ts.map +1 -0
  861. package/dist/store/index.js +13 -0
  862. package/dist/store/index.js.map +1 -0
  863. package/dist/store/json-column.d.ts +33 -0
  864. package/dist/store/json-column.d.ts.map +1 -0
  865. package/dist/store/json-column.js +62 -0
  866. package/dist/store/json-column.js.map +1 -0
  867. package/dist/store/jsonl.d.ts +9 -0
  868. package/dist/store/jsonl.d.ts.map +1 -0
  869. package/dist/store/jsonl.js +61 -0
  870. package/dist/store/jsonl.js.map +1 -0
  871. package/dist/store/live-query.d.ts +108 -0
  872. package/dist/store/live-query.d.ts.map +1 -0
  873. package/dist/store/live-query.js +254 -0
  874. package/dist/store/live-query.js.map +1 -0
  875. package/dist/store/outbox.d.ts +26 -0
  876. package/dist/store/outbox.d.ts.map +1 -0
  877. package/dist/store/outbox.js +80 -0
  878. package/dist/store/outbox.js.map +1 -0
  879. package/dist/store/query.d.ts +39 -0
  880. package/dist/store/query.d.ts.map +1 -0
  881. package/dist/store/query.js +97 -0
  882. package/dist/store/query.js.map +1 -0
  883. package/dist/store/refusal.d.ts +15 -0
  884. package/dist/store/refusal.d.ts.map +1 -0
  885. package/dist/store/refusal.js +36 -0
  886. package/dist/store/refusal.js.map +1 -0
  887. package/dist/store/rows.d.ts +80 -0
  888. package/dist/store/rows.d.ts.map +1 -0
  889. package/dist/store/rows.js +183 -0
  890. package/dist/store/rows.js.map +1 -0
  891. package/dist/store/schema.d.ts +25 -0
  892. package/dist/store/schema.d.ts.map +1 -0
  893. package/dist/store/schema.js +115 -0
  894. package/dist/store/schema.js.map +1 -0
  895. package/dist/store/sql.d.ts +73 -0
  896. package/dist/store/sql.d.ts.map +1 -0
  897. package/dist/store/sql.js +234 -0
  898. package/dist/store/sql.js.map +1 -0
  899. package/dist/store/step.d.ts +50 -0
  900. package/dist/store/step.d.ts.map +1 -0
  901. package/dist/store/step.js +52 -0
  902. package/dist/store/step.js.map +1 -0
  903. package/dist/store/store.d.ts +171 -0
  904. package/dist/store/store.d.ts.map +1 -0
  905. package/dist/store/store.js +818 -0
  906. package/dist/store/store.js.map +1 -0
  907. package/dist/store/table-changes.d.ts +29 -0
  908. package/dist/store/table-changes.d.ts.map +1 -0
  909. package/dist/store/table-changes.js +102 -0
  910. package/dist/store/table-changes.js.map +1 -0
  911. package/dist/store/table-evolve.d.ts +74 -0
  912. package/dist/store/table-evolve.d.ts.map +1 -0
  913. package/dist/store/table-evolve.js +201 -0
  914. package/dist/store/table-evolve.js.map +1 -0
  915. package/dist/store/table-handle.d.ts +73 -0
  916. package/dist/store/table-handle.d.ts.map +1 -0
  917. package/dist/store/table-handle.js +101 -0
  918. package/dist/store/table-handle.js.map +1 -0
  919. package/dist/store/table-history.d.ts +75 -0
  920. package/dist/store/table-history.d.ts.map +1 -0
  921. package/dist/store/table-history.js +42 -0
  922. package/dist/store/table-history.js.map +1 -0
  923. package/dist/store/table-migration.d.ts +16 -0
  924. package/dist/store/table-migration.d.ts.map +1 -0
  925. package/dist/store/table-migration.js +202 -0
  926. package/dist/store/table-migration.js.map +1 -0
  927. package/dist/store/table-writes.d.ts +125 -0
  928. package/dist/store/table-writes.d.ts.map +1 -0
  929. package/dist/store/table-writes.js +170 -0
  930. package/dist/store/table-writes.js.map +1 -0
  931. package/dist/store/table.d.ts +80 -0
  932. package/dist/store/table.d.ts.map +1 -0
  933. package/dist/store/table.js +103 -0
  934. package/dist/store/table.js.map +1 -0
  935. package/dist/store/text.d.ts +14 -0
  936. package/dist/store/text.d.ts.map +1 -0
  937. package/dist/store/text.js +51 -0
  938. package/dist/store/text.js.map +1 -0
  939. package/dist/store/writes.d.ts +5 -0
  940. package/dist/store/writes.d.ts.map +1 -0
  941. package/dist/store/writes.js +4 -0
  942. package/dist/store/writes.js.map +1 -0
  943. package/dist/surfaces/active-language.d.ts +20 -0
  944. package/dist/surfaces/active-language.d.ts.map +1 -0
  945. package/dist/surfaces/active-language.js +78 -0
  946. package/dist/surfaces/active-language.js.map +1 -0
  947. package/dist/surfaces/active-theme.d.ts +16 -0
  948. package/dist/surfaces/active-theme.d.ts.map +1 -0
  949. package/dist/surfaces/active-theme.js +47 -0
  950. package/dist/surfaces/active-theme.js.map +1 -0
  951. package/dist/surfaces/client.d.ts +96 -0
  952. package/dist/surfaces/client.d.ts.map +1 -0
  953. package/dist/surfaces/client.js +264 -0
  954. package/dist/surfaces/client.js.map +1 -0
  955. package/dist/surfaces/connection.d.ts +49 -0
  956. package/dist/surfaces/connection.d.ts.map +1 -0
  957. package/dist/surfaces/connection.js +142 -0
  958. package/dist/surfaces/connection.js.map +1 -0
  959. package/dist/surfaces/format.d.ts +5 -0
  960. package/dist/surfaces/format.d.ts.map +1 -0
  961. package/dist/surfaces/format.js +37 -0
  962. package/dist/surfaces/format.js.map +1 -0
  963. package/dist/surfaces/index.d.ts +15 -0
  964. package/dist/surfaces/index.d.ts.map +1 -0
  965. package/dist/surfaces/index.js +18 -0
  966. package/dist/surfaces/index.js.map +1 -0
  967. package/dist/surfaces/language.d.ts +53 -0
  968. package/dist/surfaces/language.d.ts.map +1 -0
  969. package/dist/surfaces/language.js +74 -0
  970. package/dist/surfaces/language.js.map +1 -0
  971. package/dist/surfaces/loaded.d.ts +42 -0
  972. package/dist/surfaces/loaded.d.ts.map +1 -0
  973. package/dist/surfaces/loaded.js +116 -0
  974. package/dist/surfaces/loaded.js.map +1 -0
  975. package/dist/surfaces/locale-choice.d.ts +25 -0
  976. package/dist/surfaces/locale-choice.d.ts.map +1 -0
  977. package/dist/surfaces/locale-choice.js +14 -0
  978. package/dist/surfaces/locale-choice.js.map +1 -0
  979. package/dist/surfaces/messages.d.ts +67 -0
  980. package/dist/surfaces/messages.d.ts.map +1 -0
  981. package/dist/surfaces/messages.js +112 -0
  982. package/dist/surfaces/messages.js.map +1 -0
  983. package/dist/surfaces/page-state.d.ts +14 -0
  984. package/dist/surfaces/page-state.d.ts.map +1 -0
  985. package/dist/surfaces/page-state.js +43 -0
  986. package/dist/surfaces/page-state.js.map +1 -0
  987. package/dist/surfaces/preference.d.ts +32 -0
  988. package/dist/surfaces/preference.d.ts.map +1 -0
  989. package/dist/surfaces/preference.js +72 -0
  990. package/dist/surfaces/preference.js.map +1 -0
  991. package/dist/surfaces/registered.d.ts +33 -0
  992. package/dist/surfaces/registered.d.ts.map +1 -0
  993. package/dist/surfaces/registered.js +51 -0
  994. package/dist/surfaces/registered.js.map +1 -0
  995. package/dist/surfaces/scripts.d.ts +84 -0
  996. package/dist/surfaces/scripts.d.ts.map +1 -0
  997. package/dist/surfaces/scripts.js +28 -0
  998. package/dist/surfaces/scripts.js.map +1 -0
  999. package/dist/surfaces/theme-choice.d.ts +31 -0
  1000. package/dist/surfaces/theme-choice.d.ts.map +1 -0
  1001. package/dist/surfaces/theme-choice.js +18 -0
  1002. package/dist/surfaces/theme-choice.js.map +1 -0
  1003. package/dist/surfaces/themes.d.ts +43 -0
  1004. package/dist/surfaces/themes.d.ts.map +1 -0
  1005. package/dist/surfaces/themes.js +110 -0
  1006. package/dist/surfaces/themes.js.map +1 -0
  1007. package/dist/surfaces/translations.d.ts +29 -0
  1008. package/dist/surfaces/translations.d.ts.map +1 -0
  1009. package/dist/surfaces/translations.js +57 -0
  1010. package/dist/surfaces/translations.js.map +1 -0
  1011. package/dist/sync/batch.d.ts +18 -0
  1012. package/dist/sync/batch.d.ts.map +1 -0
  1013. package/dist/sync/batch.js +125 -0
  1014. package/dist/sync/batch.js.map +1 -0
  1015. package/dist/sync/client.d.ts +166 -0
  1016. package/dist/sync/client.d.ts.map +1 -0
  1017. package/dist/sync/client.js +438 -0
  1018. package/dist/sync/client.js.map +1 -0
  1019. package/dist/sync/files.d.ts +46 -0
  1020. package/dist/sync/files.d.ts.map +1 -0
  1021. package/dist/sync/files.js +13 -0
  1022. package/dist/sync/files.js.map +1 -0
  1023. package/dist/sync/filesystem.d.ts +37 -0
  1024. package/dist/sync/filesystem.d.ts.map +1 -0
  1025. package/dist/sync/filesystem.js +185 -0
  1026. package/dist/sync/filesystem.js.map +1 -0
  1027. package/dist/sync/index.d.ts +8 -0
  1028. package/dist/sync/index.d.ts.map +1 -0
  1029. package/dist/sync/index.js +9 -0
  1030. package/dist/sync/index.js.map +1 -0
  1031. package/dist/sync/lines.d.ts +18 -0
  1032. package/dist/sync/lines.d.ts.map +1 -0
  1033. package/dist/sync/lines.js +46 -0
  1034. package/dist/sync/lines.js.map +1 -0
  1035. package/dist/sync/remote.d.ts +130 -0
  1036. package/dist/sync/remote.d.ts.map +1 -0
  1037. package/dist/sync/remote.js +46 -0
  1038. package/dist/sync/remote.js.map +1 -0
  1039. package/dist/sync/state.d.ts +17 -0
  1040. package/dist/sync/state.d.ts.map +1 -0
  1041. package/dist/sync/state.js +40 -0
  1042. package/dist/sync/state.js.map +1 -0
  1043. package/dist/telemetry-ingest/batch.d.ts +70 -0
  1044. package/dist/telemetry-ingest/batch.d.ts.map +1 -0
  1045. package/dist/telemetry-ingest/batch.js +110 -0
  1046. package/dist/telemetry-ingest/batch.js.map +1 -0
  1047. package/dist/telemetry-ingest/facet.d.ts +21 -0
  1048. package/dist/telemetry-ingest/facet.d.ts.map +1 -0
  1049. package/dist/telemetry-ingest/facet.js +96 -0
  1050. package/dist/telemetry-ingest/facet.js.map +1 -0
  1051. package/dist/telemetry-ingest/index.d.ts +5 -0
  1052. package/dist/telemetry-ingest/index.d.ts.map +1 -0
  1053. package/dist/telemetry-ingest/index.js +8 -0
  1054. package/dist/telemetry-ingest/index.js.map +1 -0
  1055. package/dist/telemetry-ingest/recorder.d.ts +50 -0
  1056. package/dist/telemetry-ingest/recorder.d.ts.map +1 -0
  1057. package/dist/telemetry-ingest/recorder.js +298 -0
  1058. package/dist/telemetry-ingest/recorder.js.map +1 -0
  1059. package/dist/telemetry-ingest/sender.d.ts +14 -0
  1060. package/dist/telemetry-ingest/sender.d.ts.map +1 -0
  1061. package/dist/telemetry-ingest/sender.js +64 -0
  1062. package/dist/telemetry-ingest/sender.js.map +1 -0
  1063. package/dist/telemetry-sqlite/index.d.ts +13 -4
  1064. package/dist/telemetry-sqlite/index.d.ts.map +1 -1
  1065. package/dist/telemetry-sqlite/index.js +81 -241
  1066. package/dist/telemetry-sqlite/index.js.map +1 -1
  1067. package/dist/telemetry-sqlite/node.d.ts +13 -0
  1068. package/dist/telemetry-sqlite/node.d.ts.map +1 -0
  1069. package/dist/telemetry-sqlite/node.js +27 -0
  1070. package/dist/telemetry-sqlite/node.js.map +1 -0
  1071. package/dist/telemetry-sqlite/schema.d.ts +9 -0
  1072. package/dist/telemetry-sqlite/schema.d.ts.map +1 -0
  1073. package/dist/telemetry-sqlite/schema.js +61 -0
  1074. package/dist/telemetry-sqlite/schema.js.map +1 -0
  1075. package/dist/telemetry-sqlite/store.d.ts +3 -0
  1076. package/dist/telemetry-sqlite/store.d.ts.map +1 -1
  1077. package/dist/telemetry-sqlite/store.js +24 -13
  1078. package/dist/telemetry-sqlite/store.js.map +1 -1
  1079. package/dist/telemetry.d.ts +937 -0
  1080. package/dist/telemetry.d.ts.map +1 -0
  1081. package/dist/telemetry.js +470 -0
  1082. package/dist/telemetry.js.map +1 -0
  1083. package/dist/tui/bridge.d.ts +112 -0
  1084. package/dist/tui/bridge.d.ts.map +1 -0
  1085. package/dist/tui/bridge.js +9 -0
  1086. package/dist/tui/bridge.js.map +1 -0
  1087. package/dist/tui/channel.d.ts +44 -0
  1088. package/dist/tui/channel.d.ts.map +1 -0
  1089. package/dist/tui/channel.js +150 -0
  1090. package/dist/tui/channel.js.map +1 -0
  1091. package/dist/tui/frames.d.ts +5 -0
  1092. package/dist/tui/frames.d.ts.map +1 -0
  1093. package/dist/tui/frames.js +52 -0
  1094. package/dist/tui/frames.js.map +1 -0
  1095. package/dist/tui/index.d.ts +7 -0
  1096. package/dist/tui/index.d.ts.map +1 -0
  1097. package/dist/tui/index.js +8 -0
  1098. package/dist/tui/index.js.map +1 -0
  1099. package/dist/tui/runtime.d.ts +46 -0
  1100. package/dist/tui/runtime.d.ts.map +1 -0
  1101. package/dist/tui/runtime.js +101 -0
  1102. package/dist/tui/runtime.js.map +1 -0
  1103. package/dist/tui/scope.d.ts +46 -0
  1104. package/dist/tui/scope.d.ts.map +1 -0
  1105. package/dist/tui/scope.js +141 -0
  1106. package/dist/tui/scope.js.map +1 -0
  1107. package/dist/tui/terminal.d.ts +15 -0
  1108. package/dist/tui/terminal.d.ts.map +1 -0
  1109. package/dist/tui/terminal.js +37 -0
  1110. package/dist/tui/terminal.js.map +1 -0
  1111. package/dist/tui/theme.d.ts +17 -0
  1112. package/dist/tui/theme.d.ts.map +1 -0
  1113. package/dist/tui/theme.js +38 -0
  1114. package/dist/tui/theme.js.map +1 -0
  1115. package/dist/watch.d.ts +194 -0
  1116. package/dist/watch.d.ts.map +1 -0
  1117. package/dist/watch.js +383 -0
  1118. package/dist/watch.js.map +1 -0
  1119. package/dist/web/environment.d.ts +4 -0
  1120. package/dist/web/environment.d.ts.map +1 -0
  1121. package/dist/web/environment.js +37 -0
  1122. package/dist/web/environment.js.map +1 -0
  1123. package/dist/web/index.d.ts +5 -0
  1124. package/dist/web/index.d.ts.map +1 -0
  1125. package/dist/web/index.js +7 -0
  1126. package/dist/web/index.js.map +1 -0
  1127. package/dist/web/language.d.ts +7 -0
  1128. package/dist/web/language.d.ts.map +1 -0
  1129. package/dist/web/language.js +21 -0
  1130. package/dist/web/language.js.map +1 -0
  1131. package/dist/web/page.d.ts +29 -0
  1132. package/dist/web/page.d.ts.map +1 -0
  1133. package/dist/web/page.js +92 -0
  1134. package/dist/web/page.js.map +1 -0
  1135. package/dist/web/scripts.d.ts +23 -0
  1136. package/dist/web/scripts.d.ts.map +1 -0
  1137. package/dist/web/scripts.js +50 -0
  1138. package/dist/web/scripts.js.map +1 -0
  1139. package/dist/web/styles.d.ts +17 -0
  1140. package/dist/web/styles.d.ts.map +1 -0
  1141. package/dist/web/styles.js +218 -0
  1142. package/dist/web/styles.js.map +1 -0
  1143. package/dist/web/themes.d.ts +6 -0
  1144. package/dist/web/themes.d.ts.map +1 -0
  1145. package/dist/web/themes.js +31 -0
  1146. package/dist/web/themes.js.map +1 -0
  1147. package/docs/benchmarks.md +1036 -0
  1148. package/docs/decisions.md +3436 -0
  1149. package/docs/dependencies/book.md +1671 -0
  1150. package/docs/dependencies/index.html +2641 -0
  1151. package/docs/dependencies/model.md +330 -0
  1152. package/docs/design.md +3065 -0
  1153. package/docs/durable-observers/book.md +432 -0
  1154. package/docs/durable-observers/index.html +517 -0
  1155. package/docs/flow-control/book.md +333 -0
  1156. package/docs/flow-control/fold/index.html +265 -0
  1157. package/docs/flow-control/index.html +548 -0
  1158. package/docs/flow-control/window/index.html +228 -0
  1159. package/docs/guide-plugins-hosts/book.md +957 -0
  1160. package/docs/guide-plugins-hosts/index.html +952 -0
  1161. package/docs/http-workers/book.md +378 -0
  1162. package/docs/http-workers/index.html +515 -0
  1163. package/docs/i18n/book.md +217 -0
  1164. package/docs/i18n/index.html +344 -0
  1165. package/docs/layer-1.md +311 -0
  1166. package/docs/layer-2.md +216 -0
  1167. package/docs/p3-features/README.md +6 -0
  1168. package/docs/p3-features/book.md +478 -0
  1169. package/docs/plugin-authoring.md +276 -0
  1170. package/docs/plugin-model/book.md +186 -0
  1171. package/docs/plugin-model/index.html +310 -0
  1172. package/docs/plugin-primer/book.md +273 -0
  1173. package/docs/plugin-primer/index.html +430 -0
  1174. package/docs/slice-1.md +236 -0
  1175. package/docs/slice-10.md +288 -0
  1176. package/docs/slice-11.md +114 -0
  1177. package/docs/slice-12.md +132 -0
  1178. package/docs/slice-13.md +121 -0
  1179. package/docs/slice-2.md +174 -0
  1180. package/docs/slice-3a.md +296 -0
  1181. package/docs/slice-3b.md +197 -0
  1182. package/docs/slice-4.md +146 -0
  1183. package/docs/slice-4a.md +418 -0
  1184. package/docs/slice-4b.md +208 -0
  1185. package/docs/slice-5.md +281 -0
  1186. package/docs/slice-6a.md +676 -0
  1187. package/docs/slice-6b.md +332 -0
  1188. package/docs/slice-7a.md +130 -0
  1189. package/docs/slice-7b/book.md +608 -0
  1190. package/docs/slice-7b/index.html +842 -0
  1191. package/docs/slice-7b.md +255 -0
  1192. package/docs/slice-7c.md +165 -0
  1193. package/docs/slice-8.md +194 -0
  1194. package/docs/slice-9.md +110 -0
  1195. package/docs/slices.md +241 -0
  1196. package/docs/store/book.md +670 -0
  1197. package/docs/store/index.html +861 -0
  1198. package/docs/store/walkthrough.md +193 -0
  1199. package/docs/theming/book.md +223 -0
  1200. package/docs/theming/index.html +371 -0
  1201. package/docs/tutorial/book.md +2169 -0
  1202. package/docs/tutorial/index.html +2112 -0
  1203. package/docs/tutorial/screens/click-after.png +0 -0
  1204. package/docs/tutorial/screens/click-before.png +0 -0
  1205. package/docs/tutorial/screens/edited.png +0 -0
  1206. package/docs/tutorial/screens/french.png +0 -0
  1207. package/docs/tutorial/screens/harbor.png +0 -0
  1208. package/docs/tutorial/screens/page.png +0 -0
  1209. package/docs/tutorial/screens/traces-ada.png +0 -0
  1210. package/docs/tutorial/screens/traces.png +0 -0
  1211. package/package.json +114 -20
  1212. package/src/delta/README.md +69 -0
  1213. package/dist/cell.d.ts +0 -122
  1214. package/dist/cell.d.ts.map +0 -1
  1215. package/dist/cell.js +0 -356
  1216. package/dist/cell.js.map +0 -1
  1217. package/dist/cluster.d.ts +0 -27
  1218. package/dist/cluster.d.ts.map +0 -1
  1219. package/dist/cluster.js +0 -230
  1220. package/dist/cluster.js.map +0 -1
  1221. package/dist/connection.d.ts +0 -270
  1222. package/dist/connection.d.ts.map +0 -1
  1223. package/dist/connection.js +0 -1216
  1224. package/dist/connection.js.map +0 -1
  1225. package/dist/contract.d.ts +0 -208
  1226. package/dist/contract.d.ts.map +0 -1
  1227. package/dist/contract.js +0 -246
  1228. package/dist/contract.js.map +0 -1
  1229. package/dist/declare.d.ts +0 -33
  1230. package/dist/declare.d.ts.map +0 -1
  1231. package/dist/declare.js +0 -2
  1232. package/dist/declare.js.map +0 -1
  1233. package/dist/errors.d.ts +0 -28
  1234. package/dist/errors.d.ts.map +0 -1
  1235. package/dist/errors.js +0 -59
  1236. package/dist/errors.js.map +0 -1
  1237. package/dist/host.d.ts +0 -348
  1238. package/dist/host.d.ts.map +0 -1
  1239. package/dist/host.js +0 -1000
  1240. package/dist/host.js.map +0 -1
  1241. package/dist/link.d.ts +0 -107
  1242. package/dist/link.d.ts.map +0 -1
  1243. package/dist/link.js +0 -355
  1244. package/dist/link.js.map +0 -1
  1245. package/dist/loader.d.ts +0 -4
  1246. package/dist/loader.d.ts.map +0 -1
  1247. package/dist/loader.js +0 -73
  1248. package/dist/loader.js.map +0 -1
  1249. package/dist/manager.d.ts +0 -115
  1250. package/dist/manager.d.ts.map +0 -1
  1251. package/dist/manager.js +0 -345
  1252. package/dist/manager.js.map +0 -1
  1253. package/dist/node.d.ts +0 -4
  1254. package/dist/node.d.ts.map +0 -1
  1255. package/dist/node.js +0 -4
  1256. package/dist/node.js.map +0 -1
  1257. package/dist/object.d.ts +0 -438
  1258. package/dist/object.d.ts.map +0 -1
  1259. package/dist/object.js +0 -1571
  1260. package/dist/object.js.map +0 -1
  1261. package/dist/publish.d.ts +0 -5
  1262. package/dist/publish.d.ts.map +0 -1
  1263. package/dist/publish.js +0 -40
  1264. package/dist/publish.js.map +0 -1
  1265. package/dist/registry.d.ts +0 -25
  1266. package/dist/registry.d.ts.map +0 -1
  1267. package/dist/registry.js +0 -6
  1268. package/dist/registry.js.map +0 -1
  1269. package/dist/reload.d.ts +0 -126
  1270. package/dist/reload.d.ts.map +0 -1
  1271. package/dist/reload.js +0 -653
  1272. package/dist/reload.js.map +0 -1
  1273. package/dist/remote.d.ts +0 -165
  1274. package/dist/remote.d.ts.map +0 -1
  1275. package/dist/remote.js +0 -612
  1276. package/dist/remote.js.map +0 -1
  1277. package/dist/schema.d.ts +0 -21
  1278. package/dist/schema.d.ts.map +0 -1
  1279. package/dist/schema.js +0 -228
  1280. package/dist/schema.js.map +0 -1
  1281. package/dist/state.d.ts +0 -92
  1282. package/dist/state.d.ts.map +0 -1
  1283. package/dist/state.js +0 -287
  1284. package/dist/state.js.map +0 -1
  1285. package/dist/types.d.ts +0 -88
  1286. package/dist/types.d.ts.map +0 -1
  1287. package/dist/types.js +0 -2
  1288. package/dist/types.js.map +0 -1
  1289. package/dist/websocket.d.ts +0 -15
  1290. package/dist/websocket.d.ts.map +0 -1
  1291. package/dist/websocket.js +0 -16
  1292. package/dist/websocket.js.map +0 -1
  1293. package/dist/wire.d.ts +0 -216
  1294. package/dist/wire.d.ts.map +0 -1
  1295. package/dist/wire.js +0 -165
  1296. package/dist/wire.js.map +0 -1
  1297. package/docs/guide.md +0 -814
  1298. package/docs/spec.md +0 -288
  1299. package/docs/tutorial.md +0 -931
@@ -0,0 +1,66 @@
1
+ import type { Principal } from "../../data/index.ts";
2
+ import { type Facet } from "../../host/index.ts";
3
+ import type { JsonValue } from "../../json.ts";
4
+ /** What the server knows of the app: its data directory, its name, its newest API version, its owner principal. */
5
+ export declare const AppInfo: import("../../contracts/contract.ts").Contract<{
6
+ kind: "local";
7
+ name: "chord.app.info";
8
+ params: {};
9
+ history: [{
10
+ version: "2";
11
+ variants: {
12
+ members: {
13
+ state: {
14
+ readonly dataDir: import("../../contracts/schema.ts").StringSchema;
15
+ readonly name: import("../../contracts/schema.ts").StringSchema;
16
+ readonly version: import("../../contracts/schema.ts").StringSchema;
17
+ readonly owner: import("../../contracts/index.ts").Schema<unknown>;
18
+ };
19
+ methods: {};
20
+ keyed: {};
21
+ };
22
+ };
23
+ changes: never;
24
+ }];
25
+ }>;
26
+ /** What a worker knows of itself: its address (kind, params, key) and the app's start data for it. */
27
+ export declare const WorkerInfo: import("../../contracts/contract.ts").Contract<{
28
+ kind: "local";
29
+ name: "chord.app.worker-info";
30
+ params: {};
31
+ history: [{
32
+ version: "1";
33
+ variants: {
34
+ members: {
35
+ state: {
36
+ readonly address: import("../../contracts/index.ts").Schema<{
37
+ kind: string;
38
+ key: string;
39
+ params: unknown;
40
+ }>;
41
+ readonly start: import("../../contracts/index.ts").Schema<unknown>;
42
+ };
43
+ methods: {};
44
+ keyed: {};
45
+ };
46
+ };
47
+ changes: never;
48
+ }];
49
+ }>;
50
+ /** The facet serving `AppInfo` with `info`. */
51
+ export declare function appInfoFacet<P extends Principal>(info: {
52
+ readonly dataDir: string;
53
+ readonly name: string;
54
+ readonly version: string;
55
+ readonly owner: P;
56
+ }): Facet<P>;
57
+ /** The facet serving `WorkerInfo` with the worker's address and start data. */
58
+ export declare function workerInfoFacet<P extends Principal>(info: {
59
+ readonly address: {
60
+ readonly kind: string;
61
+ readonly key: string;
62
+ readonly params: JsonValue;
63
+ };
64
+ readonly start: JsonValue;
65
+ }): Facet<P>;
66
+ //# sourceMappingURL=info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/node/app/info.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,mHAAmH;AACnH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;EAIlB,CAAC;AAEH,sGAAsG;AACtG,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;EAOrB,CAAC;AAEH,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CAClB,GAAG,KAAK,CAAC,CAAC,CAAC,CAUX;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE;IAC1D,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC;IAC9F,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC1B,GAAG,KAAK,CAAC,CAAC,CAAC,CAIX"}
@@ -0,0 +1,37 @@
1
+ // The start-data objects (slice 13 §1; decision "The plugin model, points 3, 4, 5 and 8" (8)): base code shrinks to
2
+ // the API, the bootstrap and one facet serving process values as core objects plugins `get`. `AppInfo` on the
3
+ // server (the data directory, the app's name, its API version and its owner: decision "The kit's owner is a principal
4
+ // the app chooses"), `WorkerInfo` on a worker (its address and the app's start data for it).
5
+ import { local, obj, str, unknown } from "../../contracts/index.js";
6
+ import { defineFacet } from "../../host/index.js";
7
+ import { constant } from "../../state/index.js";
8
+ /** What the server knows of the app: its data directory, its name, its newest API version, its owner principal. */
9
+ export const AppInfo = local("chord.app.info", {
10
+ version: 2,
11
+ params: {},
12
+ members: { dataDir: str(), name: str(), version: str(), owner: unknown() },
13
+ });
14
+ /** What a worker knows of itself: its address (kind, params, key) and the app's start data for it. */
15
+ export const WorkerInfo = local("chord.app.worker-info", {
16
+ version: 1,
17
+ params: {},
18
+ members: {
19
+ address: obj({ kind: str(), key: str(), params: unknown() }),
20
+ start: unknown(),
21
+ },
22
+ });
23
+ /** The facet serving `AppInfo` with `info`. */
24
+ export function appInfoFacet(info) {
25
+ return defineFacet((host) => host.serve(AppInfo, () => ({
26
+ dataDir: constant(info.dataDir),
27
+ name: constant(info.name),
28
+ version: constant(info.version),
29
+ // The same object at every get: its principal key is computed once.
30
+ owner: constant(info.owner),
31
+ })));
32
+ }
33
+ /** The facet serving `WorkerInfo` with the worker's address and start data. */
34
+ export function workerInfoFacet(info) {
35
+ return defineFacet((host) => host.serve(WorkerInfo, () => ({ address: constant(info.address), start: constant(info.start) })));
36
+ }
37
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/node/app/info.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,8GAA8G;AAC9G,sHAAsH;AACtH,6FAA6F;AAE7F,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,mHAAmH;AACnH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,EAAE;IAC9C,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;CAC1E,CAAC,CAAC;AAEH,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,uBAAuB,EAAE;IACxD,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,EAAE;IACV,OAAO,EAAE;QACR,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,KAAK,EAAE,OAAO,EAAE;KAChB;CACD,CAAC,CAAC;AAEH,+CAA+C;AAC/C,MAAM,UAAU,YAAY,CAAsB,IAKjD;IACA,OAAO,WAAW,CAAI,CAAC,IAAI,EAAE,EAAE,CAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B,oEAAoE;QACpE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;KAC3B,CAAC,CAAC,CACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAsB,IAGpD;IACA,OAAO,WAAW,CAAI,CAAC,IAAI,EAAE,EAAE,CAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAChG,CAAC;AACH,CAAC","sourcesContent":["// The start-data objects (slice 13 §1; decision \"The plugin model, points 3, 4, 5 and 8\" (8)): base code shrinks to\n// the API, the bootstrap and one facet serving process values as core objects plugins `get`. `AppInfo` on the\n// server (the data directory, the app's name, its API version and its owner: decision \"The kit's owner is a principal\n// the app chooses\"), `WorkerInfo` on a worker (its address and the app's start data for it).\n\nimport { local, obj, str, unknown } from \"../../contracts/index.ts\";\nimport type { Principal } from \"../../data/index.ts\";\nimport { defineFacet, type Facet } from \"../../host/index.ts\";\nimport type { JsonValue } from \"../../json.ts\";\nimport { constant } from \"../../state/index.ts\";\n\n/** What the server knows of the app: its data directory, its name, its newest API version, its owner principal. */\nexport const AppInfo = local(\"chord.app.info\", {\n\tversion: 2,\n\tparams: {},\n\tmembers: { dataDir: str(), name: str(), version: str(), owner: unknown() },\n});\n\n/** What a worker knows of itself: its address (kind, params, key) and the app's start data for it. */\nexport const WorkerInfo = local(\"chord.app.worker-info\", {\n\tversion: 1,\n\tparams: {},\n\tmembers: {\n\t\taddress: obj({ kind: str(), key: str(), params: unknown() }),\n\t\tstart: unknown(),\n\t},\n});\n\n/** The facet serving `AppInfo` with `info`. */\nexport function appInfoFacet<P extends Principal>(info: {\n\treadonly dataDir: string;\n\treadonly name: string;\n\treadonly version: string;\n\treadonly owner: P;\n}): Facet<P> {\n\treturn defineFacet<P>((host) =>\n\t\thost.serve(AppInfo, () => ({\n\t\t\tdataDir: constant(info.dataDir),\n\t\t\tname: constant(info.name),\n\t\t\tversion: constant(info.version),\n\t\t\t// The same object at every get: its principal key is computed once.\n\t\t\towner: constant(info.owner),\n\t\t})),\n\t);\n}\n\n/** The facet serving `WorkerInfo` with the worker's address and start data. */\nexport function workerInfoFacet<P extends Principal>(info: {\n\treadonly address: { readonly kind: string; readonly key: string; readonly params: JsonValue };\n\treadonly start: JsonValue;\n}): Facet<P> {\n\treturn defineFacet<P>((host) =>\n\t\thost.serve(WorkerInfo, () => ({ address: constant(info.address), start: constant(info.start) })),\n\t);\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { Principal } from "../../data/index.ts";
2
+ import { type Facet } from "../../host/index.ts";
3
+ /** The invite plugin's server facet; the owner (`AppInfo.owner`) makes the invites. */
4
+ export declare function inviteFacet<P extends Principal>(): Facet<P>;
5
+ //# sourceMappingURL=invite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../../src/node/app/invite.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAiB9D,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAiD3D"}
@@ -0,0 +1,64 @@
1
+ // The invite plugin (slice 13 §3, decision "The app kit, point 2"): the owner (`AppInfo.owner`, the principal the app
2
+ // names) makes an invite link for a principal of the app it chooses (`POST /_chord/invites`, owner only: `{ principal,
3
+ // label }` → `{ path }`); the invitee opens it, its page posts the token (the URL's fragment, never logged) to `POST
4
+ // /_chord/invite`, which consumes it (single use, 7 days) and answers with a browser session for that principal (§2's
5
+ // sessions). Invites wait in memory: a restart drops the ones not used. An exported facet, as `defineUsers` (see there
6
+ // why).
7
+ import { samePrincipal } from "../../data/principal.js";
8
+ import { defineFacet } from "../../host/index.js";
9
+ import { Http } from "../http/index.js";
10
+ import { AppInfo } from "./info.js";
11
+ import { fragmentPage } from "./owner.js";
12
+ import { hashToken, newToken } from "./secrets.js";
13
+ import { Sessions } from "./sessions.js";
14
+ /** How long an invite is valid: 7 days. */
15
+ const INVITE_MS = 7 * 24 * 60 * 60_000;
16
+ /** The invite link's path: its page, and the post that consumes it. */
17
+ const INVITE_PATH = "/_chord/invite";
18
+ /** The invite plugin's server facet; the owner (`AppInfo.owner`) makes the invites. */
19
+ export function inviteFacet() {
20
+ // By their token's hash: what the map holds is no credential.
21
+ const invites = new Map();
22
+ return defineFacet((_host, self) => self.contribute(Http, {
23
+ routes: {
24
+ "POST /_chord/invites": async (request, ctx) => {
25
+ // `AppInfo.owner` is the app's `principal.owner`, a principal of its type.
26
+ const owner = (await ctx.get(AppInfo, {})).owner.value;
27
+ if (!samePrincipal(ctx.principal, owner, ctx))
28
+ return { kind: "error", status: 403 };
29
+ // A trust boundary: the owner's request, checked for its shape.
30
+ const body = (await request.json());
31
+ const principal = body?.principal;
32
+ if (typeof principal !== "object" || principal === null || typeof body?.label !== "string") {
33
+ return { kind: "error", status: 400 };
34
+ }
35
+ const token = newToken();
36
+ invites.set(hashToken(token), { principal, label: body.label, expires: Date.now() + INVITE_MS });
37
+ return { kind: "json", value: { path: `${INVITE_PATH}#${token}` } };
38
+ },
39
+ [`GET ${INVITE_PATH}`]: {
40
+ public: true,
41
+ handler: async (request) => ({ kind: "html", body: fragmentPage(INVITE_PATH, request.nonce) }),
42
+ },
43
+ [`POST ${INVITE_PATH}`]: {
44
+ public: true,
45
+ handler: async (request, ctx) => {
46
+ // A trust boundary: anyone may post here.
47
+ const body = (await request.json());
48
+ const hash = typeof body?.token === "string" ? hashToken(body.token) : undefined;
49
+ const invite = hash === undefined ? undefined : invites.get(hash);
50
+ if (hash === undefined || invite === undefined)
51
+ return { kind: "error", status: 403 };
52
+ invites.delete(hash);
53
+ if (invite.expires <= Date.now())
54
+ return { kind: "error", status: 403 };
55
+ const sessions = await ctx.get(Sessions, {});
56
+ const secure = request.provenance.kind !== "local";
57
+ const issued = await sessions.issue({ principal: invite.principal, label: invite.label, kind: "browser", secure }, ctx);
58
+ return { kind: "json", value: "signed in", headers: { "Set-Cookie": issued.cookie } };
59
+ },
60
+ },
61
+ },
62
+ }));
63
+ }
64
+ //# sourceMappingURL=invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invite.js","sourceRoot":"","sources":["../../../src/node/app/invite.ts"],"names":[],"mappings":"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","sourcesContent":["// The invite plugin (slice 13 §3, decision \"The app kit, point 2\"): the owner (`AppInfo.owner`, the principal the app\n// names) makes an invite link for a principal of the app it chooses (`POST /_chord/invites`, owner only: `{ principal,\n// label }` → `{ path }`); the invitee opens it, its page posts the token (the URL's fragment, never logged) to `POST\n// /_chord/invite`, which consumes it (single use, 7 days) and answers with a browser session for that principal (§2's\n// sessions). Invites wait in memory: a restart drops the ones not used. An exported facet, as `defineUsers` (see there\n// why).\n\nimport type { Principal } from \"../../data/index.ts\";\nimport { samePrincipal } from \"../../data/principal.ts\";\nimport { defineFacet, type Facet } from \"../../host/index.ts\";\nimport type { JsonValue } from \"../../json.ts\";\nimport { Http } from \"../http/index.ts\";\nimport { AppInfo } from \"./info.ts\";\nimport { fragmentPage } from \"./owner.ts\";\nimport { hashToken, newToken } from \"./secrets.ts\";\nimport { Sessions } from \"./sessions.ts\";\n\n/** How long an invite is valid: 7 days. */\nconst INVITE_MS = 7 * 24 * 60 * 60_000;\n\n/** The invite link's path: its page, and the post that consumes it. */\nconst INVITE_PATH = \"/_chord/invite\";\n\n/** An invite waiting: the principal it signs in, its label, its expiry. */\ntype Invite = { readonly principal: JsonValue; readonly label: string; readonly expires: number };\n\n/** The invite plugin's server facet; the owner (`AppInfo.owner`) makes the invites. */\nexport function inviteFacet<P extends Principal>(): Facet<P> {\n\t// By their token's hash: what the map holds is no credential.\n\tconst invites = new Map<string, Invite>();\n\treturn defineFacet<P>((_host, self) =>\n\t\tself.contribute(Http, {\n\t\t\troutes: {\n\t\t\t\t\"POST /_chord/invites\": async (request, ctx) => {\n\t\t\t\t\t// `AppInfo.owner` is the app's `principal.owner`, a principal of its type.\n\t\t\t\t\tconst owner = (await ctx.get(AppInfo, {})).owner.value as Principal;\n\t\t\t\t\tif (!samePrincipal(ctx.principal, owner, ctx)) return { kind: \"error\", status: 403 };\n\t\t\t\t\t// A trust boundary: the owner's request, checked for its shape.\n\t\t\t\t\tconst body = (await request.json()) as {\n\t\t\t\t\t\treadonly principal?: JsonValue;\n\t\t\t\t\t\treadonly label?: unknown;\n\t\t\t\t\t} | null;\n\t\t\t\t\tconst principal = body?.principal;\n\t\t\t\t\tif (typeof principal !== \"object\" || principal === null || typeof body?.label !== \"string\") {\n\t\t\t\t\t\treturn { kind: \"error\", status: 400 };\n\t\t\t\t\t}\n\t\t\t\t\tconst token = newToken();\n\t\t\t\t\tinvites.set(hashToken(token), { principal, label: body.label, expires: Date.now() + INVITE_MS });\n\t\t\t\t\treturn { kind: \"json\", value: { path: `${INVITE_PATH}#${token}` } };\n\t\t\t\t},\n\t\t\t\t[`GET ${INVITE_PATH}`]: {\n\t\t\t\t\tpublic: true,\n\t\t\t\t\thandler: async (request) => ({ kind: \"html\", body: fragmentPage(INVITE_PATH, request.nonce) }),\n\t\t\t\t},\n\t\t\t\t[`POST ${INVITE_PATH}`]: {\n\t\t\t\t\tpublic: true,\n\t\t\t\t\thandler: async (request, ctx) => {\n\t\t\t\t\t\t// A trust boundary: anyone may post here.\n\t\t\t\t\t\tconst body = (await request.json()) as { readonly token?: unknown } | null;\n\t\t\t\t\t\tconst hash = typeof body?.token === \"string\" ? hashToken(body.token) : undefined;\n\t\t\t\t\t\tconst invite = hash === undefined ? undefined : invites.get(hash);\n\t\t\t\t\t\tif (hash === undefined || invite === undefined) return { kind: \"error\", status: 403 };\n\t\t\t\t\t\tinvites.delete(hash);\n\t\t\t\t\t\tif (invite.expires <= Date.now()) return { kind: \"error\", status: 403 };\n\t\t\t\t\t\tconst sessions = await ctx.get(Sessions, {});\n\t\t\t\t\t\tconst secure = request.provenance.kind !== \"local\";\n\t\t\t\t\t\tconst issued = await sessions.issue(\n\t\t\t\t\t\t\t{ principal: invite.principal, label: invite.label, kind: \"browser\", secure },\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { kind: \"json\", value: \"signed in\", headers: { \"Set-Cookie\": issued.cookie } };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t);\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import type { Address } from "../../contracts/index.ts";
2
+ /** The paths of a data directory. */
3
+ export type AppLayout = {
4
+ readonly dataDir: string;
5
+ readonly server: string;
6
+ readonly serverStore: string;
7
+ readonly workers: string;
8
+ readonly plugins: string;
9
+ readonly logs: string;
10
+ /** Each worker kind's base, in `<kind>/` (`WorkersOptions.baseDir`): written again at every start. */
11
+ readonly workerBases: string;
12
+ /** Node's compile cache for the workers (`NODE_COMPILE_CACHE`). */
13
+ readonly compileCache: string;
14
+ readonly ownerToken: string;
15
+ readonly cookieSecret: string;
16
+ };
17
+ /** The data directory of app `name` unless the start script names one: `~/.<name>`. */
18
+ export declare function defaultDataDir(name: string): string;
19
+ /**
20
+ * The real path of the data directory `path`, made when missing (mode 0700), refused when the kit must not make it
21
+ * private: the home directory, a file system's root, or a directory another user owns (a clear error, instead of
22
+ * tightening a directory others use or failing on `EPERM`). Its mode is set on the real path, never through a link.
23
+ */
24
+ export declare function openDataDir(path: string): Promise<string>;
25
+ /** The layout of `dataDir` (a real path, `openDataDir`'s), its directories made private (`privateDirectory`). */
26
+ export declare function createLayout(dataDir: string): Promise<AppLayout>;
27
+ /** Makes `dir` (and missing parents) with mode 0700, and sets 0700 on it when it existed. */
28
+ export declare function privateDirectory(dir: string): Promise<void>;
29
+ /**
30
+ * Makes the store file `path` private before SQLite opens it: created empty with mode 0600 when missing (SQLite gives
31
+ * its journal files the database's mode), else set to 0600 with the journal files it has.
32
+ */
33
+ export declare function privateStore(path: string): Promise<void>;
34
+ /** The directory of the worker at `address`: `workers/<kind>/<its key, encoded>`. */
35
+ export declare function workerDirectory(dataDir: string, address: Address): string;
36
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/node/app/layout.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sGAAsG;IACtG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa/D;AAED,iHAAiH;AACjH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiBtE;AAED,6FAA6F;AAC7F,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9D;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAEzE"}
@@ -0,0 +1,87 @@
1
+ // The app kit's data directory (slice 13 §4, decision "The app kit, point 4: storage"): one fixed layout, made private
2
+ // at every start. `server/` holds the server's store and files, `workers/<kind>/<address>/` each worker's store and
3
+ // files, `plugins/` the user's plugins root, `logs/` the logs, `cache/` what only saves time (`workers/<kind>/`, each
4
+ // worker kind's base, written again at every start; `node/`, the workers' compile cache), `owner-token` the owner's token for command-line
5
+ // clients. Directories are 0700 and stores 0600, also when they existed looser before (other local users must not
6
+ // read the sessions in a store, nor replace it).
7
+ import { createHash } from "node:crypto";
8
+ import { chmod, mkdir, open, realpath, stat } from "node:fs/promises";
9
+ import { homedir } from "node:os";
10
+ import { join, parse } from "node:path";
11
+ /** The data directory of app `name` unless the start script names one: `~/.<name>`. */
12
+ export function defaultDataDir(name) {
13
+ return join(homedir(), `.${name}`);
14
+ }
15
+ /**
16
+ * The real path of the data directory `path`, made when missing (mode 0700), refused when the kit must not make it
17
+ * private: the home directory, a file system's root, or a directory another user owns (a clear error, instead of
18
+ * tightening a directory others use or failing on `EPERM`). Its mode is set on the real path, never through a link.
19
+ */
20
+ export async function openDataDir(path) {
21
+ await mkdir(path, { recursive: true, mode: 0o700 });
22
+ const dataDir = await realpath(path);
23
+ const home = await realpath(homedir());
24
+ if (dataDir === home || dataDir === parse(dataDir).root) {
25
+ const what = dataDir === home ? "the home directory" : "a file system's root";
26
+ throw new Error(`startServer: the data directory ${dataDir} is ${what}; name a directory of the app's own`);
27
+ }
28
+ const { uid } = await stat(dataDir);
29
+ if (process.getuid !== undefined && uid !== process.getuid()) {
30
+ throw new Error(`startServer: the data directory ${dataDir} belongs to another user (uid ${uid})`);
31
+ }
32
+ return dataDir;
33
+ }
34
+ /** The layout of `dataDir` (a real path, `openDataDir`'s), its directories made private (`privateDirectory`). */
35
+ export async function createLayout(dataDir) {
36
+ await privateDirectory(dataDir);
37
+ const layout = {
38
+ dataDir,
39
+ server: join(dataDir, "server"),
40
+ serverStore: join(dataDir, "server", "store.sqlite"),
41
+ workers: join(dataDir, "workers"),
42
+ plugins: join(dataDir, "plugins"),
43
+ logs: join(dataDir, "logs"),
44
+ workerBases: join(dataDir, "cache", "workers"),
45
+ compileCache: join(dataDir, "cache", "node"),
46
+ ownerToken: join(dataDir, "owner-token"),
47
+ cookieSecret: join(dataDir, "server", "cookie-secret"),
48
+ };
49
+ const dirs = [layout.server, layout.workers, layout.plugins, layout.logs, join(dataDir, "cache")];
50
+ for (const dir of [...dirs, layout.workerBases, layout.compileCache])
51
+ await privateDirectory(dir);
52
+ return layout;
53
+ }
54
+ /** Makes `dir` (and missing parents) with mode 0700, and sets 0700 on it when it existed. */
55
+ export async function privateDirectory(dir) {
56
+ await mkdir(dir, { recursive: true, mode: 0o700 });
57
+ await chmod(dir, 0o700);
58
+ }
59
+ /**
60
+ * Makes the store file `path` private before SQLite opens it: created empty with mode 0600 when missing (SQLite gives
61
+ * its journal files the database's mode), else set to 0600 with the journal files it has.
62
+ */
63
+ export async function privateStore(path) {
64
+ await (await open(path, "a", 0o600)).close();
65
+ for (const file of [path, `${path}-wal`, `${path}-shm`]) {
66
+ await chmod(file, 0o600).catch((error) => {
67
+ if (error.code !== "ENOENT")
68
+ throw error;
69
+ });
70
+ }
71
+ }
72
+ /** The directory of the worker at `address`: `workers/<kind>/<its key, encoded>`. */
73
+ export function workerDirectory(dataDir, address) {
74
+ return join(dataDir, "workers", address.kind, encodedKey(address.key));
75
+ }
76
+ /** The longest key kept readable as a directory name; a longer one is named by its hash. */
77
+ const READABLE_KEY = 160;
78
+ /**
79
+ * An address key as one directory name: percent-encoded (`/`, `\`, `.` and every other character a file system might
80
+ * treat specially included), or its SHA-256 when that is longer than `READABLE_KEY`. Capital letters are encoded too:
81
+ * on a case-insensitive file system (macOS) `p|A` and `p|a` would otherwise share a directory.
82
+ */
83
+ function encodedKey(key) {
84
+ const encoded = encodeURIComponent(key).replace(/(%[0-9A-F]{2})|[.!'()*~A-Z]/g, (match, escaped) => escaped ?? `%${match.charCodeAt(0).toString(16).toUpperCase()}`);
85
+ return encoded.length <= READABLE_KEY ? encoded : `sha256-${createHash("sha256").update(key).digest("hex")}`;
86
+ }
87
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/node/app/layout.ts"],"names":[],"mappings":"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","sourcesContent":["// The app kit's data directory (slice 13 §4, decision \"The app kit, point 4: storage\"): one fixed layout, made private\n// at every start. `server/` holds the server's store and files, `workers/<kind>/<address>/` each worker's store and\n// files, `plugins/` the user's plugins root, `logs/` the logs, `cache/` what only saves time (`workers/<kind>/`, each\n// worker kind's base, written again at every start; `node/`, the workers' compile cache), `owner-token` the owner's token for command-line\n// clients. Directories are 0700 and stores 0600, also when they existed looser before (other local users must not\n// read the sessions in a store, nor replace it).\n\nimport { createHash } from \"node:crypto\";\nimport { chmod, mkdir, open, realpath, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, parse } from \"node:path\";\nimport type { Address } from \"../../contracts/index.ts\";\n\n/** The paths of a data directory. */\nexport type AppLayout = {\n\treadonly dataDir: string;\n\treadonly server: string;\n\treadonly serverStore: string;\n\treadonly workers: string;\n\treadonly plugins: string;\n\treadonly logs: string;\n\t/** Each worker kind's base, in `<kind>/` (`WorkersOptions.baseDir`): written again at every start. */\n\treadonly workerBases: string;\n\t/** Node's compile cache for the workers (`NODE_COMPILE_CACHE`). */\n\treadonly compileCache: string;\n\treadonly ownerToken: string;\n\treadonly cookieSecret: string;\n};\n\n/** The data directory of app `name` unless the start script names one: `~/.<name>`. */\nexport function defaultDataDir(name: string): string {\n\treturn join(homedir(), `.${name}`);\n}\n\n/**\n * The real path of the data directory `path`, made when missing (mode 0700), refused when the kit must not make it\n * private: the home directory, a file system's root, or a directory another user owns (a clear error, instead of\n * tightening a directory others use or failing on `EPERM`). Its mode is set on the real path, never through a link.\n */\nexport async function openDataDir(path: string): Promise<string> {\n\tawait mkdir(path, { recursive: true, mode: 0o700 });\n\tconst dataDir = await realpath(path);\n\tconst home = await realpath(homedir());\n\tif (dataDir === home || dataDir === parse(dataDir).root) {\n\t\tconst what = dataDir === home ? \"the home directory\" : \"a file system's root\";\n\t\tthrow new Error(`startServer: the data directory ${dataDir} is ${what}; name a directory of the app's own`);\n\t}\n\tconst { uid } = await stat(dataDir);\n\tif (process.getuid !== undefined && uid !== process.getuid()) {\n\t\tthrow new Error(`startServer: the data directory ${dataDir} belongs to another user (uid ${uid})`);\n\t}\n\treturn dataDir;\n}\n\n/** The layout of `dataDir` (a real path, `openDataDir`'s), its directories made private (`privateDirectory`). */\nexport async function createLayout(dataDir: string): Promise<AppLayout> {\n\tawait privateDirectory(dataDir);\n\tconst layout: AppLayout = {\n\t\tdataDir,\n\t\tserver: join(dataDir, \"server\"),\n\t\tserverStore: join(dataDir, \"server\", \"store.sqlite\"),\n\t\tworkers: join(dataDir, \"workers\"),\n\t\tplugins: join(dataDir, \"plugins\"),\n\t\tlogs: join(dataDir, \"logs\"),\n\t\tworkerBases: join(dataDir, \"cache\", \"workers\"),\n\t\tcompileCache: join(dataDir, \"cache\", \"node\"),\n\t\townerToken: join(dataDir, \"owner-token\"),\n\t\tcookieSecret: join(dataDir, \"server\", \"cookie-secret\"),\n\t};\n\tconst dirs = [layout.server, layout.workers, layout.plugins, layout.logs, join(dataDir, \"cache\")];\n\tfor (const dir of [...dirs, layout.workerBases, layout.compileCache]) await privateDirectory(dir);\n\treturn layout;\n}\n\n/** Makes `dir` (and missing parents) with mode 0700, and sets 0700 on it when it existed. */\nexport async function privateDirectory(dir: string): Promise<void> {\n\tawait mkdir(dir, { recursive: true, mode: 0o700 });\n\tawait chmod(dir, 0o700);\n}\n\n/**\n * Makes the store file `path` private before SQLite opens it: created empty with mode 0600 when missing (SQLite gives\n * its journal files the database's mode), else set to 0600 with the journal files it has.\n */\nexport async function privateStore(path: string): Promise<void> {\n\tawait (await open(path, \"a\", 0o600)).close();\n\tfor (const file of [path, `${path}-wal`, `${path}-shm`]) {\n\t\tawait chmod(file, 0o600).catch((error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code !== \"ENOENT\") throw error;\n\t\t});\n\t}\n}\n\n/** The directory of the worker at `address`: `workers/<kind>/<its key, encoded>`. */\nexport function workerDirectory(dataDir: string, address: Address): string {\n\treturn join(dataDir, \"workers\", address.kind, encodedKey(address.key));\n}\n\n/** The longest key kept readable as a directory name; a longer one is named by its hash. */\nconst READABLE_KEY = 160;\n\n/**\n * An address key as one directory name: percent-encoded (`/`, `\\`, `.` and every other character a file system might\n * treat specially included), or its SHA-256 when that is longer than `READABLE_KEY`. Capital letters are encoded too:\n * on a case-insensitive file system (macOS) `p|A` and `p|a` would otherwise share a directory.\n */\nfunction encodedKey(key: string): string {\n\tconst encoded = encodeURIComponent(key).replace(\n\t\t/(%[0-9A-F]{2})|[.!'()*~A-Z]/g,\n\t\t(match, escaped: string | undefined) => escaped ?? `%${match.charCodeAt(0).toString(16).toUpperCase()}`,\n\t);\n\treturn encoded.length <= READABLE_KEY ? encoded : `sha256-${createHash(\"sha256\").update(key).digest(\"hex\")}`;\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { Context } from "../../context/index.ts";
2
+ import type { Principal } from "../../data/index.ts";
3
+ import { type Facet, type Host } from "../../host/index.ts";
4
+ /** The owner link's one-time token: made at each start (the previous one dropped), consumed by its first use. */
5
+ export declare class OwnerLink {
6
+ #private;
7
+ /** A fresh token (the previous one no longer valid), valid for 10 minutes. */
8
+ renew(): string;
9
+ /** Whether `token` is the current one and has not expired; it is used up either way when it matches. */
10
+ consume(token: string): boolean;
11
+ }
12
+ /** The path of the owner link's page and post. */
13
+ export declare const OWNER_PATH = "/_chord/owner";
14
+ /**
15
+ * The kit's facet for the owner link: `GET /_chord/owner`, a page posting the fragment's token, and `POST
16
+ * /_chord/owner`, which consumes it and answers with a session cookie of `owner`.
17
+ */
18
+ export declare function ownerFacet<P extends Principal>(link: OwnerLink, owner: P): Facet<P>;
19
+ /**
20
+ * A sign-in page for a link with a token in its fragment (the owner link, an invite): its script (the response's nonce)
21
+ * posts the token to `path`, then opens the app.
22
+ */
23
+ export declare function fragmentPage(path: string, nonce: string): string;
24
+ /**
25
+ * The owner token file at `path`: kept when its token still authenticates as `owner` (its session exists, its secret
26
+ * matches, it has not expired, it names `owner`; its mode set to 0600 again), else a new device session of `owner`
27
+ * written there (mode 0600, in one step), the old file's session revoked when it names another principal (the owner
28
+ * changed). Its token, for the start script.
29
+ */
30
+ export declare function ownerTokenFile<P extends Principal>(path: string, owner: P, host: Host<P>, context: Context): Promise<string>;
31
+ //# sourceMappingURL=owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.d.ts","sourceRoot":"","sources":["../../../src/node/app/owner.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAQzE,iHAAiH;AACjH,qBAAa,SAAS;;IAIrB,8EAA8E;IAC9E,KAAK,IAAI,MAAM,CAKd;IAED,wGAAwG;IACxG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAK9B;CACD;AAED,kDAAkD;AAClD,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CA2BnF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAShE;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,SAAS,EACvD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EACb,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -0,0 +1,104 @@
1
+ // The owner (slice 13 §2, decisions "The app kit, point 3: authentication" and "The kit's owner is a principal the app
2
+ // chooses"): the owner is the principal the app names (`principal.owner`); no owner by loopback alone. At each start
3
+ // the kit makes a one-time owner link (a random token, single use, valid 10 minutes, the previous one dropped); the
4
+ // start script prints it. Its page reads the token from the URL's fragment (never sent to a server, so never in a
5
+ // log) and posts it; the post consumes it and sets a browser session cookie for the owner. The owner token file
6
+ // (mode 0600) carries a device session of the owner for command-line clients on the same machine.
7
+ import { chmod } from "node:fs/promises";
8
+ import { samePrincipal } from "../../data/principal.js";
9
+ import { defineFacet } from "../../host/index.js";
10
+ import { Http } from "../http/index.js";
11
+ import { hashToken, matchesHash, newToken, readSecret, writeSecret } from "./secrets.js";
12
+ import { Sessions } from "./sessions.js";
13
+ /** How long an owner link is valid: 10 minutes. */
14
+ const OWNER_LINK_MS = 10 * 60_000;
15
+ /** The owner link's one-time token: made at each start (the previous one dropped), consumed by its first use. */
16
+ export class OwnerLink {
17
+ #hash;
18
+ #expires = 0;
19
+ /** A fresh token (the previous one no longer valid), valid for 10 minutes. */
20
+ renew() {
21
+ const token = newToken();
22
+ this.#hash = hashToken(token);
23
+ this.#expires = Date.now() + OWNER_LINK_MS;
24
+ return token;
25
+ }
26
+ /** Whether `token` is the current one and has not expired; it is used up either way when it matches. */
27
+ consume(token) {
28
+ const hash = this.#hash;
29
+ if (hash === undefined || !matchesHash(token, hash))
30
+ return false;
31
+ this.#hash = undefined;
32
+ return Date.now() < this.#expires;
33
+ }
34
+ }
35
+ /** The path of the owner link's page and post. */
36
+ export const OWNER_PATH = "/_chord/owner";
37
+ /**
38
+ * The kit's facet for the owner link: `GET /_chord/owner`, a page posting the fragment's token, and `POST
39
+ * /_chord/owner`, which consumes it and answers with a session cookie of `owner`.
40
+ */
41
+ export function ownerFacet(link, owner) {
42
+ return defineFacet((_host, self) => self.contribute(Http, {
43
+ routes: {
44
+ [`GET ${OWNER_PATH}`]: {
45
+ public: true,
46
+ handler: async (request) => ({ kind: "html", body: fragmentPage(OWNER_PATH, request.nonce) }),
47
+ },
48
+ [`POST ${OWNER_PATH}`]: {
49
+ public: true,
50
+ handler: async (request, ctx) => {
51
+ const body = (await request.json());
52
+ // A trust boundary: anyone may post here.
53
+ if (typeof body?.token !== "string" || !link.consume(body.token))
54
+ return { kind: "error", status: 403 };
55
+ const sessions = await ctx.get(Sessions, {});
56
+ const secure = request.provenance.kind !== "local";
57
+ const issued = await sessions.issue({ principal: owner, label: "owner browser", kind: "browser", secure }, ctx);
58
+ return { kind: "json", value: "signed in", headers: { "Set-Cookie": issued.cookie } };
59
+ },
60
+ },
61
+ },
62
+ }));
63
+ }
64
+ /**
65
+ * A sign-in page for a link with a token in its fragment (the owner link, an invite): its script (the response's nonce)
66
+ * posts the token to `path`, then opens the app.
67
+ */
68
+ export function fragmentPage(path, nonce) {
69
+ return [
70
+ "<!doctype html><title>Sign in</title><p id=status>Signing in…</p>",
71
+ `<script nonce="${nonce}">`,
72
+ "const token = location.hash.slice(1); history.replaceState(null, '', location.pathname);",
73
+ `fetch(${JSON.stringify(path)}, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ token }) })`,
74
+ " .then((r) => { if (r.ok) location.replace('/'); else document.getElementById('status').textContent = 'This link is used up or expired.'; });",
75
+ "</script>",
76
+ ].join("\n");
77
+ }
78
+ /**
79
+ * The owner token file at `path`: kept when its token still authenticates as `owner` (its session exists, its secret
80
+ * matches, it has not expired, it names `owner`; its mode set to 0600 again), else a new device session of `owner`
81
+ * written there (mode 0600, in one step), the old file's session revoked when it names another principal (the owner
82
+ * changed). Its token, for the start script.
83
+ */
84
+ export async function ownerTokenFile(path, owner, host, context) {
85
+ const existing = await readSecret(path);
86
+ return host.root(async (ctx) => {
87
+ const sessions = await ctx.get(Sessions, {});
88
+ if (existing !== undefined) {
89
+ // `verify` gives what `issue` stored: a principal of the app's type, or `null`.
90
+ const verified = (await sessions.verify(existing, ctx));
91
+ if (samePrincipal(verified ?? undefined, owner, ctx)) {
92
+ await chmod(path, 0o600);
93
+ return existing;
94
+ }
95
+ // The kit made that session for the file; replacing the file ends it.
96
+ if (verified !== null)
97
+ await sessions.revoke(existing.slice(0, existing.indexOf(".")), ctx);
98
+ }
99
+ const { token } = await sessions.issue({ principal: owner, label: "owner token file", kind: "device" }, ctx);
100
+ await writeSecret(path, token, existing === undefined ? "create" : "replace");
101
+ return token;
102
+ }, context);
103
+ }
104
+ //# sourceMappingURL=owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner.js","sourceRoot":"","sources":["../../../src/node/app/owner.ts"],"names":[],"mappings":"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","sourcesContent":["// The owner (slice 13 §2, decisions \"The app kit, point 3: authentication\" and \"The kit's owner is a principal the app\n// chooses\"): the owner is the principal the app names (`principal.owner`); no owner by loopback alone. At each start\n// the kit makes a one-time owner link (a random token, single use, valid 10 minutes, the previous one dropped); the\n// start script prints it. Its page reads the token from the URL's fragment (never sent to a server, so never in a\n// log) and posts it; the post consumes it and sets a browser session cookie for the owner. The owner token file\n// (mode 0600) carries a device session of the owner for command-line clients on the same machine.\n\nimport { chmod } from \"node:fs/promises\";\nimport type { Context } from \"../../context/index.ts\";\nimport type { Principal } from \"../../data/index.ts\";\nimport { samePrincipal } from \"../../data/principal.ts\";\nimport { defineFacet, type Facet, type Host } from \"../../host/index.ts\";\nimport { Http } from \"../http/index.ts\";\nimport { hashToken, matchesHash, newToken, readSecret, writeSecret } from \"./secrets.ts\";\nimport { Sessions } from \"./sessions.ts\";\n\n/** How long an owner link is valid: 10 minutes. */\nconst OWNER_LINK_MS = 10 * 60_000;\n\n/** The owner link's one-time token: made at each start (the previous one dropped), consumed by its first use. */\nexport class OwnerLink {\n\t#hash: string | undefined;\n\t#expires = 0;\n\n\t/** A fresh token (the previous one no longer valid), valid for 10 minutes. */\n\trenew(): string {\n\t\tconst token = newToken();\n\t\tthis.#hash = hashToken(token);\n\t\tthis.#expires = Date.now() + OWNER_LINK_MS;\n\t\treturn token;\n\t}\n\n\t/** Whether `token` is the current one and has not expired; it is used up either way when it matches. */\n\tconsume(token: string): boolean {\n\t\tconst hash = this.#hash;\n\t\tif (hash === undefined || !matchesHash(token, hash)) return false;\n\t\tthis.#hash = undefined;\n\t\treturn Date.now() < this.#expires;\n\t}\n}\n\n/** The path of the owner link's page and post. */\nexport const OWNER_PATH = \"/_chord/owner\";\n\n/**\n * The kit's facet for the owner link: `GET /_chord/owner`, a page posting the fragment's token, and `POST\n * /_chord/owner`, which consumes it and answers with a session cookie of `owner`.\n */\nexport function ownerFacet<P extends Principal>(link: OwnerLink, owner: P): Facet<P> {\n\treturn defineFacet<P>((_host, self) =>\n\t\tself.contribute(Http, {\n\t\t\troutes: {\n\t\t\t\t[`GET ${OWNER_PATH}`]: {\n\t\t\t\t\tpublic: true,\n\t\t\t\t\thandler: async (request) => ({ kind: \"html\", body: fragmentPage(OWNER_PATH, request.nonce) }),\n\t\t\t\t},\n\t\t\t\t[`POST ${OWNER_PATH}`]: {\n\t\t\t\t\tpublic: true,\n\t\t\t\t\thandler: async (request, ctx) => {\n\t\t\t\t\t\tconst body = (await request.json()) as { readonly token?: unknown } | null;\n\t\t\t\t\t\t// A trust boundary: anyone may post here.\n\t\t\t\t\t\tif (typeof body?.token !== \"string\" || !link.consume(body.token))\n\t\t\t\t\t\t\treturn { kind: \"error\", status: 403 };\n\t\t\t\t\t\tconst sessions = await ctx.get(Sessions, {});\n\t\t\t\t\t\tconst secure = request.provenance.kind !== \"local\";\n\t\t\t\t\t\tconst issued = await sessions.issue(\n\t\t\t\t\t\t\t{ principal: owner, label: \"owner browser\", kind: \"browser\", secure },\n\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { kind: \"json\", value: \"signed in\", headers: { \"Set-Cookie\": issued.cookie } };\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t);\n}\n\n/**\n * A sign-in page for a link with a token in its fragment (the owner link, an invite): its script (the response's nonce)\n * posts the token to `path`, then opens the app.\n */\nexport function fragmentPage(path: string, nonce: string): string {\n\treturn [\n\t\t\"<!doctype html><title>Sign in</title><p id=status>Signing in…</p>\",\n\t\t`<script nonce=\"${nonce}\">`,\n\t\t\"const token = location.hash.slice(1); history.replaceState(null, '', location.pathname);\",\n\t\t`fetch(${JSON.stringify(path)}, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ token }) })`,\n\t\t\" .then((r) => { if (r.ok) location.replace('/'); else document.getElementById('status').textContent = 'This link is used up or expired.'; });\",\n\t\t\"</script>\",\n\t].join(\"\\n\");\n}\n\n/**\n * The owner token file at `path`: kept when its token still authenticates as `owner` (its session exists, its secret\n * matches, it has not expired, it names `owner`; its mode set to 0600 again), else a new device session of `owner`\n * written there (mode 0600, in one step), the old file's session revoked when it names another principal (the owner\n * changed). Its token, for the start script.\n */\nexport async function ownerTokenFile<P extends Principal>(\n\tpath: string,\n\towner: P,\n\thost: Host<P>,\n\tcontext: Context,\n): Promise<string> {\n\tconst existing = await readSecret(path);\n\treturn host.root(async (ctx) => {\n\t\tconst sessions = await ctx.get(Sessions, {});\n\t\tif (existing !== undefined) {\n\t\t\t// `verify` gives what `issue` stored: a principal of the app's type, or `null`.\n\t\t\tconst verified = (await sessions.verify(existing, ctx)) as P | null;\n\t\t\tif (samePrincipal(verified ?? undefined, owner, ctx)) {\n\t\t\t\tawait chmod(path, 0o600);\n\t\t\t\treturn existing;\n\t\t\t}\n\t\t\t// The kit made that session for the file; replacing the file ends it.\n\t\t\tif (verified !== null) await sessions.revoke(existing.slice(0, existing.indexOf(\".\")), ctx);\n\t\t}\n\t\tconst { token } = await sessions.issue({ principal: owner, label: \"owner token file\", kind: \"device\" }, ctx);\n\t\tawait writeSecret(path, token, existing === undefined ? \"create\" : \"replace\");\n\t\treturn token;\n\t}, context);\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import type { Principal } from "../../data/index.ts";
2
+ import { type Facet } from "../../host/index.ts";
3
+ /** Who starts a pairing: the signed-in owner (not counted), or an anonymous client at an address (counted). */
4
+ export type PairingStarter = {
5
+ readonly kind: "owner";
6
+ } | {
7
+ readonly kind: "anonymous";
8
+ readonly address: string;
9
+ };
10
+ /** One pairing under way: its code, the device's label, who started it, its expiry, its token once approved. */
11
+ type Pairing = {
12
+ readonly code: string;
13
+ readonly label: string;
14
+ readonly by: PairingStarter;
15
+ readonly expires: number;
16
+ token?: string;
17
+ };
18
+ /** The limits of pairings under way: in all (100 by default) and per client address (10 by default). */
19
+ export type PairingLimits = {
20
+ readonly maxPending?: number;
21
+ readonly perAddress?: number;
22
+ };
23
+ /** The pairings under way, by code and by their poll secret's hash, with the anonymous ones counted. */
24
+ export declare class Pairings {
25
+ #private;
26
+ constructor(limits?: PairingLimits);
27
+ /**
28
+ * A new pairing for a device labelled `label`, started `by` the owner or an anonymous client: its code (for the
29
+ * owner) and its poll secret (for the device); `undefined` when an anonymous client reached a limit.
30
+ */
31
+ begin(label: string, by: PairingStarter): {
32
+ readonly code: string;
33
+ readonly poll: string;
34
+ } | undefined;
35
+ /** The pairing waiting for approval under `code` (any case), unexpired. */
36
+ waiting(code: string): Pairing | undefined;
37
+ /** What a poll with `poll` learns: still waiting, the device's token (once: the pairing ends), or nothing. */
38
+ poll(poll: string): {
39
+ readonly kind: "waiting";
40
+ } | {
41
+ readonly kind: "approved";
42
+ readonly token: string;
43
+ } | undefined;
44
+ }
45
+ /** The pairing routes' prefix. */
46
+ export declare const PAIR_PATH = "/_chord/pair";
47
+ /**
48
+ * The kit's facet for device pairing: `POST /_chord/pair` (public: `{ label? }` → `{ code, poll }`, 429 past a limit
49
+ * unless the owner asks), `POST /_chord/pair/poll` (public: `{ poll }` → `{ status: "waiting" }`, `{ status:
50
+ * "approved", token }` once, else 404), `GET` and `POST /_chord/pair/:code` (`owner`'s confirm page and approval: a
51
+ * device session of `owner`).
52
+ */
53
+ export declare function pairingFacet<P extends Principal>(pairings: Pairings, owner: P): Facet<P>;
54
+ export {};
55
+ //# sourceMappingURL=pairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../../src/node/app/pairing.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAW9D,+GAA+G;AAC/G,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnH,gHAAgH;AAChH,KAAK,OAAO,GAAG;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wGAAwG;AACxG,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3F,wGAAwG;AACxG,qBAAa,QAAQ;;IAQpB,YAAY,MAAM,GAAE,aAAkB,EAGrC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAgBrG;IAED,2EAA2E;IAC3E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAIzC;IAED,8GAA8G;IAC9G,IAAI,CACH,IAAI,EAAE,MAAM,GACV;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;KAAE,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAQlG;CAqBD;AASD,kCAAkC;AAClC,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAiDxF"}