@north-light/cli 0.3.530 → 0.3.532

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 (495) hide show
  1. package/dist/clients/attach/session/connection.js +1 -1
  2. package/dist/clients/attach/session/reconnect.js +1 -1
  3. package/dist/clients/attach/viewer.js +508 -508
  4. package/dist/core/async-array.d.ts +7 -0
  5. package/dist/core/async-array.js +1 -0
  6. package/dist/core/audit.d.ts +1 -1
  7. package/dist/core/audit.js +2 -2
  8. package/dist/core/canvas/attention.d.ts +4 -4
  9. package/dist/core/canvas/attention.js +1 -1
  10. package/dist/core/canvas/boot.d.ts +4 -4
  11. package/dist/core/canvas/boot.js +1 -1
  12. package/dist/core/canvas/canvas.d.ts +59 -59
  13. package/dist/core/canvas/canvas.js +19 -19
  14. package/dist/core/canvas/context-strip.js +2 -2
  15. package/dist/core/canvas/crons.d.ts +27 -27
  16. package/dist/core/canvas/crons.js +11 -11
  17. package/dist/core/canvas/daemon-actions.d.ts +10 -10
  18. package/dist/core/canvas/daemon-actions.js +8 -8
  19. package/dist/core/canvas/daemon-owner.d.ts +3 -3
  20. package/dist/core/canvas/daemon-owner.js +2 -2
  21. package/dist/core/canvas/db.d.ts +19 -30
  22. package/dist/core/canvas/db.js +3 -2
  23. package/dist/core/canvas/deliveries.d.ts +16 -16
  24. package/dist/core/canvas/deliveries.js +24 -24
  25. package/dist/core/canvas/executions.d.ts +8 -8
  26. package/dist/core/canvas/executions.js +1 -1
  27. package/dist/core/canvas/focuses.d.ts +8 -8
  28. package/dist/core/canvas/focuses.js +1 -1
  29. package/dist/core/canvas/history.d.ts +3 -3
  30. package/dist/core/canvas/history.js +9 -9
  31. package/dist/core/canvas/install-id.d.ts +1 -1
  32. package/dist/core/canvas/install-id.js +1 -1
  33. package/dist/core/canvas/managed-worktree-sweep-candidates.d.ts +1 -1
  34. package/dist/core/canvas/managed-worktree-sweep-candidates.js +2 -2
  35. package/dist/core/canvas/memory-reads.d.ts +6 -6
  36. package/dist/core/canvas/memory-reads.js +1 -1
  37. package/dist/core/canvas/nav-model.d.ts +13 -13
  38. package/dist/core/canvas/nav-model.js +1 -1
  39. package/dist/core/canvas/node-agent-paths.d.ts +6 -6
  40. package/dist/core/canvas/node-agent-paths.js +1 -1
  41. package/dist/core/canvas/node-tokens.d.ts +7 -7
  42. package/dist/core/canvas/node-tokens.js +3 -3
  43. package/dist/core/canvas/outcome-actions.d.ts +5 -5
  44. package/dist/core/canvas/outcome-actions.js +3 -3
  45. package/dist/core/canvas/recovery.d.ts +26 -26
  46. package/dist/core/canvas/recovery.js +2 -2
  47. package/dist/core/canvas/render-source.d.ts +1 -1
  48. package/dist/core/canvas/render-source.js +1 -1
  49. package/dist/core/canvas/sessions.d.ts +10 -10
  50. package/dist/core/canvas/sessions.js +4 -4
  51. package/dist/core/canvas/source.js +1 -1
  52. package/dist/core/canvas/structured-requests.d.ts +15 -15
  53. package/dist/core/canvas/structured-requests.js +5 -5
  54. package/dist/core/canvas/tree.d.ts +9 -9
  55. package/dist/core/canvas/tree.js +5 -5
  56. package/dist/core/canvas/waits.d.ts +13 -13
  57. package/dist/core/canvas/waits.js +6 -6
  58. package/dist/core/canvas/worktrees.d.ts +15 -15
  59. package/dist/core/canvas/worktrees.js +1 -1
  60. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -1
  61. package/dist/core/conversation-store/file-store.d.ts +7 -7
  62. package/dist/core/conversation-store/file-store.js +9 -9
  63. package/dist/core/conversation-store/index.d.ts +16 -14
  64. package/dist/core/conversation-store/index.js +1 -1
  65. package/dist/core/conversation-store/listener.js +5 -5
  66. package/dist/core/conversation-store/patch.d.ts +3 -1
  67. package/dist/core/conversation-store/patch.js +1 -1
  68. package/dist/core/feed/feed.js +3 -3
  69. package/dist/core/feed/inbox.d.ts +2 -2
  70. package/dist/core/feed/inbox.js +1 -1
  71. package/dist/core/feed/messages.d.ts +11 -12
  72. package/dist/core/feed/messages.js +5 -5
  73. package/dist/core/feed/reports.d.ts +4 -4
  74. package/dist/core/feed/reports.js +2 -2
  75. package/dist/core/grants/cover.d.ts +1 -1
  76. package/dist/core/grants/cover.js +1 -1
  77. package/dist/core/grants/local.d.ts +1 -1
  78. package/dist/core/grants/local.js +1 -1
  79. package/dist/core/grants/mirror.d.ts +19 -19
  80. package/dist/core/grants/mirror.js +2 -2
  81. package/dist/core/grants/on-sync.d.ts +1 -1
  82. package/dist/core/grants/on-sync.js +1 -1
  83. package/dist/core/grants/remove.js +1 -1
  84. package/dist/core/grants/sync.js +1 -1
  85. package/dist/core/graph/access.d.ts +17 -17
  86. package/dist/core/graph/access.js +3 -3
  87. package/dist/core/graph/custom.d.ts +16 -16
  88. package/dist/core/graph/custom.js +9 -9
  89. package/dist/core/graph/deletion.d.ts +3 -7
  90. package/dist/core/graph/deletion.js +4 -4
  91. package/dist/core/graph/documents.d.ts +24 -27
  92. package/dist/core/graph/documents.js +7 -7
  93. package/dist/core/graph/edges.d.ts +13 -13
  94. package/dist/core/graph/edges.js +1 -1
  95. package/dist/core/graph/events.d.ts +7 -9
  96. package/dist/core/graph/events.js +8 -8
  97. package/dist/core/graph/exposures.d.ts +6 -6
  98. package/dist/core/graph/exposures.js +4 -4
  99. package/dist/core/graph/jobs.d.ts +6 -8
  100. package/dist/core/graph/jobs.js +2 -2
  101. package/dist/core/graph/kinds/action.js +1 -1
  102. package/dist/core/graph/kinds/custom.js +2 -2
  103. package/dist/core/graph/kinds/document.d.ts +1 -0
  104. package/dist/core/graph/kinds/document.js +4 -4
  105. package/dist/core/graph/kinds/dto.d.ts +2 -2
  106. package/dist/core/graph/kinds/dto.js +1 -1
  107. package/dist/core/graph/kinds/job.js +2 -2
  108. package/dist/core/graph/kinds/kind.d.ts +6 -8
  109. package/dist/core/graph/kinds/kind.js +1 -1
  110. package/dist/core/graph/kinds/node.js +5 -5
  111. package/dist/core/graph/kinds/owner.js +2 -2
  112. package/dist/core/graph/kinds/registry.d.ts +6 -9
  113. package/dist/core/graph/kinds/registry.js +1 -1
  114. package/dist/core/graph/names.d.ts +6 -6
  115. package/dist/core/graph/names.js +3 -3
  116. package/dist/core/graph/object-waits.d.ts +4 -7
  117. package/dist/core/graph/object-waits.js +1 -1
  118. package/dist/core/graph/objects.d.ts +14 -14
  119. package/dist/core/graph/objects.js +9 -9
  120. package/dist/core/graph/package-docs.d.ts +2 -7
  121. package/dist/core/graph/package-docs.js +5 -5
  122. package/dist/core/graph/package-kinds.d.ts +2 -5
  123. package/dist/core/graph/package-kinds.js +1 -1
  124. package/dist/core/graph/package-reconcile.d.ts +2 -5
  125. package/dist/core/graph/package-reconcile.js +1 -1
  126. package/dist/core/graph/reader.d.ts +18 -18
  127. package/dist/core/graph/reader.js +3 -3
  128. package/dist/core/graph/receivers.d.ts +4 -4
  129. package/dist/core/graph/receivers.js +5 -5
  130. package/dist/core/graph/repo-sync/exchange.d.ts +3 -7
  131. package/dist/core/graph/repo-sync/exchange.js +2 -2
  132. package/dist/core/graph/repo-sync/repos.d.ts +7 -5
  133. package/dist/core/graph/repo-sync/repos.js +3 -3
  134. package/dist/core/graph/repo-sync/sync.d.ts +3 -6
  135. package/dist/core/graph/repo-sync/sync.js +2 -2
  136. package/dist/core/graph/rules.d.ts +5 -5
  137. package/dist/core/graph/rules.js +3 -3
  138. package/dist/core/graph/spaces/app.js +1 -1
  139. package/dist/core/graph/spaces/index.d.ts +4 -5
  140. package/dist/core/graph/spaces/index.js +1 -1
  141. package/dist/core/graph/spaces/own-memory.d.ts +4 -4
  142. package/dist/core/graph/spaces/own-memory.js +1 -1
  143. package/dist/core/graph/spaces/person.js +3 -3
  144. package/dist/core/graph/spaces/repo.d.ts +1 -1
  145. package/dist/core/graph/spaces/repo.js +1 -1
  146. package/dist/core/graph/watches.d.ts +15 -15
  147. package/dist/core/graph/watches.js +10 -10
  148. package/dist/core/human/feedback-companion.d.ts +2 -2
  149. package/dist/core/human/feedback-companion.js +1 -1
  150. package/dist/core/human/feedback.d.ts +3 -3
  151. package/dist/core/human/feedback.js +1 -1
  152. package/dist/core/human/requests.d.ts +34 -33
  153. package/dist/core/human/requests.js +20 -20
  154. package/dist/core/human/scan.d.ts +2 -2
  155. package/dist/core/human/scan.js +1 -1
  156. package/dist/core/human/tickets.d.ts +9 -9
  157. package/dist/core/human/tickets.js +1 -1
  158. package/dist/core/llm/app-rungs.d.ts +1 -1
  159. package/dist/core/llm/app-rungs.js +1 -1
  160. package/dist/core/llm/run.js +2 -2
  161. package/dist/core/peer/directory.d.ts +1 -1
  162. package/dist/core/peer/directory.js +1 -1
  163. package/dist/core/peer/envelope.d.ts +3 -3
  164. package/dist/core/peer/envelope.js +1 -1
  165. package/dist/core/peer/home.d.ts +13 -7
  166. package/dist/core/peer/home.js +2 -2
  167. package/dist/core/peer/ingest.d.ts +6 -6
  168. package/dist/core/peer/ingest.js +1 -1
  169. package/dist/core/peer/outbox-store.d.ts +14 -14
  170. package/dist/core/peer/outbox-store.js +5 -5
  171. package/dist/core/peer/receiver.d.ts +2 -2
  172. package/dist/core/peer/receiver.js +1 -1
  173. package/dist/core/peer/stubs.d.ts +10 -10
  174. package/dist/core/peer/stubs.js +1 -1
  175. package/dist/core/providers/approval.d.ts +2 -2
  176. package/dist/core/providers/approval.js +2 -2
  177. package/dist/core/providers/audit.d.ts +3 -3
  178. package/dist/core/providers/audit.js +2 -2
  179. package/dist/core/providers/bundles.js +2 -2
  180. package/dist/core/providers/call.d.ts +2 -2
  181. package/dist/core/providers/call.js +1 -1
  182. package/dist/core/providers/files.d.ts +1 -1
  183. package/dist/core/providers/files.js +1 -1
  184. package/dist/core/providers/mint.js +1 -1
  185. package/dist/core/providers/receipts.d.ts +1 -1
  186. package/dist/core/providers/receipts.js +2 -2
  187. package/dist/core/review/birth.js +1 -1
  188. package/dist/core/review/comments.d.ts +19 -19
  189. package/dist/core/review/comments.js +5 -5
  190. package/dist/core/review/companion.d.ts +1 -1
  191. package/dist/core/review/companion.js +1 -1
  192. package/dist/core/review/document.d.ts +3 -3
  193. package/dist/core/review/document.js +2 -2
  194. package/dist/core/review/fork.js +2 -2
  195. package/dist/core/review/realize.js +1 -1
  196. package/dist/core/review/remap.d.ts +2 -2
  197. package/dist/core/review/remap.js +4 -4
  198. package/dist/core/review/stage.d.ts +1 -1
  199. package/dist/core/review/stage.js +1 -1
  200. package/dist/core/review/store.d.ts +21 -21
  201. package/dist/core/review/store.js +1 -1
  202. package/dist/core/runs/activity.d.ts +1 -1
  203. package/dist/core/runs/activity.js +5 -5
  204. package/dist/core/runs/confinement.d.ts +7 -7
  205. package/dist/core/runs/confinement.js +2 -2
  206. package/dist/core/runs/events.d.ts +12 -12
  207. package/dist/core/runs/events.js +4 -4
  208. package/dist/core/runs/operations.d.ts +11 -11
  209. package/dist/core/runs/operations.js +5 -5
  210. package/dist/core/runs/questions.d.ts +10 -10
  211. package/dist/core/runs/questions.js +3 -3
  212. package/dist/core/runtime/auth-reload.js +1 -1
  213. package/dist/core/runtime/bearings.d.ts +5 -5
  214. package/dist/core/runtime/bearings.js +6 -6
  215. package/dist/core/runtime/broker-inventory.js +1 -1
  216. package/dist/core/runtime/broker-request.js +1 -1
  217. package/dist/core/runtime/broker.js +1 -1
  218. package/dist/core/runtime/close.d.ts +3 -3
  219. package/dist/core/runtime/close.js +1 -1
  220. package/dist/core/runtime/deliver-live.js +1 -1
  221. package/dist/core/runtime/fleet.d.ts +2 -2
  222. package/dist/core/runtime/host.d.ts +3 -3
  223. package/dist/core/runtime/host.js +3 -3
  224. package/dist/core/runtime/kickoff.d.ts +12 -12
  225. package/dist/core/runtime/kickoff.js +17 -17
  226. package/dist/core/runtime/launch-target.d.ts +1 -1
  227. package/dist/core/runtime/launch-target.js +1 -1
  228. package/dist/core/runtime/ledger.d.ts +3 -3
  229. package/dist/core/runtime/ledger.js +3 -3
  230. package/dist/core/runtime/lifecycle.d.ts +1 -1
  231. package/dist/core/runtime/lifecycle.js +2 -2
  232. package/dist/core/runtime/memory-admission.js +1 -1
  233. package/dist/core/runtime/model-swap.d.ts +2 -2
  234. package/dist/core/runtime/model-swap.js +1 -1
  235. package/dist/core/runtime/node-read.d.ts +1 -1
  236. package/dist/core/runtime/node-read.js +2 -2
  237. package/dist/core/runtime/nodes.d.ts +6 -6
  238. package/dist/core/runtime/nodes.js +1 -1
  239. package/dist/core/runtime/outcome-document.d.ts +1 -1
  240. package/dist/core/runtime/outcome-document.js +1 -1
  241. package/dist/core/runtime/persona.d.ts +3 -3
  242. package/dist/core/runtime/persona.js +2 -2
  243. package/dist/core/runtime/placement.d.ts +11 -11
  244. package/dist/core/runtime/placement.js +1 -1
  245. package/dist/core/runtime/promote.d.ts +3 -3
  246. package/dist/core/runtime/promote.js +1 -1
  247. package/dist/core/runtime/recycle.js +1 -1
  248. package/dist/core/runtime/reopen.d.ts +5 -5
  249. package/dist/core/runtime/reopen.js +1 -1
  250. package/dist/core/runtime/reset.d.ts +4 -4
  251. package/dist/core/runtime/reset.js +1 -1
  252. package/dist/core/runtime/revive-all.d.ts +2 -2
  253. package/dist/core/runtime/revive-all.js +1 -1
  254. package/dist/core/runtime/revive.d.ts +4 -4
  255. package/dist/core/runtime/revive.js +2 -2
  256. package/dist/core/runtime/roadmap.d.ts +6 -6
  257. package/dist/core/runtime/roadmap.js +5 -5
  258. package/dist/core/runtime/session-branch.d.ts +1 -1
  259. package/dist/core/runtime/session-branch.js +1 -1
  260. package/dist/core/runtime/session-list-cache.js +1 -1
  261. package/dist/core/runtime/situational-live.js +1 -1
  262. package/dist/core/runtime/spawn.d.ts +2 -2
  263. package/dist/core/runtime/spawn.js +2 -2
  264. package/dist/core/runtime/stop-guard.d.ts +2 -2
  265. package/dist/core/runtime/stop-guard.js +3 -3
  266. package/dist/core/runtime/warm-pool.d.ts +2 -2
  267. package/dist/core/runtime/warm-pool.js +1 -1
  268. package/dist/core/spaces/mounts.d.ts +2 -2
  269. package/dist/core/spaces/mounts.js +1 -1
  270. package/dist/core/spaces/permissions.d.ts +1 -1
  271. package/dist/core/spaces/permissions.js +1 -1
  272. package/dist/core/spaces/process.d.ts +1 -1
  273. package/dist/core/spaces/process.js +1 -1
  274. package/dist/core/spaces/space.js +1 -1
  275. package/dist/core/spaces/stop.d.ts +3 -3
  276. package/dist/core/spaces/stop.js +2 -2
  277. package/dist/core/spaces/users.d.ts +6 -6
  278. package/dist/core/spaces/users.js +1 -1
  279. package/dist/core/storage/attachments.d.ts +2 -2
  280. package/dist/core/storage/attachments.js +1 -1
  281. package/dist/core/storage/shares.d.ts +2 -2
  282. package/dist/core/storage/shares.js +1 -1
  283. package/dist/core/storage/tables.d.ts +21 -21
  284. package/dist/core/storage/tables.js +3 -3
  285. package/dist/core/substrate/delivery/corpus.d.ts +5 -8
  286. package/dist/core/substrate/delivery/corpus.js +3 -3
  287. package/dist/core/substrate/delivery/deliver.d.ts +10 -15
  288. package/dist/core/substrate/delivery/deliver.js +3 -3
  289. package/dist/core/substrate/delivery/plan.d.ts +2 -12
  290. package/dist/core/substrate/delivery/plan.js +3 -3
  291. package/dist/core/substrate/delivery/render-boot.d.ts +4 -4
  292. package/dist/core/substrate/delivery/render-boot.js +18 -18
  293. package/dist/core/substrate/delivery/render-event.d.ts +7 -14
  294. package/dist/core/substrate/delivery/render-event.js +4 -4
  295. package/dist/core/substrate/subject.d.ts +2 -2
  296. package/dist/core/substrate/subject.js +1 -1
  297. package/dist/core/usage/ledger.d.ts +6 -6
  298. package/dist/core/usage/ledger.js +4 -4
  299. package/dist/core/worktree-close.js +4 -4
  300. package/dist/core/worktree-mutation-async.js +7 -7
  301. package/dist/core/worktree-quarantine.js +1 -1
  302. package/dist/core/worktree-sweep.d.ts +1 -1
  303. package/dist/core/worktree-sweep.js +6 -6
  304. package/dist/core/worktree.d.ts +5 -5
  305. package/dist/core/worktree.js +13 -13
  306. package/dist/daemon/analytics/compute.d.ts +2 -2
  307. package/dist/daemon/analytics/compute.js +1 -1
  308. package/dist/daemon/api/app-listener.d.ts +4 -4
  309. package/dist/daemon/api/app-listener.js +13 -13
  310. package/dist/daemon/api/bridge.js +5 -5
  311. package/dist/daemon/api/document-listener.js +6 -6
  312. package/dist/daemon/api/handlers/analytics.js +1 -1
  313. package/dist/daemon/api/handlers/attach.js +1 -1
  314. package/dist/daemon/api/handlers/bash-jobs.js +1 -1
  315. package/dist/daemon/api/handlers/bash.js +1 -1
  316. package/dist/daemon/api/handlers/broker-ops.d.ts +1 -1
  317. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  318. package/dist/daemon/api/handlers/broker-recovery.d.ts +1 -1
  319. package/dist/daemon/api/handlers/broker-recovery.js +1 -1
  320. package/dist/daemon/api/handlers/broker-signals.d.ts +2 -2
  321. package/dist/daemon/api/handlers/broker-signals.js +2 -2
  322. package/dist/daemon/api/handlers/canvas.d.ts +1 -1
  323. package/dist/daemon/api/handlers/canvas.js +4 -4
  324. package/dist/daemon/api/handlers/chat-inventory.js +1 -1
  325. package/dist/daemon/api/handlers/crons.js +1 -1
  326. package/dist/daemon/api/handlers/custom-objects.d.ts +4 -4
  327. package/dist/daemon/api/handlers/custom-objects.js +3 -3
  328. package/dist/daemon/api/handlers/delivery-retry.js +1 -1
  329. package/dist/daemon/api/handlers/delivery.js +1 -1
  330. package/dist/daemon/api/handlers/docs.d.ts +4 -4
  331. package/dist/daemon/api/handlers/docs.js +1 -1
  332. package/dist/daemon/api/handlers/feedback-comments.js +3 -3
  333. package/dist/daemon/api/handlers/files.js +1 -1
  334. package/dist/daemon/api/handlers/focus.js +1 -1
  335. package/dist/daemon/api/handlers/health.js +3 -3
  336. package/dist/daemon/api/handlers/hook-exec.js +1 -1
  337. package/dist/daemon/api/handlers/human-requests.js +1 -1
  338. package/dist/daemon/api/handlers/inbox-page.d.ts +1 -1
  339. package/dist/daemon/api/handlers/inbox-page.js +1 -1
  340. package/dist/daemon/api/handlers/inbox.d.ts +1 -1
  341. package/dist/daemon/api/handlers/inbox.js +1 -1
  342. package/dist/daemon/api/handlers/llm.d.ts +1 -1
  343. package/dist/daemon/api/handlers/llm.js +3 -3
  344. package/dist/daemon/api/handlers/memory-reads.js +1 -1
  345. package/dist/daemon/api/handlers/memory.d.ts +5 -5
  346. package/dist/daemon/api/handlers/memory.js +5 -5
  347. package/dist/daemon/api/handlers/messages.js +2 -2
  348. package/dist/daemon/api/handlers/node-events.d.ts +2 -2
  349. package/dist/daemon/api/handlers/node-events.js +3 -3
  350. package/dist/daemon/api/handlers/node-outcomes.js +1 -1
  351. package/dist/daemon/api/handlers/node-records.js +2 -2
  352. package/dist/daemon/api/handlers/nodes.d.ts +1 -1
  353. package/dist/daemon/api/handlers/nodes.js +1 -1
  354. package/dist/daemon/api/handlers/objects.js +3 -3
  355. package/dist/daemon/api/handlers/package-docs.js +1 -1
  356. package/dist/daemon/api/handlers/plugin-app-token.d.ts +1 -1
  357. package/dist/daemon/api/handlers/plugin-app-token.js +1 -1
  358. package/dist/daemon/api/handlers/profiles.d.ts +3 -3
  359. package/dist/daemon/api/handlers/profiles.js +1 -1
  360. package/dist/daemon/api/handlers/providers.d.ts +1 -1
  361. package/dist/daemon/api/handlers/providers.js +1 -1
  362. package/dist/daemon/api/handlers/questions.js +1 -1
  363. package/dist/daemon/api/handlers/reports.d.ts +1 -1
  364. package/dist/daemon/api/handlers/reports.js +5 -5
  365. package/dist/daemon/api/handlers/review-comments.js +1 -1
  366. package/dist/daemon/api/handlers/reviews.js +1 -1
  367. package/dist/daemon/api/handlers/runs.js +1 -1
  368. package/dist/daemon/api/handlers/structured-requests.js +1 -1
  369. package/dist/daemon/api/handlers/subscriptions.js +1 -1
  370. package/dist/daemon/api/handlers/transfer.js +1 -1
  371. package/dist/daemon/api/map.d.ts +3 -3
  372. package/dist/daemon/api/map.js +1 -1
  373. package/dist/daemon/api/principal.d.ts +1 -1
  374. package/dist/daemon/api/principal.js +1 -1
  375. package/dist/daemon/api/reader.d.ts +5 -5
  376. package/dist/daemon/api/reader.js +1 -1
  377. package/dist/daemon/api/router.d.ts +5 -5
  378. package/dist/daemon/api/router.js +1 -1
  379. package/dist/daemon/api/server.js +1 -1
  380. package/dist/daemon/broker-signals/bus.d.ts +1 -1
  381. package/dist/daemon/broker-signals/bus.js +1 -1
  382. package/dist/daemon/companion-retire.js +1 -1
  383. package/dist/daemon/cron/armed-context.d.ts +2 -2
  384. package/dist/daemon/cron/armed-context.js +1 -1
  385. package/dist/daemon/cron/authority.d.ts +2 -2
  386. package/dist/daemon/cron/authority.js +1 -1
  387. package/dist/daemon/cron/disposition.js +1 -1
  388. package/dist/daemon/cron/ended.d.ts +1 -1
  389. package/dist/daemon/cron/ended.js +2 -2
  390. package/dist/daemon/cron/escalation.js +3 -3
  391. package/dist/daemon/cron/folders.d.ts +1 -1
  392. package/dist/daemon/cron/folders.js +1 -1
  393. package/dist/daemon/cron/held.d.ts +1 -1
  394. package/dist/daemon/cron/held.js +1 -1
  395. package/dist/daemon/cron/lease-recovery.d.ts +1 -1
  396. package/dist/daemon/cron/lease-recovery.js +1 -1
  397. package/dist/daemon/cron/passes.d.ts +2 -2
  398. package/dist/daemon/cron/passes.js +1 -1
  399. package/dist/daemon/cron/run-socket.d.ts +1 -1
  400. package/dist/daemon/cron/run-socket.js +1 -1
  401. package/dist/daemon/cron/settle.js +1 -1
  402. package/dist/daemon/cron/sinks.d.ts +1 -1
  403. package/dist/daemon/cron/sinks.js +2 -2
  404. package/dist/daemon/cron-run.d.ts +12 -3
  405. package/dist/daemon/cron-run.js +2 -2
  406. package/dist/daemon/crtrd.js +6 -6
  407. package/dist/daemon/delivery/run-delivery.js +1 -1
  408. package/dist/daemon/due-sources.d.ts +3 -3
  409. package/dist/daemon/due-sources.js +1 -1
  410. package/dist/daemon/due.d.ts +3 -3
  411. package/dist/daemon/due.js +7 -7
  412. package/dist/daemon/fleet.d.ts +2 -2
  413. package/dist/daemon/fleet.js +11 -11
  414. package/dist/daemon/human/finish.js +3 -3
  415. package/dist/daemon/human/settle.d.ts +1 -1
  416. package/dist/daemon/human/settle.js +1 -1
  417. package/dist/daemon/human/sweep.js +1 -1
  418. package/dist/daemon/joined-owner.d.ts +2 -2
  419. package/dist/daemon/joined-owner.js +1 -1
  420. package/dist/daemon/messaging/node-message.js +1 -1
  421. package/dist/daemon/park-activity.d.ts +2 -2
  422. package/dist/daemon/park-activity.js +1 -1
  423. package/dist/daemon/peer/authority.js +1 -1
  424. package/dist/daemon/peer/forward.d.ts +13 -6
  425. package/dist/daemon/peer/forward.js +1 -1
  426. package/dist/daemon/peer/handlers.js +1 -1
  427. package/dist/daemon/peer/ingress.d.ts +4 -4
  428. package/dist/daemon/peer/ingress.js +1 -1
  429. package/dist/daemon/peer/outbox.d.ts +2 -2
  430. package/dist/daemon/peer/outbox.js +1 -1
  431. package/dist/daemon/peer/relay-service.js +1 -1
  432. package/dist/daemon/plugin-objects/read-leaf.d.ts +2 -2
  433. package/dist/daemon/plugin-objects/read-leaf.js +2 -2
  434. package/dist/daemon/profile-delete.js +1 -1
  435. package/dist/daemon/readiness.d.ts +2 -2
  436. package/dist/daemon/readiness.js +1 -1
  437. package/dist/daemon/reconcilers/action-lane.d.ts +1 -1
  438. package/dist/daemon/reconcilers/action-lane.js +1 -1
  439. package/dist/daemon/reconcilers/bash-deadline.js +2 -2
  440. package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
  441. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  442. package/dist/daemon/reconcilers/controller-death.d.ts +1 -1
  443. package/dist/daemon/reconcilers/controller-death.js +1 -1
  444. package/dist/daemon/reconcilers/cron-lane.d.ts +1 -1
  445. package/dist/daemon/reconcilers/cron-lane.js +1 -1
  446. package/dist/daemon/reconcilers/delivery-lane.d.ts +1 -1
  447. package/dist/daemon/reconcilers/delivery-lane.js +2 -2
  448. package/dist/daemon/reconcilers/fault-retry-backstop.d.ts +3 -3
  449. package/dist/daemon/reconcilers/fault-retry-backstop.js +1 -1
  450. package/dist/daemon/reconcilers/grove-instance-sweep.d.ts +2 -2
  451. package/dist/daemon/reconcilers/grove-instance-sweep.js +1 -1
  452. package/dist/daemon/reconcilers/live-obligation.d.ts +6 -6
  453. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  454. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -1
  455. package/dist/daemon/reconcilers/node-deadline.d.ts +1 -1
  456. package/dist/daemon/reconcilers/node-deadline.js +1 -1
  457. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
  458. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.d.ts +3 -3
  459. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -1
  460. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -1
  461. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
  462. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.d.ts +1 -1
  463. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -1
  464. package/dist/daemon/reconcilers/pending-review-submit.d.ts +1 -1
  465. package/dist/daemon/reconcilers/pending-review-submit.js +1 -1
  466. package/dist/daemon/reconcilers/storage-due-work.js +1 -1
  467. package/dist/daemon/reconcilers/storage-maintenance.d.ts +1 -1
  468. package/dist/daemon/reconcilers/storage-maintenance.js +2 -2
  469. package/dist/daemon/reconcilers/structured-request-lane.d.ts +1 -1
  470. package/dist/daemon/reconcilers/structured-request-lane.js +1 -1
  471. package/dist/daemon/review/comment-notify.js +2 -2
  472. package/dist/daemon/review/companion.d.ts +3 -3
  473. package/dist/daemon/review/companion.js +1 -1
  474. package/dist/daemon/review/finish.js +1 -1
  475. package/dist/daemon/review/sweep.js +1 -1
  476. package/dist/daemon/run-notices.d.ts +4 -4
  477. package/dist/daemon/run-notices.js +1 -1
  478. package/dist/daemon/runs/append-section.d.ts +2 -2
  479. package/dist/daemon/runs/append-section.js +2 -2
  480. package/dist/daemon/runs/observer.d.ts +2 -2
  481. package/dist/daemon/runs/observer.js +2 -2
  482. package/dist/daemon/structured-requests/boot.d.ts +1 -1
  483. package/dist/daemon/structured-requests/boot.js +1 -1
  484. package/dist/daemon/structured-requests/effects.js +1 -1
  485. package/dist/daemon/structured-requests/sidecar.d.ts +1 -1
  486. package/dist/daemon/structured-requests/sidecar.js +1 -1
  487. package/dist/migrations/004-canvas-documents/apply.d.ts +3 -3
  488. package/dist/migrations/004-canvas-documents/apply.js +1 -1
  489. package/dist/migrations/004-canvas-documents/index.d.ts +2 -2
  490. package/dist/migrations/004-canvas-documents/index.js +2 -2
  491. package/dist/migrations/activation.js +2 -2
  492. package/docs/public-api.md +11 -0
  493. package/package.json +3 -2
  494. package/packages/crouter-identity/package.json +1 -1
  495. package/runtime.lock.json +12 -12
@@ -1,11 +1,11 @@
1
- var x=Object.defineProperty;var l=(n,e)=>x(n,"name",{value:e,configurable:!0});import{prepared as h}from"../sqlite-statements.js";import{EventEmitter as $}from"node:events";const S=new $;S.setMaxListeners(0);function ue(n,e){const o=l(s=>e(s),"listener");return S.on(n,o),()=>S.off(n,o)}l(ue,"subscribeDocumentEvents");import{evalCondition as B}from"../predicate.js";import{finalizeNodeMail as J,insertMessage as K}from"../feed/messages.js";import{linkAuthorizes as U,ownerChain as G,readCheck as q}from"./access.js";import{getByRowid as z}from"./objects.js";import{appScopesNow as X,publishLookups as Y,readerForObject as P}from"./reader.js";import{configFromJson as C}from"./watches.js";import{CrtrError as L}from"../errors.js";import{ExitCode as M}from"../../types.js";import{eventSpec as V,kindOf as D}from"./kinds/registry.js";import{machineNameOf as k}from"../peer/names.js";import{settleObjectWaits as Q}from"../canvas/waits.js";import{RECEIVERS as F}from"./receivers.js";import{DEFAULT_LISTEN as W}from"./types.js";function Z(n,e){if(n.level===void 0||n.level===e.level||e.levels?.includes(n.level))return n.level??e.level;const o=[e.level,...e.levels??[]].filter((s,t,i)=>i.indexOf(s)===t).sort((s,t)=>s-t);throw new L("invalid_level",`${n.object.type} ${n.event} publishes at level ${o.join(", ")}, not ${n.level}`,M.USAGE,{kind:n.object.type,event:n.event,level:n.level,allowed:o})}l(Z,"resolveLevel");function ee(n,e){const o=n.split("."),s=e.split(".");for(let t=0;t<o.length;t++){if(o[t]===">")return t===o.length-1&&s.length>t;if(t>=s.length||o[t]!=="*"&&o[t]!==s[t])return!1}return o.length===s.length}l(ee,"matchSubject");const H={"next-turn":1,"after-turn":2,steer:3,interrupt:4};function te(n,e){let o=null;for(const s of n){let t=null;for(const i of s)i.threshold<=e&&(!t||i.threshold>t.threshold)&&(t=i);t&&(!o||H[t.delivery]>H[o])&&(o=t.delivery)}return o}l(te,"resolveDelivery");function ve(n,e,o){if(e.config)return e.config;const s=h(n,"SELECT listen_json FROM objects WHERE rowid = ?").get(o.rowid);return s?.listen_json?C(s.listen_json):W}l(ve,"listenConfigFor");function ne(n,e){return e.inboxKind??(n.level>=7?"urgent":"update")}l(ne,"inboxKind");function oe(n,e){return e.type==="node"?e.id:h(n,`SELECT 1 FROM objects WHERE type IN ('person','app','repo','profile')
2
- AND name = ? AND rowid != ? LIMIT 1`).get(e.name,e.rowid)?`${e.type}:${e.name}`:e.name}l(oe,"ownerHandleOf");function se(n,e,o){const s=e.object.owner===null?null:h(n,"SELECT * FROM objects WHERE rowid = ?").get(e.object.owner),t=s?.id??null,i=s?oe(n,s):null;return{event:e.event,level:e.level,object:{id:e.object.id,type:e.object.type,kind:e.object.kind,owner:t,owner_handle:i,name:e.object.name,...e.object.home_machine?{machine:k(e.object.home_machine),machine_id:e.object.home_machine}:{}},actor:e.actor?.id??null,...e.actor?.home_machine?{actor_machine:k(e.actor.home_machine),actor_machine_id:e.actor.home_machine}:{},attrs:o,...e.pointer===void 0?{}:{pointer:e.pointer}}}l(se,"pushFields");function ie(n,e,o,s){const t=se(n,e,s),i=e.messageBody!==void 0&&o.carriesBody===!0,f=i?typeof e.messageBody=="object"&&e.messageBody!==null&&!Array.isArray(e.messageBody)?{...e.messageBody,push:t}:{body:e.messageBody,push:t}:{push:t},d=i?e.messageBody:null,a=d?.bodyRef===void 0?null:d;return{kind:ne(e,o),label:a?.label??(typeof d?.label=="string"?d.label:e.object.type.includes(".")&&typeof e.messageBody?.summary=="string"?e.messageBody.summary.split(`
3
- `)[0]:`${e.event} ${e.object.type} ${e.object.name}`),...a?.bodyRef===void 0?{}:{bodyRef:a.bodyRef},...a?.disposition===void 0?{}:{disposition:a.disposition},senderNodeId:e.actor?.type==="node"?e.actor.id:null,senderName:e.actor===null||e.actor===void 0?null:e.actor.home_machine?`${e.actor.name} on ${k(e.actor.home_machine)}`:e.actor.name,bodyJson:f}}l(ie,"messageInput");function re(n,e,o,s,t){if(!o.supersedes)return[{attrs:e.attrs,destinations:[...s]}];const i=h(n,`SELECT d.delivery_id, d.message_id, d.state, m.body_json FROM deliveries d
1
+ var H=Object.defineProperty;var d=(n,e)=>H(n,"name",{value:e,configurable:!0});import{EventEmitter as x}from"node:events";const v=new x;v.setMaxListeners(0);async function pe(n,e){const o=d(i=>e(i),"listener");return v.on(n,o),()=>v.off(n,o)}d(pe,"subscribeDocumentEvents");import{evalCondition as $}from"../predicate.js";import{finalizeNodeMail as B,insertMessage as J}from"../feed/messages.js";import{linkAuthorizes as K,ownerChain as U,readCheck as G}from"./access.js";import{getByRowid as q}from"./objects.js";import{appScopesNow as z,publishLookups as X,readerForObject as Y}from"./reader.js";import{configFromJson as T}from"./watches.js";import{CrtrError as A}from"../errors.js";import{ExitCode as L}from"../../types.js";import{eventSpec as P,kindOf as k}from"./kinds/registry.js";import{machineNameOf as M}from"../peer/names.js";import{settleObjectWaits as V}from"../canvas/waits.js";import{RECEIVERS as D}from"./receivers.js";import{DEFAULT_LISTEN as F}from"./types.js";import{afterCommit as Q}from"../canvas/db.js";function Z(n,e){if(n.level===void 0||n.level===e.level||e.levels?.includes(n.level))return n.level??e.level;const o=[e.level,...e.levels??[]].filter((i,t,s)=>s.indexOf(i)===t).sort((i,t)=>i-t);throw new A("invalid_level",`${n.object.type} ${n.event} publishes at level ${o.join(", ")}, not ${n.level}`,L.USAGE,{kind:n.object.type,event:n.event,level:n.level,allowed:o})}d(Z,"resolveLevel");function ee(n,e){const o=n.split("."),i=e.split(".");for(let t=0;t<o.length;t++){if(o[t]===">")return t===o.length-1&&i.length>t;if(t>=i.length||o[t]!=="*"&&o[t]!==i[t])return!1}return o.length===i.length}d(ee,"matchSubject");const W={"next-turn":1,"after-turn":2,steer:3,interrupt:4};function te(n,e){let o=null;for(const i of n){let t=null;for(const s of i)s.threshold<=e&&(!t||s.threshold>t.threshold)&&(t=s);t&&(!o||W[t.delivery]>W[o])&&(o=t.delivery)}return o}d(te,"resolveDelivery");async function ve(n,e,o){if(e.config)return e.config;const i=await n.prepare("SELECT listen_json FROM objects WHERE rowid = ?").get(o.rowid);return i?.listen_json?T(i.listen_json):F}d(ve,"listenConfigFor");function ne(n,e){return e.inboxKind??(n.level>=7?"urgent":"update")}d(ne,"inboxKind");async function oe(n,e){return e.type==="node"?e.id:await n.prepare(`SELECT 1 FROM objects WHERE type IN ('person','app','repo','profile')
2
+ AND name = ? AND rowid != ? LIMIT 1`).get(e.name,e.rowid)?`${e.type}:${e.name}`:e.name}d(oe,"ownerHandleOf");async function ie(n,e,o){const i=e.object.owner===null?null:await n.prepare("SELECT * FROM objects WHERE rowid = ?").get(e.object.owner),t=i?.id??null,s=i?await oe(n,i):null;return{event:e.event,level:e.level,object:{id:e.object.id,type:e.object.type,kind:e.object.kind,owner:t,owner_handle:s,name:e.object.name,...e.object.home_machine?{machine:M(e.object.home_machine),machine_id:e.object.home_machine}:{}},actor:e.actor?.id??null,...e.actor?.home_machine?{actor_machine:M(e.actor.home_machine),actor_machine_id:e.actor.home_machine}:{},attrs:o,...e.pointer===void 0?{}:{pointer:e.pointer}}}d(ie,"pushFields");async function se(n,e,o,i){const t=await ie(n,e,i),s=e.messageBody!==void 0&&o.carriesBody===!0,f=s?typeof e.messageBody=="object"&&e.messageBody!==null&&!Array.isArray(e.messageBody)?{...e.messageBody,push:t}:{body:e.messageBody,push:t}:{push:t},c=s?e.messageBody:null,l=c?.bodyRef===void 0?null:c;return{kind:ne(e,o),label:l?.label??(typeof c?.label=="string"?c.label:e.object.type.includes(".")&&typeof e.messageBody?.summary=="string"?e.messageBody.summary.split(`
3
+ `)[0]:`${e.event} ${e.object.type} ${e.object.name}`),...l?.bodyRef===void 0?{}:{bodyRef:l.bodyRef},...l?.disposition===void 0?{}:{disposition:l.disposition},senderNodeId:e.actor?.type==="node"?e.actor.id:null,senderName:e.actor===null||e.actor===void 0?null:e.actor.home_machine?`${e.actor.name} on ${M(e.actor.home_machine)}`:e.actor.name,bodyJson:f}}d(se,"messageInput");async function re(n,e,o,i,t){if(!o.supersedes)return[{attrs:e.attrs,destinations:[...i]}];const s=n.prepare(`SELECT d.delivery_id, d.message_id, d.state, m.body_json FROM deliveries d
4
4
  JOIN messages m ON m.message_id = d.message_id
5
5
  WHERE d.destination_id = ? AND d.state IN ('pending', 'handed_off')
6
6
  AND d.canceled_at IS NULL AND m.event = ? AND m.object_id = ?
7
- ORDER BY m.seq`),f=h(n,"DELETE FROM deliveries WHERE delivery_id = ?"),d=h(n,"SELECT * FROM objects WHERE id = ?"),a=new Map,_=new Set;for(const m of s){const w=t(m),O=d.get(w),I=O===void 0?void 0:D(n,O.type),j=i.all(w,e.event,e.object.id),b=new Set;for(const c of j)c.state==="handed_off"?I?.supersedeClaimed?.(n,c.delivery_id)&&b.add(c.delivery_id):(f.run(c.delivery_id),_.add(c.message_id));const y=j.filter(c=>c.state==="pending"||b.has(c.delivery_id)).at(-1),R=y?.message_id??null,r=a.get(R)??{prior:y?.body_json?JSON.parse(y.body_json).push?.attrs??null:null,destinations:[]};r.destinations.push(m),a.set(R,r)}const N=h(n,"DELETE FROM messages WHERE message_id = ? AND NOT EXISTS (SELECT 1 FROM deliveries WHERE message_id = ?)");for(const m of _)N.run(m,m);return[...a.values()].map(m=>({attrs:o.merge?o.merge(m.prior,e):e.attrs,destinations:m.destinations}))}l(re,"supersede");function ce(n,e,o,s,t){const i=z(n,s);if(i===null||i.type!=="app")return!1;const f=h(n,"SELECT 1 FROM peer_stubs WHERE object = ?").get(e.rowid)!==void 0,d=f?null:X(n,i,t);return(f||d!==null)&&U(n,i,d,e,o)}l(ce,"linkDelivers");const T=8;class de extends L{static{l(this,"HopLimitError")}constructor(e){super("hop_limit",`event depth ${e} exceeds ${T}`,M.GENERAL,{depth:e,limit:T})}}function Se(n,e,o=()=>[]){const s=V(n,e.object.type,e.event),t={...e,level:Z(e,s)};t.object.type==="document"&&(t.event==="edited"||t.event==="deleted")&&queueMicrotask(()=>S.emit(t.object.id,t.event));const i=e.cause??null,f=i===null?null:h(n,`SELECT depth FROM messages WHERE message_id = ?
8
- UNION ALL SELECT depth FROM message_causes WHERE message_id = ? LIMIT 1`).get(i,i);if(i!==null&&f===void 0)throw new L("unknown_cause",`no message ${i}`,M.USAGE,{cause:i});const d=f===null?0:f.depth+1;if(d>T)throw new de(d);(s.endsWait===!0||t.event==="deleted")&&Q(n,t.object.id);const a=G(n,t.object),_=`w.watcher, o.id AS watcher_id, o.type AS watcher_type, o.reception, s.pattern, s.filter_json,
9
- COALESCE(s.config_json, o.listen_json) AS config_json, w.link_app`,N=n.prepare(s.durable?`SELECT ${_} FROM watches w JOIN watch_subscriptions s ON s.watch = w.rowid
10
- JOIN objects o ON o.rowid = w.watcher WHERE w.object = ? AND w.watcher != ? AND o.reception >= 1`:`SELECT ${_} FROM objects o INDEXED BY objects_receiving CROSS JOIN watches w CROSS JOIN watch_subscriptions s
11
- WHERE o.reception = 2 AND w.watcher = o.rowid AND s.watch = w.rowid AND w.object = ? AND w.watcher != ?`).all(t.object.rowid,t.actor?.rowid??-1);if(N.length===0)return{delivered:0,message_id:null,depth:d};const m={event:t.event,level:t.level,id:t.object.id,type:t.object.type,kind:t.object.kind,actor:t.actor?.id??null,...t.attrs},w=new Map;for(const r of N){if(t.onlyWatchers!==void 0&&!t.onlyWatchers.includes(r.watcher_id)||!ee(r.pattern,t.event)||r.filter_json!==null&&!B(JSON.parse(r.filter_json),m))continue;const c=w.get(r.watcher)??{id:r.watcher_id,type:r.watcher_type,reception:r.reception,configs:[],linkApp:r.link_app};c.configs.push(r.config_json?C(r.config_json):W),w.set(r.watcher,c)}const O=(a.length?a[a.length-1]:t.object).type==="repo",I=l(()=>[],"noRepos"),j=q(n,t.object),b=Y(n),y=[];for(const r of w.values()){const c=h(n,"SELECT * FROM objects WHERE id = ?").get(r.id),u=D(n,c.type),v=u.receiverFor?u.receiverFor(n,c):u.receiver;if(v===void 0)continue;const g=te(r.configs,t.level);if(g===null)continue;const E=P(n,c,O?o:I,b);if(E.scopes===null&&(E.class==="node"||E.owner.type!=="person"))continue;const p=r.linkApp!==null&&!j(E)&&ce(n,t.object,c,r.linkApp,b);!p&&!j(E)||y.push({id:r.id,reception:r.reception,delivery:g,receiver:v,...p?{linked:p}:{}})}if(y.length===0)return{delivered:0,message_id:null,depth:d};let R=null;for(const r of re(n,t,s,y,c=>c.id)){const c=new Map;for(const p of r.destinations)c.set(p.receiver,[...c.get(p.receiver)??[],p]);const u=ie(n,t,s,r.attrs),v=[...c].map(([p,A])=>F[p].bodyOwner(A)).find(p=>p!==null)??null,g=J({...u,urgency:"normal"},v),E=K(n,{operationId:g.operationId,createdAt:g.createdAt,senderNodeId:u.senderNodeId,senderName:u.senderName,kind:u.kind,label:u.label,bodyRef:g.bodyRef,bodyJson:g.bodyJson,disposition:u.disposition??null,event:{event:t.event,objectId:t.object.id,level:t.level,actorId:t.actor?.id??null},causeMessageId:i,depth:d});R??=E;for(const[p,A]of c)F[p].enqueue(n,{messageId:E,event:t.event,level:t.level,senderNodeId:u.senderNodeId,elevatesTier:s.elevatesTier===!0,...t.idempotencyKey===void 0?{}:{idempotencyKey:t.idempotencyKey}},A)}return{delivered:y.length,message_id:R,depth:d}}l(Se,"publish");export{T as HOP_LIMIT,de as HopLimitError,ve as listenConfigFor,ee as matchSubject,Se as publish,te as resolveDelivery,Z as resolveLevel,ue as subscribeDocumentEvents,re as supersede};
7
+ ORDER BY m.seq`),f=n.prepare("DELETE FROM deliveries WHERE delivery_id = ?"),c=n.prepare("SELECT * FROM objects WHERE id = ?"),l=new Map,g=new Set;for(const m of i){const E=t(m),N=await c.get(E),S=N===void 0?void 0:await k(n,N.type),_=await s.all(E,e.event,e.object.id),j=new Set;for(const a of _)a.state==="handed_off"?await S?.supersedeClaimed?.(n,a.delivery_id)&&j.add(a.delivery_id):(await f.run(a.delivery_id),g.add(a.message_id));const w=_.filter(a=>a.state==="pending"||j.has(a.delivery_id)).at(-1),b=w?.message_id??null,r=l.get(b)??{prior:w?.body_json?JSON.parse(w.body_json).push?.attrs??null:null,destinations:[]};r.destinations.push(m),l.set(b,r)}const R=n.prepare("DELETE FROM messages WHERE message_id = ? AND NOT EXISTS (SELECT 1 FROM deliveries WHERE message_id = ?)");for(const m of g)await R.run(m,m);return[...l.values()].map(m=>({attrs:o.merge?o.merge(m.prior,e):e.attrs,destinations:m.destinations}))}d(re,"supersede");async function ae(n,e,o,i,t){const s=await q(n,i);if(s===null||s.type!=="app")return!1;const f=await n.prepare("SELECT 1 FROM peer_stubs WHERE object = ?").get(e.rowid)!==void 0,c=f?null:await z(n,s,t);return(f||c!==null)&&await K(n,s,c,e,o)}d(ae,"linkDelivers");const C=8;class ce extends A{static{d(this,"HopLimitError")}constructor(e){super("hop_limit",`event depth ${e} exceeds ${C}`,L.GENERAL,{depth:e,limit:C})}}async function Se(n,e,o=async()=>[]){const i=await P(n,e.object.type,e.event),t={...e,level:Z(e,i)};t.object.type==="document"&&(t.event==="edited"||t.event==="deleted")&&Q(()=>v.emit(t.object.id,t.event));const s=e.cause??null,f=s===null?null:await n.prepare(`SELECT depth FROM messages WHERE message_id = ?
8
+ UNION ALL SELECT depth FROM message_causes WHERE message_id = ? LIMIT 1`).get(s,s);if(s!==null&&f===void 0)throw new A("unknown_cause",`no message ${s}`,L.USAGE,{cause:s});const c=f===null?0:f.depth+1;if(c>C)throw new ce(c);(i.endsWait===!0||t.event==="deleted")&&await V(n,t.object.id);const l=await U(n,t.object),g=`w.watcher, o.id AS watcher_id, o.type AS watcher_type, o.reception, s.pattern, s.filter_json,
9
+ COALESCE(s.config_json, o.listen_json) AS config_json, w.link_app`,R=await n.prepareUncached(i.durable?`SELECT ${g} FROM watches w JOIN watch_subscriptions s ON s.watch = w.rowid
10
+ JOIN objects o ON o.rowid = w.watcher WHERE w.object = ? AND w.watcher != ? AND o.reception >= 1`:`SELECT ${g} FROM objects o INDEXED BY objects_receiving CROSS JOIN watches w CROSS JOIN watch_subscriptions s
11
+ WHERE o.reception = 2 AND w.watcher = o.rowid AND s.watch = w.rowid AND w.object = ? AND w.watcher != ?`).all(t.object.rowid,t.actor?.rowid??-1);if(R.length===0)return{delivered:0,message_id:null,depth:c};const m={event:t.event,level:t.level,id:t.object.id,type:t.object.type,kind:t.object.kind,actor:t.actor?.id??null,...t.attrs},E=new Map;for(const r of R){if(t.onlyWatchers!==void 0&&!t.onlyWatchers.includes(r.watcher_id)||!ee(r.pattern,t.event)||r.filter_json!==null&&!$(JSON.parse(r.filter_json),m))continue;const a=E.get(r.watcher)??{id:r.watcher_id,type:r.watcher_type,reception:r.reception,configs:[],linkApp:r.link_app};a.configs.push(r.config_json?T(r.config_json):F),E.set(r.watcher,a)}const N=(l.length?l[l.length-1]:t.object).type==="repo",S=d(async()=>[],"noRepos"),_=await G(n,t.object),j=X(n),w=[];for(const r of E.values()){const a=await n.prepare("SELECT * FROM objects WHERE id = ?").get(r.id),u=await k(n,a.type),O=u.receiverFor?await u.receiverFor(n,a):u.receiver;if(O===void 0)continue;const h=te(r.configs,t.level);if(h===null)continue;const y=await Y(n,a,N?o:S,j);if(y.scopes===null&&(y.class==="node"||y.owner.type!=="person"))continue;const p=r.linkApp!==null&&!await _(y)&&await ae(n,t.object,a,r.linkApp,j);!p&&!await _(y)||w.push({id:r.id,reception:r.reception,delivery:h,receiver:O,...p?{linked:p}:{}})}if(w.length===0)return{delivered:0,message_id:null,depth:c};let b=null;for(const r of await re(n,t,i,w,a=>a.id)){const a=new Map;for(const p of r.destinations)a.set(p.receiver,[...a.get(p.receiver)??[],p]);const u=await se(n,t,i,r.attrs),O=[...a].map(([p,I])=>D[p].bodyOwner(I)).find(p=>p!==null)??null,h=B({...u,urgency:"normal"},O),y=await J(n,{operationId:h.operationId,createdAt:h.createdAt,senderNodeId:u.senderNodeId,senderName:u.senderName,kind:u.kind,label:u.label,bodyRef:h.bodyRef,bodyJson:h.bodyJson,disposition:u.disposition??null,event:{event:t.event,objectId:t.object.id,level:t.level,actorId:t.actor?.id??null},causeMessageId:s,depth:c});b??=y;for(const[p,I]of a)await D[p].enqueue(n,{messageId:y,event:t.event,level:t.level,senderNodeId:u.senderNodeId,elevatesTier:i.elevatesTier===!0,...t.idempotencyKey===void 0?{}:{idempotencyKey:t.idempotencyKey}},I)}return{delivered:w.length,message_id:b,depth:c}}d(Se,"publish");export{C as HOP_LIMIT,ce as HopLimitError,ve as listenConfigFor,ee as matchSubject,Se as publish,te as resolveDelivery,Z as resolveLevel,pe as subscribeDocumentEvents,re as supersede};
@@ -2,8 +2,8 @@
2
2
  * channel (`system` = rebuilt system prompt, `transcript` = conversation), in
3
3
  * `exposures` and `context_sessions`. Rows cascade with the node. Callers
4
4
  * load, mutate in memory, and `saveLedger` inside their own transaction. */
5
- import type { DatabaseSync } from 'node:sqlite';
6
5
  import type { RuleSpec } from './types.js';
6
+ import type { CanvasDb } from '../canvas/db.js';
7
7
  export type ExposureLevel = RuleSpec['deliver'];
8
8
  export type Channel = 'system' | 'transcript';
9
9
  export interface Held {
@@ -28,16 +28,16 @@ export interface Exposed {
28
28
  headsKey: string | null;
29
29
  contentHash: string | null;
30
30
  }
31
- export declare function loadLedger(db: DatabaseSync, node: number): Ledger;
31
+ export declare function loadLedger(db: CanvasDb, node: number): Promise<Ledger>;
32
32
  /** Write what changed since `loadLedger` (a ledger never loaded is written whole). */
33
- export declare function saveLedger(db: DatabaseSync, ledger: Ledger): void;
33
+ export declare function saveLedger(db: CanvasDb, ledger: Ledger): Promise<void>;
34
34
  /** Whether the node has a ledger at all (a context session or any exposure). */
35
- export declare function hasLedger(db: DatabaseSync, node: number): boolean;
35
+ export declare function hasLedger(db: CanvasDb, node: number): Promise<boolean>;
36
36
  /** End the node's context session: nothing is held any more. */
37
- export declare function clearLedger(db: DatabaseSync, node: number): void;
37
+ export declare function clearLedger(db: CanvasDb, node: number): Promise<void>;
38
38
  /** Seed a fork with what the source's transcript holds; the fork builds its own
39
39
  * system prompt, so system rows and the preference snapshot are not copied. */
40
- export declare function forkLedger(db: DatabaseSync, source: number, fork: number): void;
40
+ export declare function forkLedger(db: CanvasDb, source: number, fork: number): Promise<void>;
41
41
  /** Held at `level` or above: this object, or any held object with the same body
42
42
  * (content hash). The object itself counts at content level only for the same revision. */
43
43
  export declare function heldAtOrAbove(ledger: Ledger, exposed: Exposed, level: ExposureLevel, channel?: Channel): boolean;
@@ -1,4 +1,4 @@
1
- var O=Object.defineProperty;var i=(n,e)=>O(n,"name",{value:e,configurable:!0});import{prepared as a}from"../sqlite-statements.js";const f={name:1,preview:2,content:3},b=["system","transcript"],l=new WeakMap;function _(n){return{node:n.node,preferenceSnapshot:n.preferenceSnapshot,objects:new Map([...n.objects].map(([e,t])=>[e,{...t}])),listed:new Map([...n.listed].map(([e,t])=>[e,{...t}]))}}i(_,"cloneLedger");function S(n){return{node:n,preferenceSnapshot:null,objects:new Map,listed:new Map}}i(S,"emptyLedger");function T(n,e){const t=S(e),s=a(n,"SELECT preference_snapshot, listed_json FROM context_sessions WHERE node = ?").get(e);if(s!==void 0){t.preferenceSnapshot=s.preference_snapshot;for(const[o,r]of Object.entries(JSON.parse(s.listed_json)))t.listed.set(o,r)}const c=a(n,"SELECT object, channel, level, heads_key, content_hash FROM exposures WHERE node = ?").all(e);for(const o of c){const r=t.objects.get(o.object)??{headsKey:o.heads_key,contentHash:o.content_hash};r[o.channel]=o.level,t.objects.set(o.object,r)}return l.set(t,_(t)),t}i(T,"loadLedger");function x(n,e){const t=l.get(e)??S(e.node),s=JSON.stringify(Object.fromEntries(e.listed));(e.preferenceSnapshot!==t.preferenceSnapshot||s!==JSON.stringify(Object.fromEntries(t.listed)))&&a(n,`INSERT INTO context_sessions (node, preference_snapshot, listed_json) VALUES (?, ?, ?)
2
- ON CONFLICT(node) DO UPDATE SET preference_snapshot = excluded.preference_snapshot, listed_json = excluded.listed_json`).run(e.node,e.preferenceSnapshot,s);const c=a(n,`INSERT INTO exposures (node, object, channel, level, heads_key, content_hash) VALUES (?, ?, ?, ?, ?, ?)
3
- ON CONFLICT(node, object, channel) DO UPDATE SET level = excluded.level, heads_key = excluded.heads_key, content_hash = excluded.content_hash`),o=a(n,"DELETE FROM exposures WHERE node = ? AND object = ? AND channel = ?"),r=new Set([...t.objects.keys(),...e.objects.keys()]);for(const d of r){const u=e.objects.get(d),p=t.objects.get(d);for(const h of b){const E=u?.[h];E===void 0?p?.[h]!==void 0&&o.run(e.node,d,h):(E!==p?.[h]||u.headsKey!==p?.headsKey||u.contentHash!==p?.contentHash)&&c.run(e.node,d,h,E,u.headsKey,u.contentHash)}}l.set(e,_(e))}i(x,"saveLedger");function H(n,e){return a(n,"SELECT 1 FROM context_sessions WHERE node = ? UNION ALL SELECT 1 FROM exposures WHERE node = ? LIMIT 1").get(e,e)!==void 0}i(H,"hasLedger");function L(n,e){a(n,"DELETE FROM exposures WHERE node = ?").run(e),a(n,"DELETE FROM context_sessions WHERE node = ?").run(e)}i(L,"clearLedger");function R(n,e,t){L(n,t),a(n,`INSERT INTO exposures (node, object, channel, level, heads_key, content_hash)
4
- SELECT ?, object, channel, level, heads_key, content_hash FROM exposures WHERE node = ? AND channel = 'transcript'`).run(t,e);const s=a(n,"SELECT listed_json FROM context_sessions WHERE node = ?").get(e);if(s===void 0)return;const c={};for(const[o,r]of Object.entries(JSON.parse(s.listed_json)))r.transcript!==void 0&&(c[o]={transcript:r.transcript});a(n,"INSERT INTO context_sessions (node, preference_snapshot, listed_json) VALUES (?, NULL, ?)").run(t,JSON.stringify(c))}i(R,"forkLedger");function j(n,e){if(n===void 0)return 0;const t=i(s=>n[s]!==void 0?f[n[s]]:0,"of");return e!==void 0?t(e):Math.max(t("system"),t("transcript"))}i(j,"rankIn");function m(n,e,t,s){const c=f[t],o=n.objects.get(e.object);if(o!==void 0&&j(o,s)>=c&&(t!=="content"||o.headsKey===e.headsKey))return!0;if(e.contentHash===null)return!1;for(const r of n.objects.values())if(r.contentHash===e.contentHash&&j(r,s)>=c)return!0;return!1}i(m,"heldAtOrAbove");function M(n,e,t,s){const c=n.objects.get(t.object),o=c!==void 0&&c.headsKey===t.headsKey&&c.contentHash===t.contentHash,r=o?{...c}:{headsKey:t.headsKey,contentHash:t.contentHash},d=o?c[e]:void 0;r[e]=d!==void 0&&f[d]>=f[s]?d:s,n.objects.set(t.object,r)}i(M,"hold");function A(n,e,t,s){return j(n.listed.get(e),s)>=f[t]}i(A,"listedAtOrAbove");function v(n,e,t,s){const c=n.listed.get(t)??{},o=c[e];o!==void 0&&f[o]>=f[s]||n.listed.set(t,{...c,[e]:s})}i(v,"holdListing");function I(n,e){const t=n.objects.get(e);if(t!==void 0)for(const[s,c]of n.objects){if(s!==e&&(t.contentHash===null||c.contentHash!==t.contentHash))continue;const{transcript:o,...r}=c;r.system===void 0?n.objects.delete(s):n.objects.set(s,r)}}i(I,"demoteTranscript");function w(n,e){return n.preferenceSnapshot===null&&(n.preferenceSnapshot=e),n.preferenceSnapshot}i(w,"freezePreferences");function k(n){return[...n.objects.values()].some(e=>e.transcript!==void 0)||[...n.listed.values()].some(e=>e.transcript!==void 0)}i(k,"hasTranscript");export{L as clearLedger,I as demoteTranscript,R as forkLedger,w as freezePreferences,H as hasLedger,k as hasTranscript,m as heldAtOrAbove,M as hold,v as holdListing,A as listedAtOrAbove,T as loadLedger,x as saveLedger};
1
+ var y=Object.defineProperty;var a=(n,e)=>y(n,"name",{value:e,configurable:!0});const p={name:1,preview:2,content:3},S=["system","transcript"],E=new WeakMap;function j(n){return{node:n.node,preferenceSnapshot:n.preferenceSnapshot,objects:new Map([...n.objects].map(([e,t])=>[e,{...t}])),listed:new Map([...n.listed].map(([e,t])=>[e,{...t}]))}}a(j,"cloneLedger");function _(n){return{node:n,preferenceSnapshot:null,objects:new Map,listed:new Map}}a(_,"emptyLedger");async function L(n,e){const t=_(e),s=await n.prepare("SELECT preference_snapshot, listed_json FROM context_sessions WHERE node = ?").get(e);if(s!==void 0){t.preferenceSnapshot=s.preference_snapshot;for(const[o,c]of Object.entries(JSON.parse(s.listed_json)))t.listed.set(o,c)}const r=await n.prepare("SELECT object, channel, level, heads_key, content_hash FROM exposures WHERE node = ?").all(e);for(const o of r){const c=t.objects.get(o.object)??{headsKey:o.heads_key,contentHash:o.content_hash};c[o.channel]=o.level,t.objects.set(o.object,c)}return E.set(t,j(t)),t}a(L,"loadLedger");async function N(n,e){const t=E.get(e)??_(e.node),s=JSON.stringify(Object.fromEntries(e.listed));(e.preferenceSnapshot!==t.preferenceSnapshot||s!==JSON.stringify(Object.fromEntries(t.listed)))&&await n.prepare(`INSERT INTO context_sessions (node, preference_snapshot, listed_json) VALUES (?, ?, ?)
2
+ ON CONFLICT(node) DO UPDATE SET preference_snapshot = excluded.preference_snapshot, listed_json = excluded.listed_json`).run(e.node,e.preferenceSnapshot,s);const r=n.prepare(`INSERT INTO exposures (node, object, channel, level, heads_key, content_hash) VALUES (?, ?, ?, ?, ?, ?)
3
+ ON CONFLICT(node, object, channel) DO UPDATE SET level = excluded.level, heads_key = excluded.heads_key, content_hash = excluded.content_hash`),o=n.prepare("DELETE FROM exposures WHERE node = ? AND object = ? AND channel = ?"),c=new Set([...t.objects.keys(),...e.objects.keys()]);for(const i of c){const f=e.objects.get(i),u=t.objects.get(i);for(const d of S){const h=f?.[d];h===void 0?u?.[d]!==void 0&&await o.run(e.node,i,d):(h!==u?.[d]||f.headsKey!==u?.headsKey||f.contentHash!==u?.contentHash)&&await r.run(e.node,i,d,h,f.headsKey,f.contentHash)}}E.set(e,j(e))}a(N,"saveLedger");async function T(n,e){return await n.prepare("SELECT 1 FROM context_sessions WHERE node = ? UNION ALL SELECT 1 FROM exposures WHERE node = ? LIMIT 1").get(e,e)!==void 0}a(T,"hasLedger");async function O(n,e){await n.prepare("DELETE FROM exposures WHERE node = ?").run(e),await n.prepare("DELETE FROM context_sessions WHERE node = ?").run(e)}a(O,"clearLedger");async function w(n,e,t){await O(n,t),await n.prepare(`INSERT INTO exposures (node, object, channel, level, heads_key, content_hash)
4
+ SELECT ?, object, channel, level, heads_key, content_hash FROM exposures WHERE node = ? AND channel = 'transcript'`).run(t,e);const s=await n.prepare("SELECT listed_json FROM context_sessions WHERE node = ?").get(e);if(s===void 0)return;const r={};for(const[o,c]of Object.entries(JSON.parse(s.listed_json)))c.transcript!==void 0&&(r[o]={transcript:c.transcript});await n.prepare("INSERT INTO context_sessions (node, preference_snapshot, listed_json) VALUES (?, NULL, ?)").run(t,JSON.stringify(r))}a(w,"forkLedger");function l(n,e){if(n===void 0)return 0;const t=a(s=>n[s]!==void 0?p[n[s]]:0,"of");return e!==void 0?t(e):Math.max(t("system"),t("transcript"))}a(l,"rankIn");function x(n,e,t,s){const r=p[t],o=n.objects.get(e.object);if(o!==void 0&&l(o,s)>=r&&(t!=="content"||o.headsKey===e.headsKey))return!0;if(e.contentHash===null)return!1;for(const c of n.objects.values())if(c.contentHash===e.contentHash&&l(c,s)>=r)return!0;return!1}a(x,"heldAtOrAbove");function H(n,e,t,s){const r=n.objects.get(t.object),o=r!==void 0&&r.headsKey===t.headsKey&&r.contentHash===t.contentHash,c=o?{...r}:{headsKey:t.headsKey,contentHash:t.contentHash},i=o?r[e]:void 0;c[e]=i!==void 0&&p[i]>=p[s]?i:s,n.objects.set(t.object,c)}a(H,"hold");function R(n,e,t,s){return l(n.listed.get(e),s)>=p[t]}a(R,"listedAtOrAbove");function M(n,e,t,s){const r=n.listed.get(t)??{},o=r[e];o!==void 0&&p[o]>=p[s]||n.listed.set(t,{...r,[e]:s})}a(M,"holdListing");function m(n,e){const t=n.objects.get(e);if(t!==void 0)for(const[s,r]of n.objects){if(s!==e&&(t.contentHash===null||r.contentHash!==t.contentHash))continue;const{transcript:o,...c}=r;c.system===void 0?n.objects.delete(s):n.objects.set(s,c)}}a(m,"demoteTranscript");function A(n,e){return n.preferenceSnapshot===null&&(n.preferenceSnapshot=e),n.preferenceSnapshot}a(A,"freezePreferences");function v(n){return[...n.objects.values()].some(e=>e.transcript!==void 0)||[...n.listed.values()].some(e=>e.transcript!==void 0)}a(v,"hasTranscript");export{O as clearLedger,m as demoteTranscript,w as forkLedger,A as freezePreferences,T as hasLedger,v as hasTranscript,x as heldAtOrAbove,H as hold,M as holdListing,R as listedAtOrAbove,L as loadLedger,N as saveLedger};
@@ -1,7 +1,5 @@
1
- /** Jobs: a backgrounded bash command as an object the node that started it owns, with its
2
- * `jobs` row and the events of its start and end. Runs in the caller's transaction. */
3
- import type { DatabaseSync } from 'node:sqlite';
4
1
  import type { ObjectRow } from './types.js';
2
+ import type { CanvasDb } from '../canvas/db.js';
5
3
  export type JobStatus = 'running' | 'exited' | 'killed';
6
4
  export interface JobRow {
7
5
  object: number;
@@ -11,21 +9,21 @@ export interface JobRow {
11
9
  job_dir: string;
12
10
  log_path: string;
13
11
  }
14
- export declare function jobRow(db: DatabaseSync, job: ObjectRow): JobRow | null;
12
+ export declare function jobRow(db: CanvasDb, job: ObjectRow): Promise<JobRow | null>;
15
13
  /** Create the job object (`id` keeps the job id the runner already uses), its `running` row,
16
14
  * the node's acted-on edge and `job-start` watch, and publish `created`. */
17
- export declare function startJob(db: DatabaseSync, node: ObjectRow, spec: {
15
+ export declare function startJob(db: CanvasDb, node: ObjectRow, spec: {
18
16
  id?: string;
19
17
  command: string;
20
18
  jobDir: string;
21
19
  logPath: string;
22
- }): ObjectRow;
20
+ }): Promise<ObjectRow>;
23
21
  /** End a running job: `exited` with its exit code, or `killed` with the killer as actor (null
24
22
  * when the runtime killed it, e.g. at its deadline; `reason` then names why). The event carries
25
23
  * the exit code and log path, never output. A job already ended is left as is. */
26
- export declare function finishJob(db: DatabaseSync, job: ObjectRow, end: {
24
+ export declare function finishJob(db: CanvasDb, job: ObjectRow, end: {
27
25
  exitCode: number;
28
26
  } | {
29
27
  killedBy: ObjectRow | null;
30
28
  reason?: string;
31
- }): ObjectRow;
29
+ }): Promise<ObjectRow>;
@@ -1,2 +1,2 @@
1
- var w=Object.defineProperty;var n=(t,o)=>w(t,"name",{value:o,configurable:!0});import{prepared as a}from"../sqlite-statements.js";import{recordActedOn as u}from"./edges.js";import{publish as d}from"./events.js";import{createObject as h,getByRowid as E}from"./objects.js";import{recordWatch as b}from"./watches.js";function m(t){return t.split(`
2
- `,1)[0].trim()}n(m,"firstLine");function f(t,o){return`${m(t)} (${o})`}n(f,"previewOf");function j(t,o){return a(t,"SELECT * FROM jobs WHERE object = ?").get(o.rowid)??null}n(j,"jobRow");function v(t,o,r){if(o.type!=="node")throw new Error(`startJob: ${o.id} is a ${o.type}, not a node`);const i=h(t,{...r.id===void 0?{}:{id:r.id},type:"job",kind:"bash",owner:o.rowid,privacy:"public",name:m(r.command)||"bash",preview:f(r.command,"running")});return a(t,"INSERT INTO jobs (object, command, status, exit_code, job_dir, log_path) VALUES (?, ?, 'running', NULL, ?, ?)").run(i.rowid,r.command,r.jobDir,r.logPath),u(t,o,i),b(t,o,i,"job-start"),d(t,{event:"created",object:i,actor:o,attrs:{}}),i}n(v,"startJob");function S(t,o,r){const i=j(t,o);if(i===null)throw new Error(`finishJob: ${o.id} has no jobs row`);if(i.status!=="running")return o;const e="killedBy"in r,s=e?"killed":"exited",l=e?null:r.exitCode;a(t,"UPDATE jobs SET status = ?, exit_code = ? WHERE object = ?").run(s,l,o.rowid);const p=e?"killed":`exited ${l}`;a(t,"UPDATE objects SET preview = ? WHERE rowid = ?").run(f(i.command,p),o.rowid);const c=E(t,o.rowid);return e&&r.killedBy!==null&&u(t,r.killedBy,c),d(t,{event:s,object:c,actor:e?r.killedBy:null,attrs:e?{"log-path":i.log_path,...r.reason===void 0?{}:{reason:r.reason}}:{"exit-code":l,"log-path":i.log_path}}),c}n(S,"finishJob");export{S as finishJob,j as jobRow,v as startJob};
1
+ var m=Object.defineProperty;var e=(t,r)=>m(t,"name",{value:r,configurable:!0});import{recordActedOn as s}from"./edges.js";import{publish as u}from"./events.js";import{createObject as f,getByRowid as E}from"./objects.js";import{recordWatch as h}from"./watches.js";function w(t){return t.split(`
2
+ `,1)[0].trim()}e(w,"firstLine");function d(t,r){return`${w(t)} (${r})`}e(d,"previewOf");async function b(t,r){return await t.prepare("SELECT * FROM jobs WHERE object = ?").get(r.rowid)??null}e(b,"jobRow");async function R(t,r,i){if(r.type!=="node")throw new Error(`startJob: ${r.id} is a ${r.type}, not a node`);const o=await f(t,{...i.id===void 0?{}:{id:i.id},type:"job",kind:"bash",owner:r.rowid,privacy:"public",name:w(i.command)||"bash",preview:d(i.command,"running")});return await t.prepare("INSERT INTO jobs (object, command, status, exit_code, job_dir, log_path) VALUES (?, ?, 'running', NULL, ?, ?)").run(o.rowid,i.command,i.jobDir,i.logPath),await s(t,r,o),await h(t,r,o,"job-start"),await u(t,{event:"created",object:o,actor:r,attrs:{}}),o}e(R,"startJob");async function T(t,r,i){const o=await b(t,r);if(o===null)throw new Error(`finishJob: ${r.id} has no jobs row`);if(o.status!=="running")return r;const a="killedBy"in i,c=a?"killed":"exited",n=a?null:i.exitCode;await t.prepare("UPDATE jobs SET status = ?, exit_code = ? WHERE object = ?").run(c,n,r.rowid);const p=a?"killed":`exited ${n}`;await t.prepare("UPDATE objects SET preview = ? WHERE rowid = ?").run(d(o.command,p),r.rowid);const l=await E(t,r.rowid);return a&&i.killedBy!==null&&await s(t,i.killedBy,l),await u(t,{event:c,object:l,actor:a?i.killedBy:null,attrs:a?{"log-path":o.log_path,...i.reason===void 0?{}:{reason:i.reason}}:{"exit-code":n,"log-path":o.log_path}}),l}e(T,"finishJob");export{T as finishJob,b as jobRow,R as startJob};
@@ -1 +1 @@
1
- import{receiverForObject as o}from"../receivers.js";import{withBase as d}from"./kind.js";import{header as c}from"./render.js";import{objectDTO as n}from"./dto.js";const b={name:"action",addressable:"id",events:d({}),receiverFor:o,supersedeClaimed(r,t){const e=Date.now();return Number(r.prepare("UPDATE deliveries SET canceled_at = ?, updated_at = ? WHERE delivery_id = ? AND state = 'handed_off' AND canceled_at IS NULL").run(e,e,t).changes)===1},read(r,t,e){const a={object:n(r,e)};return{data:a,text:c("object",a.object)}}};export{b as actionKind};
1
+ import{receiverForObject as o}from"../receivers.js";import{withBase as c}from"./kind.js";import{header as d}from"./render.js";import{objectDTO as n}from"./dto.js";const b={name:"action",addressable:"id",events:c({}),receiverFor:o,async supersedeClaimed(r,t){const e=Date.now();return Number((await r.prepareUncached("UPDATE deliveries SET canceled_at = ?, updated_at = ? WHERE delivery_id = ? AND state = 'handed_off' AND canceled_at IS NULL").run(e,e,t)).changes)===1},async read(r,t,e){const a={object:await n(r,e)};return{data:a,text:d("object",a.object)}}};export{b as actionKind};
@@ -1,7 +1,7 @@
1
- var l=Object.defineProperty;var d=(s,c)=>l(s,"name",{value:c,configurable:!0});import{prepared as m}from"../../sqlite-statements.js";import{recordLiveRead as u}from"./kind.js";import{header as v}from"./render.js";import{objectDTO as j}from"./dto.js";import{receiverForObject as b}from"../receivers.js";function S(s,c){const a=Object.fromEntries(Object.entries(c).map(([t,{ends_wait:i,...o}])=>[`${s}.${t}`,{...o,carriesBody:!0,...i===void 0?{}:{endsWait:i}}]));return{name:s,events:{created:{level:4},read:{level:1},watched:{level:1},deleted:{level:5},configured:{level:1},...a},addressable:"name",receiverFor:b,read(t,i,o,p){u(t,i,o,p.reposFn);const e=m(t,"SELECT description, summary, state_json, published_at, receiver_json, dropped FROM custom_objects WHERE object = ?").get(o.rowid),n=e?.receiver_json==null?null:JSON.parse(e.receiver_json),r={object:j(t,o),description:e?.description??"",summary:e?.summary??null,state:e?.state_json==null?null:JSON.parse(e.state_json),published_at:e?.published_at??null,receiver:typeof n=="string"?n:n&&typeof n=="object"?Object.keys(n)[0]:null,dropped:e?.dropped??0};return{data:r,text:`${v("object",r.object)}
1
+ var l=Object.defineProperty;var c=(s,a)=>l(s,"name",{value:a,configurable:!0});import{recordLiveRead as u}from"./kind.js";import{header as m}from"./render.js";import{objectDTO as v}from"./dto.js";import{receiverForObject as j}from"../receivers.js";function $(s,a){const d=Object.fromEntries(Object.entries(a).map(([t,{ends_wait:i,...o}])=>[`${s}.${t}`,{...o,carriesBody:!0,...i===void 0?{}:{endsWait:i}}]));return{name:s,events:{created:{level:4},read:{level:1},watched:{level:1},deleted:{level:5},configured:{level:1},...d},addressable:"name",receiverFor:j,async read(t,i,o,p){await u(t,i,o,p.reposFn);const e=await t.prepare("SELECT description, summary, state_json, published_at, receiver_json, dropped FROM custom_objects WHERE object = ?").get(o.rowid),n=e?.receiver_json==null?null:JSON.parse(e.receiver_json),r={object:await v(t,o),description:e?.description??"",summary:e?.summary??null,state:e?.state_json==null?null:JSON.parse(e.state_json),published_at:e?.published_at??null,receiver:typeof n=="string"?n:n&&typeof n=="object"?Object.keys(n)[0]:null,dropped:e?.dropped??0};return{data:r,text:`${m("object",r.object)}
2
2
  Description: ${r.description}
3
3
  Summary: ${r.summary??""}
4
4
  State: ${JSON.stringify(r.state)}
5
5
  Published: ${r.published_at??"never"}
6
6
  Receiver: ${r.receiver??"none"}
7
- Dropped: ${r.dropped}`}}}}d(S,"customKind");export{S as customKind};
7
+ Dropped: ${r.dropped}`}}}}c($,"customKind");export{$ as customKind};
@@ -1,3 +1,4 @@
1
+ /** The document kind: markdown with revisions — its catalog (edits supersede and merge), its list fields and its render. */
1
2
  import type { DocFieldsDTO, ObjectDTO } from '../../../api/dto/objects.js';
2
3
  import { type ObjectKind } from './kind.js';
3
4
  export interface DocumentReadData {
@@ -1,5 +1,5 @@
1
- var y=Object.defineProperty;var m=(e,t)=>y(e,"name",{value:t,configurable:!0});import{prepared as _}from"../../sqlite-statements.js";import{recordMemoryReadsIn as v}from"../../canvas/memory-reads.js";import{deliveryDocOf as x,nodeSubject as S,ownerHandle as $}from"../../substrate/delivery/corpus.js";import{recordContentDelivery as D}from"../../substrate/delivery/deliver.js";import{renderExplicitRead as R}from"../../substrate/delivery/render-event.js";import{canRead as N}from"../access.js";import{documentRecord as j,readDocument as k}from"../documents.js";import{loadLedger as E,saveLedger as O}from"../exposures.js";import{getByRowid as A}from"../objects.js";import{rulesOf as h}from"../rules.js";import{objectDTO as d}from"./dto.js";import{withBase as L}from"./kind.js";import{attr as l,header as I,section as M}from"./render.js";function b(e,t,n){const r=`${n.name}/`;return _(e,`SELECT * FROM objects WHERE type = 'document' AND deleted_at IS NULL AND home_machine IS NULL AND owner IS ?
2
- AND substr(name, 1, ?) = ? ORDER BY name`).all(n.owner,r.length,r).filter(s=>!s.name.slice(r.length).includes("/")&&N(e,t,s)).map(s=>d(e,s))}m(b,"listingOf");function B(e,t,n){const r=t.class==="node",o=r?E(e,t.node.rowid):{node:0,preferenceSnapshot:null,objects:new Map,listed:new Map},s={db:e,reader:t,subject:r?S(e,t):null,ledger:o,channel:"transcript"},a=R(s,x(e,t,n));return r&&(D(e,t,a.delivered),O(e,o)),{attachments:a.attachments,linked:a.linked.map(u=>u.object)}}m(B,"explicitReadAttachments");function T(e,t,n){if(t.class!=="node"||n.kind!=="knowledge"&&n.kind!=="preference"||n.owner===null)return;const r=A(e,n.owner);r!==null&&v(e,t.node.id,[{name:n.name,scope:$(r),at:new Date().toISOString(),type:"read"}])}m(T,"recordExplicitMemoryRead");function W(e,t){const n=[];if(t.attachments&&n.push(t.attachments,""),n.push(I("object",e,l("privacy",e.privacy)+l("revision",t.revision))),n.push(`Preview: ${e.preview}`),t.summary&&n.push(`Summary: ${t.summary}`),t.fields!==void 0&&n.push(`<fields>
1
+ var _=Object.defineProperty;var m=(e,t)=>_(e,"name",{value:t,configurable:!0});import{recordMemoryReadsIn as v}from"../../canvas/memory-reads.js";import{deliveryDocOf as x,nodeSubject as $,ownerHandle as D}from"../../substrate/delivery/corpus.js";import{recordContentDelivery as R}from"../../substrate/delivery/deliver.js";import{renderExplicitRead as S}from"../../substrate/delivery/render-event.js";import{canRead as N}from"../access.js";import{documentRecord as j,readDocument as k}from"../documents.js";import{loadLedger as A,saveLedger as E}from"../exposures.js";import{getByRowid as O}from"../objects.js";import{rulesOf as h}from"../rules.js";import{objectDTO as d}from"./dto.js";import{withBase as L}from"./kind.js";import{attr as l,header as I,section as M}from"./render.js";import{filterAsync as b,mapAsync as p}from"../../async-array.js";async function B(e,t,n){const i=`${n.name}/`,s=await e.prepare(`SELECT * FROM objects WHERE type = 'document' AND deleted_at IS NULL AND home_machine IS NULL AND owner IS ?
2
+ AND substr(name, 1, ?) = ? ORDER BY name`).all(n.owner,i.length,i);return await p(await b(s,async r=>!r.name.slice(i.length).includes("/")&&await N(e,t,r)),async r=>await d(e,r))}m(B,"listingOf");async function T(e,t,n){const i=t.class==="node",s=i?await A(e,t.node.rowid):{node:0,preferenceSnapshot:null,objects:new Map,listed:new Map},r={db:e,reader:t,subject:i?await $(e,t):null,ledger:s,channel:"transcript"},o=await S(r,await x(e,t,n));return i&&(await R(e,t,o.delivered),await E(e,s)),{attachments:o.attachments,linked:o.linked.map(c=>c.object)}}m(T,"explicitReadAttachments");async function W(e,t,n){if(t.class!=="node"||n.kind!=="knowledge"&&n.kind!=="preference"||n.owner===null)return;const i=await O(e,n.owner);i!==null&&await v(e,t.node.id,[{name:n.name,scope:D(i),at:new Date().toISOString(),type:"read"}])}m(W,"recordExplicitMemoryRead");function C(e,t){const n=[];if(t.attachments&&n.push(t.attachments,""),n.push(I("object",e,l("privacy",e.privacy)+l("revision",t.revision))),n.push(`Preview: ${e.preview}`),t.summary&&n.push(`Summary: ${t.summary}`),t.fields!==void 0&&n.push(`<fields>
3
3
  ${JSON.stringify(t.fields,null,2)}
4
- </fields>`),t.needs_merge?(t.heads.forEach((r,o)=>{n.push(`<head${l("rev",r.rev_id)}${l("number",r.number)}${l("author",r.author_id)}>`,t.bodies[o]??"","</head>")}),n.push(`This document has ${t.heads.length} heads. Your next \`crtr doc edit\` writes the merged body and joins them into one revision.`)):n.push("",t.bodies[0]??""),t.listing&&t.listing.length>0){const r=t.listing.some(a=>a.owner?.id===e.owner?.id&&a.name.startsWith(`${e.name}/`)),o=t.listing.some(a=>a.owner?.id!==e.owner?.id||!a.name.startsWith(`${e.name}/`)),s=r&&o?`Names under ${e.name}/ and documents it links to`:r?`Names under ${e.name}/`:"Documents it links to";n.push("",...M(s,t.listing))}return n.join(`
5
- `)}m(W,"render");function C(e){const t=e.attrs.revision,n=e.attrs.from_revision??(typeof t=="number"?t-1:null),r=e.attrs.rationale;return{...e.attrs,from_revision:n,revision:t,authors:e.actor?[e.actor.id]:[],rationales:typeof r=="string"?[r]:[]}}m(C,"editAttrs");const H=m((e,t)=>{const n=C(t);if(e===null)return n;const r=e.authors??[];return{...n,from_revision:e.from_revision??null,authors:[...r,...n.authors.filter(o=>!r.includes(o))],rationales:[...e.rationales??[],...n.rationales]}},"mergeEdits"),te={name:"document",addressable:"name",events:L({edited:{level:8,supersedes:!0,merge:H},deleted:{level:8}}),listItem(e,t){return{summary:j(e,t).summary??null,rules:h(e,t).length}},read(e,t,n,r){const o=k(e,t,n,r.reposFn);T(e,t,n);const s=o.record,a=b(e,t,n),{attachments:u,linked:p}=B(e,t,n),g=new Set(a.map(i=>i.id)),f=[...a,...p.filter(i=>!g.has(i.id)).map(i=>d(e,i))],c={summary:s.summary??null,revision:s.revision,heads:o.heads.map(i=>({rev_id:i.rev_id,number:i.number,author_id:i.author,created_at:i.created_at})),bodies:o.heads.map(i=>i.body),needs_merge:o.needsMerge,...f.length>0?{listing:f}:{},...u===""?{}:{attachments:u}};return r.fields&&(c.fields={why_it_exists:s.why_it_exists??null,unlisted:s.unlisted,lint_ignore:s.lint_ignore??[],extensions:s.extensions??{},rules:h(e,n).map(({matchFrontmatter:i,...w})=>({...w,...i===void 0?{}:{match_frontmatter:i}}))}),{data:c,text:W(d(e,n),c)}}};export{te as documentKind};
4
+ </fields>`),t.needs_merge?(t.heads.forEach((i,s)=>{n.push(`<head${l("rev",i.rev_id)}${l("number",i.number)}${l("author",i.author_id)}>`,t.bodies[s]??"","</head>")}),n.push(`This document has ${t.heads.length} heads. Your next \`crtr doc edit\` writes the merged body and joins them into one revision.`)):n.push("",t.bodies[0]??""),t.listing&&t.listing.length>0){const i=t.listing.some(o=>o.owner?.id===e.owner?.id&&o.name.startsWith(`${e.name}/`)),s=t.listing.some(o=>o.owner?.id!==e.owner?.id||!o.name.startsWith(`${e.name}/`)),r=i&&s?`Names under ${e.name}/ and documents it links to`:i?`Names under ${e.name}/`:"Documents it links to";n.push("",...M(r,t.listing))}return n.join(`
5
+ `)}m(C,"render");function H(e){const t=e.attrs.revision,n=e.attrs.from_revision??(typeof t=="number"?t-1:null),i=e.attrs.rationale;return{...e.attrs,from_revision:n,revision:t,authors:e.actor?[e.actor.id]:[],rationales:typeof i=="string"?[i]:[]}}m(H,"editAttrs");const U=m((e,t)=>{const n=H(t);if(e===null)return n;const i=e.authors??[];return{...n,from_revision:e.from_revision??null,authors:[...i,...n.authors.filter(s=>!i.includes(s))],rationales:[...e.rationales??[],...n.rationales]}},"mergeEdits"),ne={name:"document",addressable:"name",events:L({edited:{level:8,supersedes:!0,merge:U},deleted:{level:8}}),async listItem(e,t){return{summary:(await j(e,t)).summary??null,rules:(await h(e,t)).length}},async read(e,t,n,i){const s=await k(e,t,n,i.reposFn);await W(e,t,n);const r=s.record,o=await B(e,t,n),{attachments:c,linked:w}=await T(e,t,n),y=new Set(o.map(a=>a.id)),f=[...o,...await p(w.filter(a=>!y.has(a.id)),async a=>await d(e,a))],u={summary:r.summary??null,revision:r.revision,heads:s.heads.map(a=>({rev_id:a.rev_id,number:a.number,author_id:a.author,created_at:a.created_at})),bodies:s.heads.map(a=>a.body),needs_merge:s.needsMerge,...f.length>0?{listing:f}:{},...c===""?{}:{attachments:c}};return i.fields&&(u.fields={why_it_exists:r.why_it_exists??null,unlisted:r.unlisted,lint_ignore:r.lint_ignore??[],extensions:r.extensions??{},rules:(await h(e,n)).map(({matchFrontmatter:a,...g})=>({...g,...a===void 0?{}:{match_frontmatter:a}}))}),{data:u,text:C(await d(e,n),u)}}};export{ne as documentKind};
@@ -1,5 +1,5 @@
1
1
  /** An object row as the `/v1/objects` wire shape. */
2
- import type { DatabaseSync } from 'node:sqlite';
3
2
  import type { ObjectDTO } from '../../../api/dto/objects.js';
4
3
  import type { ObjectRow } from '../types.js';
5
- export declare function objectDTO(db: DatabaseSync, o: ObjectRow): ObjectDTO;
4
+ import type { CanvasDb } from '../../canvas/db.js';
5
+ export declare function objectDTO(db: CanvasDb, o: ObjectRow): Promise<ObjectDTO>;
@@ -1 +1 @@
1
- var i=Object.defineProperty;var d=(n,e)=>i(n,"name",{value:e,configurable:!0});import{getByRowid as a}from"../objects.js";function c(n,e){const t=e.owner===null?null:a(n,e.owner),r=t?{id:t.id,type:t.type,handle:t.type==="node"?t.id:t.name}:null;return{id:e.id,type:e.type,kind:e.kind,owner:r,privacy:e.privacy,name:e.name,preview:e.preview??"",created_at:e.created_at,deleted_at:e.deleted_at}}d(c,"objectDTO");export{c as objectDTO};
1
+ var a=Object.defineProperty;var d=(n,e)=>a(n,"name",{value:e,configurable:!0});import{getByRowid as i}from"../objects.js";async function l(n,e){const t=e.owner===null?null:await i(n,e.owner),r=t?{id:t.id,type:t.type,handle:t.type==="node"?t.id:t.name}:null;return{id:e.id,type:e.type,kind:e.kind,owner:r,privacy:e.privacy,name:e.name,preview:e.preview??"",created_at:e.created_at,deleted_at:e.deleted_at}}d(l,"objectDTO");export{l as objectDTO};
@@ -1,2 +1,2 @@
1
- import{jobRow as m}from"../jobs.js";import{objectDTO as c}from"./dto.js";import{recordLiveRead as l,withBase as p}from"./kind.js";import{attr as a,header as h}from"./render.js";const f={name:"job",addressable:"id",events:p({exited:{level:7},killed:{level:7}}),read(r,s,e,d){const o=m(r,e);if(!o)throw new Error(`job object ${e.id} has no jobs row`);l(r,s,e,d.reposFn);const n=c(r,e),t={command:o.command,status:o.status,exit_code:o.exit_code,log_path:o.log_path},i=[h("object",n,a("status",t.status)+a("exit_code",t.exit_code)),`Command: ${t.command}`,`Log: ${t.log_path}`].join(`
2
- `);return{data:t,text:i}}};export{f as jobKind};
1
+ import{jobRow as c}from"../jobs.js";import{objectDTO as m}from"./dto.js";import{recordLiveRead as l,withBase as p}from"./kind.js";import{attr as r,header as w}from"./render.js";const f={name:"job",addressable:"id",events:p({exited:{level:7},killed:{level:7}}),async read(a,s,e,i){const o=await c(a,e);if(!o)throw new Error(`job object ${e.id} has no jobs row`);await l(a,s,e,i.reposFn);const n=await m(a,e),t={command:o.command,status:o.status,exit_code:o.exit_code,log_path:o.log_path},d=[w("object",n,r("status",t.status)+r("exit_code",t.exit_code)),`Command: ${t.command}`,`Log: ${t.log_path}`].join(`
2
+ `);return{data:t,text:d}}};export{f as jobKind};
@@ -1,9 +1,7 @@
1
- /** The one interface every canvas object kind implements: its declared events, how it is
2
- * addressed, and how it reads. The kind name is what `objects.type` stores. */
3
- import type { DatabaseSync } from 'node:sqlite';
4
1
  import type { ReposFn } from '../reader.js';
5
2
  import type { ReceiverName } from '../receivers.js';
6
3
  import type { CanvasEvent, Level, ObjectRow, Reader } from '../types.js';
4
+ import type { CanvasDb } from '../../canvas/db.js';
7
5
  /** A superseding event's attrs: built from the superseded pending delivery's attrs (null when it
8
6
  * supersedes nothing) and the new event. */
9
7
  export type SupersedeMerge = (prior: Record<string, unknown> | null, ev: CanvasEvent) => Record<string, unknown>;
@@ -52,18 +50,18 @@ export interface ObjectKind {
52
50
  /** How a watcher of this kind receives events (a key of `receivers.ts`). Absent: it cannot watch. */
53
51
  receiver?: ReceiverName;
54
52
  /** Resolve a receiver from this particular object, when it is configured per instance. */
55
- receiverFor?(db: DatabaseSync, object: ObjectRow): ReceiverName | undefined;
53
+ receiverFor?(db: CanvasDb, object: ObjectRow): Promise<ReceiverName | undefined>;
56
54
  /** A kind may fence claimed deliveries when a superseding event replaces them. Return true
57
55
  * only if the claimed delivery was replaced; model handoffs are not retractable. */
58
- supersedeClaimed?(db: DatabaseSync, deliveryId: string): boolean;
56
+ supersedeClaimed?(db: CanvasDb, deliveryId: string): Promise<boolean>;
59
57
  /** Records the read (a watch and a `read` event) and renders the object. */
60
- read(db: DatabaseSync, reader: Reader, object: ObjectRow, opts: ReadOpts): KindRead;
58
+ read(db: CanvasDb, reader: Reader, object: ObjectRow, opts: ReadOpts): Promise<KindRead>;
61
59
  /** Extra fields a list or search row carries. */
62
- listItem?(db: DatabaseSync, object: ObjectRow): Record<string, unknown>;
60
+ listItem?(db: CanvasDb, object: ObjectRow): Promise<Record<string, unknown>>;
63
61
  }
64
62
  /** Events every kind inherits. */
65
63
  export declare const BASE_EVENTS: EventCatalog;
66
64
  /** The base events with a kind's own merged over them. */
67
65
  export declare function withBase(own?: EventCatalog): EventCatalog;
68
66
  /** A live read of a non-document object: the reader watches it and its other watchers hear `read`. */
69
- export declare function recordLiveRead(db: DatabaseSync, reader: Reader, object: ObjectRow, reposFn: ReposFn): void;
67
+ export declare function recordLiveRead(db: CanvasDb, reader: Reader, object: ObjectRow, reposFn: ReposFn): Promise<void>;
@@ -1 +1 @@
1
- var l=Object.defineProperty;var d=(e,r)=>l(e,"name",{value:r,configurable:!0});import{actorOf as a}from"../documents.js";import{publish as c}from"../events.js";import{recordWatch as n}from"../watches.js";const f={created:{level:4},read:{level:1},watched:{level:1},deleted:{level:5},configured:{level:1}};function s(e={}){return{...f,...e}}d(s,"withBase");function h(e,r,t,i){const o=a(r);o.rowid!==t.rowid&&(n(e,o,t,"read"),c(e,{event:"read",object:t,actor:o,attrs:{}},i))}d(h,"recordLiveRead");export{f as BASE_EVENTS,h as recordLiveRead,s as withBase};
1
+ var d=Object.defineProperty;var a=(e,r)=>d(e,"name",{value:r,configurable:!0});import{actorOf as l}from"../documents.js";import{publish as c}from"../events.js";import{recordWatch as n}from"../watches.js";const f={created:{level:4},read:{level:1},watched:{level:1},deleted:{level:5},configured:{level:1}};function u(e={}){return{...f,...e}}a(u,"withBase");async function w(e,r,t,i){const o=l(r);o.rowid!==t.rowid&&(await n(e,o,t,"read"),await c(e,{event:"read",object:t,actor:o,attrs:{}},i))}a(w,"recordLiveRead");export{f as BASE_EVENTS,w as recordLiveRead,u as withBase};
@@ -1,5 +1,5 @@
1
- var y=Object.defineProperty;var s=(r,t)=>y(r,"name",{value:t,configurable:!0});import{prepared as c}from"../../sqlite-statements.js";import{cancelCronsOnWake as T}from"../../canvas/crons.js";import{settleMatchingControllerWait as b}from"../../canvas/waits.js";import{effectiveTier as R,listenDeliveryTier as I,newId as N}from"../../feed/messages.js";import{readGoal as S}from"../../runtime/kickoff.js";import{canRead as h}from"../access.js";import{objectDTO as w}from"./dto.js";import{recordLiveRead as L,withBase as O}from"./kind.js";import{attr as D,header as j,section as f}from"./render.js";const m=[3,5,7];function C(r){return r?.split(`
2
- `).map(t=>t.trim()).find(t=>t!=="")??""}s(C,"firstLine");const K={bodyOwner:s(r=>r[0]?.id??null,"bodyOwner"),enqueue(r,t,n){const a=Date.now(),l=t.senderNodeId,i=n.map(e=>e.id),u=`(${i.map(()=>"?").join(",")})`,p=l===null?new Set:new Set(r.prepare(`SELECT DISTINCT node_id FROM waits WHERE kind = 'controller' AND target_id = ? AND satisfied_at IS NULL AND node_id IN ${u}`).all(l,...i).map(e=>e.node_id)),o=new Set(r.prepare(`SELECT DISTINCT anchor_node FROM crons WHERE cancel_on_wake = 1 AND anchor_node IN ${u}`).all(...i).map(e=>e.anchor_node)),v=c(r,`INSERT INTO deliveries (delivery_id, message_id, destination_id, urgency, wake, state, created_at, updated_at, idempotency_key)
3
- VALUES (?, ?, ?, ?, ?, 'pending', ?, ?, ?)`);for(const e of n){const d=I(e.delivery),E=e.reception===2?d.wake:0,_=t.elevatesTier?R(e.id,d.urgency):d.urgency;v.run(N(),t.messageId,e.id,_,E,a,a,t.idempotencyKey===void 0?null:`${t.idempotencyKey}:${e.id}`),p.has(e.id)&&b(e.id,l,a,r),E===1&&_!=="deferred"&&o.has(e.id)&&T(e.id)}}},U={name:"node",addressable:"id",receiver:"inbox",receiverFor:s((r,t)=>c(r,"SELECT 1 FROM peer_stubs WHERE object = ?").get(t.rowid)===void 0?"inbox":"peer","receiverFor"),events:O({configured:{level:1,durable:!0},messaged:{level:2,durable:!0},sent:{level:1,durable:!0},"report.update":{level:5,levels:m,durable:!0,carriesBody:!0,elevatesTier:!0},"report.final":{level:7,durable:!0,carriesBody:!0,elevatesTier:!0,inboxKind:"final"},outcome:{level:1,durable:!0,supersedes:!0,carriesBody:!0},"report.result":{level:5,durable:!0,carriesBody:!0,elevatesTier:!0,inboxKind:"completed"},"notice.crash":{level:5,levels:m,durable:!0,carriesBody:!0,elevatesTier:!0},"notice.deadline":{level:5,levels:m,durable:!0,carriesBody:!0,elevatesTier:!0},"notice.close":{level:5,levels:m,durable:!0,carriesBody:!0,elevatesTier:!0}}),read(r,t,n,a){const l=c(r,"SELECT status FROM nodes WHERE node_id = ?").get(n.id),i=s(e=>e.filter(d=>h(r,t,d)).map(d=>w(r,d)),"visible"),u=c(r,`SELECT o.* FROM nodes n JOIN objects o ON o.id = n.node_id
4
- WHERE n.parent = ? AND o.deleted_at IS NULL ORDER BY o.rowid`).all(n.id),p=c(r,"SELECT * FROM objects WHERE owner = ? AND deleted_at IS NULL ORDER BY rowid").all(n.rowid);L(r,t,n,a.reposFn);const o={status:l?.status??"deleted",mandate_first_line:C(S(n.id)),children:i(u),owned:i(p.filter(e=>e.type!=="job")),jobs:i(p.filter(e=>e.type==="job"))},v=[j("object",w(r,n),D("status",o.status)),`Mandate: ${o.mandate_first_line}`,...f("Children",o.children),...f("Owns",o.owned),...f("Jobs",o.jobs)].join(`
5
- `);return{data:o,text:v}}};export{K as nodeInbox,U as nodeKind};
1
+ var E=Object.defineProperty;var l=(t,r)=>E(t,"name",{value:r,configurable:!0});import{cancelCronsOnWake as _}from"../../canvas/crons.js";import{settleMatchingControllerWait as T}from"../../canvas/waits.js";import{effectiveTier as b,listenDeliveryTier as R,newId as I}from"../../feed/messages.js";import{readGoal as N}from"../../runtime/kickoff.js";import{canRead as h}from"../access.js";import{objectDTO as f}from"./dto.js";import{recordLiveRead as S,withBase as L}from"./kind.js";import{attr as O,header as D,section as m}from"./render.js";import{filterAsync as j,mapAsync as C}from"../../async-array.js";const p=[3,5,7];function g(t){return t?.split(`
2
+ `).map(r=>r.trim()).find(r=>r!=="")??""}l(g,"firstLine");const K={bodyOwner:l(t=>t[0]?.id??null,"bodyOwner"),async enqueue(t,r,a){const d=Date.now(),s=r.senderNodeId,n=a.map(e=>e.id),c=`(${n.map(()=>"?").join(",")})`,u=s===null?new Set:new Set((await t.prepareUncached(`SELECT DISTINCT node_id FROM waits WHERE kind = 'controller' AND target_id = ? AND satisfied_at IS NULL AND node_id IN ${c}`).all(s,...n)).map(e=>e.node_id)),i=new Set((await t.prepareUncached(`SELECT DISTINCT anchor_node FROM crons WHERE cancel_on_wake = 1 AND anchor_node IN ${c}`).all(...n)).map(e=>e.anchor_node)),w=t.prepare(`INSERT INTO deliveries (delivery_id, message_id, destination_id, urgency, wake, state, created_at, updated_at, idempotency_key)
3
+ VALUES (?, ?, ?, ?, ?, 'pending', ?, ?, ?)`);for(const e of a){const o=R(e.delivery),v=e.reception===2?o.wake:0,y=r.elevatesTier?await b(e.id,o.urgency):o.urgency;await w.run(I(),r.messageId,e.id,y,v,d,d,r.idempotencyKey===void 0?null:`${r.idempotencyKey}:${e.id}`),u.has(e.id)&&await T(e.id,s,d,t),v===1&&y!=="deferred"&&i.has(e.id)&&await _(e.id)}}},J={name:"node",addressable:"id",receiver:"inbox",receiverFor:l(async(t,r)=>await t.prepare("SELECT 1 FROM peer_stubs WHERE object = ?").get(r.rowid)===void 0?"inbox":"peer","receiverFor"),events:L({configured:{level:1,durable:!0},messaged:{level:2,durable:!0},sent:{level:1,durable:!0},"report.update":{level:5,levels:p,durable:!0,carriesBody:!0,elevatesTier:!0},"report.final":{level:7,durable:!0,carriesBody:!0,elevatesTier:!0,inboxKind:"final"},outcome:{level:1,durable:!0,supersedes:!0,carriesBody:!0},"report.result":{level:5,durable:!0,carriesBody:!0,elevatesTier:!0,inboxKind:"completed"},"notice.crash":{level:5,levels:p,durable:!0,carriesBody:!0,elevatesTier:!0},"notice.deadline":{level:5,levels:p,durable:!0,carriesBody:!0,elevatesTier:!0},"notice.close":{level:5,levels:p,durable:!0,carriesBody:!0,elevatesTier:!0}}),async read(t,r,a,d){const s=await t.prepare("SELECT status FROM nodes WHERE node_id = ?").get(a.id),n=l(async e=>await C(await j(e,async o=>await h(t,r,o)),async o=>await f(t,o)),"visible"),c=await t.prepare(`SELECT o.* FROM nodes n JOIN objects o ON o.id = n.node_id
4
+ WHERE n.parent = ? AND o.deleted_at IS NULL ORDER BY o.rowid`).all(a.id),u=await t.prepare("SELECT * FROM objects WHERE owner = ? AND deleted_at IS NULL ORDER BY rowid").all(a.rowid);await S(t,r,a,d.reposFn);const i={status:s?.status??"deleted",mandate_first_line:g(await N(a.id)),children:await n(c),owned:await n(u.filter(e=>e.type!=="job")),jobs:await n(u.filter(e=>e.type==="job"))},w=[D("object",await f(t,a),O("status",i.status)),`Mandate: ${i.mandate_first_line}`,...m("Children",i.children),...m("Owns",i.owned),...m("Jobs",i.jobs)].join(`
5
+ `);return{data:i,text:w}}};export{K as nodeInbox,J as nodeKind};
@@ -1,2 +1,2 @@
1
- var p=Object.defineProperty;var d=(a,t)=>p(a,"name",{value:t,configurable:!0});import{prepared as c}from"../../sqlite-statements.js";import{objectDTO as l}from"./dto.js";import{recordLiveRead as h,withBase as y}from"./kind.js";import{header as f}from"./render.js";function n(a){return{name:a,addressable:"handle",events:y(),read(t,o,e,s){const r=c(t,"SELECT scheme, external_id FROM identities WHERE object = ?").get(e.rowid);h(t,o,e,s.reposFn);const i={handle:e.name,display_name:e.preview||e.name,identity:{scheme:r?.scheme??"",external_id:r?.external_id??""}},m=[f("object",l(t,e)),`Handle: ${i.handle}`,`Display name: ${i.display_name}`,`Identity: ${i.identity.scheme}:${i.identity.external_id}`].join(`
2
- `);return{data:i,text:m}}}}d(n,"ownerKind");const u=[n("person"),n("app"),n("repo"),n("profile")];export{u as ownerKinds};
1
+ var m=Object.defineProperty;var d=(n,t)=>m(n,"name",{value:t,configurable:!0});import{objectDTO as c}from"./dto.js";import{recordLiveRead as l,withBase as h}from"./kind.js";import{header as y}from"./render.js";function i(n){return{name:n,addressable:"handle",events:h(),async read(t,s,e,o){const r=await t.prepare("SELECT scheme, external_id FROM identities WHERE object = ?").get(e.rowid);await l(t,s,e,o.reposFn);const a={handle:e.name,display_name:e.preview||e.name,identity:{scheme:r?.scheme??"",external_id:r?.external_id??""}},p=[y("object",await c(t,e)),`Handle: ${a.handle}`,`Display name: ${a.display_name}`,`Identity: ${a.identity.scheme}:${a.identity.external_id}`].join(`
2
+ `);return{data:a,text:p}}}}d(i,"ownerKind");const E=[i("person"),i("app"),i("repo"),i("profile")];export{E as ownerKinds};
@@ -1,13 +1,10 @@
1
- /** The kind registry: kind name → its `ObjectKind`, and each kind's declared events.
2
- * `createObject` and `publish` go through it, so an undeclared kind cannot be written and an
3
- * undeclared event cannot be published. It decides no access, fan-out or delivery. */
4
- import type { DatabaseSync } from 'node:sqlite';
5
1
  import type { EventSpec, ObjectKind } from './kind.js';
2
+ import type { CanvasDb } from '../../canvas/db.js';
6
3
  /** A registration write invalidates the in-process copy before its next lookup. */
7
- export declare function invalidateCustomKind(db: DatabaseSync, name: string): void;
8
- export declare function kindNames(db: DatabaseSync): string[];
9
- export declare function isKind(db: DatabaseSync, name: string): boolean;
4
+ export declare function invalidateCustomKind(db: CanvasDb, name: string): void;
5
+ export declare function kindNames(db: CanvasDb): Promise<string[]>;
6
+ export declare function isKind(db: CanvasDb, name: string): Promise<boolean>;
10
7
  /** The kind named `name`, or throws `unknown_kind`. */
11
- export declare function kindOf(db: DatabaseSync, name: string): ObjectKind;
8
+ export declare function kindOf(db: CanvasDb, name: string): Promise<ObjectKind>;
12
9
  /** The declared spec of `event` on `kind`, or throws `unknown_event` naming the declared events. */
13
- export declare function eventSpec(db: DatabaseSync, kind: string, event: string): EventSpec;
10
+ export declare function eventSpec(db: CanvasDb, kind: string, event: string): Promise<EventSpec>;
@@ -1 +1 @@
1
- var l=Object.defineProperty;var o=(e,n)=>l(e,"name",{value:n,configurable:!0});import{prepared as u}from"../../sqlite-statements.js";import{CrtrError as f}from"../../errors.js";import{ExitCode as m}from"../../../types.js";import{documentKind as k}from"./document.js";import{jobKind as w}from"./job.js";import{nodeKind as O}from"./node.js";import{actionKind as j}from"./action.js";import{ownerKinds as E}from"./owner.js";import{customKind as S}from"./custom.js";let a=null;function s(){return a??=new Map([k,O,j,w,...E].map(e=>[e.name,e])),a}o(s,"kinds");const c=new WeakMap;function N(e,n){c.get(e)?.delete(n)}o(N,"invalidateCustomKind");function g(e){return[...s().keys(),...u(e,"SELECT name FROM object_kinds ORDER BY name").all().map(n=>n.name)]}o(g,"kindNames");function J(e,n){return s().has(n)||p(e,n)!==null}o(J,"isKind");function p(e,n){let t=c.get(e);t||(t=new Map,c.set(e,t));const r=t.get(n);if(r)return r;const i=u(e,"SELECT events_json FROM object_kinds WHERE name = ?").get(n);if(!i)return null;const d=S(n,JSON.parse(i.events_json));return t.set(n,d),d}o(p,"kindOfCustom");function h(e,n){const t=s().get(n)??p(e,n);if(t==null)throw new f("unknown_kind",`no object kind named ${JSON.stringify(n)}; the kinds are ${g(e).join(", ")}`,m.USAGE,{kind:n});return t}o(h,"kindOf");function A(e,n,t){const r=h(e,n).events,i=Object.hasOwn(r,t)?r[t]:void 0;if(i===void 0)throw new f("unknown_event",`${n} declares no event ${JSON.stringify(t)}; it declares ${Object.keys(r).join(", ")}`,m.USAGE,{kind:n,event:t,declared:Object.keys(r)});return i}o(A,"eventSpec");export{A as eventSpec,N as invalidateCustomKind,J as isKind,g as kindNames,h as kindOf};
1
+ var m=Object.defineProperty;var o=(t,n)=>m(t,"name",{value:n,configurable:!0});import{CrtrError as d}from"../../errors.js";import{ExitCode as u}from"../../../types.js";import{documentKind as l}from"./document.js";import{jobKind as w}from"./job.js";import{nodeKind as k}from"./node.js";import{actionKind as O}from"./action.js";import{ownerKinds as j}from"./owner.js";import{customKind as E}from"./custom.js";let f=null;function s(){return f??=new Map([l,k,O,w,...j].map(t=>[t.name,t])),f}o(s,"kinds");const a=new WeakMap;function $(t,n){a.get(t)?.delete(n)}o($,"invalidateCustomKind");async function y(t){return[...s().keys(),...(await t.prepare("SELECT name FROM object_kinds ORDER BY name").all()).map(n=>n.name)]}o(y,"kindNames");async function v(t,n){return s().has(n)||await p(t,n)!==null}o(v,"isKind");async function p(t,n){let e=a.get(t);e||(e=new Map,a.set(t,e));const i=e.get(n);if(i)return i;const r=await t.prepare("SELECT events_json FROM object_kinds WHERE name = ?").get(n);if(!r)return null;const c=E(n,JSON.parse(r.events_json));return e.set(n,c),c}o(p,"kindOfCustom");async function g(t,n){const e=s().get(n)??await p(t,n);if(e==null)throw new d("unknown_kind",`no object kind named ${JSON.stringify(n)}; the kinds are ${(await y(t)).join(", ")}`,u.USAGE,{kind:n});return e}o(g,"kindOf");async function N(t,n,e){const i=(await g(t,n)).events,r=Object.hasOwn(i,e)?i[e]:void 0;if(r===void 0)throw new d("unknown_event",`${n} declares no event ${JSON.stringify(e)}; it declares ${Object.keys(i).join(", ")}`,u.USAGE,{kind:n,event:e,declared:Object.keys(i)});return r}o(N,"eventSpec");export{N as eventSpec,$ as invalidateCustomKind,v as isKind,y as kindNames,g as kindOf};
@@ -1,5 +1,5 @@
1
- import type { DatabaseSync } from 'node:sqlite';
2
1
  import type { ObjectRow, Reader } from './types.js';
2
+ import type { CanvasDb } from '../canvas/db.js';
3
3
  export type Resolution = {
4
4
  object: ObjectRow;
5
5
  } | {
@@ -14,7 +14,7 @@ export type Resolution = {
14
14
  /** The owners a bare name is looked up under, in order: own node, repos nearest
15
15
  * first, the profile's project repos, profile, app, you, then the apps whose tools the run may use (installed
16
16
  * plugins) with `crtr` last. */
17
- export declare function viewOf(db: DatabaseSync, reader: Reader): ObjectRow[];
17
+ export declare function viewOf(db: CanvasDb, reader: Reader): Promise<ObjectRow[]>;
18
18
  /** The owner types that carry a handle; `<type>:<handle>/<name>` names one exactly. */
19
19
  export declare const HANDLE_TYPES: readonly ["person", "app", "repo", "profile"];
20
20
  /** A ref without its `[[ ]]` wrapper. */
@@ -23,7 +23,7 @@ export declare const unwrapRef: (raw: string) => string;
23
23
  * holding that handle (handles are unique per type, not across types). Any owner
24
24
  * also answers to its object id, so `<owner object id>/<name>` names a document
25
25
  * whatever its owner's type. */
26
- export declare function ownersByHandle(db: DatabaseSync, handle: string, type?: string): ObjectRow[];
26
+ export declare function ownersByHandle(db: CanvasDb, handle: string, type?: string): Promise<ObjectRow[]>;
27
27
  /** `name` may be wrapped in `[[ ]]`, a raw object id, a bare document name,
28
28
  * `<owner handle>/<name>`, or `<type>:<owner handle>/<name>`. Under a handle
29
29
  * several owner types share, owners in the reader's view come first in view
@@ -32,11 +32,11 @@ export declare function ownersByHandle(db: DatabaseSync, handle: string, type?:
32
32
  /** Precomputed for one reader across many resolutions (a corpus names every document). */
33
33
  export interface ResolveContext {
34
34
  view: ObjectRow[];
35
- readable: (o: ObjectRow) => boolean;
35
+ readable: (o: ObjectRow) => Promise<boolean>;
36
36
  }
37
- export declare function resolveName(db: DatabaseSync, reader: Reader, raw: string, context?: ResolveContext): Resolution;
37
+ export declare function resolveName(db: CanvasDb, reader: Reader, raw: string, context?: ResolveContext): Promise<Resolution>;
38
38
  /** Every readable stub of another machine's object that `raw` (`<owner handle>/<name>`, `<type>:<owner handle>/<name>` or a bare name) names:
39
39
  * empty when none does, more than one when the name is ambiguous. `resolveName` never answers a stub, so a stub cannot shadow a local
40
40
  * object; this is the lookup a forwarding handler makes only after `resolveName` found no local object, to learn that the name belongs
41
41
  * to an object another machine homes. */
42
- export declare function stubsNamed(db: DatabaseSync, reader: Reader, raw: string): ObjectRow[];
42
+ export declare function stubsNamed(db: CanvasDb, reader: Reader, raw: string): Promise<ObjectRow[]>;
@@ -1,3 +1,3 @@
1
- var M=Object.defineProperty;var i=(t,e)=>M(t,"name",{value:e,configurable:!0});import{prepared as w}from"../sqlite-statements.js";import{isSafeNodeId as _}from"../canvas/paths.js";import{canRead as O,toolApps as $}from"./access.js";import{getById as H}from"./objects.js";function y(t,e){const n=w(t,"SELECT * FROM objects WHERE type = 'person' AND name = 'user' AND home_machine IS NULL").get(),p=$(t,e),o=e.class==="node"?[e.node,...e.repos,...e.projectRepos,e.profile,e.app]:e.class==="app"?[e.app]:e.class==="object"?[e.owner,...e.repos,e.app]:[],c=new Set;return[...o,n,...p].filter(r=>!!r&&!c.has(r.rowid)&&!!c.add(r.rowid))}i(y,"viewOf");function d(t,e,n,p,o=!1){return t.prepare(`SELECT * FROM objects WHERE (type = 'document' OR instr(type, '.') > 0) AND owner = ? AND name = ? AND home_machine IS ${o?"NOT NULL":"NULL"}
2
- AND deleted_at IS ${p?"NOT NULL ORDER BY deleted_at DESC":"NULL"}`).all(e.rowid,n)}i(d,"namedObjects");const B=["person","app","repo","profile"],S=/^(person|app|repo|profile|node):([^/]+)\/(.+)$/,A=i(t=>t.trim().replace(/^\[\[(.*)\]\]$/,"$1").trim(),"unwrapRef");function j(t){const e=S.exec(t);if(e)return{type:e[1],handle:e[2],rest:e[3]};const n=t.indexOf("/");return n>0?{handle:t.slice(0,n),rest:t.slice(n+1)}:null}i(j,"splitOwnerRef");function I(t,e,n){return n==="node"?w(t,"SELECT * FROM objects WHERE type = 'node' AND id = ?").all(e):n?w(t,"SELECT * FROM objects WHERE type = ? AND (name = ? OR id = ?) AND home_machine IS NULL").all(n,e,e):w(t,`SELECT * FROM objects WHERE (type = 'node' AND id = ?)
3
- OR (type IN ('person','app','repo','profile') AND (name = ? OR id = ?) AND home_machine IS NULL)`).all(e,e,e)}i(I,"ownersByHandle");function Y(t,e,n,p){let o=A(n);const c=/^([^:/]+):reports\/(.+?)(?:\.md)?$/.exec(o);c&&!S.test(o)&&(o=`${c[1]}/reports/${c[2]}`);const r=p?.readable??(f=>O(t,e,f)),a=H(t,o);if(a&&r(a))return a.deleted_at?{deleted:a}:{object:a};const N=p?.view??y(t,e);for(const f of N){const l=d(t,f,o,!1).find(r);if(l)return{object:l}}const m=j(o);if(m){const{type:f,handle:l,rest:L}=m,g=f!==void 0,E=I(t,l,f),h=i(s=>{const u=N.findIndex(T=>T.rowid===s.rowid);return u<0?1/0:u},"rank"),x=E.filter(s=>h(s)<1/0).sort((s,u)=>h(s)-h(u));for(const s of x){const u=d(t,s,L,!1).find(r);if(u)return{object:u}}const R=E.flatMap(s=>d(t,s,L,!1)).filter(r);if(R.length===1)return{object:R[0]};if(R.length>1)return{ambiguous:R};const D=E.flatMap(s=>d(t,s,L,!0)).find(r);return D?{deleted:D}:!g&&E.length===0&&_(l)?{remote:o}:{missing:!0}}for(const f of N){const l=d(t,f,o,!0).find(r);if(l)return{deleted:l}}return{missing:!0}}i(Y,"resolveName");function b(t,e,n){const p=A(n),o=i((a,N)=>a.flatMap(m=>d(t,m,N,!1,!0)).filter(m=>O(t,e,m)),"found"),c=o(y(t,e),p);if(c.length)return c;const r=j(p);return r?o(I(t,r.handle,r.type),r.rest):[]}i(b,"stubsNamed");export{B as HANDLE_TYPES,I as ownersByHandle,Y as resolveName,b as stubsNamed,A as unwrapRef,y as viewOf};
1
+ var $=Object.defineProperty;var s=(e,t)=>$(e,"name",{value:t,configurable:!0});import{isSafeNodeId as H}from"../canvas/paths.js";import{canRead as D,toolApps as C}from"./access.js";import{getById as M}from"./objects.js";import{filterAsync as O,findAsync as d,flatMapAsync as h}from"../async-array.js";async function S(e,t){const n=await e.prepare("SELECT * FROM objects WHERE type = 'person' AND name = 'user' AND home_machine IS NULL").get(),r=await C(e,t),o=t.class==="node"?[t.node,...t.repos,...t.projectRepos,t.profile,t.app]:t.class==="app"?[t.app]:t.class==="object"?[t.owner,...t.repos,t.app]:[],c=new Set;return[...o,n,...r].filter(a=>!!a&&!c.has(a.rowid)&&!!c.add(a.rowid))}s(S,"viewOf");async function m(e,t,n,r,o=!1){return await e.prepareUncached(`SELECT * FROM objects WHERE (type = 'document' OR instr(type, '.') > 0) AND owner = ? AND name = ? AND home_machine IS ${o?"NOT NULL":"NULL"}
2
+ AND deleted_at IS ${r?"NOT NULL ORDER BY deleted_at DESC":"NULL"}`).all(t.rowid,n)}s(m,"namedObjects");const b=["person","app","repo","profile"],j=/^(person|app|repo|profile|node):([^/]+)\/(.+)$/,I=s(e=>e.trim().replace(/^\[\[(.*)\]\]$/,"$1").trim(),"unwrapRef");function g(e){const t=j.exec(e);if(t)return{type:t[1],handle:t[2],rest:t[3]};const n=e.indexOf("/");return n>0?{handle:e.slice(0,n),rest:e.slice(n+1)}:null}s(g,"splitOwnerRef");async function x(e,t,n){return n==="node"?await e.prepare("SELECT * FROM objects WHERE type = 'node' AND id = ?").all(t):n?await e.prepare("SELECT * FROM objects WHERE type = ? AND (name = ? OR id = ?) AND home_machine IS NULL").all(n,t,t):await e.prepare(`SELECT * FROM objects WHERE (type = 'node' AND id = ?)
3
+ OR (type IN ('person','app','repo','profile') AND (name = ? OR id = ?) AND home_machine IS NULL)`).all(t,t,t)}s(x,"ownersByHandle");async function P(e,t,n,r){let o=I(n);const c=/^([^:/]+):reports\/(.+?)(?:\.md)?$/.exec(o);c&&!j.test(o)&&(o=`${c[1]}/reports/${c[2]}`);const a=r?.readable??(async p=>await D(e,t,p)),w=await M(e,o);if(w&&await a(w))return w.deleted_at?{deleted:w}:{object:w};const y=r?.view??await S(e,t);for(const p of y){const f=await d(await m(e,p,o,!1),a);if(f)return{object:f}}const u=g(o);if(u){const{type:p,handle:f,rest:R}=u,T=p!==void 0,N=await x(e,f,p),L=s(i=>{const l=y.findIndex(_=>_.rowid===i.rowid);return l<0?1/0:l},"rank"),U=N.filter(i=>L(i)<1/0).sort((i,l)=>L(i)-L(l));for(const i of U){const l=await d(await m(e,i,R,!1),a);if(l)return{object:l}}const E=await O(await h(N,async i=>await m(e,i,R,!1)),a);if(E.length===1)return{object:E[0]};if(E.length>1)return{ambiguous:E};const A=await d(await h(N,async i=>await m(e,i,R,!0)),a);return A?{deleted:A}:!T&&N.length===0&&H(f)?{remote:o}:{missing:!0}}for(const p of y){const f=await d(await m(e,p,o,!0),a);if(f)return{deleted:f}}return{missing:!0}}s(P,"resolveName");async function V(e,t,n){const r=I(n),o=s(async(w,y)=>await O(await h(w,async u=>await m(e,u,y,!1,!0)),async u=>await D(e,t,u)),"found"),c=await o(await S(e,t),r);if(c.length)return c;const a=g(r);return a?await o(await x(e,a.handle,a.type),a.rest):[]}s(V,"stubsNamed");export{b as HANDLE_TYPES,x as ownersByHandle,P as resolveName,V as stubsNamed,I as unwrapRef,S as viewOf};
@@ -1,12 +1,9 @@
1
- /** A node's wait on a watched object: armed when a node starts watching an object whose kind declares an
2
- * event with `endsWait` (a workflow run until `completed`), settled by `publish` when that event lands,
3
- * by the node stopping its watch, or by the node ending. The rows live in `waits` (kind `object`). */
4
- import type { DatabaseSync } from 'node:sqlite';
5
1
  import type { ObjectRow } from './types.js';
2
+ import type { CanvasDb } from '../canvas/db.js';
6
3
  /** Whether an object of this kind is something a node waits on: one of its events ends a wait. */
7
- export declare function kindEndsWait(db: DatabaseSync, type: string): boolean;
4
+ export declare function kindEndsWait(db: CanvasDb, type: string): Promise<boolean>;
8
5
  /** `watcher` (a node) started watching `object`: arm its wait when the object's kind has an ending event.
9
6
  * A node of another machine has no `nodes` row here; its home arms the wait when peer ingest records the watch there. */
10
- export declare function armObjectWaitForWatch(db: DatabaseSync, watcher: ObjectRow, object: ObjectRow): void;
7
+ export declare function armObjectWaitForWatch(db: CanvasDb, watcher: ObjectRow, object: ObjectRow): Promise<void>;
11
8
  /** `watcher` stopped watching `object` entirely: its wait on it is over. */
12
- export declare function settleObjectWaitForUnwatch(db: DatabaseSync, watcher: ObjectRow, object: ObjectRow): void;
9
+ export declare function settleObjectWaitForUnwatch(db: CanvasDb, watcher: ObjectRow, object: ObjectRow): Promise<void>;
@@ -1 +1 @@
1
- var r=Object.defineProperty;var n=(e,t)=>r(e,"name",{value:t,configurable:!0});import{armObjectWait as o,settleObjectWaits as f}from"../canvas/waits.js";import{kindOf as u}from"./kinds/registry.js";import{stubOf as m}from"../peer/stubs.js";function p(e,t){return Object.values(u(e,t).events).some(i=>i.endsWait===!0)}n(p,"kindEndsWait");function W(e,t,i){t.type!=="node"||m(e,t)!==null||!p(e,i.type)||o(e,t.id,i.id)}n(W,"armObjectWaitForWatch");function c(e,t,i){t.type==="node"&&f(e,i.id,t.id)}n(c,"settleObjectWaitForUnwatch");export{W as armObjectWaitForWatch,p as kindEndsWait,c as settleObjectWaitForUnwatch};
1
+ var n=Object.defineProperty;var a=(i,t)=>n(i,"name",{value:t,configurable:!0});import{armObjectWait as r,settleObjectWaits as o}from"../canvas/waits.js";import{kindOf as s}from"./kinds/registry.js";import{stubOf as f}from"../peer/stubs.js";async function u(i,t){return Object.values((await s(i,t)).events).some(e=>e.endsWait===!0)}a(u,"kindEndsWait");async function O(i,t,e){t.type!=="node"||await f(i,t)!==null||!await u(i,e.type)||await r(i,t.id,e.id)}a(O,"armObjectWaitForWatch");async function W(i,t,e){t.type==="node"&&await o(i,e.id,t.id)}a(W,"settleObjectWaitForUnwatch");export{O as armObjectWaitForWatch,u as kindEndsWait,W as settleObjectWaitForUnwatch};